diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..8f0de65
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,18 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[docker-compose.yml]
+indent_size = 4
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..7333620
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,38 @@
+* text=auto eol=lf
+
+*.blade.php diff=html
+*.css diff=css
+*.html diff=html
+*.md diff=markdown
+*.php diff=php
+
+/.github export-ignore
+CHANGELOG.md export-ignore
+.styleci.yml export-ignore
+
+# Ignorar archivos de configuración y herramientas de desarrollo
+.editorconfig export-ignore
+.prettierrc.json export-ignore
+.prettierignore export-ignore
+.eslintrc.json export-ignore
+
+# Ignorar node_modules y dependencias locales
+node_modules/ export-ignore
+vendor/ export-ignore
+
+# Ignorar archivos de build
+npm-debug.log export-ignore
+
+# Ignorar carpetas de logs y caché
+storage/logs/ export-ignore
+storage/framework/ export-ignore
+
+# Ignorar carpetas de compilación de frontend
+public/build/ export-ignore
+dist/ export-ignore
+
+# Ignorar archivos de CI/CD
+.github/ export-ignore
+.gitlab-ci.yml export-ignore
+.vscode/ export-ignore
+.idea/ export-ignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d07bec2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+/node_modules
+/vendor
+/.vscode
+/.nova
+/.fleet
+/.phpactor.json
+/.phpunit.cache
+/.phpunit.result.cache
+/.zed
+/.idea
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..5d3dfee
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,16 @@
+# Dependencias de Composer y Node.js
+/vendor/
+/node_modules/
+
+# Caché y logs
+/storage/
+*.log
+*.cache
+
+# Archivos del sistema
+.DS_Store
+Thumbs.db
+
+# Configuración de editores
+.idea/
+.vscode/
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..5f11c9c
--- /dev/null
+++ b/.prettierrc.json
@@ -0,0 +1,29 @@
+{
+ "arrowParens": "avoid",
+ "bracketSpacing": true,
+ "bracketSameLine": true,
+ "htmlWhitespaceSensitivity": "css",
+ "insertPragma": false,
+ "jsxSingleQuote": true,
+ "printWidth": 120,
+ "proseWrap": "preserve",
+ "quoteProps": "as-needed",
+ "requirePragma": false,
+ "semi": true,
+ "singleQuote": true,
+ "tabWidth": 4,
+ "trailingComma": "none",
+ "useTabs": false,
+ "endOfLine": "lf",
+ "embeddedLanguageFormatting": "auto",
+ "overrides": [
+ {
+ "files": [
+ "resources/assets/**/*.js"
+ ],
+ "options": {
+ "semi": false
+ }
+ }
+ ]
+}
diff --git a/Actions/Fortify/CreateNewUser.php b/Actions/Fortify/CreateNewUser.php
new file mode 100644
index 0000000..89525c6
--- /dev/null
+++ b/Actions/Fortify/CreateNewUser.php
@@ -0,0 +1,40 @@
+ $input
+ */
+ public function create(array $input): User
+ {
+ Validator::make($input, [
+ 'name' => ['required', 'string', 'max:255'],
+ 'email' => [
+ 'required',
+ 'string',
+ 'email',
+ 'max:255',
+ Rule::unique(User::class),
+ ],
+ 'password' => $this->passwordRules(),
+ ])->validate();
+
+ return User::create([
+ 'name' => $input['name'],
+ 'email' => $input['email'],
+ 'password' => Hash::make($input['password']),
+ ]);
+ }
+}
diff --git a/Actions/Fortify/PasswordValidationRules.php b/Actions/Fortify/PasswordValidationRules.php
new file mode 100644
index 0000000..a2edbce
--- /dev/null
+++ b/Actions/Fortify/PasswordValidationRules.php
@@ -0,0 +1,18 @@
+|string>
+ */
+ protected function passwordRules(): array
+ {
+ return ['required', 'string', Password::default(), 'confirmed'];
+ }
+}
diff --git a/Actions/Fortify/ResetUserPassword.php b/Actions/Fortify/ResetUserPassword.php
new file mode 100644
index 0000000..9017b2c
--- /dev/null
+++ b/Actions/Fortify/ResetUserPassword.php
@@ -0,0 +1,29 @@
+ $input
+ */
+ public function reset(User $user, array $input): void
+ {
+ Validator::make($input, [
+ 'password' => $this->passwordRules(),
+ ])->validate();
+
+ $user->forceFill([
+ 'password' => Hash::make($input['password']),
+ ])->save();
+ }
+}
diff --git a/Actions/Fortify/UpdateUserPassword.php b/Actions/Fortify/UpdateUserPassword.php
new file mode 100644
index 0000000..35b0fc3
--- /dev/null
+++ b/Actions/Fortify/UpdateUserPassword.php
@@ -0,0 +1,32 @@
+ $input
+ */
+ public function update(User $user, array $input): void
+ {
+ Validator::make($input, [
+ 'current_password' => ['required', 'string', 'current_password:web'],
+ 'password' => $this->passwordRules(),
+ ], [
+ 'current_password.current_password' => __('The provided password does not match your current password.'),
+ ])->validateWithBag('updatePassword');
+
+ $user->forceFill([
+ 'password' => Hash::make($input['password']),
+ ])->save();
+ }
+}
diff --git a/Actions/Fortify/UpdateUserProfileInformation.php b/Actions/Fortify/UpdateUserProfileInformation.php
new file mode 100644
index 0000000..2367171
--- /dev/null
+++ b/Actions/Fortify/UpdateUserProfileInformation.php
@@ -0,0 +1,60 @@
+ $input
+ */
+ public function update(User $user, array $input): void
+ {
+ Validator::make($input, [
+ 'name' => ['required', 'string', 'max:255'],
+
+ 'email' => [
+ 'required',
+ 'string',
+ 'email',
+ 'max:255',
+ Rule::unique('users')->ignore($user->id),
+ ],
+ ])->validateWithBag('updateProfileInformation');
+
+ if (
+ $input['email'] !== $user->email &&
+ $user instanceof MustVerifyEmail
+ ) {
+ $this->updateVerifiedUser($user, $input);
+ } else {
+ $user->forceFill([
+ 'name' => $input['name'],
+ 'email' => $input['email'],
+ ])->save();
+ }
+ }
+
+ /**
+ * Update the given verified user's profile information.
+ *
+ * @param array $input
+ */
+ protected function updateVerifiedUser(User $user, array $input): void
+ {
+ $user->forceFill([
+ 'name' => $input['name'],
+ 'email' => $input['email'],
+ 'email_verified_at' => null,
+ ])->save();
+
+ $user->sendEmailVerificationNotification();
+ }
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..0cc0f79
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,41 @@
+# 📜 CHANGELOG - Laravel Vuexy Admin
+
+Este documento sigue el formato [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+
+## [0.1.0] - ALPHA - 2025-03-05
+
+### ✨ Added (Agregado)
+- 📌 **Integración con los catálogos SAT (CFDI 4.0)**:
+ - `sat_banco`, `sat_clave_prod_serv`, `sat_clave_unidad`, `sat_codigo_postal`, `sat_colonia`, `sat_deduccion`, `sat_estado`, `sat_forma_pago`, `sat_localidad`, `sat_municipio`, `sat_moneda`, `sat_pais`, `sat_percepcion`, `sat_regimen_contratacion`, `sat_regimen_fiscal`, `sat_uso_cfdi`.
+- 🎨 **Interfaz basada en Vuexy Admin** con integración de Laravel Blade + Livewire.
+- 🔑 **Sistema de autenticación y RBAC** con Laravel Fortify y Spatie Permissions.
+- 🔄 **Módulo de tipos de cambio** con integración de la API de Banxico.
+- 📦 **Manejo de almacenamiento y gestión de activos**.
+- 🚀 **Publicación inicial del repositorio en Packagist y Git Tea**.
+
+### 🛠 Changed (Modificado)
+- **Optimización del sistema de permisos y roles** para mayor flexibilidad.
+
+### 🐛 Fixed (Correcciones)
+- Se corrigieron errores en migraciones de catálogos SAT.
+
+---
+
+## 📅 Próximos Cambios Planeados
+- 📊 **Módulo de Reportes** con Laravel Excel y Charts.
+- 🏪 **Módulo de Inventarios y Punto de Venta (POS)**.
+- 📍 **Mejor integración con APIs de geolocalización**.
+
+---
+
+**📌 Nota:** Esta es la primera versión **ALPHA**, aún en desarrollo.
+
+---
+
+## 🔄 Sincronización de Cambios
+Este `CHANGELOG.md` se actualiza primero en nuestro repositorio principal en **[Tea - Koneko Git](https://git.koneko.mx/koneko/laravel-vuexy-admin)** y luego se refleja en GitHub.
+Los cambios recientes pueden verse antes en **Tea** que en **GitHub** debido a la sincronización automática.
+
+---
+
+📅 Última actualización: **2024-03-05**.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..ab16327
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,9 @@
+## 🔐 Acceso al Repositorio Privado
+
+Nuestro servidor Git en **Tea** tiene un registro cerrado. Para contribuir:
+
+1. Abre un **Issue** en [GitHub](https://github.com/koneko-mx/laravel-vuexy-admin/issues) indicando tu interés en contribuir.
+2. Alternativamente, envía un correo a **contacto@koneko.mx** solicitando acceso.
+3. Una vez aprobado, recibirás una invitación para registrarte y clonar el repositorio.
+
+Si solo necesitas acceso de lectura, puedes clonar la versión pública en **GitHub**.
diff --git a/Console/Commands/CleanInitialAvatars.php b/Console/Commands/CleanInitialAvatars.php
new file mode 100644
index 0000000..0f03d7f
--- /dev/null
+++ b/Console/Commands/CleanInitialAvatars.php
@@ -0,0 +1,43 @@
+files($directory);
+
+ foreach ($files as $file) {
+ $lastModified = Storage::disk('public')->lastModified($file);
+
+ // Elimina archivos no accedidos en los últimos 30 días
+ if (now()->timestamp - $lastModified > 30 * 24 * 60 * 60) {
+ Storage::disk('public')->delete($file);
+ }
+ }
+
+ $this->info('Avatares iniciales antiguos eliminados.');
+ }
+}
diff --git a/Console/Commands/SyncRBAC.php b/Console/Commands/SyncRBAC.php
new file mode 100644
index 0000000..45ce8ed
--- /dev/null
+++ b/Console/Commands/SyncRBAC.php
@@ -0,0 +1,26 @@
+argument('action');
+ if ($action === 'import') {
+ RBACService::loadRolesAndPermissions();
+ $this->info('Roles y permisos importados correctamente.');
+ } elseif ($action === 'export') {
+ // Implementación para exportar los roles a JSON
+ $this->info('Exportación de roles y permisos completada.');
+ } else {
+ $this->error('Acción no válida. Usa "import" o "export".');
+ }
+ }
+}
diff --git a/Helpers/CatalogHelper.php b/Helpers/CatalogHelper.php
new file mode 100644
index 0000000..c8375f0
--- /dev/null
+++ b/Helpers/CatalogHelper.php
@@ -0,0 +1,72 @@
+find($id);
+ return response()->json($data);
+ }
+
+ // Aplicar filtros personalizados
+ foreach ($customFilters as $field => $value) {
+ if (!is_null($value)) {
+ $query->where($field, $value);
+ }
+ }
+
+ // Aplicar filtro de búsqueda si hay searchTerm
+ if ($searchTerm) {
+ $query->where($valueField, 'like', '%' . $searchTerm . '%');
+ }
+
+ // Limitar resultados si el límite no es falso
+ if ($limit > 0) {
+ $query->limit($limit);
+ }
+
+ $results = $query->get([$keyField, $valueField]);
+
+ // Devolver según el tipo de respuesta
+ switch ($responseType) {
+ case 'keyValue':
+ $data = $results->pluck($valueField, $keyField)->toArray();
+ break;
+
+ case 'select2':
+ $data = $results->map(function ($item) use ($keyField, $valueField) {
+ return [
+ 'id' => $item->{$keyField},
+ 'text' => $item->{$valueField},
+ ];
+ })->toArray();
+ break;
+
+ default:
+ $data = $results->map(function ($item) use ($keyField, $valueField) {
+ return [
+ 'id' => $item->{$keyField},
+ 'text' => $item->{$valueField},
+ ];
+ })->toArray();
+ break;
+ }
+
+ return response()->json($data);
+ }
+}
diff --git a/Helpers/VuexyHelper.php b/Helpers/VuexyHelper.php
new file mode 100644
index 0000000..847e8b4
--- /dev/null
+++ b/Helpers/VuexyHelper.php
@@ -0,0 +1,209 @@
+ 'vertical',
+ 'myTheme' => 'theme-default',
+ 'myStyle' => 'light',
+ 'myRTLSupport' => false,
+ 'myRTLMode' => true,
+ 'hasCustomizer' => true,
+ 'showDropdownOnHover' => true,
+ 'displayCustomizer' => true,
+ 'contentLayout' => 'compact',
+ 'headerType' => 'fixed',
+ 'navbarType' => 'fixed',
+ 'menuFixed' => true,
+ 'menuCollapsed' => false,
+ 'footerFixed' => false,
+ 'customizerControls' => [
+ 'rtl',
+ 'style',
+ 'headerType',
+ 'contentLayout',
+ 'layoutCollapsed',
+ 'showDropdownOnHover',
+ 'layoutNavbarOptions',
+ 'themes',
+ ],
+ // 'defaultLanguage'=>'en',
+ ];
+
+ // if any key missing of array from custom.php file it will be merge and set a default value from dataDefault array and store in data variable
+ $data = array_merge($DefaultData, $data);
+
+ // All options available in the template
+ $allOptions = [
+ 'myLayout' => ['vertical', 'horizontal', 'blank', 'front'],
+ 'menuCollapsed' => [true, false],
+ 'hasCustomizer' => [true, false],
+ 'showDropdownOnHover' => [true, false],
+ 'displayCustomizer' => [true, false],
+ 'contentLayout' => ['compact', 'wide'],
+ 'headerType' => ['fixed', 'static'],
+ 'navbarType' => ['fixed', 'static', 'hidden'],
+ 'myStyle' => ['light', 'dark', 'system'],
+ 'myTheme' => ['theme-default', 'theme-bordered', 'theme-semi-dark'],
+ 'myRTLSupport' => [true, false],
+ 'myRTLMode' => [true, false],
+ 'menuFixed' => [true, false],
+ 'footerFixed' => [true, false],
+ 'customizerControls' => [],
+ // 'defaultLanguage'=>array('en'=>'en','fr'=>'fr','de'=>'de','ar'=>'ar'),
+ ];
+
+ //if myLayout value empty or not match with default options in custom.php config file then set a default value
+ foreach ($allOptions as $key => $value) {
+ if (array_key_exists($key, $DefaultData)) {
+ if (gettype($DefaultData[$key]) === gettype($data[$key])) {
+ // data key should be string
+ if (is_string($data[$key])) {
+ // data key should not be empty
+ if (isset($data[$key]) && $data[$key] !== null) {
+ // data key should not be exist inside allOptions array's sub array
+ if (!array_key_exists($data[$key], $value)) {
+ // ensure that passed value should be match with any of allOptions array value
+ $result = array_search($data[$key], $value, 'strict');
+ if (empty($result) && $result !== 0) {
+ $data[$key] = $DefaultData[$key];
+ }
+ }
+ } else {
+ // if data key not set or
+ $data[$key] = $DefaultData[$key];
+ }
+ }
+ } else {
+ $data[$key] = $DefaultData[$key];
+ }
+ }
+ }
+ $styleVal = $data['myStyle'] == "dark" ? "dark" : "light";
+ $styleUpdatedVal = $data['myStyle'] == "dark" ? "dark" : $data['myStyle'];
+ // Determine if the layout is admin or front based on cookies
+ $layoutName = $data['myLayout'];
+ $isAdmin = Str::contains($layoutName, 'front') ? false : true;
+
+ $modeCookieName = $isAdmin ? 'admin-mode' : 'front-mode';
+ $colorPrefCookieName = $isAdmin ? 'admin-colorPref' : 'front-colorPref';
+
+ // Determine style based on cookies, only if not 'blank-layout'
+ if ($layoutName !== 'blank') {
+ if (isset($_COOKIE[$modeCookieName])) {
+ $styleVal = $_COOKIE[$modeCookieName];
+ if ($styleVal === 'system') {
+ $styleVal = isset($_COOKIE[$colorPrefCookieName]) ? $_COOKIE[$colorPrefCookieName] : 'light';
+ }
+ $styleUpdatedVal = $_COOKIE[$modeCookieName];
+ }
+ }
+
+ isset($_COOKIE['theme']) ? $themeVal = $_COOKIE['theme'] : $themeVal = $data['myTheme'];
+
+ $directionVal = isset($_COOKIE['direction']) ? ($_COOKIE['direction'] === "true" ? 'rtl' : 'ltr') : $data['myRTLMode'];
+
+ //layout classes
+ $layoutClasses = [
+ 'layout' => $data['myLayout'],
+ 'theme' => $themeVal,
+ 'themeOpt' => $data['myTheme'],
+ 'style' => $styleVal,
+ 'styleOpt' => $data['myStyle'],
+ 'styleOptVal' => $styleUpdatedVal,
+ 'rtlSupport' => $data['myRTLSupport'],
+ 'rtlMode' => $data['myRTLMode'],
+ 'textDirection' => $directionVal, //$data['myRTLMode'],
+ 'menuCollapsed' => $data['menuCollapsed'],
+ 'hasCustomizer' => $data['hasCustomizer'],
+ 'showDropdownOnHover' => $data['showDropdownOnHover'],
+ 'displayCustomizer' => $data['displayCustomizer'],
+ 'contentLayout' => $data['contentLayout'],
+ 'headerType' => $data['headerType'],
+ 'navbarType' => $data['navbarType'],
+ 'menuFixed' => $data['menuFixed'],
+ 'footerFixed' => $data['footerFixed'],
+ 'customizerControls' => $data['customizerControls'],
+ ];
+
+ // sidebar Collapsed
+ if ($layoutClasses['menuCollapsed'] == true) {
+ $layoutClasses['menuCollapsed'] = 'layout-menu-collapsed';
+ }
+
+ // Header Type
+ if ($layoutClasses['headerType'] == 'fixed') {
+ $layoutClasses['headerType'] = 'layout-menu-fixed';
+ }
+ // Navbar Type
+ if ($layoutClasses['navbarType'] == 'fixed') {
+ $layoutClasses['navbarType'] = 'layout-navbar-fixed';
+ } elseif ($layoutClasses['navbarType'] == 'static') {
+ $layoutClasses['navbarType'] = '';
+ } else {
+ $layoutClasses['navbarType'] = 'layout-navbar-hidden';
+ }
+
+ // Menu Fixed
+ if ($layoutClasses['menuFixed'] == true) {
+ $layoutClasses['menuFixed'] = 'layout-menu-fixed';
+ }
+
+ // Footer Fixed
+ if ($layoutClasses['footerFixed'] == true) {
+ $layoutClasses['footerFixed'] = 'layout-footer-fixed';
+ }
+
+ // RTL Supported template
+ if ($layoutClasses['rtlSupport'] == true) {
+ $layoutClasses['rtlSupport'] = '/rtl';
+ }
+
+ // RTL Layout/Mode
+ if ($layoutClasses['rtlMode'] == true) {
+ $layoutClasses['rtlMode'] = 'rtl';
+ $layoutClasses['textDirection'] = isset($_COOKIE['direction']) ? ($_COOKIE['direction'] === "true" ? 'rtl' : 'ltr') : 'rtl';
+ } else {
+ $layoutClasses['rtlMode'] = 'ltr';
+ $layoutClasses['textDirection'] = isset($_COOKIE['direction']) && $_COOKIE['direction'] === "true" ? 'rtl' : 'ltr';
+ }
+
+ // Show DropdownOnHover for Horizontal Menu
+ if ($layoutClasses['showDropdownOnHover'] == true) {
+ $layoutClasses['showDropdownOnHover'] = true;
+ } else {
+ $layoutClasses['showDropdownOnHover'] = false;
+ }
+
+ // To hide/show display customizer UI, not js
+ if ($layoutClasses['displayCustomizer'] == true) {
+ $layoutClasses['displayCustomizer'] = true;
+ } else {
+ $layoutClasses['displayCustomizer'] = false;
+ }
+
+ return $layoutClasses;
+ }
+
+ public static function updatePageConfig($pageConfigs)
+ {
+ $demo = 'custom';
+ if (isset($pageConfigs)) {
+ if (count($pageConfigs) > 0) {
+ foreach ($pageConfigs as $config => $val) {
+ Config::set('vuexy.' . $demo . '.' . $config, $val);
+ }
+ }
+ }
+ }
+}
diff --git a/Http/Controllers/AdminController.php b/Http/Controllers/AdminController.php
new file mode 100644
index 0000000..edd14e7
--- /dev/null
+++ b/Http/Controllers/AdminController.php
@@ -0,0 +1,62 @@
+expectsJson(), 403, __('errors.ajax_only'));
+
+ $VuexyAdminService = app(VuexyAdminService::class);
+
+ return response()->json($VuexyAdminService->getVuexySearchData());
+ }
+
+ public function quickLinksUpdate(Request $request)
+ {
+ abort_if(!request()->expectsJson(), 403, __('errors.ajax_only'));
+
+ $validated = $request->validate([
+ 'action' => 'required|in:update,remove',
+ 'route' => 'required|string',
+ ]);
+
+ $quickLinks = Setting::where('user_id', Auth::user()->id)
+ ->where('key', 'quicklinks')
+ ->first();
+
+ $quickLinks = $quickLinks ? json_decode($quickLinks->value, true) : [];
+
+ if ($validated['action'] === 'update') {
+ // Verificar si ya existe
+ if (!in_array($validated['route'], $quickLinks))
+ $quickLinks[] = $validated['route'];
+ } elseif ($validated['action'] === 'remove') {
+ // Eliminar la ruta si existe
+ $quickLinks = array_filter($quickLinks, function ($route) use ($validated) {
+ return $route !== $validated['route'];
+ });
+ }
+
+ Setting::updateOrCreate(['user_id' => Auth::user()->id, 'key' => 'quicklinks'], ['value' => json_encode($quickLinks)]);
+
+ VuexyAdminService::clearQuickLinksCache();
+ }
+
+ public function generalSettings()
+ {
+ return view('vuexy-admin::admin-settings.webapp-general-settings');
+ }
+
+ public function smtpSettings()
+ {
+ return view('vuexy-admin::admin-settings.smtp-settings');
+ }
+}
diff --git a/Http/Controllers/AuthController.php b/Http/Controllers/AuthController.php
new file mode 100644
index 0000000..49495e4
--- /dev/null
+++ b/Http/Controllers/AuthController.php
@@ -0,0 +1,144 @@
+ 'blank'];
+
+ return view("vuexy-admin::auth.login-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function registerView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+
+
+ public function confirmPasswordView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.confirm-password-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function resetPasswordView()
+ {
+ if (!Features::enabled(Features::resetPasswords()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.reset-password-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function requestPasswordResetLinkView(Request $request)
+ {
+ if (!Features::enabled(Features::resetPasswords()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.reset-password-{$viewMode}", ['pageConfigs' => $pageConfigs, 'request' => $request]);
+ }
+
+
+
+
+
+
+
+
+ public function twoFactorChallengeView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.two-factor-challenge-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function twoFactorRecoveryCodesView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function twoFactorAuthenticationView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+
+
+
+
+ public function verifyEmailView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.verify-email-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function showEmailVerificationForm()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function userProfileView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('vuexy.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("vuexy-admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+ */
+}
diff --git a/Http/Controllers/CacheController.php b/Http/Controllers/CacheController.php
new file mode 100644
index 0000000..fd365d6
--- /dev/null
+++ b/Http/Controllers/CacheController.php
@@ -0,0 +1,41 @@
+json(['success' => true, 'message' => 'Cache generado correctamente.']);
+ } catch (\Exception $e) {
+ return response()->json(['success' => false, 'message' => 'Error al generar el cache.', 'error' => $e->getMessage()], 500);
+ }
+ }
+
+ public function generateRouteCache()
+ {
+ try {
+ // Lógica para generar cache de rutas
+ Artisan::call('route:cache');
+
+ return response()->json(['success' => true, 'message' => 'Cache de rutas generado correctamente.']);
+ } catch (\Exception $e) {
+ return response()->json(['success' => false, 'message' => 'Error al generar el cache de rutas.', 'error' => $e->getMessage()], 500);
+ }
+ }
+
+ public function cacheManager(CacheConfigService $cacheConfigService)
+ {
+ $configCache = $cacheConfigService->getConfig();
+
+ return view('vuexy-admin::cache-manager.index', compact('configCache'));
+ }
+}
diff --git a/Http/Controllers/HomeController.php b/Http/Controllers/HomeController.php
new file mode 100644
index 0000000..86820df
--- /dev/null
+++ b/Http/Controllers/HomeController.php
@@ -0,0 +1,32 @@
+ 'blank'];
+
+ return view('vuexy-admin::pages.comingsoon', compact('pageConfigs'));
+ }
+
+ public function underMaintenance()
+ {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view('vuexy-admin::pages.under-maintenance', compact('pageConfigs'));
+ }
+}
diff --git a/Http/Controllers/LanguageController.php b/Http/Controllers/LanguageController.php
new file mode 100644
index 0000000..80b4874
--- /dev/null
+++ b/Http/Controllers/LanguageController.php
@@ -0,0 +1,21 @@
+session()->put('locale', $locale);
+ }
+ App::setLocale($locale);
+ return redirect()->back();
+ }
+}
diff --git a/Http/Controllers/PermissionController.php b/Http/Controllers/PermissionController.php
new file mode 100644
index 0000000..87fa3ca
--- /dev/null
+++ b/Http/Controllers/PermissionController.php
@@ -0,0 +1,37 @@
+ajax()) {
+ $permissions = Permission::latest()->get();
+
+ return DataTables::of($permissions)
+ ->addIndexColumn()
+ ->addColumn('assigned_to', function ($row) {
+ return (Arr::pluck($row->roles, ['name']));
+ })
+ ->editColumn('created_at', function ($request) {
+ return $request->created_at->format('Y-m-d h:i:s a');
+ })
+ ->make(true);
+ }
+
+ return view('vuexy-admin::permissions.index');
+ }
+}
diff --git a/Http/Controllers/RoleController.php b/Http/Controllers/RoleController.php
new file mode 100644
index 0000000..f1158e1
--- /dev/null
+++ b/Http/Controllers/RoleController.php
@@ -0,0 +1,38 @@
+input('id');
+ $name = $request->input('name');
+
+ // Verificar si el nombre ya existe en la base de datos
+ $existingRole = Role::where('name', $name)
+ ->whereNot('id', $id)
+ ->first();
+
+ if ($existingRole) {
+ return response()->json(['valid' => false]);
+ }
+
+ return response()->json(['valid' => true]);
+ }
+}
diff --git a/Http/Controllers/RolePermissionController.php b/Http/Controllers/RolePermissionController.php
new file mode 100644
index 0000000..d3d9c78
--- /dev/null
+++ b/Http/Controllers/RolePermissionController.php
@@ -0,0 +1,76 @@
+json([
+ 'roles' => Role::with('permissions')->get(),
+ 'permissions' => Permission::all()
+ ]);
+ }
+
+ public function storeRole(Request $request)
+ {
+ $request->validate(['name' => 'required|string|unique:roles,name']);
+ $role = Role::create(['name' => $request->name]);
+ return response()->json(['message' => 'Rol creado con éxito', 'role' => $role]);
+ }
+
+ public function storePermission(Request $request)
+ {
+ $request->validate(['name' => 'required|string|unique:permissions,name']);
+ $permission = Permission::create(['name' => $request->name]);
+ return response()->json(['message' => 'Permiso creado con éxito', 'permission' => $permission]);
+ }
+
+ public function assignPermissionToRole(Request $request)
+ {
+ $request->validate([
+ 'role_id' => 'required|exists:roles,id',
+ 'permission_id' => 'required|exists:permissions,id'
+ ]);
+
+ $role = Role::findById($request->role_id);
+ $permission = Permission::findById($request->permission_id);
+
+ $role->givePermissionTo($permission->name);
+
+ return response()->json(['message' => 'Permiso asignado con éxito']);
+ }
+
+ public function removePermissionFromRole(Request $request)
+ {
+ $request->validate([
+ 'role_id' => 'required|exists:roles,id',
+ 'permission_id' => 'required|exists:permissions,id'
+ ]);
+
+ $role = Role::findById($request->role_id);
+ $permission = Permission::findById($request->permission_id);
+
+ $role->revokePermissionTo($permission->name);
+
+ return response()->json(['message' => 'Permiso eliminado con éxito']);
+ }
+
+ public function deleteRole($id)
+ {
+ $role = Role::findOrFail($id);
+ $role->delete();
+ return response()->json(['message' => 'Rol eliminado con éxito']);
+ }
+
+ public function deletePermission($id)
+ {
+ $permission = Permission::findOrFail($id);
+ $permission->delete();
+ return response()->json(['message' => 'Permiso eliminado con éxito']);
+ }
+}
diff --git a/Http/Controllers/UserController copy.php b/Http/Controllers/UserController copy.php
new file mode 100644
index 0000000..117d910
--- /dev/null
+++ b/Http/Controllers/UserController copy.php
@@ -0,0 +1,188 @@
+ajax()) {
+ $users = User::when(!Auth::user()->hasRole('SuperAdmin'), function ($query) {
+ $query->where('id', '>', 1);
+ })
+ ->latest()
+ ->get();
+
+ return DataTables::of($users)
+ ->only(['id', 'name', 'email', 'avatar', 'roles', 'status', 'created_at'])
+ ->addIndexColumn()
+ ->addColumn('avatar', function ($user) {
+ return $user->profile_photo_url;
+ })
+ ->addColumn('roles', function ($user) {
+ return (Arr::pluck($user->roles, ['name']));
+ })
+ /*
+ ->addColumn('stores', function ($user) {
+ return (Arr::pluck($user->stores, ['nombre']));
+ })
+ y*/
+ ->editColumn('created_at', function ($user) {
+ return $user->created_at->format('Y-m-d');
+ })
+ ->make(true);
+ }
+
+ return view('vuexy-admin::users.index');
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(Request $request)
+ {
+ $validator = Validator::make($request->all(), [
+ 'name' => 'required|max:255',
+ 'email' => 'required|max:255|unique:users',
+ 'photo' => 'nullable|mimes:jpg,jpeg,png|max:1024',
+ 'password' => 'required',
+ ]);
+
+ if ($validator->fails())
+ return response()->json(['errors' => $validator->errors()->all()]);
+
+ // Preparamos los datos
+ $user_request = array_merge_recursive($request->all(), [
+ 'remember_token' => Str::random(10),
+ 'created_by' => Auth::user()->id,
+ ]);
+
+ $user_request['password'] = bcrypt($request->password);
+
+ // Guardamos el nuevo usuario
+ $user = User::create($user_request);
+
+ // Asignmos los permisos
+ $user->assignRole($request->roles);
+
+ // Asignamos Sucursals
+ //$user->stores()->attach($request->stores);
+
+ if ($request->file('photo')){
+ $avatarImageService = new AvatarImageService();
+
+ $avatarImageService->updateProfilePhoto($user, $request->file('photo'));
+ }
+
+ return response()->json(['success' => 'Se agrego correctamente el usuario']);
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int User $user
+ * @return \Illuminate\Http\Response
+ */
+ public function show(User $user)
+ {
+ return view('vuexy-admin::users.show', compact('user'));
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int User $user
+ * @return \Illuminate\Http\Response
+ */
+ public function updateAjax(Request $request, User $user)
+ {
+ // Validamos los datos
+ $validator = Validator::make($request->all(), [
+ 'name' => 'required|max:191',
+ 'email' => "required|max:191|unique:users,email," . $user->id,
+ 'photo' => 'nullable|mimes:jpg,jpeg,png|max:2048'
+ ]);
+
+ if ($validator->fails())
+ return response()->json(['errors' => $validator->errors()->all()]);
+
+ // Preparamos los datos
+ $user_request = $request->all();
+
+ if ($request->password) {
+ $user_request['password'] = bcrypt($request->password);
+ } else {
+ unset($user_request['password']);
+ }
+
+ // Guardamos los cambios
+ $user->update($user_request);
+
+ // Sincronizamos Roles
+ $user->syncRoles($request->roles);
+
+ // Sincronizamos Sucursals
+ //$user->stores()->sync($request->stores);
+
+ // Actualizamos foto de perfil
+ if ($request->file('photo'))
+ $avatarImageService = new AvatarImageService();
+
+ $avatarImageService->updateProfilePhoto($user, $request->file('photo'));
+
+ return response()->json(['success' => 'Se guardo correctamente los cambios.']);
+ }
+
+
+ public function userSettings(User $user)
+ {
+ return view('vuexy-admin::users.user-settings', compact('user'));
+ }
+
+ public function generateAvatar(Request $request)
+ {
+ // Validación de entrada
+ $request->validate([
+ 'name' => 'nullable|string',
+ 'color' => 'nullable|string|size:6',
+ 'background' => 'nullable|string|size:6',
+ 'size' => 'nullable|integer|min:20|max:1024'
+ ]);
+
+ $name = $request->get('name', 'NA');
+ $color = $request->get('color', '7F9CF5');
+ $background = $request->get('background', 'EBF4FF');
+ $size = $request->get('size', 100);
+
+ return User::getAvatarImage($name, $color, $background, $size);
+
+ try {
+ } catch (\Exception $e) {
+ // String base64 de una imagen PNG transparente de 1x1 píxel
+ $transparentBase64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==';
+
+ return response()->make(base64_decode($transparentBase64), 200, [
+ 'Content-Type' => 'image/png'
+ ]);
+ }
+ }
+}
diff --git a/Http/Controllers/UserController.php b/Http/Controllers/UserController.php
new file mode 100644
index 0000000..f5af305
--- /dev/null
+++ b/Http/Controllers/UserController.php
@@ -0,0 +1,234 @@
+ajax()) {
+ $bootstrapTableIndexConfig = [
+ 'table' => 'users',
+ 'columns' => [
+ 'users.id',
+ 'users.code',
+ DB::raw("CONCAT_WS(' ', users.name, users.last_name) AS full_name"),
+ 'users.email',
+ 'users.birth_date',
+ 'users.hire_date',
+ 'users.curp',
+ 'users.nss',
+ 'users.job_title',
+ 'users.profile_photo_path',
+ DB::raw("(SELECT GROUP_CONCAT(roles.name SEPARATOR ';') as roles FROM model_has_roles INNER JOIN roles ON (model_has_roles.role_id = roles.id) WHERE model_has_roles.model_id = 1) as roles"),
+ 'users.is_partner',
+ 'users.is_employee',
+ 'users.is_prospect',
+ 'users.is_customer',
+ 'users.is_provider',
+ 'users.is_user',
+ 'users.status',
+ DB::raw("CONCAT_WS(' ', created.name, created.last_name) AS creator"),
+ 'created.email AS creator_email',
+ 'users.created_at',
+ 'users.updated_at',
+ ],
+ 'joins' => [
+ [
+ 'table' => 'users as parent',
+ 'first' => 'users.parent_id',
+ 'second' => 'parent.id',
+ 'type' => 'leftJoin',
+ ],
+ [
+ 'table' => 'users as agent',
+ 'first' => 'users.agent_id',
+ 'second' => 'agent.id',
+ 'type' => 'leftJoin',
+ ],
+ [
+ 'table' => 'users as created',
+ 'first' => 'users.created_by',
+ 'second' => 'created.id',
+ 'type' => 'leftJoin',
+ ],
+ [
+ 'table' => 'sat_codigo_postal',
+ 'first' => 'users.domicilio_fiscal',
+ 'second' => 'sat_codigo_postal.c_codigo_postal',
+ 'type' => 'leftJoin',
+ ],
+ [
+ 'table' => 'sat_estado',
+ 'first' => 'sat_codigo_postal.c_estado',
+ 'second' => 'sat_estado.c_estado',
+ 'type' => 'leftJoin',
+ 'and' => [
+ 'sat_estado.c_pais = "MEX"',
+ ],
+ ],
+ [
+ 'table' => 'sat_localidad',
+ 'first' => 'sat_codigo_postal.c_localidad',
+ 'second' => 'sat_localidad.c_localidad',
+ 'type' => 'leftJoin',
+ 'and' => [
+ 'sat_codigo_postal.c_estado = sat_localidad.c_estado',
+ ],
+ ],
+ [
+ 'table' => 'sat_municipio',
+ 'first' => 'sat_codigo_postal.c_municipio',
+ 'second' => 'sat_municipio.c_municipio',
+ 'type' => 'leftJoin',
+ 'and' => [
+ 'sat_codigo_postal.c_estado = sat_municipio.c_estado',
+ ],
+ ],
+ [
+ 'table' => 'sat_regimen_fiscal',
+ 'first' => 'users.c_regimen_fiscal',
+ 'second' => 'sat_regimen_fiscal.c_regimen_fiscal',
+ 'type' => 'leftJoin',
+ ],
+ [
+ 'table' => 'sat_uso_cfdi',
+ 'first' => 'users.c_uso_cfdi',
+ 'second' => 'sat_uso_cfdi.c_uso_cfdi',
+ 'type' => 'leftJoin',
+ ],
+ ],
+ 'filters' => [
+ 'search' => ['users.name', 'users.email', 'users.code', 'parent.name', 'created.name'],
+ ],
+ 'sort_column' => 'users.name',
+ 'default_sort_order' => 'asc',
+ ];
+
+ return (new GenericQueryBuilder($request, $bootstrapTableIndexConfig))->getJson();
+ }
+
+ return view('vuexy-admin::users.index');
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(Request $request)
+ {
+ $validator = Validator::make($request->all(), [
+ 'name' => 'required|max:255',
+ 'email' => 'required|max:255|unique:users',
+ 'photo' => 'nullable|mimes:jpg,jpeg,png|max:1024',
+ 'password' => 'required',
+ ]);
+
+ if ($validator->fails())
+ return response()->json(['errors' => $validator->errors()->all()]);
+
+ // Preparamos los datos
+ $user_request = array_merge_recursive($request->all(), [
+ 'remember_token' => Str::random(10),
+ 'created_by' => Auth::user()->id,
+ ]);
+
+ $user_request['password'] = bcrypt($request->password);
+
+ // Guardamos el nuevo usuario
+ $user = User::create($user_request);
+
+ // Asignmos los permisos
+ $user->assignRole($request->roles);
+
+ // Asignamos Sucursals
+ //$user->stores()->attach($request->stores);
+
+ if ($request->file('photo')){
+ $avatarImageService = new AvatarImageService();
+
+ $avatarImageService->updateProfilePhoto($user, $request->file('photo'));
+ }
+
+ return response()->json(['success' => 'Se agrego correctamente el usuario']);
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param int User $user
+ * @return \Illuminate\Http\Response
+ */
+ public function show(User $user)
+ {
+ return view('vuexy-admin::users.show', compact('user'));
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param int User $user
+ * @return \Illuminate\Http\Response
+ */
+ public function updateAjax(Request $request, User $user)
+ {
+ // Validamos los datos
+ $validator = Validator::make($request->all(), [
+ 'name' => 'required|max:191',
+ 'email' => "required|max:191|unique:users,email," . $user->id,
+ 'photo' => 'nullable|mimes:jpg,jpeg,png|max:2048'
+ ]);
+
+ if ($validator->fails())
+ return response()->json(['errors' => $validator->errors()->all()]);
+
+ // Preparamos los datos
+ $user_request = $request->all();
+
+ if ($request->password) {
+ $user_request['password'] = bcrypt($request->password);
+ } else {
+ unset($user_request['password']);
+ }
+
+ // Guardamos los cambios
+ $user->update($user_request);
+
+ // Sincronizamos Roles
+ $user->syncRoles($request->roles);
+
+ // Sincronizamos Sucursals
+ //$user->stores()->sync($request->stores);
+
+ // Actualizamos foto de perfil
+ if ($request->file('photo'))
+ $avatarImageService = new AvatarImageService();
+
+ $avatarImageService->updateProfilePhoto($user, $request->file('photo'));
+
+ return response()->json(['success' => 'Se guardo correctamente los cambios.']);
+ }
+
+
+ public function userSettings(User $user)
+ {
+ return view('vuexy-admin::users.user-settings', compact('user'));
+ }
+
+}
diff --git a/Http/Controllers/UserProfileController.php b/Http/Controllers/UserProfileController.php
new file mode 100644
index 0000000..ac36c68
--- /dev/null
+++ b/Http/Controllers/UserProfileController.php
@@ -0,0 +1,54 @@
+validate([
+ 'name' => 'nullable|string',
+ 'color' => 'nullable|string|size:6',
+ 'background' => 'nullable|string|size:6',
+ 'size' => 'nullable|integer|min:20|max:1024'
+ ]);
+
+ $name = $request->get('name', 'NA');
+ $color = $request->get('color', '7F9CF5');
+ $background = $request->get('background', 'EBF4FF');
+ $size = $request->get('size', 100);
+
+ $avatarService = new AvatarInitialsService();
+
+ try {
+ return $avatarService->getAvatarImage($name, $color, $background, $size);
+
+ } catch (\Exception $e) {
+ // String base64 de una imagen PNG transparente de 1x1 píxel
+ $transparentBase64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==';
+
+ return response()->make(base64_decode($transparentBase64), 200, [
+ 'Content-Type' => 'image/png'
+ ]);
+ }
+ }
+
+
+}
diff --git a/Http/Middleware/AdminTemplateMiddleware.php b/Http/Middleware/AdminTemplateMiddleware.php
new file mode 100644
index 0000000..b6ce5b6
--- /dev/null
+++ b/Http/Middleware/AdminTemplateMiddleware.php
@@ -0,0 +1,37 @@
+header('Accept'), 'text/html')) {
+ $adminVars = app(AdminTemplateService::class)->getAdminVars();
+ $vuexyAdminService = app(VuexyAdminService::class);
+
+ View::share([
+ '_admin' => $adminVars,
+ 'vuexyMenu' => $vuexyAdminService->getMenu(),
+ 'vuexySearch' => $vuexyAdminService->getSearch(),
+ 'vuexyQuickLinks' => $vuexyAdminService->getQuickLinks(),
+ 'vuexyNotifications' => $vuexyAdminService->getNotifications(),
+ 'vuexyBreadcrumbs' => $vuexyAdminService->getBreadcrumbs(),
+ ]);
+
+ }
+
+ return $next($request);
+ }
+}
diff --git a/Listeners/ClearUserCache.php b/Listeners/ClearUserCache.php
new file mode 100644
index 0000000..41eb55f
--- /dev/null
+++ b/Listeners/ClearUserCache.php
@@ -0,0 +1,25 @@
+user) {
+ VuexyAdminService::clearUserMenuCache();
+ VuexyAdminService::clearSearchMenuCache();
+ VuexyAdminService::clearQuickLinksCache();
+ VuexyAdminService::clearNotificationsCache();
+ }
+ }
+}
diff --git a/Listeners/HandleUserLogin.php b/Listeners/HandleUserLogin.php
new file mode 100644
index 0000000..840669b
--- /dev/null
+++ b/Listeners/HandleUserLogin.php
@@ -0,0 +1,26 @@
+ $event->user->id,
+ 'ip_address' => request()->ip(),
+ 'user_agent' => request()->header('User-Agent'),
+ ]);
+
+ // Actualizar el último login
+ $event->user->update(['last_login_at' => now(), 'last_login_ip' => request()->ip()]);
+
+ // Enviar notificación de inicio de sesión
+ //Mail::to($event->user->email)->send(new LoginNotification($event->user));
+ }
+}
diff --git a/Livewire/AdminSettings/ApplicationSettings.php b/Livewire/AdminSettings/ApplicationSettings.php
new file mode 100644
index 0000000..4c5e131
--- /dev/null
+++ b/Livewire/AdminSettings/ApplicationSettings.php
@@ -0,0 +1,83 @@
+loadSettings();
+ }
+
+ public function loadSettings($clearcache = false)
+ {
+ $this->upload_image_logo = null;
+ $this->upload_image_logo_dark = null;
+
+ $adminTemplateService = app(AdminTemplateService::class);
+
+ if ($clearcache) {
+ $adminTemplateService->clearAdminVarsCache();
+ }
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $adminTemplateService->getAdminVars();
+
+ $this->admin_app_name = $settings['app_name'];
+ $this->admin_image_logo = $settings['image_logo']['large'];
+ $this->admin_image_logo_dark = $settings['image_logo']['large_dark'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'admin_app_name' => 'required|string|max:255',
+ 'upload_image_logo' => 'nullable|image|mimes:jpeg,png,jpg,svg,webp|max:20480',
+ 'upload_image_logo_dark' => 'nullable|image|mimes:jpeg,png,jpg,svg,webp|max:20480',
+ ]);
+
+ $adminSettingsService = app(AdminSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $adminSettingsService->updateSetting('admin_app_name', $this->admin_app_name);
+
+ // Procesar favicon si se ha cargado una imagen
+ if ($this->upload_image_logo) {
+ $adminSettingsService->processAndSaveImageLogo($this->upload_image_logo);
+ }
+
+ if ($this->upload_image_logo_dark) {
+ $adminSettingsService->processAndSaveImageLogo($this->upload_image_logo_dark, 'dark');
+ }
+
+ $this->loadSettings(true);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.admin-settings.application-settings');
+ }
+}
diff --git a/Livewire/AdminSettings/GeneralSettings.php b/Livewire/AdminSettings/GeneralSettings.php
new file mode 100644
index 0000000..e1a1cf1
--- /dev/null
+++ b/Livewire/AdminSettings/GeneralSettings.php
@@ -0,0 +1,84 @@
+loadSettings();
+ }
+
+ public function loadSettings($clearcache = false)
+ {
+ $this->upload_image_favicon = null;
+
+ $adminTemplateService = app(AdminTemplateService::class);
+
+ if ($clearcache) {
+ $adminTemplateService->clearAdminVarsCache();
+ }
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $adminTemplateService->getAdminVars();
+
+ $this->admin_title = $settings['title'];
+ $this->admin_favicon_16x16 = $settings['favicon']['16x16'];
+ $this->admin_favicon_76x76 = $settings['favicon']['76x76'];
+ $this->admin_favicon_120x120 = $settings['favicon']['120x120'];
+ $this->admin_favicon_152x152 = $settings['favicon']['152x152'];
+ $this->admin_favicon_180x180 = $settings['favicon']['180x180'];
+ $this->admin_favicon_192x192 = $settings['favicon']['192x192'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'admin_title' => 'required|string|max:255',
+ 'upload_image_favicon' => 'nullable|image|mimes:jpeg,png,jpg,svg,webp|max:20480',
+ ]);
+
+ $adminSettingsService = app(AdminSettingsService::class);
+
+ // Guardar título del sitio en configuraciones
+ $adminSettingsService->updateSetting('admin_title', $this->admin_title);
+
+ // Procesar favicon si se ha cargado una imagen
+ if ($this->upload_image_favicon) {
+ $adminSettingsService->processAndSaveFavicon($this->upload_image_favicon);
+ }
+
+ $this->loadSettings(true);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.admin-settings.general-settings');
+ }
+}
diff --git a/Livewire/AdminSettings/InterfaceSettings.php b/Livewire/AdminSettings/InterfaceSettings.php
new file mode 100644
index 0000000..33ea5b1
--- /dev/null
+++ b/Livewire/AdminSettings/InterfaceSettings.php
@@ -0,0 +1,118 @@
+loadSettings();
+ }
+
+
+ public function loadSettings()
+ {
+ $adminTemplateService = app(AdminTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $adminTemplateService->getVuexyCustomizerVars();
+
+ $this->vuexy_myLayout = $settings['myLayout'];
+ $this->vuexy_myTheme = $settings['myTheme'];
+ $this->vuexy_myStyle = $settings['myStyle'];
+ $this->vuexy_hasCustomizer = $settings['hasCustomizer'];
+ $this->vuexy_displayCustomizer = $settings['displayCustomizer'];
+ $this->vuexy_contentLayout = $settings['contentLayout'];
+ $this->vuexy_navbarType = $settings['navbarType'];
+ $this->vuexy_footerFixed = $settings['footerFixed'];
+ $this->vuexy_menuFixed = $settings['menuFixed'];
+ $this->vuexy_menuCollapsed = $settings['menuCollapsed'];
+ $this->vuexy_headerType = $settings['headerType'];
+ $this->vuexy_showDropdownOnHover = $settings['showDropdownOnHover'];
+ $this->vuexy_authViewMode = $settings['authViewMode'];
+ $this->vuexy_maxQuickLinks = $settings['maxQuickLinks'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'vuexy_maxQuickLinks' => 'required|integer|min:2|max:20',
+ ]);
+
+ $globalSettingsService = app(GlobalSettingsService::class);
+
+ // Guardar configuraciones
+ $globalSettingsService->updateSetting('config.vuexy.custom.myLayout', $this->vuexy_myLayout);
+ $globalSettingsService->updateSetting('config.vuexy.custom.myTheme', $this->vuexy_myTheme);
+ $globalSettingsService->updateSetting('config.vuexy.custom.myStyle', $this->vuexy_myStyle);
+ $globalSettingsService->updateSetting('config.vuexy.custom.hasCustomizer', $this->vuexy_hasCustomizer);
+ $globalSettingsService->updateSetting('config.vuexy.custom.displayCustomizer', $this->vuexy_displayCustomizer);
+ $globalSettingsService->updateSetting('config.vuexy.custom.contentLayout', $this->vuexy_contentLayout);
+ $globalSettingsService->updateSetting('config.vuexy.custom.navbarType', $this->vuexy_navbarType);
+ $globalSettingsService->updateSetting('config.vuexy.custom.footerFixed', $this->vuexy_footerFixed);
+ $globalSettingsService->updateSetting('config.vuexy.custom.menuFixed', $this->vuexy_menuFixed);
+ $globalSettingsService->updateSetting('config.vuexy.custom.menuCollapsed', $this->vuexy_menuCollapsed);
+ $globalSettingsService->updateSetting('config.vuexy.custom.headerType', $this->vuexy_headerType);
+ $globalSettingsService->updateSetting('config.vuexy.custom.showDropdownOnHover', $this->vuexy_showDropdownOnHover);
+ $globalSettingsService->updateSetting('config.vuexy.custom.authViewMode', $this->vuexy_authViewMode);
+ $globalSettingsService->updateSetting('config.vuexy.custom.maxQuickLinks', $this->vuexy_maxQuickLinks);
+
+ $globalSettingsService->clearSystemConfigCache();
+
+ // Refrescar el componente actual
+ $this->dispatch('clearLocalStoregeTemplateCustomizer');
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.',
+ deferReload: true
+ );
+ }
+
+ public function clearCustomConfig()
+ {
+ $globalSettingsService = app(GlobalSettingsService::class);
+
+ $globalSettingsService->clearVuexyConfig();
+
+ // Refrescar el componente actual
+ $this->dispatch('clearLocalStoregeTemplateCustomizer');
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.',
+ deferReload: true
+ );
+ }
+
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.admin-settings.interface-settings');
+ }
+}
diff --git a/Livewire/AdminSettings/MailSenderResponseSettings.php b/Livewire/AdminSettings/MailSenderResponseSettings.php
new file mode 100644
index 0000000..a6a1d35
--- /dev/null
+++ b/Livewire/AdminSettings/MailSenderResponseSettings.php
@@ -0,0 +1,106 @@
+ 'save'];
+
+ const REPLY_EMAIL_CREATOR = 1;
+ const REPLY_EMAIL_SENDER = 2;
+ const REPLY_EMAIL_CUSTOM = 3;
+
+ public $reply_email_options = [
+ self::REPLY_EMAIL_CREATOR => 'Responder al creador del documento',
+ self::REPLY_EMAIL_SENDER => 'Responder a quien envía el documento',
+ self::REPLY_EMAIL_CUSTOM => 'Definir dirección de correo electrónico',
+ ];
+
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+
+ public function loadSettings()
+ {
+ $globalSettingsService = app(GlobalSettingsService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $globalSettingsService->getMailSystemConfig();
+
+ $this->from_address = $settings['from']['address'];
+ $this->from_name = $settings['from']['name'];
+ $this->reply_to_method = $settings['reply_to']['method'];
+ $this->reply_to_email = $settings['reply_to']['email'];
+ $this->reply_to_name = $settings['reply_to']['name'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'from_address' => 'required|email',
+ 'from_name' => 'required|string|max:255',
+ 'reply_to_method' => 'required|string|max:255',
+ ], [
+ 'from_address.required' => 'El campo de correo electrónico es obligatorio.',
+ 'from_address.email' => 'El formato del correo electrónico no es válido.',
+ 'from_name.required' => 'El nombre es obligatorio.',
+ 'from_name.string' => 'El nombre debe ser una cadena de texto.',
+ 'from_name.max' => 'El nombre no puede tener más de 255 caracteres.',
+ 'reply_to_method.required' => 'El método de respuesta es obligatorio.',
+ 'reply_to_method.string' => 'El método de respuesta debe ser una cadena de texto.',
+ 'reply_to_method.max' => 'El método de respuesta no puede tener más de 255 caracteres.',
+ ]);
+
+ if ($this->reply_to_method == self::REPLY_EMAIL_CUSTOM) {
+ $this->validate([
+ 'reply_to_email' => ['required', 'email'],
+ 'reply_to_name' => ['required', 'string', 'max:255'],
+ ], [
+ 'reply_to_email.required' => 'El correo de respuesta es obligatorio.',
+ 'reply_to_email.email' => 'El formato del correo de respuesta no es válido.',
+ 'reply_to_name.required' => 'El nombre de respuesta es obligatorio.',
+ 'reply_to_name.string' => 'El nombre de respuesta debe ser una cadena de texto.',
+ 'reply_to_name.max' => 'El nombre de respuesta no puede tener más de 255 caracteres.',
+ ]);
+ }
+
+ $globalSettingsService = app(GlobalSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $globalSettingsService->updateSetting('mail.from.address', $this->from_address);
+ $globalSettingsService->updateSetting('mail.from.name', $this->from_name);
+ $globalSettingsService->updateSetting('mail.reply_to.method', $this->reply_to_method);
+ $globalSettingsService->updateSetting('mail.reply_to.email', $this->reply_to_method == self::REPLY_EMAIL_CUSTOM ? $this->reply_to_email : '');
+ $globalSettingsService->updateSetting('mail.reply_to.name', $this->reply_to_method == self::REPLY_EMAIL_CUSTOM ? $this->reply_to_name : '');
+
+ $globalSettingsService->clearMailSystemConfigCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.',
+ );
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.admin-settings.mail-sender-response-settings');
+ }
+}
diff --git a/Livewire/AdminSettings/MailSmtpSettings.php b/Livewire/AdminSettings/MailSmtpSettings.php
new file mode 100644
index 0000000..3ddc256
--- /dev/null
+++ b/Livewire/AdminSettings/MailSmtpSettings.php
@@ -0,0 +1,175 @@
+ 'SSL (Secure Sockets Layer)',
+ self::SMTP_ENCRYPTION_TLS => 'TLS (Transport Layer Security)',
+ self::SMTP_ENCRYPTION_NONE => 'Sin encriptación (No recomendado)',
+ ];
+
+ public $rules = [
+ [
+ 'host' => 'nullable|string|max:255',
+ 'port' => 'nullable|integer',
+ 'encryption' => 'nullable|string',
+ 'username' => 'nullable|string|max:255',
+ 'password' => 'nullable|string|max:255',
+ ],
+ [
+ 'host.string' => 'El servidor SMTP debe ser una cadena de texto.',
+ 'host.max' => 'El servidor SMTP no puede exceder los 255 caracteres.',
+ 'port.integer' => 'El puerto SMTP debe ser un número entero.',
+ 'encryption.string' => 'El tipo de encriptación SMTP debe ser una cadena de texto.',
+ 'username.string' => 'El nombre de usuario SMTP debe ser una cadena de texto.',
+ 'username.max' => 'El nombre de usuario SMTP no puede exceder los 255 caracteres.',
+ 'password.string' => 'La contraseña SMTP debe ser una cadena de texto.',
+ 'password.max' => 'La contraseña SMTP no puede exceder los 255 caracteres.',
+ ]
+ ];
+
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $globalSettingsService = app(GlobalSettingsService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $globalSettingsService->getMailSystemConfig();
+
+ $this->change_smtp_settings = false;
+ $this->save_button_disabled = true;
+
+ $this->host = $settings['mailers']['smtp']['host'];
+ $this->port = $settings['mailers']['smtp']['port'];
+ $this->encryption = $settings['mailers']['smtp']['encryption'];
+ $this->username = $settings['mailers']['smtp']['username'];
+ $this->password = null;
+ }
+
+ public function save()
+ {
+ $this->validate($this->rules[0]);
+
+ $globalSettingsService = app(GlobalSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $globalSettingsService->updateSetting('mail.mailers.smtp.host', $this->host);
+ $globalSettingsService->updateSetting('mail.mailers.smtp.port', $this->port);
+ $globalSettingsService->updateSetting('mail.mailers.smtp.encryption', $this->encryption);
+ $globalSettingsService->updateSetting('mail.mailers.smtp.username', $this->username);
+ $globalSettingsService->updateSetting('mail.mailers.smtp.password', Crypt::encryptString($this->password));
+
+ $globalSettingsService->clearMailSystemConfigCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function testSmtpConnection()
+ {
+ // Validar los datos del formulario
+ $this->validate($this->rules[0]);
+
+ try {
+ // Verificar la conexión SMTP
+ if ($this->validateSMTPConnection()) {
+ $this->save_button_disabled = false;
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Conexión SMTP exitosa, se guardó los cambios exitosamente.',
+ );
+ }
+ } catch (\Exception $e) {
+ // Captura y maneja errores de conexión SMTP
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'danger',
+ message: 'Error en la conexión SMTP: ' . $e->getMessage(),
+ delay: 15000 // Timeout personalizado
+ );
+ }
+ }
+
+ private function validateSMTPConnection()
+ {
+ $dsn = sprintf(
+ 'smtp://%s:%s@%s:%s?encryption=%s',
+ urlencode($this->username), // Codificar nombre de usuario
+ urlencode($this->password), // Codificar contraseña
+ $this->host, // Host SMTP
+ $this->port, // Puerto SMTP
+ $this->encryption // Encriptación (tls o ssl)
+ );
+
+ // Crear el transportador usando el DSN
+ $transport = Transport::fromDsn($dsn);
+
+ // Crear el mailer con el transportador personalizado
+ $mailer = new Mailer($transport);
+
+ // Enviar un correo de prueba
+ $email = (new Email())
+ ->from($this->username) // Dirección de correo del remitente
+ ->to(env('MAIL_SANDBOX')) // Dirección de correo de destino
+ ->subject(Config::get('app.name') . ' - Correo de prueba')
+ ->text('Este es un correo de prueba para verificar la conexión SMTP.');
+
+ // Enviar el correo
+ $mailer->send($email);
+
+ return true;
+ }
+
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.admin-settings.mail-smtp-settings');
+ }
+}
diff --git a/Livewire/Cache/CacheFunctions.php b/Livewire/Cache/CacheFunctions.php
new file mode 100644
index 0000000..1ec47da
--- /dev/null
+++ b/Livewire/Cache/CacheFunctions.php
@@ -0,0 +1,212 @@
+ 0,
+ 'config' => 0,
+ 'routes' => 0,
+ 'views' => 0,
+ 'events' => 0,
+ ];
+
+ protected $listeners = [
+ 'reloadCacheFunctionsStatsEvent' => 'reloadCacheStats',
+ ];
+
+ public function mount()
+ {
+ $this->reloadCacheStats(false);
+ }
+
+ public function reloadCacheStats($notify = true)
+ {
+ $cacheDriver = config('cache.default'); // Obtiene el driver configurado para caché
+
+ // Caché General
+ switch ($cacheDriver) {
+ case 'memcached':
+ try {
+ $cacheStore = Cache::getStore()->getMemcached();
+ $stats = $cacheStore->getStats();
+
+ $this->cacheCounts['general'] = array_sum(array_column($stats, 'curr_items')); // Total de claves en Memcached
+ } catch (\Exception $e) {
+ $this->cacheCounts['general'] = 'Error obteniendo datos de Memcached';
+ }
+ break;
+
+ case 'redis':
+ try {
+ $prefix = config('cache.prefix'); // Asegúrate de agregar el sufijo correcto si es necesario
+ $keys = Redis::connection('cache')->keys($prefix . '*');
+
+ $this->cacheCounts['general'] = count($keys); // Total de claves en Redis
+ } catch (\Exception $e) {
+ $this->cacheCounts['general'] = 'Error obteniendo datos de Redis';
+ }
+ break;
+
+ case 'database':
+ try {
+ $this->cacheCounts['general'] = DB::table('cache')->count(); // Total de registros en la tabla de caché
+ } catch (\Exception $e) {
+ $this->cacheCounts['general'] = 'Error obteniendo datos de la base de datos';
+ }
+ break;
+
+ case 'file':
+ try {
+ $cachePath = config('cache.stores.file.path');
+ $files = glob($cachePath . '/*');
+
+ $this->cacheCounts['general'] = count($files);
+ } catch (\Exception $e) {
+ $this->cacheCounts['general'] = 'Error obteniendo datos de archivos';
+ }
+ break;
+
+ default:
+ $this->cacheCounts['general'] = 'Driver de caché no soportado';
+ }
+
+ // Configuración
+ $this->cacheCounts['config'] = file_exists(base_path('bootstrap/cache/config.php')) ? 1 : 0;
+
+ // Rutas
+ $this->cacheCounts['routes'] = count(glob(base_path('bootstrap/cache/routes-*.php'))) > 0 ? 1 : 0;
+
+ // Vistas
+ $this->cacheCounts['views'] = count(glob(storage_path('framework/views/*')));
+
+ // Configuración
+ $this->cacheCounts['events'] = file_exists(base_path('bootstrap/cache/events.php')) ? 1 : 0;
+
+ if ($notify) {
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han recargado los estadísticos de caché.'
+ );
+ }
+ }
+
+
+ public function clearLaravelCache()
+ {
+ Artisan::call('cache:clear');
+
+ sleep(1);
+
+ $this->response('Se han limpiado las cachés de la aplicación.', 'warning');
+ }
+
+ public function clearConfigCache()
+ {
+ Artisan::call('config:clear');
+
+ $this->response('Se ha limpiado la cache de la configuración de Laravel.', 'warning');
+ }
+
+ public function configCache()
+ {
+ Artisan::call('config:cache');
+ }
+
+ public function clearRouteCache()
+ {
+ Artisan::call('route:clear');
+
+ $this->response('Se han limpiado las rutas de Laravel.', 'warning');
+ }
+
+ public function cacheRoutes()
+ {
+ Artisan::call('route:cache');
+ }
+
+ public function clearViewCache()
+ {
+ Artisan::call('view:clear');
+
+ $this->response('Se han limpiado las vistas de Laravel.', 'warning');
+ }
+
+ public function cacheViews()
+ {
+ Artisan::call('view:cache');
+
+ $this->response('Se han cacheado las vistas de Laravel.');
+ }
+
+ public function clearEventCache()
+ {
+ Artisan::call('event:clear');
+
+ $this->response('Se han limpiado los eventos de Laravel.', 'warning');
+ }
+
+ public function cacheEvents()
+ {
+ Artisan::call('event:cache');
+
+ $this->response('Se han cacheado los eventos de Laravel.');
+ }
+
+ public function optimizeClear()
+ {
+ Artisan::call('optimize:clear');
+
+ $this->response('Se han optimizado todos los cachés de Laravel.');
+ }
+
+ public function resetPermissionCache()
+ {
+ Artisan::call('permission:cache-reset');
+
+ $this->response('Se han limpiado los cachés de permisos.', 'warning');
+ }
+
+ public function clearResetTokens()
+ {
+ Artisan::call('auth:clear-resets');
+
+ $this->response('Se han limpiado los tokens de reseteo de contraseña.', 'warning');
+ }
+
+ /**
+ * Genera una respuesta estandarizada.
+ */
+ private function response(string $message, string $type = 'success'): void
+ {
+ $this->reloadCacheStats(false);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $type,
+ message: $message,
+ );
+
+ $this->dispatch('reloadCacheStatsEvent', notify: false);
+ $this->dispatch('reloadSessionStatsEvent', notify: false);
+ $this->dispatch('reloadRedisStatsEvent', notify: false);
+ $this->dispatch('reloadMemcachedStatsEvent', notify: false);
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.cache.cache-functions');
+ }
+}
diff --git a/Livewire/Cache/CacheStats.php b/Livewire/Cache/CacheStats.php
new file mode 100644
index 0000000..ab54e66
--- /dev/null
+++ b/Livewire/Cache/CacheStats.php
@@ -0,0 +1,65 @@
+ 'reloadCacheStats'];
+
+ public function mount(CacheConfigService $cacheConfigService)
+ {
+ $this->cacheConfig = $cacheConfigService->getConfig();
+
+ $this->reloadCacheStats(false);
+ }
+
+ public function reloadCacheStats($notify = true)
+ {
+ $cacheManagerService = new CacheManagerService();
+
+ $this->cacheStats = $cacheManagerService->getCacheStats();
+
+ if ($notify) {
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $this->cacheStats['status'],
+ message: $this->cacheStats['message']
+ );
+ }
+ }
+
+ public function clearCache()
+ {
+ $cacheManagerService = new CacheManagerService();
+
+ $message = $cacheManagerService->clearCache();
+
+ $this->reloadCacheStats(false);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $message['status'],
+ message: $message['message'],
+ );
+
+ $this->dispatch('reloadRedisStatsEvent', notify: false);
+ $this->dispatch('reloadMemcachedStatsEvent', notify: false);
+ $this->dispatch('reloadCacheFunctionsStatsEvent', notify: false);
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.cache.cache-stats');
+ }
+}
diff --git a/Livewire/Cache/MemcachedStats.php b/Livewire/Cache/MemcachedStats.php
new file mode 100644
index 0000000..456b108
--- /dev/null
+++ b/Livewire/Cache/MemcachedStats.php
@@ -0,0 +1,64 @@
+ 'reloadCacheStats'];
+
+ public function mount()
+ {
+ $this->reloadCacheStats(false);
+ }
+
+ public function reloadCacheStats($notify = true)
+ {
+ $cacheManagerService = new CacheManagerService($this->driver);
+
+ $memcachedStats = $cacheManagerService->getMemcachedStats();
+
+ $this->memcachedStats = $memcachedStats['info'];
+
+ if ($notify) {
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $memcachedStats['status'],
+ message: $memcachedStats['message']
+ );
+ }
+ }
+
+ public function clearCache()
+ {
+ $cacheManagerService = new CacheManagerService($this->driver);
+
+ $message = $cacheManagerService->clearCache();
+
+ $this->reloadCacheStats(false);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $message['status'],
+ message: $message['message'],
+ );
+
+ $this->dispatch('reloadCacheStatsEvent', notify: false);
+ $this->dispatch('reloadSessionStatsEvent', notify: false);
+ $this->dispatch('reloadCacheFunctionsStatsEvent', notify: false);
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.cache.memcached-stats');
+ }
+}
diff --git a/Livewire/Cache/RedisStats.php b/Livewire/Cache/RedisStats.php
new file mode 100644
index 0000000..25946b0
--- /dev/null
+++ b/Livewire/Cache/RedisStats.php
@@ -0,0 +1,64 @@
+ 'reloadCacheStats'];
+
+ public function mount()
+ {
+ $this->reloadCacheStats(false);
+ }
+
+ public function reloadCacheStats($notify = true)
+ {
+ $cacheManagerService = new CacheManagerService($this->driver);
+
+ $redisStats = $cacheManagerService->getRedisStats();
+
+ $this->redisStats = $redisStats['info'];
+
+ if ($notify) {
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $redisStats['status'],
+ message: $redisStats['message']
+ );
+ }
+ }
+
+ public function clearCache()
+ {
+ $cacheManagerService = new CacheManagerService($this->driver);
+
+ $message = $cacheManagerService->clearCache();
+
+ $this->reloadCacheStats(false);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $message['status'],
+ message: $message['message'],
+ );
+
+ $this->dispatch('reloadCacheStatsEvent', notify: false);
+ $this->dispatch('reloadSessionStatsEvent', notify: false);
+ $this->dispatch('reloadCacheFunctionsStatsEvent', notify: false);
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.cache.redis-stats');
+ }
+}
diff --git a/Livewire/Cache/SessionStats.php b/Livewire/Cache/SessionStats.php
new file mode 100644
index 0000000..c6fb063
--- /dev/null
+++ b/Livewire/Cache/SessionStats.php
@@ -0,0 +1,63 @@
+ 'reloadSessionStats'];
+
+ public function mount(CacheConfigService $cacheConfigService)
+ {
+ $this->cacheConfig = $cacheConfigService->getConfig();
+ $this->reloadSessionStats(false);
+ }
+
+ public function reloadSessionStats($notify = true)
+ {
+ $sessionManagerService = new SessionManagerService();
+
+ $this->sessionStats = $sessionManagerService->getSessionStats();
+
+ if ($notify) {
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $this->sessionStats['status'],
+ message: $this->sessionStats['message']
+ );
+ }
+ }
+
+ public function clearSessions()
+ {
+ $sessionManagerService = new SessionManagerService();
+
+ $message = $sessionManagerService->clearSessions();
+
+ $this->reloadSessionStats(false);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: $message['status'],
+ message: $message['message'],
+ );
+
+ $this->dispatch('reloadRedisStatsEvent', notify: false);
+ $this->dispatch('reloadMemcachedStatsEvent', notify: false);
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.cache.session-stats');
+ }
+}
diff --git a/Livewire/Form/AbstractFormComponent.php b/Livewire/Form/AbstractFormComponent.php
new file mode 100644
index 0000000..eceaca3
--- /dev/null
+++ b/Livewire/Form/AbstractFormComponent.php
@@ -0,0 +1,515 @@
+uniqueId = uniqid();
+ $this->mode = $mode;
+ $this->id = $id;
+
+ $model = new ($this->model());
+
+ $this->tagName = $model->tagName;
+ $this->columnNameLabel = $model->columnNameLabel;
+ $this->singularName = $model->singularName;
+ $this->formId = Str::camel($model->tagName) .'Form';
+
+ $this->setBtnSubmitText();
+
+ if ($this->mode !== 'create' && $this->id) {
+ // Si no es modo 'create', cargamos el registro desde la BD
+ $record = $this->model()::findOrFail($this->id);
+
+ $this->initializeFormData($record, $mode);
+
+ } else {
+ // Modo 'create', o sin ID: iniciamos datos vacíos
+ $this->initializeFormData(null, $mode);
+ }
+ }
+
+ /**
+ * Configura el texto del botón principal de envío, basado en la propiedad $mode.
+ *
+ * @return void
+ */
+ private function setBtnSubmitText(): void
+ {
+ $this->btnSubmitText = match ($this->mode) {
+ 'create' => 'Crear ' . $this->singularName(),
+ 'edit' => 'Guardar cambios',
+ 'delete' => 'Eliminar ' . $this->singularName(),
+ default => 'Enviar'
+ };
+ }
+
+ /**
+ * Retorna el "singularName" definido en el modelo asociado.
+ * Permite también decidir si se devuelve con la primera letra en mayúscula
+ * o en minúscula.
+ *
+ * @param string $type Puede ser 'uppercase' o 'lowercase'. Por defecto, 'lowercase'.
+ * @return string Nombre en singular del modelo, formateado.
+ */
+ private function singularName($type = 'lowercase'): string
+ {
+ /** @var Model $model */
+ $model = new ($this->model());
+
+ return $type === 'uppercase'
+ ? ucfirst($model->singularName)
+ : lcfirst($model->singularName);
+ }
+
+ /**
+ * Método del ciclo de vida de Livewire que se llama en cada hidratación.
+ * Puedes disparar eventos o manejar lógica que suceda en cada request
+ * una vez que Livewire 'rehidrate' el componente en el servidor.
+ *
+ * @return void
+ */
+ public function hydrate(): void
+ {
+ $this->dispatch($this->dispatches()['on-hydrate']);
+ }
+
+ // ======================================================================
+ // OPERACIONES CRUD
+ // ======================================================================
+
+ /**
+ * Método principal de envío del formulario (submit). Gestiona los flujos
+ * de crear, editar o eliminar un registro dentro de una transacción de BD.
+ *
+ * @return void
+ */
+ public function onSubmit(): void
+ {
+ DB::beginTransaction();
+
+ try {
+ if ($this->mode === 'delete') {
+ $this->delete();
+ } else {
+ $this->save();
+ }
+
+ DB::commit();
+
+ } catch (ValidationException $e) {
+ DB::rollBack();
+ $this->handleValidationException($e);
+
+ } catch (QueryException $e) {
+ DB::rollBack();
+ $this->handleDatabaseException($e);
+
+ } catch (ModelNotFoundException $e) {
+ DB::rollBack();
+ $this->handleException('danger', 'Registro no encontrado.');
+
+ } catch (Exception $e) {
+ DB::rollBack();
+ $this->handleException('danger', 'Error al eliminar el registro: ' . $e->getMessage());
+ }
+ }
+
+ /**
+ * Crea o actualiza un registro en la base de datos,
+ * aplicando validaciones y llamadas a hooks antes y después de guardar.
+ *
+ * @return void
+ * @throws ValidationException
+ */
+ protected function save(): void
+ {
+ // Validamos los datos, con posibles atributos y mensajes personalizados
+ $validatedData = $this->validate(
+ $this->dynamicRules($this->mode),
+ $this->messages(),
+ $this->attributes()
+ );
+
+ // Hook previo (por referencia)
+ $this->beforeSave($validatedData);
+
+ // Ajustamos/convertimos los datos finales
+ $data = $this->prepareData($validatedData);
+ $record = $this->model()::updateOrCreate(['id' => $this->id], $data);
+
+ // Hook posterior
+ $this->afterSave($record);
+
+ // Notificamos éxito
+ $this->handleSuccess('success', $this->singularName('uppercase') . " guardado correctamente.");
+ }
+
+ /**
+ * Elimina un registro de la base de datos (modo 'delete'),
+ * aplicando validaciones y hooks antes y después de la eliminación.
+ *
+ * @return void
+ * @throws ValidationException
+ */
+ protected function delete(): void
+ {
+ $this->validate($this->dynamicRules('delete', $this->messages(), $this->attributes()));
+
+ $record = $this->model()::findOrFail($this->id);
+
+ // Hook antes de la eliminación
+ $this->beforeDelete($record);
+
+ $record->delete();
+
+ // Hook después de la eliminación
+ $this->afterDelete($record);
+
+ $this->handleSuccess('warning', $this->singularName('uppercase') . " eliminado.");
+ }
+
+ // ======================================================================
+ // HOOKS DE ACCIONES
+ // ======================================================================
+
+ /**
+ * Hook que se ejecuta antes de guardar o actualizar un registro.
+ * Puede usarse para ajustar o limpiar datos antes de la operación en base de datos.
+ *
+ * @param array $data Datos validados que se van a guardar.
+ * Se pasa por referencia para permitir cambios.
+ * @return void
+ */
+ protected function beforeSave(array &$data): void {}
+
+ /**
+ * Hook que se ejecuta después de guardar o actualizar un registro.
+ * Puede usarse para acciones como disparar eventos, notificaciones a otros sistemas, etc.
+ *
+ * @param mixed $record Instancia del modelo recién creado o actualizado.
+ * @return void
+ */
+ protected function afterSave($record): void {}
+
+ /**
+ * Hook que se ejecuta antes de eliminar un registro.
+ * Puede emplearse para validaciones adicionales o limpieza de datos relacionados.
+ *
+ * @param mixed $record Instancia del modelo que se eliminará.
+ * @return void
+ */
+ protected function beforeDelete($record): void {}
+
+ /**
+ * Hook que se ejecuta después de eliminar un registro.
+ * Útil para operaciones finales, como remover archivos relacionados o
+ * disparar un evento de "elemento eliminado".
+ *
+ * @param mixed $record Instancia del modelo que se acaba de eliminar.
+ * @return void
+ */
+ protected function afterDelete($record): void {}
+
+ // ======================================================================
+ // MANEJO DE VALIDACIONES Y ERRORES
+ // ======================================================================
+
+ /**
+ * Maneja las excepciones de validación (ValidationException).
+ * Asigna los errores al error bag de Livewire y muestra notificaciones.
+ *
+ * @param ValidationException $e Excepción de validación.
+ * @return void
+ */
+ protected function handleValidationException(ValidationException $e): void
+ {
+ $this->setErrorBag($e->validator->errors());
+ $this->handleException('danger', 'Error en la validación de los datos.');
+ $this->dispatch($this->dispatches()['on-failed-validation']);
+ }
+
+ /**
+ * Maneja las excepciones de base de datos (QueryException).
+ * Incluye casos especiales para claves foráneas y duplicadas.
+ *
+ * @param QueryException $e Excepción de consulta a la base de datos.
+ * @return void
+ */
+ protected function handleDatabaseException(QueryException $e): void
+ {
+ $errorMessage = match ($e->errorInfo[1]) {
+ 1452 => "Una clave foránea no es válida.",
+ 1062 => $this->extractDuplicateField($e->getMessage()),
+ 1451 => "No se puede eliminar el registro porque está en uso.",
+ default => env('APP_DEBUG') ? $e->getMessage() : "Error inesperado en la base de datos.",
+ };
+
+ $this->handleException('danger', $errorMessage, 'form', 120000);
+ }
+
+ /**
+ * Maneja excepciones o errores generales, mostrando una notificación al usuario.
+ *
+ * @param string $type Tipo de notificación (por ejemplo, 'success', 'warning', 'danger').
+ * @param string $message Mensaje que se mostrará en la notificación.
+ * @param string $target Objetivo/área donde se mostrará la notificación ('form', 'index', etc.).
+ * @param int $delay Tiempo en milisegundos que la notificación permanecerá visible.
+ * @return void
+ */
+ protected function handleException($type, $message, $target = 'form', $delay = 9000): void
+ {
+ $this->dispatchNotification($type, $message, $target, $delay);
+ }
+
+ /**
+ * Extrae el campo duplicado de un mensaje de error MySQL, para mostrar un mensaje amigable.
+ *
+ * @param string $errorMessage Mensaje de error completo de la base de datos.
+ * @return string Mensaje simplificado indicando cuál campo está duplicado.
+ */
+ private function extractDuplicateField($errorMessage): string
+ {
+ preg_match("/for key 'unique_(.*?)'/", $errorMessage, $matches);
+
+ return isset($matches[1])
+ ? "El valor ingresado para '" . str_replace('_', ' ', $matches[1]) . "' ya está en uso."
+ : "Ya existe un registro con este valor.";
+ }
+
+ // ======================================================================
+ // NOTIFICACIONES Y REDIRECCIONAMIENTOS
+ // ======================================================================
+
+ /**
+ * Maneja el flujo de notificación y redirección cuando una operación
+ * (guardar, eliminar) finaliza satisfactoriamente.
+ *
+ * @param string $type Tipo de notificación ('success', 'warning', etc.).
+ * @param string $message Mensaje a mostrar.
+ * @return void
+ */
+ protected function handleSuccess($type, $message): void
+ {
+ $this->dispatchNotification($type, $message, 'index');
+ $this->redirectRoute($this->getRedirectRoute());
+ }
+
+ /**
+ * Envía una notificación al navegador (mediante eventos de Livewire)
+ * indicando el tipo, el mensaje y el destino donde debe visualizarse.
+ *
+ * @param string $type Tipo de notificación (success, danger, etc.).
+ * @param string $message Mensaje de la notificación.
+ * @param string $target Destino para mostrarla ('form', 'index', etc.).
+ * @param int $delay Duración de la notificación en milisegundos.
+ * @return void
+ */
+ protected function dispatchNotification($type, $message, $target = 'form', $delay = 9000): void
+ {
+ $this->dispatch(
+ $target == 'index' ? 'store-notification' : 'notification',
+ target: $target === 'index' ? $this->targetNotifies()['index'] : $this->targetNotifies()['form'],
+ type: $type,
+ message: $message,
+ delay: $delay
+ );
+ }
+
+ // ======================================================================
+ // RENDERIZACIÓN
+ // ======================================================================
+
+ /**
+ * Renderiza la vista Blade asociada a este componente.
+ * Retorna un objeto Illuminate\View\View.
+ *
+ * @return View
+ */
+ public function render(): View
+ {
+ return view($this->viewPath());
+ }
+}
diff --git a/Livewire/Form/AbstractFormOffCanvasComponent.php b/Livewire/Form/AbstractFormOffCanvasComponent.php
new file mode 100644
index 0000000..8512a26
--- /dev/null
+++ b/Livewire/Form/AbstractFormOffCanvasComponent.php
@@ -0,0 +1,667 @@
+
+ */
+ protected $casts = [];
+
+ // ===================== MÉTODOS ABSTRACTOS =====================
+
+ /**
+ * Define el modelo Eloquent asociado con el formulario.
+ *
+ * @return string
+ */
+ abstract protected function model(): string;
+
+ /**
+ * Define los campos del formulario.
+ *
+ * @return array
+ */
+ abstract protected function fields(): array;
+
+ /**
+ * Retorna los valores por defecto para los campos del formulario.
+ *
+ * @return array Valores predeterminados.
+ */
+ abstract protected function defaults(): array;
+
+ /**
+ * Campo que se debe enfocar cuando se abra el formulario.
+ *
+ * @return string
+ */
+ abstract protected function focusOnOpen(): string;
+
+ /**
+ * Define reglas de validación dinámicas según el modo del formulario.
+ *
+ * @param string $mode Modo actual del formulario ('create', 'edit', 'delete').
+ * @return array Reglas de validación.
+ */
+ abstract protected function dynamicRules(string $mode): array;
+
+ /**
+ * Devuelve las opciones que se mostrarán en los selectores del formulario.
+ *
+ * @return array Opciones para los campos del formulario.
+ */
+ abstract protected function options(): array;
+
+ /**
+ * Retorna la ruta de la vista asociada al formulario.
+ *
+ * @return string Ruta de la vista Blade.
+ */
+ abstract protected function viewPath(): string;
+
+ // ===================== VALIDACIONES =====================
+
+ protected function attributes(): array
+ {
+ return [];
+ }
+
+ protected function messages(): array
+ {
+ return [];
+ }
+
+ // ===================== INICIALIZACIÓN DEL COMPONENTE =====================
+
+ /**
+ * Se ejecuta cuando el componente se monta por primera vez.
+ *
+ * Inicializa propiedades y carga datos iniciales.
+ *
+ * @return void
+ */
+ public function mount(): void
+ {
+ $this->uniqueId = uniqid();
+
+ $model = new ($this->model());
+
+ $this->tagName = $model->tagName;
+ $this->columnNameLabel = $model->columnNameLabel;
+ $this->singularName = $model->singularName;
+ $this->offcanvasId = 'offcanvas' . ucfirst(Str::camel($model->tagName));
+ $this->formId = Str::camel($model->tagName) .'Form';
+ $this->focusOnOpen = "{$this->focusOnOpen()}_{$this->uniqueId}";
+
+ $this->loadDefaults();
+ $this->loadOptions();
+ }
+
+ // ===================== INICIALIZACIÓN Y CONFIGURACIÓN =====================
+
+ /**
+ * Devuelve los valores por defecto para los campos del formulario.
+ *
+ * @return array Valores por defecto.
+ */
+ private function loadDefaults(): void
+ {
+ $this->defaultValues = $this->defaults();
+ }
+
+ /**
+ * Carga las opciones necesarias para los campos del formulario.
+ *
+ * @return void
+ */
+ private function loadOptions(): void
+ {
+ foreach ($this->options() as $key => $value) {
+ $this->$key = $value;
+ }
+ }
+
+ /**
+ * Carga los datos de un modelo específico en el formulario para su edición.
+ *
+ * @param int $id ID del registro a editar.
+ * @return void
+ */
+ public function loadFormModel(int $id): void
+ {
+ if ($this->loadData($id)) {
+ $this->mode = 'edit';
+
+ $this->dispatch($this->getDispatche('refresh-offcanvas'));
+ }
+ }
+
+ /**
+ * Carga el modelo para confirmar su eliminación.
+ *
+ * @param int $id ID del registro a eliminar.
+ * @return void
+ */
+ public function loadFormModelForDeletion(int $id): void
+ {
+ if ($this->loadData($id)) {
+ $this->mode = 'delete';
+ $this->confirmDeletion = false;
+
+ $this->dispatch($this->getDispatche('refresh-offcanvas'));
+ }
+ }
+
+ private function getDispatche(string $name): string
+ {
+ $model = new ($this->model());
+
+ $dispatches = [
+ 'refresh-offcanvas' => 'refresh-' . Str::kebab($model->tagName) . '-offcanvas',
+ 'reload-table' => 'reload-bt-' . Str::kebab($model->tagName) . 's',
+ ];
+
+ return $dispatches[$name] ?? null;
+ }
+
+
+ /**
+ * Carga los datos del modelo según el ID proporcionado.
+ *
+ * @param int $id ID del modelo.
+ * @return bool True si los datos fueron cargados correctamente.
+ */
+ protected function loadData(int $id): bool
+ {
+ $model = $this->model()::find($id);
+
+ if ($model) {
+ $data = $model->only(['id', ...$this->fields()]);
+
+ $this->applyCasts($data);
+ $this->fill($data);
+
+
+ return true;
+ }
+
+ return false;
+ }
+
+ // ===================== OPERACIONES CRUD =====================
+
+ /**
+ * Método principal para enviar el formulario.
+ *
+ * @return void
+ */
+ public function onSubmit(): void
+ {
+ $this->successProcess = false;
+ $this->validationError = false;
+
+ if(!$this->mode)
+ $this->mode = 'create';
+
+ DB::beginTransaction(); // Iniciar transacción
+
+ try {
+ if($this->mode === 'delete'){
+ $this->delete();
+
+ }else{
+ $this->save();
+ }
+
+ DB::commit();
+
+ } catch (ValidationException $e) {
+ DB::rollBack();
+ $this->handleValidationException($e);
+
+ } catch (QueryException $e) {
+ DB::rollBack();
+ $this->handleDatabaseException($e);
+
+ } catch (ModelNotFoundException $e) {
+ DB::rollBack();
+ $this->handleException('danger', 'Registro no encontrado.');
+
+ } catch (Exception $e) {
+ DB::rollBack(); // Revertir la transacción si ocurre un error
+ $this->handleException('danger', 'Error al eliminar el registro: ' . $e->getMessage());
+ }
+ }
+
+ /**
+ * Guarda o actualiza un registro en la base de datos.
+ *
+ * @return void
+ * @throws ValidationException
+ */
+ protected function save(): void
+ {
+ // Valida incluyendo atributos personalizados
+ $validatedData = $this->validate(
+ $this->dynamicRules($this->mode),
+ $this->messages(),
+ $this->attributes()
+ );
+
+ $this->convertEmptyValuesToNull($validatedData);
+ $this->applyCasts($validatedData);
+
+ $this->beforeSave($validatedData);
+ $record = $this->model()::updateOrCreate(['id' => $this->id], $validatedData);
+ $this->afterSave($record);
+
+ $this->handleSuccess('success', ucfirst($this->singularName) . " guardado correctamente.");
+ }
+
+ /**
+ * Elimina un registro en la base de datos.
+ *
+ * @return void
+ */
+ protected function delete(): void
+ {
+ $this->validate($this->dynamicRules(
+ 'delete',
+ $this->messages(),
+ $this->attributes()
+ ));
+
+ $record = $this->model()::findOrFail($this->id);
+
+ $this->beforeDelete($record);
+ $record->delete();
+ $this->afterDelete($record);
+
+ $this->handleSuccess('warning', ucfirst($this->singularName) . " eliminado.");
+ }
+
+ // ===================== HOOKS DE ACCIONES CRUD =====================
+
+ /**
+ * Hook que se ejecuta antes de guardar datos en la base de datos.
+ *
+ * Este método permite realizar modificaciones o preparar los datos antes de ser validados
+ * y almacenados. Es útil para formatear datos, agregar valores calculados o realizar
+ * operaciones previas a la persistencia.
+ *
+ * @param array $data Datos validados que se almacenarán. Se pasan por referencia,
+ * por lo que cualquier cambio aquí afectará directamente los datos guardados.
+ *
+ * @return void
+ */
+ protected function beforeSave(array &$data): void {}
+
+ /**
+ * Hook que se ejecuta después de guardar o actualizar un registro en la base de datos.
+ *
+ * Ideal para ejecutar tareas posteriores al guardado, como enviar notificaciones,
+ * registrar auditorías o realizar acciones en otros modelos relacionados.
+ *
+ * @param \Illuminate\Database\Eloquent\Model $record El modelo que fue guardado, conteniendo
+ * los datos actualizados.
+ *
+ * @return void
+ */
+ protected function afterSave($record): void {}
+
+ /**
+ * Hook que se ejecuta antes de eliminar un registro de la base de datos.
+ *
+ * Permite validar si el registro puede ser eliminado o realizar tareas previas
+ * como desasociar relaciones, eliminar archivos relacionados o verificar restricciones.
+ *
+ * @param \Illuminate\Database\Eloquent\Model $record El modelo que está por ser eliminado.
+ *
+ * @return void
+ */
+ protected function beforeDelete($record): void {}
+
+ /**
+ * Hook que se ejecuta después de eliminar un registro de la base de datos.
+ *
+ * Útil para realizar acciones adicionales tras la eliminación, como limpiar datos relacionados,
+ * eliminar archivos vinculados o registrar eventos de auditoría.
+ *
+ * @param \Illuminate\Database\Eloquent\Model $record El modelo eliminado. Aunque ya no existe en la base de datos,
+ * se conserva la información del registro en memoria.
+ *
+ * @return void
+ */
+ protected function afterDelete($record): void {}
+
+ // ===================== MANEJO DE VALIDACIONES Y EXCEPCIONES =====================
+
+ /**
+ * Maneja las excepciones de validación.
+ *
+ * Este método captura los errores de validación, los agrega al error bag de Livewire
+ * y dispara un evento para manejar el fallo de validación, útil en formularios modales.
+ *
+ * @param ValidationException $e Excepción de validación capturada.
+ * @return void
+ */
+ protected function handleValidationException(ValidationException $e): void
+ {
+ $this->setErrorBag($e->validator->errors());
+
+ // Notifica al usuario que ocurrió un error de validación
+ $this->handleException('danger', 'Error en la validación de los datos.');
+ }
+
+ /**
+ * Maneja las excepciones relacionadas con la base de datos.
+ *
+ * Analiza el código de error de la base de datos y genera un mensaje de error específico
+ * para la situación. También se encarga de enviar una notificación de error.
+ *
+ * @param QueryException $e Excepción capturada durante la ejecución de una consulta.
+ * @return void
+ */
+ protected function handleDatabaseException(QueryException $e): void
+ {
+ $errorMessage = match ($e->errorInfo[1]) {
+ 1452 => "Una clave foránea no es válida.",
+ 1062 => $this->extractDuplicateField($e->getMessage()),
+ 1451 => "No se puede eliminar el registro porque está en uso.",
+ default => env('APP_DEBUG') ? $e->getMessage() : "Error inesperado en la base de datos.",
+ };
+
+ $this->handleException('danger', $errorMessage, 'form', 120000);
+ }
+
+ /**
+ * Maneja cualquier tipo de excepción general y envía una notificación al usuario.
+ *
+ * @param string $type El tipo de notificación (success, danger, warning).
+ * @param string $message El mensaje que se mostrará al usuario.
+ * @param string $target El contenedor donde se mostrará la notificación (por defecto 'form').
+ * @param int $delay Tiempo en milisegundos que durará la notificación en pantalla.
+ * @return void
+ */
+ protected function handleException($type, $message, $target = 'form', $delay = 9000): void
+ {
+ $this->validationError = true;
+
+ $this->dispatch($this->getDispatche('refresh-offcanvas'));
+ $this->dispatchNotification($type, $message, $target, $delay);
+ }
+
+ /**
+ * Extrae el nombre del campo duplicado de un error de base de datos MySQL.
+ *
+ * Esta función se utiliza para identificar el campo específico que causó un error
+ * de duplicación de clave única, y genera un mensaje personalizado para el usuario.
+ *
+ * @param string $errorMessage El mensaje de error completo proporcionado por MySQL.
+ * @return string Mensaje de error amigable para el usuario.
+ */
+ private function extractDuplicateField($errorMessage): string
+ {
+ preg_match("/for key 'unique_(.*?)'/", $errorMessage, $matches);
+
+ return isset($matches[1])
+ ? "El valor ingresado para '" . str_replace('_', ' ', $matches[1]) . "' ya está en uso."
+ : "Ya existe un registro con este valor.";
+ }
+
+ // ===================== NOTIFICACIONES Y ÉXITO =====================
+
+ /**
+ * Despacha una notificación tras el éxito de una operación.
+ *
+ * @param string $type Tipo de notificación (success, warning, danger)
+ * @param string $message Mensaje a mostrar.
+ * @return void
+ */
+ protected function handleSuccess(string $type, string $message): void
+ {
+ $this->successProcess = true;
+
+ $this->dispatch($this->getDispatche('refresh-offcanvas'));
+ $this->dispatch($this->getDispatche('reload-table'));
+
+ $this->dispatchNotification($type, $message, 'index');
+ }
+
+ /**
+ * Envía una notificación al navegador.
+ *
+ * @param string $type Tipo de notificación (success, danger, etc.)
+ * @param string $message Mensaje de la notificación
+ * @param string $target Destino (form, index)
+ * @param int $delay Duración de la notificación en milisegundos
+ */
+ protected function dispatchNotification($type, $message, $target = 'form', $delay = 9000): void
+ {
+ $model = new ($this->model());
+
+ $this->tagName = $model->tagName;
+ $this->columnNameLabel = $model->columnNameLabel;
+ $this->singularName = $model->singularName;
+
+ $tagOffcanvas = ucfirst(Str::camel($model->tagName));
+
+ $targetNotifies = [
+ "index" => '#bt-' . Str::kebab($model->tagName) . 's .notification-container',
+ "form" => "#offcanvas{$tagOffcanvas} .notification-container",
+ ];
+
+ $this->dispatch(
+ 'notification',
+ target: $target === 'index' ? $targetNotifies['index'] : $targetNotifies['form'],
+ type: $type,
+ message: $message,
+ delay: $delay
+ );
+ }
+
+ // ===================== FORMULARIO Y CONVERSIÓN DE DATOS =====================
+
+ /**
+ * Convierte los valores vacíos a `null` en los campos que son configurados como `nullable`.
+ *
+ * Esta función verifica las reglas de validación actuales y transforma todos los campos vacíos
+ * en valores `null` si las reglas permiten valores nulos. Es útil para evitar insertar cadenas vacías
+ * en la base de datos donde se espera un valor nulo.
+ *
+ * @param array $data Los datos del formulario que se deben procesar.
+ * @return void
+ */
+ protected function convertEmptyValuesToNull(array &$data): void
+ {
+ $nullableFields = array_keys(array_filter($this->dynamicRules($this->mode), function ($rules) {
+ return in_array('nullable', (array) $rules);
+ }));
+
+ foreach ($nullableFields as $field) {
+ if (isset($data[$field]) && $data[$field] === '') {
+ $data[$field] = null;
+ }
+ }
+ }
+
+ /**
+ * Aplica tipos de datos definidos en `$casts` a los campos del formulario.
+ *
+ * Esta función toma los datos de entrada y los transforma en el tipo de datos esperado según
+ * lo definido en la propiedad `$casts`. Es útil para asegurar que los datos se almacenen en
+ * el formato correcto, como convertir cadenas a números enteros o booleanos.
+ *
+ * @param array $data Los datos del formulario que necesitan ser casteados.
+ * @return void
+ */
+ protected function applyCasts(array &$data): void
+ {
+ foreach ($this->casts as $field => $type) {
+ if (array_key_exists($field, $data)) {
+ $data[$field] = $this->castValue($type, $data[$field]);
+ }
+ }
+ }
+
+ /**
+ * Castea un valor a su tipo de dato correspondiente.
+ *
+ * Convierte un valor dado al tipo especificado, manejando adecuadamente los valores vacíos
+ * o nulos. También asegura que valores como `0` o `''` sean tratados correctamente
+ * para evitar errores al almacenarlos en la base de datos.
+ *
+ * @param string $type El tipo de dato al que se debe convertir (`boolean`, `integer`, `float`, `string`, `array`).
+ * @param mixed $value El valor que se debe castear.
+ * @return mixed El valor convertido al tipo especificado.
+ */
+ protected function castValue($type, $value): mixed
+ {
+ // Convertir valores vacíos o cero a null si corresponde
+ if (is_null($value) || $value === '' || $value === '0' || $value === 0.0) {
+ return match ($type) {
+ 'boolean' => false, // No permitir null en booleanos
+ 'integer' => 0, // Valor por defecto para enteros
+ 'float', 'double' => 0.0, // Valor por defecto para decimales
+ 'string' => "", // Convertir cadena vacía en null
+ 'array' => [], // Evitar null en arrays
+ default => null, // Valor por defecto para otros tipos
+ };
+ }
+
+ // Castear el valor si no es null ni vacío
+ return match ($type) {
+ 'boolean' => (bool) $value,
+ 'integer' => (int) $value,
+ 'float', 'double' => (float) $value,
+ 'string' => (string) $value,
+ 'array' => (array) $value,
+ default => $value,
+ };
+ }
+
+
+ // ===================== RENDERIZACIÓN DE VISTA =====================
+
+ /**
+ * Renderiza la vista del formulario.
+ *
+ * @return \Illuminate\View\View
+ */
+ public function render(): View
+ {
+ return view($this->viewPath());
+ }
+}
diff --git a/Livewire/Permissions/PermissionIndex.php b/Livewire/Permissions/PermissionIndex.php
new file mode 100644
index 0000000..2aa71da
--- /dev/null
+++ b/Livewire/Permissions/PermissionIndex.php
@@ -0,0 +1,28 @@
+roles_html_select = " Selecciona un rol ";
+
+ foreach (Role::all() as $role) {
+ $this->rows_roles[$role->name] = "style} m-1\">{$role->name} ";
+ $this->roles_html_select .= "name}\" class=\"text-capitalize\">{$role->name} ";
+ }
+
+ $this->roles_html_select .= " ";
+
+ return view('vuexy-admin::livewire.permissions.index');
+ }
+}
diff --git a/Livewire/Permissions/Permissions.php b/Livewire/Permissions/Permissions.php
new file mode 100644
index 0000000..661bc7f
--- /dev/null
+++ b/Livewire/Permissions/Permissions.php
@@ -0,0 +1,35 @@
+validate([
+ 'permissionName' => 'required|unique:permissions,name'
+ ]);
+
+ Permission::create(['name' => $this->permissionName]);
+ session()->flash('message', 'Permiso creado con éxito.');
+ $this->reset('permissionName');
+ }
+
+ public function deletePermission($id)
+ {
+ Permission::find($id)->delete();
+ session()->flash('message', 'Permiso eliminado.');
+ }
+
+ public function render()
+ {
+ return view('livewire.permissions', [
+ 'permissions' => Permission::all()
+ ]);
+ }
+}
diff --git a/Livewire/Roles/RoleCards.php b/Livewire/Roles/RoleCards.php
new file mode 100644
index 0000000..613bf10
--- /dev/null
+++ b/Livewire/Roles/RoleCards.php
@@ -0,0 +1,182 @@
+loadRolesAndPermissions();
+ $this->dispatch('reloadForm');
+ }
+
+ private function loadRolesAndPermissions()
+ {
+ $this->roles = Auth::user()->hasRole('SuperAdmin') ?
+ Role::all() :
+ Role::where('name', '!=', 'SuperAdmin')->get();
+
+ // Obtener todos los permisos
+ $permissions = Permission::all()->map(function ($permission) {
+ $name = $permission->name;
+ $action = substr($name, strrpos($name, '.') + 1);
+
+ return [
+ 'group_name' => $permission->group_name,
+ 'sub_group_name' => $permission->sub_group_name,
+ $action => $name // Agregar la acción directamente al array
+ ];
+ })->groupBy('group_name'); // Agrupar los permisos por grupo
+
+
+ // Procesar los permisos agrupados para cargarlos en el componente
+ $permissionsInputs = [];
+
+ $this->permissions = $permissions->map(function ($groupPermissions) use (&$permissionsInputs) {
+ $permission = [
+ 'group_name' => $groupPermissions[0]['group_name'], // Tomar el grupo del primer permiso del grupo
+ 'sub_group_name' => $groupPermissions[0]['sub_group_name'], // Tomar la descripción del primer permiso del grupo
+ ];
+
+ // Agregar todas las acciones al permissionsInputs y al permission
+ foreach ($groupPermissions as $permissionData) {
+ foreach ($permissionData as $key => $value) {
+ if ($key !== 'sub_group_name' && $key !== 'group_name') {
+ $permissionsInputs[str_replace('.', '_', $value)] = false;
+ $permission[$key] = $value;
+ }
+ }
+ }
+
+ return $permission;
+ });
+
+ $this->permissionsInputs = $permissionsInputs;
+ }
+
+ public function loadRoleData($action, $roleId = false)
+ {
+ $this->resetForm();
+
+ $this->title = 'Agregar un nuevo rol';
+ $this->btn_submit_text = 'Crear nuevo rol';
+
+ if ($roleId) {
+ $role = Role::findOrFail($roleId);
+
+ switch ($action) {
+ case 'view':
+ $this->title = $role->name;
+ $this->name = $role->name;
+ $this->style = $role->style;
+ $this->dispatch('deshabilitarFormulario');
+ break;
+
+ case 'update':
+ $this->title = 'Editar rol';
+ $this->btn_submit_text = 'Guardar cambios';
+ $this->roleId = $roleId;
+ $this->name = $role->name;
+ $this->style = $role->style;
+ $this->dispatch('habilitarFormulario');
+ break;
+
+ case 'clone':
+ $this->style = $role->style;
+ $this->dispatch('habilitarFormulario');
+ break;
+
+ default:
+ break;
+ }
+
+ foreach ($role->permissions as $permission) {
+ $this->permissionsInputs[str_replace('.', '_', $permission->name)] = true;
+ }
+ }
+
+ $this->dispatch('reloadForm');
+ }
+
+ public function loadDestroyRoleData() {}
+
+ public function saveRole()
+ {
+ $permissions = [];
+
+ foreach ($this->permissionsInputs as $permission => $value) {
+ if ($value === true)
+ $permissions[] = str_replace('_', '.', $permission);
+ }
+
+ if ($this->roleId) {
+ $role = Role::find($this->roleId);
+
+ $role->name = $this->name;
+ $role->style = $this->style;
+
+ $role->save();
+
+ $role->syncPermissions($permissions);
+ } else {
+ $role = Role::create([
+ 'name' => $this->name,
+ 'style' => $this->style,
+ ]);
+
+ $role->syncPermissions($permissions);
+ }
+
+ $this->loadRolesAndPermissions();
+
+ $this->dispatch('modalHide');
+ $this->dispatch('reloadForm');
+ }
+
+ public function deleteRole()
+ {
+ $role = Role::find($this->destroyRoleId);
+
+ if ($role)
+ $role->delete();
+
+ $this->loadRolesAndPermissions();
+
+ $this->dispatch('modalDeleteHide');
+ $this->dispatch('reloadForm');
+ }
+
+ private function resetForm()
+ {
+ $this->roleId = '';
+ $this->name = '';
+ $this->style = '';
+
+ foreach ($this->permissionsInputs as $key => $permission) {
+ $this->permissionsInputs[$key] = false;
+ }
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.roles.cards');
+ }
+}
diff --git a/Livewire/Roles/RoleIndex.php b/Livewire/Roles/RoleIndex.php
new file mode 100644
index 0000000..10a168d
--- /dev/null
+++ b/Livewire/Roles/RoleIndex.php
@@ -0,0 +1,61 @@
+availablePermissions = Permission::all();
+ }
+
+ public function createRole()
+ {
+ $this->validate([
+ 'roleName' => 'required|unique:roles,name'
+ ]);
+
+ $role = Role::create(['name' => $this->roleName]);
+ $this->reset(['roleName']);
+ session()->flash('message', 'Rol creado con éxito.');
+ }
+
+ public function selectRole($roleId)
+ {
+ $this->selectedRole = Role::find($roleId);
+ $this->permissions = $this->selectedRole->permissions->pluck('id')->toArray();
+ }
+
+ public function updateRolePermissions()
+ {
+ if ($this->selectedRole) {
+ $this->selectedRole->syncPermissions($this->permissions);
+ session()->flash('message', 'Permisos actualizados correctamente.');
+ }
+ }
+
+ public function deleteRole($roleId)
+ {
+ Role::find($roleId)->delete();
+ session()->flash('message', 'Rol eliminado.');
+ }
+
+ public function render()
+ {
+ return view('livewire.roles', [
+ 'index' => Role::paginate(10)
+ ]);
+ }
+}
diff --git a/Livewire/Table/AbstractIndexComponent.php b/Livewire/Table/AbstractIndexComponent.php
new file mode 100644
index 0000000..93bf75f
--- /dev/null
+++ b/Livewire/Table/AbstractIndexComponent.php
@@ -0,0 +1,174 @@
+ 'id', // Campo por defecto para ordenar
+ 'exportFileName' => 'Listado', // Nombre de archivo para exportar
+ 'showFullscreen' => false,
+ 'showPaginationSwitch'=> false,
+ 'showRefresh' => false,
+ 'pagination' => false,
+ // Agrega aquí cualquier otra configuración por defecto que uses
+ ];
+ }
+
+ /**
+ * Se ejecuta al montar el componente Livewire.
+ * Configura $tagName, $singularName, $formId y $bt_datatable.
+ *
+ * @return void
+ */
+ public function mount(): void
+ {
+ // Obtenemos el modelo
+ $model = $this->model();
+ if (is_string($model)) {
+ // Si se retornó la clase en abstract protected function model(),
+ // instanciamos manualmente
+ $model = new $model;
+ }
+
+ // Usamos las propiedades definidas en el modelo
+ // (tagName, singularName, etc.), si existen en el modelo.
+ // Ajusta nombres según tu convención.
+ $this->tagName = $model->tagName ?? Str::snake(class_basename($model));
+ $this->singularName = $model->singularName ?? class_basename($model);
+ $this->formId = Str::kebab($this->tagName) . '-form';
+
+ // Inicia la configuración principal de la tabla
+ $this->setupDataTable();
+ }
+
+ /**
+ * Combina la configuración base de la tabla con las columnas y formatos
+ * definidos en las clases hijas.
+ *
+ * @return void
+ */
+ protected function setupDataTable(): void
+ {
+ $baseConfig = $this->bootstraptableConfig();
+
+ $this->bt_datatable = array_merge($baseConfig, [
+ 'header' => $this->columns(),
+ 'format' => $this->format(),
+ ]);
+ }
+
+ /**
+ * Renderiza la vista definida en viewPath().
+ *
+ * @return \Illuminate\View\View
+ */
+ public function render()
+ {
+ return view($this->viewPath());
+ }
+
+ /**
+ * Ejemplo de método para la lógica de filtrado que podrías sobreescribir en la clase hija.
+ *
+ * @param array $criteria
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ protected function applyFilters($criteria = [])
+ {
+ // Aplica tu lógica de filtros, búsquedas, etc.
+ // La clase hija podría sobrescribir este método o llamarlo desde su propia lógica.
+ $query = $this->model()::query();
+
+ // Por ejemplo:
+ /*
+ if (!empty($criteria['store_id'])) {
+ $query->where('store_id', $criteria['store_id']);
+ }
+ */
+
+ return $query;
+ }
+}
diff --git a/Livewire/Users/UserCount.php b/Livewire/Users/UserCount.php
new file mode 100644
index 0000000..0e3eb6b
--- /dev/null
+++ b/Livewire/Users/UserCount.php
@@ -0,0 +1,31 @@
+ 'updateCounts'];
+
+ public function mount()
+ {
+ $this->updateCounts();
+ }
+
+ public function updateCounts()
+ {
+ $this->total = User::count();
+ $this->enabled = User::where('status', User::STATUS_ENABLED)->count();
+ $this->disabled = User::where('status', User::STATUS_DISABLED)->count();
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.users.count');
+ }
+}
diff --git a/Livewire/Users/UserForm.php b/Livewire/Users/UserForm.php
new file mode 100644
index 0000000..91f9ca1
--- /dev/null
+++ b/Livewire/Users/UserForm.php
@@ -0,0 +1,306 @@
+id ?? null);
+ }
+
+ /**
+ * Cargar opciones de formularios según el modo actual.
+ *
+ * @param string $mode
+ */
+ private function loadOptions(string $mode): void
+ {
+ $this->manager_id_options = User::getUsersListWithInactive($this->manager_id, ['type' => 'user', 'status' => 1]);
+ $this->c_regimen_fiscal_options = RegimenFiscal::selectList();
+ $this->c_pais_options = Pais::selectList();
+ $this->c_estado_options = Estado::selectList($this->c_pais)->toArray();
+
+ if ($mode !== 'create') {
+ $this->c_localidad_options = Localidad::selectList($this->c_estado)->toArray();
+ $this->c_municipio_options = Municipio::selectList($this->c_estado, $this->c_municipio)->toArray();
+ $this->c_colonia_options = Colonia::selectList($this->c_codigo_postal, $this->c_colonia)->toArray();
+ }
+ }
+
+ // ===================== MÉTODOS OBLIGATORIOS =====================
+
+ /**
+ * Devuelve el modelo Eloquent asociado.
+ *
+ * @return string
+ */
+ protected function model(): string
+ {
+ return Store::class;
+ }
+
+ /**
+ * Reglas de validación dinámicas según el modo actual.
+ *
+ * @param string $mode
+ * @return array
+ */
+ protected function dynamicRules(string $mode): array
+ {
+ switch ($mode) {
+ case 'create':
+ case 'edit':
+ return [
+ 'code' => [
+ 'required', 'string', 'alpha_num', 'max:16',
+ Rule::unique('stores', 'code')->ignore($this->id)
+ ],
+ 'name' => 'required|string|max:96',
+ 'description' => 'nullable|string|max:1024',
+ 'manager_id' => 'nullable|exists:users,id',
+
+ // Información fiscal
+ 'rfc' => ['nullable', 'string', 'regex:/^([A-ZÑ&]{3,4})(\d{6})([A-Z\d]{3})$/i', 'max:13'],
+ 'nombre_fiscal' => 'nullable|string|max:255',
+ 'c_regimen_fiscal' => 'nullable|exists:sat_regimen_fiscal,c_regimen_fiscal',
+ 'domicilio_fiscal' => 'nullable|exists:sat_codigo_postal,c_codigo_postal',
+
+ // Ubicación
+ 'c_pais' => 'nullable|exists:sat_pais,c_pais|string|size:3',
+ 'c_estado' => 'nullable|exists:sat_estado,c_estado|string|min:2|max:3',
+ 'c_municipio' => 'nullable|exists:sat_municipio,c_municipio|integer',
+ 'c_localidad' => 'nullable|integer',
+ 'c_codigo_postal' => 'nullable|exists:sat_codigo_postal,c_codigo_postal|integer',
+ 'c_colonia' => 'nullable|exists:sat_colonia,c_colonia|integer',
+ 'direccion' => 'nullable|string|max:255',
+ 'num_ext' => 'nullable|string|max:50',
+ 'num_int' => 'nullable|string|max:50',
+ 'lat' => 'nullable|numeric|between:-90,90',
+ 'lng' => 'nullable|numeric|between:-180,180',
+
+ // Contacto
+ 'email' => ['nullable', 'email', 'required_if:enable_ecommerce,true'],
+ 'tel' => ['nullable', 'regex:/^[0-9\s\-\+\(\)]+$/', 'max:15'],
+ 'tel2' => ['nullable', 'regex:/^[0-9\s\-\+\(\)]+$/', 'max:15'],
+
+ // Configuración web y estado
+ 'show_on_website' => 'nullable|boolean',
+ 'enable_ecommerce' => 'nullable|boolean',
+ 'status' => 'nullable|boolean',
+ ];
+
+ case 'delete':
+ return [
+ 'confirmDeletion' => 'accepted', // Asegura que el usuario confirme la eliminación
+ ];
+
+ default:
+ return [];
+ }
+ }
+
+ /**
+ * Inicializa los datos del formulario en función del modo.
+ *
+ * @param Store|null $store
+ * @param string $mode
+ */
+ protected function initializeFormData(mixed $store, string $mode): void
+ {
+ if ($store) {
+ $this->code = $store->code;
+ $this->name = $store->name;
+ $this->description = $store->description;
+ $this->manager_id = $store->manager_id;
+ $this->rfc = $store->rfc;
+ $this->nombre_fiscal = $store->nombre_fiscal;
+ $this->c_regimen_fiscal = $store->c_regimen_fiscal;
+ $this->domicilio_fiscal = $store->domicilio_fiscal;
+ $this->c_pais = $store->c_pais;
+ $this->c_estado = $store->c_estado;
+ $this->c_municipio = $store->c_municipio;
+ $this->c_localidad = $store->c_localidad;
+ $this->c_codigo_postal = $store->c_codigo_postal;
+ $this->c_colonia = $store->c_colonia;
+ $this->direccion = $store->direccion;
+ $this->num_ext = $store->num_ext;
+ $this->num_int = $store->num_int;
+ $this->lat = $store->lat;
+ $this->lng = $store->lng;
+ $this->email = $store->email;
+ $this->tel = $store->tel;
+ $this->tel2 = $store->tel2;
+ $this->show_on_website = (bool) $store->show_on_website;
+ $this->enable_ecommerce = (bool) $store->enable_ecommerce;
+ $this->status = (bool) $store->status;
+
+ } else {
+ $this->c_pais = 'MEX';
+ $this->status = true;
+ $this->show_on_website = false;
+ $this->enable_ecommerce = false;
+ }
+
+ $this->loadOptions($mode);
+ }
+
+ /**
+ * Prepara los datos validados para su almacenamiento.
+ *
+ * @param array $validatedData
+ * @return array
+ */
+ protected function prepareData(array $validatedData): array
+ {
+ return [
+ 'code' => $validatedData['code'],
+ 'name' => $validatedData['name'],
+ 'description' => strip_tags($validatedData['description']),
+ 'manager_id' => $validatedData['manager_id'],
+ 'rfc' => $validatedData['rfc'],
+ 'nombre_fiscal' => $validatedData['nombre_fiscal'],
+ 'c_regimen_fiscal' => $validatedData['c_regimen_fiscal'],
+ 'domicilio_fiscal' => $validatedData['domicilio_fiscal'],
+ 'c_codigo_postal' => $validatedData['c_codigo_postal'],
+ 'c_pais' => $validatedData['c_pais'],
+ 'c_estado' => $validatedData['c_estado'],
+ 'c_localidad' => $validatedData['c_localidad'],
+ 'c_municipio' => $validatedData['c_municipio'],
+ 'c_colonia' => $validatedData['c_colonia'],
+ 'direccion' => $validatedData['direccion'],
+ 'num_ext' => $validatedData['num_ext'],
+ 'num_int' => $validatedData['num_int'],
+ 'email' => $validatedData['email'],
+ 'tel' => $validatedData['tel'],
+ 'tel2' => $validatedData['tel2'],
+ 'lat' => $validatedData['lat'],
+ 'lng' => $validatedData['lng'],
+ 'status' => $validatedData['status'],
+ 'show_on_website' => $validatedData['show_on_website'],
+ 'enable_ecommerce' => $validatedData['enable_ecommerce'],
+ ];
+ }
+
+ /**
+ * Definición de los contenedores de notificación.
+ *
+ * @return array
+ */
+ protected function targetNotifies(): array
+ {
+ return [
+ "index" => "#bt-stores .notification-container",
+ "form" => "#store-form .notification-container",
+ ];
+ }
+
+ /**
+ * Ruta de vista asociada al formulario.
+ *
+ * @return \Illuminate\Contracts\View\View
+ */
+ protected function viewPath(): string
+ {
+ return 'vuexy-store-manager::livewire.stores.form';
+ }
+
+ // ===================== VALIDACIONES =====================
+
+ /**
+ * Get custom attributes for validator errors.
+ *
+ * @return array
+ */
+ public function attributes(): array
+ {
+ return [
+ 'code' => 'código de sucursal',
+ 'name' => 'nombre de la sucursal',
+ ];
+ }
+
+ /**
+ * Get the error messages for the defined validation rules.
+ *
+ * @return array
+ */
+ public function messages(): array
+ {
+ return [
+ 'code.required' => 'El código de la sucursal es obligatorio.',
+ 'code.unique' => 'Este código ya está en uso por otra sucursal.',
+ 'name.required' => 'El nombre de la sucursal es obligatorio.',
+ ];
+ }
+
+ // ===================== PREPARACIÓN DE DATOS =====================
+
+ // ===================== NOTIFICACIONES Y EVENTOS =====================
+
+ /**
+ * Definición de los eventos del componente.
+ *
+ * @return array
+ */
+ protected function dispatches(): array
+ {
+ return [
+ 'on-failed-validation' => 'on-failed-validation-store',
+ 'on-hydrate' => 'on-hydrate-store-modal',
+ ];
+ }
+
+ // ===================== REDIRECCIÓN =====================
+
+ /**
+ * Define la ruta de redirección tras guardar o eliminar.
+ *
+ * @return string
+ */
+ protected function getRedirectRoute(): string
+ {
+ return 'admin.core.user.index';
+ }
+
+}
diff --git a/Livewire/Users/UserIndex.copy.php b/Livewire/Users/UserIndex.copy.php
new file mode 100644
index 0000000..9eb2963
--- /dev/null
+++ b/Livewire/Users/UserIndex.copy.php
@@ -0,0 +1,115 @@
+modalTitle = 'Crear usuario nuevo';
+ $this->btnSubmitTxt = 'Crear usuario';
+
+ $this->statuses = [
+ User::STATUS_ENABLED => ['title' => 'Activo', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_ENABLED]],
+ User::STATUS_DISABLED => ['title' => 'Deshabilitado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_DISABLED]],
+ User::STATUS_REMOVED => ['title' => 'Eliminado', 'class' => 'badge bg-label-' . User::$statusListClass[User::STATUS_REMOVED]],
+ ];
+
+ $roles = Role::whereNotIn('name', ['Patient', 'Doctor'])->get();
+
+ $this->roles_html_select = " Selecciona un rol ";
+
+ foreach ($roles as $role) {
+ $this->rows_roles[$role->name] = "style . " mx-1\">" . $role->name . " ";
+
+ if (Auth::user()->hasRole('SuperAdmin') || $role->name != 'SuperAdmin') {
+ $this->roles_html_select .= "name . "\" class=\"text-capitalize\">" . $role->name . " ";
+ $this->roles_options[$role->name] = $role->name;
+ }
+ }
+
+ $this->roles_html_select .= " ";
+
+ $this->status_options = [
+ User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED],
+ User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED],
+ ];
+ }
+
+ public function countUsers()
+ {
+ $this->total = User::count();
+ $this->enabled = User::where('status', User::STATUS_ENABLED)->count();
+ $this->disabled = User::where('status', User::STATUS_DISABLED)->count();
+ }
+
+
+ public function edit($id)
+ {
+ $user = User::findOrFail($id);
+
+ $this->indexAlert = '';
+ $this->modalTitle = 'Editar usuario: ' . $id;
+ $this->btnSubmitTxt = 'Guardar cambios';
+
+ $this->userId = $user->id;
+ $this->name = $user->name;
+ $this->email = $user->email;
+ $this->password = '';
+ $this->roles = $user->roles->pluck('name')->toArray();
+ $this->src_photo = $user->profile_photo_url;
+ $this->status = $user->status;
+
+ $this->dispatch('openModal');
+ }
+
+ public function delete($id)
+ {
+ $user = User::find($id);
+
+ if ($user) {
+ // Eliminar la imagen de perfil si existe
+ if ($user->profile_photo_path)
+ Storage::disk('public')->delete($user->profile_photo_path);
+
+ // Eliminar el usuario
+ $user->delete();
+
+ $this->indexAlert = 'Se eliminó correctamente el usuario.
';
+
+ $this->dispatch('refreshUserCount');
+ $this->dispatch('afterDelete');
+ } else {
+ $this->indexAlert = 'Usuario no encontrado.
';
+ }
+ }
+
+ public function render()
+ {
+ return view('vuexy-admin::livewire.users.index', [
+ 'users' => User::paginate(10),
+ ]);
+ }
+}
diff --git a/Livewire/Users/UserIndex.php b/Livewire/Users/UserIndex.php
new file mode 100644
index 0000000..49e0e3f
--- /dev/null
+++ b/Livewire/Users/UserIndex.php
@@ -0,0 +1,299 @@
+ 'Acciones',
+ 'code' => 'Código personal',
+ 'full_name' => 'Nombre Completo',
+ 'email' => 'Correo Electrónico',
+ 'parent_name' => 'Responsable',
+ 'parent_email' => 'Correo Responsable',
+ 'company' => 'Empresa',
+ 'birth_date' => 'Fecha de Nacimiento',
+ 'hire_date' => 'Fecha de Contratación',
+ 'curp' => 'CURP',
+ 'nss' => 'NSS',
+ 'job_title' => 'Puesto',
+ 'rfc' => 'RFC',
+ 'nombre_fiscal' => 'Nombre Fiscal',
+ 'profile_photo_path' => 'Foto de Perfil',
+ 'is_partner' => 'Socio',
+ 'is_employee' => 'Empleado',
+ 'is_prospect' => 'Prospecto',
+ 'is_customer' => 'Cliente',
+ 'is_provider' => 'Proveedor',
+ 'is_user' => 'Usuario',
+ 'status' => 'Estatus',
+ 'creator' => 'Creado Por',
+ 'creator_email' => 'Correo Creador',
+ 'created_at' => 'Fecha de Creación',
+ 'updated_at' => 'Última Modificación',
+ ];
+ }
+
+ /**
+ * Retorna el formato (formatter) para cada columna.
+ */
+ protected function format(): array
+ {
+ return [
+ 'action' => [
+ 'formatter' => 'userActionFormatter',
+ 'onlyFormatter' => true,
+ ],
+ 'code' => [
+ 'formatter' => [
+ 'name' => 'dynamicBadgeFormatter',
+ 'params' => ['color' => 'secondary'],
+ ],
+ 'align' => 'center',
+ 'switchable' => false,
+ ],
+ 'full_name' => [
+ 'formatter' => 'userProfileFormatter',
+ ],
+ 'email' => [
+ 'formatter' => 'emailFormatter',
+ 'visible' => false,
+ ],
+ 'parent_name' => [
+ 'formatter' => 'contactParentFormatter',
+ 'visible' => false,
+ ],
+ 'agent_name' => [
+ 'formatter' => 'agentFormatter',
+ 'visible' => false,
+ ],
+ 'company' => [
+ 'formatter' => 'textNowrapFormatter',
+ ],
+ 'curp' => [
+ 'visible' => false,
+ ],
+ 'nss' => [
+ 'visible' => false,
+ ],
+ 'job_title' => [
+ 'formatter' => 'textNowrapFormatter',
+ 'visible' => false,
+ ],
+ 'rfc' => [
+ 'visible' => false,
+ ],
+ 'nombre_fiscal' => [
+ 'formatter' => 'textNowrapFormatter',
+ 'visible' => false,
+ ],
+ 'domicilio_fiscal' => [
+ 'visible' => false,
+ ],
+ 'c_uso_cfdi' => [
+ 'formatter' => 'usoCfdiFormatter',
+ 'visible' => false,
+ ],
+ 'tipo_persona' => [
+ 'formatter' => 'dynamicBadgeFormatter',
+ 'align' => 'center',
+ 'visible' => false,
+ ],
+ 'c_regimen_fiscal' => [
+ 'formatter' => 'regimenFiscalFormatter',
+ 'visible' => false,
+ ],
+ 'birth_date' => [
+ 'align' => 'center',
+ 'visible' => false,
+ ],
+ 'hire_date' => [
+ 'align' => 'center',
+ 'visible' => false,
+ ],
+ 'estado' => [
+ 'formatter' => 'textNowrapFormatter',
+ ],
+ 'municipio' => [
+ 'formatter' => 'textNowrapFormatter',
+ ],
+ 'localidad' => [
+ 'formatter' => 'textNowrapFormatter',
+ 'visible' => false,
+ ],
+ 'is_partner' => [
+ 'formatter' => [
+ 'name' => 'dynamicBooleanFormatter',
+ 'params' => ['tag' => 'checkSI'],
+ ],
+ 'align' => 'center',
+ ],
+ 'is_employee' => [
+ 'formatter' => [
+ 'name' => 'dynamicBooleanFormatter',
+ 'params' => ['tag' => 'checkSI'],
+ ],
+ 'align' => 'center',
+ ],
+ 'is_prospect' => [
+ 'formatter' => [
+ 'name' => 'dynamicBooleanFormatter',
+ 'params' => ['tag' => 'checkSI'],
+ ],
+ 'align' => 'center',
+ ],
+ 'is_customer' => [
+ 'formatter' => [
+ 'name' => 'dynamicBooleanFormatter',
+ 'params' => ['tag' => 'checkSI'],
+ ],
+ 'align' => 'center',
+ ],
+ 'is_provider' => [
+ 'formatter' => [
+ 'name' => 'dynamicBooleanFormatter',
+ 'params' => ['tag' => 'checkSI'],
+ ],
+ 'align' => 'center',
+ ],
+ 'is_user' => [
+ 'formatter' => [
+ 'name' => 'dynamicBooleanFormatter',
+ 'params' => ['tag' => 'checkSI'],
+ ],
+ 'align' => 'center',
+ ],
+ 'status' => [
+ 'formatter' => 'statusIntBadgeBgFormatter',
+ 'align' => 'center',
+ ],
+ 'creator' => [
+ 'formatter' => 'creatorFormatter',
+ 'visible' => false,
+ ],
+ 'created_at' => [
+ 'formatter' => 'textNowrapFormatter',
+ 'align' => 'center',
+ 'visible' => false,
+ ],
+ 'updated_at' => [
+ 'formatter' => 'textNowrapFormatter',
+ 'align' => 'center',
+ 'visible' => false,
+ ],
+ ];
+ }
+
+ /**
+ * Procesa el documento recibido (CFDI XML o Constancia PDF).
+ */
+ public function processDocument()
+ {
+ // Verificamos si el archivo es válido
+ if (!$this->doc_file instanceof UploadedFile) {
+ return $this->addError('doc_file', 'No se pudo recibir el archivo.');
+ }
+
+ try {
+ // Validar tipo de archivo
+ $this->validate([
+ 'doc_file' => 'required|mimes:pdf,xml|max:2048'
+ ]);
+
+
+ // **Detectar el tipo de documento**
+ $extension = strtolower($this->doc_file->getClientOriginalExtension());
+
+ // **Procesar según el tipo de archivo**
+ switch ($extension) {
+ case 'xml':
+ $service = new FacturaXmlService();
+ $data = $service->processUploadedFile($this->doc_file);
+ break;
+
+ case 'pdf':
+ $service = new ConstanciaFiscalService();
+ $data = $service->extractData($this->doc_file);
+ break;
+
+ default:
+ throw new Exception("Formato de archivo no soportado.");
+ }
+
+ dd($data);
+
+ // **Asignar los valores extraídos al formulario**
+ $this->rfc = $data['rfc'] ?? null;
+ $this->name = $data['name'] ?? null;
+ $this->email = $data['email'] ?? null;
+ $this->tel = $data['telefono'] ?? null;
+ //$this->direccion = $data['domicilio_fiscal'] ?? null;
+
+ // Ocultar el Dropzone después de procesar
+ $this->dropzoneVisible = false;
+
+ } catch (ValidationException $e) {
+ $this->handleValidationException($e);
+
+ } catch (QueryException $e) {
+ $this->handleDatabaseException($e);
+
+ } catch (ModelNotFoundException $e) {
+ $this->handleException('danger', 'Registro no encontrado.');
+
+ } catch (Exception $e) {
+ $this->handleException('danger', 'Error al procesar el archivo: ' . $e->getMessage());
+ }
+ }
+
+
+ /**
+ * Montamos el componente y llamamos al parent::mount() para configurar la tabla.
+ */
+ public function mount(): void
+ {
+ parent::mount();
+
+ // Definimos las rutas específicas de este componente
+ $this->routes = [
+ 'admin.user.show' => route('admin.core.users.show', ['user' => ':id']),
+ 'admin.user.edit' => route('admin.core.users.edit', ['user' => ':id']),
+ 'admin.user.delete' => route('admin.core.users.delete', ['user' => ':id']),
+ ];
+ }
+
+ /**
+ * Retorna la vista a renderizar por este componente.
+ */
+ protected function viewPath(): string
+ {
+ return 'vuexy-admin::livewire.users.index';
+ }
+}
diff --git a/Livewire/Users/UserOffCanvasForm.php b/Livewire/Users/UserOffCanvasForm.php
new file mode 100644
index 0000000..d65c74d
--- /dev/null
+++ b/Livewire/Users/UserOffCanvasForm.php
@@ -0,0 +1,295 @@
+ 'loadFormModel',
+ 'confirmDeletionUsers' => 'loadFormModelForDeletion',
+ ];
+
+ /**
+ * Definición de tipos de datos que se deben castear.
+ *
+ * @var array
+ */
+ protected $casts = [
+ 'status' => 'boolean',
+ ];
+
+ /**
+ * Define el modelo Eloquent asociado con el formulario.
+ *
+ * @return string
+ */
+ protected function model(): string
+ {
+ return User::class;
+ }
+
+ /**
+ * Define los campos del formulario.
+ *
+ * @return array
+ */
+ protected function fields(): array
+ {
+ return (new User())->getFillable();
+ }
+
+ /**
+ * Valores por defecto para el formulario.
+ *
+ * @return array
+ */
+ protected function defaults(): array
+ {
+ return [
+ //
+ ];
+ }
+
+ /**
+ * Campo que se debe enfocar cuando se abra el formulario.
+ *
+ * @return string
+ */
+ protected function focusOnOpen(): string
+ {
+ return 'name';
+ }
+
+ /**
+ * Define reglas de validación dinámicas basadas en el modo actual.
+ *
+ * @param string $mode El modo actual del formulario ('create', 'edit', 'delete').
+ * @return array
+ */
+ protected function dynamicRules(string $mode): array
+ {
+ switch ($mode) {
+ case 'create':
+ case 'edit':
+ return [
+ 'code' => ['required', 'string', 'max:16', Rule::unique('contact', 'code')->ignore($this->id)],
+ 'name' => ['required', 'string', 'max:96'],
+ 'notes' => ['nullable', 'string', 'max:1024'],
+ 'tel' => ['nullable', 'regex:/^[0-9+\-\s]+$/', 'max:20'],
+ ];
+
+ case 'delete':
+ return [
+ 'confirmDeletion' => 'accepted', // Asegura que el usuario confirme la eliminación
+ ];
+
+ default:
+ return [];
+ }
+ }
+
+ // ===================== VALIDACIONES =====================
+
+ /**
+ * Get custom attributes for validator errors.
+ *
+ * @return array
+ */
+ protected function attributes(): array
+ {
+ return [
+ 'code' => 'código de usuario',
+ 'name' => 'nombre del usuario',
+ ];
+ }
+
+ /**
+ * Get the error messages for the defined validation rules.
+ *
+ * @return array
+ */
+ protected function messages(): array
+ {
+ return [
+ 'code.unique' => 'Este código ya está en uso por otro usuario.',
+ 'name.required' => 'El nombre del usuario es obligatorio.',
+ ];
+ }
+
+ /**
+ * Carga el formulario con datos del usuario y actualiza las opciones dinámicas.
+ *
+ * @param int $id
+ */
+ public function loadFormModel($id): void
+ {
+ parent::loadFormModel($id);
+
+ $this->work_center_options = $this->store_id
+ ? DB::table('store_work_centers')
+ ->where('store_id', $this->store_id)
+ ->pluck('name', 'id')
+ ->toArray()
+ : [];
+ }
+
+ /**
+ * Carga el formulario para eliminar un usuario, actualizando las opciones necesarias.
+ *
+ * @param int $id
+ */
+ public function loadFormModelForDeletion($id): void
+ {
+ parent::loadFormModelForDeletion($id);
+
+ $this->work_center_options = DB::table('store_work_centers')
+ ->where('store_id', $this->store_id)
+ ->pluck('name', 'id')
+ ->toArray();
+ }
+
+ /**
+ * Define las opciones de los selectores desplegables.
+ *
+ * @return array
+ */
+ protected function options(): array
+ {
+ $storeCatalogService = app(StoreCatalogService::class);
+ $contactCatalogService = app(ContactCatalogService::class);
+
+ return [
+ 'store_options' => $storeCatalogService->searchCatalog('stores', '', ['limit' => -1]),
+ 'manager_options' => $contactCatalogService->searchCatalog('users', '', ['limit' => -1]),
+ ];
+ }
+
+ /**
+ * Procesa el documento recibido (CFDI XML o Constancia PDF).
+ */
+ public function processDocument()
+ {
+ // Verificamos si el archivo es válido
+ if (!$this->doc_file instanceof UploadedFile) {
+ return $this->addError('doc_file', 'No se pudo recibir el archivo.');
+ }
+
+ try {
+ // Validar tipo de archivo
+ $this->validate([
+ 'doc_file' => 'required|mimes:pdf,xml|max:2048'
+ ]);
+
+
+ // **Detectar el tipo de documento**
+ $extension = strtolower($this->doc_file->getClientOriginalExtension());
+
+ // **Procesar según el tipo de archivo**
+ switch ($extension) {
+ case 'xml':
+ $service = new FacturaXmlService();
+ $data = $service->processUploadedFile($this->doc_file);
+ break;
+
+ case 'pdf':
+ $service = new ConstanciaFiscalService();
+ $data = $service->extractData($this->doc_file);
+ break;
+
+ default:
+ throw new Exception("Formato de archivo no soportado.");
+ }
+
+ dd($data);
+
+ // **Asignar los valores extraídos al formulario**
+ $this->rfc = $data['rfc'] ?? null;
+ $this->name = $data['name'] ?? null;
+ $this->email = $data['email'] ?? null;
+ $this->tel = $data['telefono'] ?? null;
+ //$this->direccion = $data['domicilio_fiscal'] ?? null;
+
+ // Ocultar el Dropzone después de procesar
+ $this->dropzoneVisible = false;
+
+ } catch (ValidationException $e) {
+ $this->handleValidationException($e);
+
+ } catch (QueryException $e) {
+ $this->handleDatabaseException($e);
+
+ } catch (ModelNotFoundException $e) {
+ $this->handleException('danger', 'Registro no encontrado.');
+
+ } catch (Exception $e) {
+ $this->handleException('danger', 'Error al procesar el archivo: ' . $e->getMessage());
+ }
+ }
+
+ /**
+ * Ruta de la vista asociada con este formulario.
+ *
+ * @return string
+ */
+ protected function viewPath(): string
+ {
+ return 'vuexy-admin::livewire.users.offcanvas-form';
+ }
+}
diff --git a/Livewire/Users/UserShow.php b/Livewire/Users/UserShow.php
new file mode 100644
index 0000000..de9cd95
--- /dev/null
+++ b/Livewire/Users/UserShow.php
@@ -0,0 +1,283 @@
+ 'nullable|integer',
+ 'name' => 'required|string|min:3|max:255',
+ 'cargo' => 'nullable|string|min:3|max:255',
+ 'is_prospect' => 'nullable|boolean',
+ 'is_customer' => 'nullable|boolean',
+ 'is_provider' => 'nullable|boolean',
+ 'is_user' => 'nullable|boolean',
+ 'pricelist_id' => 'nullable|integer',
+ 'enable_credit' => 'nullable|boolean',
+ 'credit_days' => 'nullable|integer',
+ 'credit_limit' => 'nullable|numeric|min:0|max:9999999.99|regex:/^\d{1,7}(\.\d{1,2})?$/',
+ 'image' => 'nullable|mimes:jpg,png|image|max:20480', // 20MB Max
+ ];
+
+ // Reglas de validación para los campos fiscales
+ protected $rulesFacturacion = [
+ 'rfc' => 'nullable|string|max:13',
+ 'domicilio_fiscal' => [
+ 'nullable',
+ 'regex:/^[0-9]{5}$/',
+ 'exists:sat_codigo_postal,c_codigo_postal'
+ ],
+ 'nombre_fiscal' => 'nullable|string|max:255',
+ 'c_regimen_fiscal' => 'nullable|integer',
+ 'c_uso_cfdi' => 'nullable|string',
+ ];
+
+ public function mount($userId)
+ {
+ $this->user = User::findOrFail($userId);
+
+ $this->reloadUserData();
+
+ $this->pricelists_options = DropdownList::selectList(DropdownList::POS_PRICELIST);
+
+ $this->status_options = [
+ User::STATUS_ENABLED => User::$statusList[User::STATUS_ENABLED],
+ User::STATUS_DISABLED => User::$statusList[User::STATUS_DISABLED],
+ ];
+
+ $this->regimen_fiscal_options = RegimenFiscal::selectList();
+ $this->uso_cfdi_options = UsoCfdi::selectList();
+ }
+
+
+ public function reloadUserData()
+ {
+ $this->tipo_persona = $this->user->tipo_persona;
+ $this->name = $this->user->name;
+ $this->cargo = $this->user->cargo;
+ $this->is_prospect = $this->user->is_prospect? true : false;
+ $this->is_customer = $this->user->is_customer? true : false;
+ $this->is_provider = $this->user->is_provider? true : false;
+ $this->is_user = $this->user->is_user? true : false;
+ $this->pricelist_id = $this->user->pricelist_id;
+ $this->enable_credit = $this->user->enable_credit? true : false;
+ $this->credit_days = $this->user->credit_days;
+ $this->credit_limit = $this->user->credit_limit;
+ $this->profile_photo = $this->user->profile_photo_url;
+ $this->profile_photo_path = $this->user->profile_photo_path;
+ $this->image = null;
+ $this->deleteUserImage = false;
+
+ $this->status = $this->user->status;
+ $this->email = $this->user->email;
+ $this->password = null;
+ $this->password_confirmation = null;
+
+ $this->rfc = $this->user->rfc;
+ $this->domicilio_fiscal = $this->user->domicilio_fiscal;
+ $this->nombre_fiscal = $this->user->nombre_fiscal;
+ $this->c_regimen_fiscal = $this->user->c_regimen_fiscal;
+ $this->c_uso_cfdi = $this->user->c_uso_cfdi;
+
+ $this->cuentaUsuarioAlert = null;
+ $this->accesosAlert = null;
+ $this->facturacionElectronicaAlert = null;
+ }
+
+
+ public function saveCuentaUsuario()
+ {
+ try {
+ // Validar Información de usuario
+ $validatedData = $this->validate($this->rulesUser);
+
+ $validatedData['name'] = trim($validatedData['name']);
+ $validatedData['cargo'] = $validatedData['cargo']? trim($validatedData['cargo']): null;
+ $validatedData['is_prospect'] = $validatedData['is_prospect'] ? 1 : 0;
+ $validatedData['is_customer'] = $validatedData['is_customer'] ? 1 : 0;
+ $validatedData['is_provider'] = $validatedData['is_provider'] ? 1 : 0;
+ $validatedData['is_user'] = $validatedData['is_user'] ? 1 : 0;
+ $validatedData['pricelist_id'] = $validatedData['pricelist_id'] ?: null;
+ $validatedData['enable_credit'] = $validatedData['enable_credit'] ? 1 : 0;
+ $validatedData['credit_days'] = $validatedData['credit_days'] ?: null;
+ $validatedData['credit_limit'] = $validatedData['credit_limit'] ?: null;
+
+ if($this->tipo_persona == User::TIPO_RFC_PUBLICO){
+ $validatedData['cargo'] = null;
+ $validatedData['is_prospect'] = null;
+ $validatedData['is_provider'] = null;
+ $validatedData['is_user'] = null;
+ $validatedData['enable_credit'] = null;
+ $validatedData['credit_days'] = null;
+ $validatedData['credit_limit'] = null;
+ }
+
+ if(!$this->user->is_prospect && !$this->user->is_customer){
+ $validatedData['pricelist_id'] = null;
+ }
+
+ if(!$this->user->is_customer){
+ $validatedData['enable_credit'] = null;
+ $validatedData['credit_days'] = null;
+ $validatedData['credit_limit'] = null;
+ }
+
+ $this->user->update($validatedData);
+
+
+ if($this->deleteUserImage && $this->user->profile_photo_path){
+ $this->user->deleteProfilePhoto();
+
+ // Reiniciar variables después de la eliminación
+ $this->deleteUserImage = false;
+ $this->profile_photo_path = null;
+ $this->profile_photo = $this->user->profile_photo_url;
+
+ }else if ($this->image) {
+ $image = ImageManager::imagick()->read($this->image->getRealPath());
+ $image = $image->scale(520, 520);
+
+ $imageName = $this->image->hashName(); // Genera un nombre único
+
+ $image->save(storage_path('app/public/profile-photos/' . $imageName));
+
+ $this->user->deleteProfilePhoto();
+
+ $this->profile_photo_path = $this->user->profile_photo_path = 'profile-photos/' . $imageName;
+ $this->profile_photo = $this->user->profile_photo_url;
+ $this->user->save();
+
+ unlink($this->image->getRealPath());
+
+ $this->reset('image');
+ }
+
+ // Puedes también devolver un mensaje de éxito si lo deseas
+ $this->setAlert('Se guardó los cambios exitosamente.', 'cuentaUsuarioAlert');
+
+ } catch (\Illuminate\Validation\ValidationException $e) {
+ // Si hay errores de validación, los puedes capturar y manejar aquí
+ $this->setAlert('Ocurrieron errores en la validación: ' . $e->validator->errors()->first(), 'cuentaUsuarioAlert', 'danger');
+ }
+ }
+
+ public function saveAccesos()
+ {
+ try {
+ $validatedData = $this->validate([
+ 'status' => 'integer',
+ 'email' => ['required', 'email', 'unique:users,email,' . $this->user->id],
+ 'password' => ['nullable', 'string', 'min:6', 'max:32', 'confirmed'], // La regla 'confirmed' valida que ambas contraseñas coincidan
+ ], [
+ 'email.required' => 'El correo electrónico es obligatorio.',
+ 'email.email' => 'Debes ingresar un correo electrónico válido.',
+ 'email.unique' => 'Este correo ya está en uso.',
+ 'password.min' => 'La contraseña debe tener al menos 5 caracteres.',
+ 'password.max' => 'La contraseña no puede tener más de 32 caracteres.',
+ 'password.confirmed' => 'Las contraseñas no coinciden.',
+ ]);
+
+ // Si la validación es exitosa, continuar con el procesamiento
+ $validatedData['email'] = trim($this->email);
+
+ if ($this->password)
+ $validatedData['password'] = bcrypt($this->password);
+
+ else
+ unset($validatedData['password']);
+
+ $this->user->update($validatedData);
+
+ $this->password = null;
+ $this->password_confirmation = null;
+
+ // Puedes también devolver un mensaje de éxito si lo deseas
+ $this->setAlert('Se guardó los cambios exitosamente.', 'accesosAlert');
+
+ } catch (\Illuminate\Validation\ValidationException $e) {
+ // Si hay errores de validación, los puedes capturar y manejar aquí
+ $this->setAlert('Ocurrieron errores en la validación: ' . $e->validator->errors()->first(), 'accesosAlert', 'danger');
+ }
+ }
+
+ public function saveFacturacionElectronica()
+ {
+ try {
+ // Validar Información fiscal
+ $validatedData = $this->validate($this->rulesFacturacion);
+
+ $validatedData['rfc'] = strtoupper(trim($validatedData['rfc'])) ?: null;
+ $validatedData['domicilio_fiscal'] = $validatedData['domicilio_fiscal'] ?: null;
+ $validatedData['nombre_fiscal'] = strtoupper(trim($validatedData['nombre_fiscal'])) ?: null;
+ $validatedData['c_regimen_fiscal'] = $validatedData['c_regimen_fiscal'] ?: null;
+ $validatedData['c_uso_cfdi'] = $validatedData['c_uso_cfdi'] ?: null;
+
+ $this->user->update($validatedData);
+
+ // Puedes también devolver un mensaje de éxito si lo deseas
+ $this->setAlert('Se guardó los cambios exitosamente.', 'facturacionElectronicaAlert');
+
+ } catch (\Illuminate\Validation\ValidationException $e) {
+ // Si hay errores de validación, los puedes capturar y manejar aquí
+ $this->setAlert('Ocurrieron errores en la validación: ' . $e->validator->errors()->first(), 'facturacionElectronicaAlert', 'danger');
+ }
+ }
+
+
+ private function setAlert($message, $alertName, $type = 'success')
+ {
+ $this->$alertName = [
+ 'message' => $message,
+ 'type' => $type
+ ];
+ }
+
+ public function render()
+ {
+ return view('livewire.admin.crm.contact-view');
+ }
+}
diff --git a/Models/MediaItem.php b/Models/MediaItem.php
new file mode 100644
index 0000000..ad44908
--- /dev/null
+++ b/Models/MediaItem.php
@@ -0,0 +1,62 @@
+ 'Card',
+ self::TYPE_BANNER => 'Banner',
+ self::TYPE_COVER => 'Cover',
+ self::TYPE_GALLERY => 'Gallery',
+ self::TYPE_BANNER_HOME => 'Banner Home',
+ self::TYPE_CARD2 => 'Card 2',
+ self::TYPE_BANNER2 => 'Banner 2',
+ self::TYPE_COVER2 => 'Cover 2',
+ ];
+
+ /**
+ * Get the parent imageable model (user or post).
+ */
+ public function imageable()
+ {
+ return $this->morphTo();
+ }
+}
diff --git a/Models/Setting.php b/Models/Setting.php
new file mode 100644
index 0000000..7300adf
--- /dev/null
+++ b/Models/Setting.php
@@ -0,0 +1,39 @@
+
+ */
+ protected $fillable = [
+ 'key',
+ 'value',
+ 'user_id',
+ ];
+
+ public $timestamps = false;
+
+ // Relación con el usuario
+ public function user()
+ {
+ return $this->belongsTo(User::class);
+ }
+
+ // Scope para obtener configuraciones de un usuario específico
+ public function scopeForUser($query, $userId)
+ {
+ return $query->where('user_id', $userId);
+ }
+
+ // Configuraciones globales (sin usuario)
+ public function scopeGlobal($query)
+ {
+ return $query->whereNull('user_id');
+ }
+}
diff --git a/Models/User copy.php b/Models/User copy.php
new file mode 100644
index 0000000..cb20a95
--- /dev/null
+++ b/Models/User copy.php
@@ -0,0 +1,377 @@
+ 'Habilitado',
+ self::STATUS_DISABLED => 'Deshabilitado',
+ self::STATUS_REMOVED => 'Eliminado',
+ ];
+
+ /**
+ * List of names for each status.
+ * @var array
+ */
+ public static $statusListClass = [
+ self::STATUS_ENABLED => 'success',
+ self::STATUS_DISABLED => 'warning',
+ self::STATUS_REMOVED => 'danger',
+ ];
+
+ /**
+ * The attributes that are mass assignable.
+ *
+ * @var array
+ */
+ protected $fillable = [
+ 'name',
+ 'last_name',
+ 'email',
+ 'password',
+ 'profile_photo_path',
+ 'status',
+ 'created_by',
+ ];
+
+ /**
+ * The attributes that should be hidden for serialization.
+ *
+ * @var array
+ */
+ protected $hidden = [
+ 'password',
+ 'remember_token',
+ 'two_factor_recovery_codes',
+ 'two_factor_secret',
+ ];
+
+ /**
+ * The accessors to append to the model's array form.
+ *
+ * @var array
+ */
+ protected $appends = [
+ 'profile_photo_url',
+ ];
+
+ /**
+ * Get the attributes that should be cast.
+ *
+ * @return array
+ */
+ protected function casts(): array
+ {
+ return [
+ 'email_verified_at' => 'datetime',
+ 'password' => 'hashed',
+ ];
+ }
+
+ /**
+ * Attributes to include in the Audit.
+ *
+ * @var array
+ */
+ protected $auditInclude = [
+ 'name',
+ 'email',
+ ];
+
+ public function updateProfilePhoto(UploadedFile $image_avatar)
+ {
+ try {
+ // Verificar si el archivo existe
+ if (!file_exists($image_avatar->getRealPath()))
+ throw new \Exception('El archivo no existe en la ruta especificada.');
+
+ if (!in_array($image_avatar->getClientOriginalExtension(), ['jpg', 'jpeg', 'png']))
+ throw new \Exception('El formato del archivo debe ser JPG o PNG.');
+
+ // Directorio donde se guardarán los avatares
+ $avatarDisk = self::AVATAR_DISK;
+ $avatarPath = self::PROFILE_PHOTO_DIR;
+ $avatarName = uniqid('avatar_') . '.png'; // Nombre único para el avatar
+
+ // Crear la instancia de ImageManager
+ $driver = config('image.driver', 'gd');
+ $manager = new ImageManager($driver);
+
+ // Crear el directorio si no existe
+ if (!Storage::disk($avatarDisk)->exists($avatarPath))
+ Storage::disk($avatarDisk)->makeDirectory($avatarPath);
+
+ // Leer la imagen
+ $image = $manager->read($image_avatar->getRealPath());
+
+ // crop the best fitting 5:3 (600x360) ratio and resize to 600x360 pixel
+ $image->cover(self::AVATAR_WIDTH, self::AVATAR_HEIGHT);
+
+ // Guardar la imagen en el disco de almacenamiento gestionado por Laravel
+ Storage::disk($avatarDisk)->put($avatarPath . '/' . $avatarName, $image->toPng(indexed: true));
+
+ // Elimina el avatar existente si hay uno
+ $this->deleteProfilePhoto();
+
+ // Update the user's profile photo path
+ $this->forceFill([
+ 'profile_photo_path' => $avatarName,
+ ])->save();
+ } catch (\Exception $e) {
+ throw new \Exception('Ocurrió un error al actualizar el avatar. ' . $e->getMessage());
+ }
+ }
+
+ public function deleteProfilePhoto()
+ {
+ if (!empty($this->profile_photo_path)) {
+ $avatarDisk = self::AVATAR_DISK;
+
+ Storage::disk($avatarDisk)->delete($this->profile_photo_path);
+
+ $this->forceFill([
+ 'profile_photo_path' => null,
+ ])->save();
+ }
+ }
+
+ public function getAvatarColor()
+ {
+ // Selecciona un color basado en el id del usuario
+ return self::AVATAR_COLORS[$this->id % count(self::AVATAR_COLORS)];
+ }
+
+ public static function getAvatarImage($name, $color, $background, $size)
+ {
+ $avatarDisk = self::AVATAR_DISK;
+ $directory = self::INITIAL_AVATAR_DIR;
+ $initials = self::getInitials($name);
+
+ $cacheKey = "avatar-{$initials}-{$color}-{$background}-{$size}";
+ $path = "{$directory}/{$cacheKey}.png";
+ $storagePath = storage_path("app/public/{$path}");
+
+ // Verificar si el avatar ya está en caché
+ if (Storage::disk($avatarDisk)->exists($path))
+ return response()->file($storagePath);
+
+ // Crear el avatar
+ $image = self::createAvatarImage($name, $color, $background, $size);
+
+ // Guardar en el directorio de iniciales
+ Storage::disk($avatarDisk)->put($path, $image->toPng(indexed: true));
+
+ // Retornar la imagen directamente
+ return response()->file($storagePath);
+ }
+
+ private static function createAvatarImage($name, $color, $background, $size)
+ {
+ // Usar la configuración del driver de imagen
+ $driver = config('image.driver', 'gd');
+ $manager = new ImageManager($driver);
+
+ $initials = self::getInitials($name);
+
+ // Obtener la ruta correcta de la fuente dentro del paquete
+ $fontPath = __DIR__ . '/../storage/fonts/OpenSans-Bold.ttf';
+
+ // Crear la imagen con fondo
+ $image = $manager->create($size, $size)
+ ->fill($background);
+
+ // Escribir texto en la imagen
+ $image->text(
+ $initials,
+ $size / 2, // Centrar horizontalmente
+ $size / 2, // Centrar verticalmente
+ function (FontFactory $font) use ($color, $size, $fontPath) {
+ $font->file($fontPath);
+ $font->size($size * 0.4);
+ $font->color($color);
+ $font->align('center');
+ $font->valign('middle');
+ }
+ );
+
+ return $image;
+ }
+
+ public static function getInitials($name)
+ {
+ // Manejar casos de nombres vacíos o nulos
+ if (empty($name))
+ return 'NA';
+
+ // Usar array_map para mayor eficiencia
+ $initials = implode('', array_map(function ($word) {
+ return mb_substr($word, 0, 1);
+ }, explode(' ', $name)));
+
+ $initials = substr($initials, 0, self::INITIAL_MAX_LENGTH);
+
+ return strtoupper($initials);
+ }
+
+ public function getProfilePhotoUrlAttribute()
+ {
+ if ($this->profile_photo_path)
+ return Storage::url(self::PROFILE_PHOTO_DIR . '/' . $this->profile_photo_path);
+
+ // Generar URL del avatar por iniciales
+ $name = urlencode($this->fullname);
+ $color = ltrim($this->getAvatarColor(), '#');
+ $background = ltrim(self::AVATAR_BACKGROUND, '#');
+ $size = (self::AVATAR_WIDTH + self::AVATAR_HEIGHT) / 2;
+
+ return url("/admin/usuario/avatar?name={$name}&color={$color}&background={$background}&size={$size}");
+ }
+
+ public function getFullnameAttribute()
+ {
+ return trim($this->name . ' ' . $this->last_name);
+ }
+
+ public function getInitialsAttribute()
+ {
+ return self::getInitials($this->fullname);
+ }
+
+ /**
+ * Envía la notificación de restablecimiento de contraseña.
+ *
+ * @param string $token
+ */
+ public function sendPasswordResetNotification($token)
+ {
+ // Usar la notificación personalizada
+ $this->notify(new CustomResetPasswordNotification($token));
+ }
+
+
+ /**
+ * Obtener usuarios activos con una excepción para incluir un usuario específico desactivado.
+ *
+ * @param array $filters Filtros opcionales como ['type' => 'user', 'status' => 1]
+ * @param int|null $includeUserId ID de usuario específico a incluir aunque esté inactivo
+ * @return array
+ */
+ public static function getUsersListWithInactive(int $includeUserId = null, array $filters = []): array
+ {
+ $query = self::query();
+
+ // Filtro por tipo de usuario
+ if (isset($filters['type'])) {
+ switch ($filters['type']) {
+ case 'partner':
+ $query->where('is_partner', 1);
+ break;
+ case 'employee':
+ $query->where('is_employee', 1);
+ break;
+ case 'prospect':
+ $query->where('is_prospect', 1);
+ break;
+ case 'customer':
+ $query->where('is_customer', 1);
+ break;
+ case 'provider':
+ $query->where('is_provider', 1);
+ break;
+ case 'user':
+ $query->where('is_user', 1);
+ break;
+ }
+ }
+
+ // Incluir usuarios activos o el usuario desactivado seleccionado
+ $query->where(function ($q) use ($filters, $includeUserId) {
+ if (isset($filters['status'])) {
+ $q->where('status', $filters['status']);
+ }
+
+ if ($includeUserId) {
+ $q->orWhere('id', $includeUserId);
+ }
+ });
+
+ // Formatear los datos como id => "Nombre Apellido"
+ return $query->pluck(\DB::raw("CONCAT(name, ' ', IFNULL(last_name, ''))"), 'id')->toArray();
+ }
+
+
+ /**
+ * Relations
+ */
+
+ // User who created this user
+ public function creator()
+ {
+ return $this->belongsTo(self::class, 'created_by');
+ }
+
+ public function isActive()
+ {
+ return $this->status === self::STATUS_ENABLED;
+ }
+
+}
diff --git a/Models/User.php b/Models/User.php
new file mode 100644
index 0000000..b1644d8
--- /dev/null
+++ b/Models/User.php
@@ -0,0 +1,237 @@
+ 'Habilitado',
+ self::STATUS_DISABLED => 'Deshabilitado',
+ self::STATUS_REMOVED => 'Eliminado',
+ ];
+
+ /**
+ * List of names for each status.
+ * @var array
+ */
+ public static $statusListClass = [
+ self::STATUS_ENABLED => 'success',
+ self::STATUS_DISABLED => 'warning',
+ self::STATUS_REMOVED => 'danger',
+ ];
+
+ /**
+ * The attributes that are mass assignable.
+ *
+ * @var array
+ */
+ protected $fillable = [
+ 'name',
+ 'last_name',
+ 'email',
+ 'password',
+ 'profile_photo_path',
+ 'status',
+ 'created_by',
+ ];
+
+ /**
+ * The attributes that should be hidden for serialization.
+ *
+ * @var array
+ */
+ protected $hidden = [
+ 'password',
+ 'remember_token',
+ 'two_factor_recovery_codes',
+ 'two_factor_secret',
+ ];
+
+ /**
+ * The accessors to append to the model's array form.
+ *
+ * @var array
+ */
+ protected $appends = [
+ 'profile_photo_url',
+ ];
+
+ /**
+ * Nombre de la etiqueta para generar Componentes
+ *
+ * @var string
+ */
+ public $tagName = 'User';
+
+ /**
+ * Nombre de la columna que contiee el nombre del registro
+ *
+ * @var string
+ */
+ public $columnNameLabel = 'full_name';
+
+ /**
+ * Nombre singular del registro.
+ *
+ * @var string
+ */
+ public $singularName = 'usuario';
+
+ /**
+ * Nombre plural del registro.
+ *
+ * @var string
+ */
+ public $pluralName = 'usuarios';
+
+ /**
+ * Get the attributes that should be cast.
+ *
+ * @return array
+ */
+ protected function casts(): array
+ {
+ return [
+ 'email_verified_at' => 'datetime',
+ 'password' => 'hashed',
+ ];
+ }
+
+ /**
+ * Attributes to include in the Audit.
+ *
+ * @var array
+ */
+ protected $auditInclude = [
+ 'name',
+ 'email',
+ ];
+
+ /**
+ * Get the full name of the user.
+ *
+ * @return string
+ */
+ public function getFullnameAttribute()
+ {
+ return trim($this->name . ' ' . $this->last_name);
+ }
+
+ /**
+ * Get the initials of the user's full name.
+ *
+ * @return string
+ */
+ public function getInitialsAttribute()
+ {
+ return self::getInitials($this->fullname);
+ }
+
+ /**
+ * Envía la notificación de restablecimiento de contraseña.
+ *
+ * @param string $token
+ */
+ public function sendPasswordResetNotification($token)
+ {
+ // Usar la notificación personalizada
+ $this->notify(new CustomResetPasswordNotification($token));
+ }
+
+ /**
+ * Obtener usuarios activos con una excepción para incluir un usuario específico desactivado.
+ *
+ * @param array $filters Filtros opcionales como ['type' => 'user', 'status' => 1]
+ * @param int|null $includeUserId ID de usuario específico a incluir aunque esté inactivo
+ * @return array
+ */
+ public static function getUsersListWithInactive($includeUserId = null, array $filters = []): array
+ {
+ $query = self::query();
+
+ // Filtro por tipo de usuario dinámico
+ $tipoUsuarios = [
+ 'partner' => 'is_partner',
+ 'employee' => 'is_employee',
+ 'prospect' => 'is_prospect',
+ 'customer' => 'is_customer',
+ 'provider' => 'is_provider',
+ 'user' => 'is_user',
+ ];
+
+ if (isset($filters['type']) && isset($tipoUsuarios[$filters['type']])) {
+ $query->where($tipoUsuarios[$filters['type']], 1);
+ }
+
+ // Filtrar por estado o incluir usuario inactivo
+ $query->where(function ($q) use ($filters, $includeUserId) {
+ if (isset($filters['status'])) {
+ $q->where('status', $filters['status']);
+ }
+
+ if ($includeUserId) {
+ $q->orWhere('id', $includeUserId);
+ }
+ });
+
+ return $query->pluck(\DB::raw("CONCAT(name, ' ', IFNULL(last_name, ''))"), 'id')->toArray();
+ }
+
+ /**
+ * User who created this user
+ */
+ public function creator()
+ {
+ return $this->belongsTo(self::class, 'created_by');
+ }
+
+ /**
+ * Check if the user is active
+ */
+ public function isActive()
+ {
+ return $this->status === self::STATUS_ENABLED;
+ }
+
+}
diff --git a/Models/UserLogin.php b/Models/UserLogin.php
new file mode 100644
index 0000000..3f86d0c
--- /dev/null
+++ b/Models/UserLogin.php
@@ -0,0 +1,14 @@
+token = $token;
+ }
+
+ /**
+ * Configura el canal de la notificación.
+ */
+ public function via($notifiable)
+ {
+ return ['mail'];
+ }
+
+ /**
+ * Configura el mensaje de correo.
+ */
+ public function toMail($notifiable)
+ {
+ try {
+ // Cargar configuración SMTP desde la base de datos
+ $this->loadDynamicMailConfig();
+
+ $resetUrl = url(route('password.reset', [
+ 'token' => $this->token,
+ 'email' => $notifiable->getEmailForPasswordReset()
+ ], false));
+
+ $appTitle = Setting::global()->where('key', 'website_title')->first()->value ?? Config::get('koneko.appTitle');
+ $imageBase64 = 'data:image/png;base64,' . base64_encode(file_get_contents(public_path('/assets/img/logo/koneko-04.png')));
+ $expireMinutes = Config::get('auth.passwords.' . Config::get('auth.defaults.passwords') . '.expire', 60);
+
+ Config::set('app.name', $appTitle);
+
+ return (new MailMessage)
+ ->subject("Restablece tu contraseña - {$appTitle}")
+ ->markdown('vuexy-admin::notifications.email', [ // Usar tu plantilla del módulo
+ 'greeting' => "Hola {$notifiable->name}",
+ 'introLines' => [
+ 'Estás recibiendo este correo porque solicitaste restablecer tu contraseña.',
+ ],
+ 'actionText' => 'Restablecer contraseña',
+ 'actionUrl' => $resetUrl,
+ 'outroLines' => [
+ "Este enlace expirará en {$expireMinutes} minutos.",
+ 'Si no solicitaste este cambio, no se requiere realizar ninguna acción.',
+ ],
+ 'displayableActionUrl' => $resetUrl, // Para el subcopy
+ 'image' => $imageBase64, // Imagen del logo
+ ]);
+
+ /*
+ */
+ } catch (\Exception $e) {
+ // Registrar el error
+ Log::error('Error al enviar el correo de restablecimiento: ' . $e->getMessage());
+
+ // Retornar un mensaje alternativo
+ return (new MailMessage)
+ ->subject('Restablece tu contraseña')
+ ->line('Ocurrió un error al enviar el correo. Por favor, intenta de nuevo más tarde.');
+ }
+ }
+
+ /**
+ * Cargar configuración SMTP desde la base de datos.
+ */
+ protected function loadDynamicMailConfig()
+ {
+ try {
+ $smtpConfig = Setting::where('key', 'LIKE', 'mail_%')
+ ->pluck('value', 'key');
+
+ if ($smtpConfig->isEmpty()) {
+ throw new Exception('No SMTP configuration found in the database.');
+ }
+
+ Config::set('mail.mailers.smtp.host', $smtpConfig['mail_mailers_smtp_host'] ?? null);
+ Config::set('mail.mailers.smtp.port', $smtpConfig['mail_mailers_smtp_port'] ?? null);
+ Config::set('mail.mailers.smtp.username', $smtpConfig['mail_mailers_smtp_username'] ?? null);
+ Config::set(
+ 'mail.mailers.smtp.password',
+ isset($smtpConfig['mail_mailers_smtp_password'])
+ ? Crypt::decryptString($smtpConfig['mail_mailers_smtp_password'])
+ : null
+ );
+ Config::set('mail.mailers.smtp.encryption', $smtpConfig['mail_mailers_smtp_encryption'] ?? null);
+ Config::set('mail.from.address', $smtpConfig['mail_from_address'] ?? null);
+ Config::set('mail.from.name', $smtpConfig['mail_from_name'] ?? null);
+ } catch (Exception $e) {
+ Log::error('SMTP Configuration Error: ' . $e->getMessage());
+ // Opcional: Puedes lanzar la excepción o manejarla de otra manera.
+ throw new Exception('Error al cargar la configuración SMTP.');
+ }
+ }
+}
diff --git a/Providers/ConfigServiceProvider.php b/Providers/ConfigServiceProvider.php
new file mode 100644
index 0000000..d165392
--- /dev/null
+++ b/Providers/ConfigServiceProvider.php
@@ -0,0 +1,31 @@
+mergeConfigFrom(__DIR__.'/../config/vuexy.php', 'vuexy');
+ }
+
+ /**
+ * Bootstrap services.
+ */
+ public function boot(): void
+ {
+ // Cargar configuración del sistema
+ $globalSettingsService = app(GlobalSettingsService::class);
+ $globalSettingsService->loadSystemConfig();
+
+ // Cargar configuración del sistema a través del servicio
+ app(GlobalSettingsService::class)->loadSystemConfig();
+ }
+}
diff --git a/Providers/FortifyServiceProvider.php b/Providers/FortifyServiceProvider.php
new file mode 100644
index 0000000..4b631d9
--- /dev/null
+++ b/Providers/FortifyServiceProvider.php
@@ -0,0 +1,124 @@
+input(Fortify::username())) . '|' . $request->ip());
+
+ return Limit::perMinute(5)->by($throttleKey);
+ });
+
+ RateLimiter::for('two-factor', function (Request $request) {
+ return Limit::perMinute(5)->by($request->session()->get('login.id'));
+ });
+
+ Fortify::authenticateUsing(function (Request $request) {
+ $user = User::where('email', $request->email)
+ ->where('status', User::STATUS_ENABLED)
+ ->first();
+
+ if ($user && Hash::check($request->password, $user->password)) {
+ return $user;
+ }
+ });
+
+ // Simula lo que hace tu middleware y comparte `_admin`
+ $viewMode = Config::get('vuexy.custom.authViewMode');
+ $adminVars = app(AdminTemplateService::class)->getAdminVars();
+
+ // Configurar la vista del login
+ Fortify::loginView(function () use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.login-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+
+ // Configurar la vista del registro (si lo necesitas)
+ Fortify::registerView(function () use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+
+ // Configurar la vista de restablecimiento de contraseñas
+ Fortify::requestPasswordResetLinkView(function () use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.forgot-password-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+
+ Fortify::resetPasswordView(function ($request) use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.reset-password-{$viewMode}", ['pageConfigs' => $pageConfigs, 'request' => $request]);
+ });
+
+ // Vista de verificación de correo electrónico
+ Fortify::verifyEmailView(function () use ($viewMode, $adminVars) {
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.verify-email-{$viewMode}");
+ });
+
+ // Vista de confirmación de contraseña
+ Fortify::confirmPasswordView(function () use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.confirm-password-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+
+ // Configurar la vista para la verificación de dos factores
+ Fortify::twoFactorChallengeView(function () use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("vuexy-admin::auth.two-factor-challenge-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+ }
+}
diff --git a/Providers/VuexyAdminServiceProvider.php b/Providers/VuexyAdminServiceProvider.php
new file mode 100644
index 0000000..0040af0
--- /dev/null
+++ b/Providers/VuexyAdminServiceProvider.php
@@ -0,0 +1,132 @@
+mergeConfigFrom(__DIR__.'/../config/koneko.php', 'koneko');
+
+ // Register the module's services and providers
+ $this->app->register(ConfigServiceProvider::class);
+ $this->app->register(FortifyServiceProvider::class);
+ $this->app->register(PermissionServiceProvider::class);
+
+ // Register the module's aliases
+ AliasLoader::getInstance()->alias('Helper', VuexyHelper::class);
+ }
+
+ /**
+ * Bootstrap any application services.
+ */
+ public function boot(): void
+ {
+ if(env('FORCE_HTTPS', false)){
+ URL::forceScheme('https');
+ }
+
+ // Registrar alias del middleware
+ $this->app['router']->aliasMiddleware('admin', AdminTemplateMiddleware::class);
+
+ // Sobrescribir ruta de traducciones para asegurar que se usen las del paquete
+ $this->app->bind('path.lang', function () {
+ return __DIR__ . '/../resources/lang';
+ });
+
+ // Register the module's routes
+ $this->loadRoutesFrom(__DIR__.'/../routes/admin.php');
+
+
+ // Cargar vistas del paquete
+ $this->loadViewsFrom(__DIR__.'/../resources/views', 'vuexy-admin');
+
+ // Registrar Componentes Blade
+ Blade::componentNamespace('VuexyAdmin\\View\\Components', 'vuexy-admin');
+
+
+ // Publicar los archivos necesarios
+ $this->publishes([
+ __DIR__.'/../config/fortify.php' => config_path('fortify.php'),
+ __DIR__.'/../config/image.php' => config_path('image.php'),
+ __DIR__.'/../config/vuexy_menu.php' => config_path('vuexy_menu.php'),
+ ], 'vuexy-admin-config');
+
+ $this->publishes([
+ __DIR__.'/../database/seeders/' => database_path('seeders'),
+ __DIR__.'/../database/data' => database_path('data'),
+ ], 'vuexy-admin-seeders');
+
+ $this->publishes([
+ __DIR__.'/../resources/img' => public_path('vendor/vuexy-admin/img'),
+ ], 'vuexy-admin-images');
+
+
+ // Register the migrations
+ $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');
+
+
+ // Registrar eventos
+ Event::listen(Login::class, HandleUserLogin::class);
+ Event::listen(Logout::class, ClearUserCache::class);
+
+
+ // Registrar comandos de consola
+ if ($this->app->runningInConsole()) {
+ $this->commands([
+ CleanInitialAvatars::class,
+ ]);
+ }
+
+ // Registrar Livewire Components
+ $components = [
+ 'user-index' => UserIndex::class,
+ 'user-show' => UserShow::class,
+ 'user-form' => UserForm::class,
+ 'user-offcanvas-form' => UserOffCanvasForm::class,
+ 'role-index' => RoleIndex::class,
+ 'permission-index' => PermissionIndex::class,
+
+
+ 'general-settings' => GeneralSettings::class,
+ 'application-settings' => ApplicationSettings::class,
+ 'interface-settings' => InterfaceSettings::class,
+ 'mail-smtp-settings' => MailSmtpSettings::class,
+ 'mail-sender-response-settings' => MailSenderResponseSettings::class,
+ 'cache-stats' => CacheStats::class,
+ 'session-stats' => SessionStats::class,
+ 'redis-stats' => RedisStats::class,
+ 'memcached-stats' => MemcachedStats::class,
+ 'cache-functions' => CacheFunctions::class,
+ ];
+
+ foreach ($components as $alias => $component) {
+ Livewire::component($alias, $component);
+ }
+
+ // Registrar auditoría en usuarios
+ User::observe(AuditableObserver::class);
+ }
+}
diff --git a/Queries/BootstrapTableQueryBuilder.php b/Queries/BootstrapTableQueryBuilder.php
new file mode 100644
index 0000000..00984cb
--- /dev/null
+++ b/Queries/BootstrapTableQueryBuilder.php
@@ -0,0 +1,104 @@
+request = $request;
+ $this->config = $config;
+ $this->query = DB::table($config['table']);
+
+ $this->applyJoins();
+ $this->applyFilters();
+ }
+
+ protected function applyJoins()
+ {
+ if (!empty($this->config['joins'])) {
+ foreach ($this->config['joins'] as $join) {
+ $type = $join['type'] ?? 'join';
+
+ $this->query->{$type}($join['table'], function($joinObj) use ($join) {
+ $joinObj->on($join['first'], '=', $join['second']);
+
+ // Soporte para AND en ON, si está definidio
+ if (!empty($join['and'])) {
+ foreach ((array) $join['and'] as $andCondition) {
+ // 'sat_codigo_postal.c_estado = sat_localidad.c_estado'
+ $parts = explode('=', $andCondition);
+
+ if (count($parts) === 2) {
+ $left = trim($parts[0]);
+ $right = trim($parts[1]);
+
+ $joinObj->whereRaw("$left = $right");
+ }
+ }
+ }
+ });
+ }
+ }
+ }
+
+ protected function applyFilters()
+ {
+ if (!empty($this->config['filters'])) {
+ foreach ($this->config['filters'] as $filter => $column) {
+ if ($this->request->filled($filter)) {
+ $this->query->where($column, 'LIKE', '%' . $this->request->input($filter) . '%');
+ }
+ }
+ }
+ }
+
+ protected function applyGrouping()
+ {
+ if (!empty($this->config['group_by'])) {
+ $this->query->groupBy($this->config['group_by']);
+ }
+ }
+
+ public function getJson()
+ {
+ $this->applyGrouping();
+
+ // Calcular total de filas antes de aplicar paginación
+ $total = DB::select("SELECT COUNT(*) as num_rows FROM (" . $this->query->selectRaw('0')->toSql() . ") as items", $this->query->getBindings())[0]->num_rows;
+
+ // Para ver la sentencia SQL (con placeholders ?)
+ //dump($this->query->toSql()); dd($this->query->getBindings());
+
+ // Aplicar orden, paginación y selección de columnas
+ $this->query
+ ->select($this->config['columns'])
+ ->when($this->request->input('sort'), function ($query) {
+ $query->orderBy($this->request->input('sort'), $this->request->input('order', 'asc'));
+ })
+ ->when($this->request->input('offset'), function ($query) {
+ $query->offset($this->request->input('offset'));
+ })
+ ->limit($this->request->input('limit', 10));
+
+ // Obtener resultados y limpiar los datos antes de enviarlos
+ $rows = $this->query->get()->map(function ($item) {
+ return collect($item)
+ ->reject(fn($val) => is_null($val) || $val === '') // Eliminar valores nulos o vacíos
+ ->map(fn($val) => is_numeric($val) ? (float) $val : $val) // Convertir números correctamente
+ ->toArray();
+ });
+
+ return response()->json([
+ "total" => $total,
+ "rows" => $rows,
+ ]);
+ }
+}
diff --git a/Queries/GenericQueryBuilder.php b/Queries/GenericQueryBuilder.php
new file mode 100644
index 0000000..23a38d3
--- /dev/null
+++ b/Queries/GenericQueryBuilder.php
@@ -0,0 +1,8 @@
+
-
-
-
+
-
+
-
+
+
+
---
-# Laravel Vuexy Admin para México
+## 📌 Descripción
-**Laravel Vuexy Admin para México** es un proyecto basado en Laravel optimizado para necesidades específicas del mercado mexicano. Incluye integración con los catálogos del SAT (CFDI 4.0), herramientas avanzadas y una interfaz moderna inspirada en el template premium Vuexy.
+**Laravel Vuexy Admin** es un módulo de administración optimizado para México, basado en Laravel 11 y diseñado para integrarse con **Vuexy Admin Template**. Incluye gestión avanzada de usuarios, roles, permisos y auditoría de acciones.
-## Características destacadas
-
-- **Optimización para México**:
- - Uso de los catálogos oficiales del SAT (versión CFDI 4.0):
- - Banco (`sat_banco`)
- - Clave de Producto o Servicio (`sat_clave_prod_serv`)
- - Clave de Unidad (`sat_clave_unidad`)
- - Forma de Pago (`sat_forma_pago`)
- - Moneda (`sat_moneda`)
- - Código Postal (`sat_codigo_postal`)
- - Régimen Fiscal (`sat_regimen_fiscal`)
- - País (`sat_pais`)
- - Uso CFDI (`sat_uso_cfdi`)
- - Colonia (`sat_colonia`)
- - Estado (`sat_estado`)
- - Localidad (`sat_localidad`)
- - Municipio (`sat_municipio`)
- - Deducción (`sat_deduccion`)
- - Percepción (`sat_percepcion`)
- - Compatible con los lineamientos y formatos del Anexo 20 del SAT.
- - Útil para generar comprobantes fiscales digitales (CFDI) y otros procesos administrativos locales.
-
-- **Otras características avanzadas**:
- - Autenticación y gestión de usuarios con Laravel Fortify.
- - Gestión de roles y permisos usando Spatie Permission.
- - Tablas dinámicas con Laravel Datatables y Yajra.
- - Integración con Redis para caching eficiente.
- - Exportación y manejo de Excel mediante Maatwebsite.
-
-## Requisitos del Sistema
-
-- **PHP**: >= 8.2
-- **Composer**: >= 2.0
-- **Node.js**: >= 16.x
-- **MySQL** o cualquier base de datos compatible con Laravel.
+### ✨ Características
+- 🔹 Sistema de autenticación con Laravel Fortify.
+- 🔹 Gestión avanzada de usuarios con Livewire.
+- 🔹 Control de roles y permisos con Spatie Permissions.
+- 🔹 Auditoría de acciones con Laravel Auditing.
+- 🔹 Publicación de configuraciones y vistas.
+- 🔹 Soporte para cache y optimización de rendimiento.
---
-## Instalación
+## 📦 Instalación
-Este proyecto ofrece dos métodos de instalación: mediante Composer o manualmente. A continuación, te explicamos ambos procesos.
-
-### Opción 1: Usar Composer (Recomendado)
-
-Para instalar el proyecto rápidamente usando Composer, ejecuta el siguiente comando:
+Instalar vía **Composer**:
```bash
-composer create-project koneko/laravel-vuexy-admin
+composer require koneko/laravel-vuexy-admin
```
-Este comando realizará automáticamente los siguientes pasos:
-1. Configurará el archivo `.env` basado en `.env.example`.
-2. Generará la clave de la aplicación.
-
-Una vez completado, debes configurar una base de datos válida en el archivo `.env` y luego ejecutar:
+Publicar archivos de configuración y migraciones:
```bash
+php artisan vendor:publish --tag=vuexy-admin-config
+php artisan migrate
+```
+
+---
+
+## 🚀 Uso básico
+
+```php
+use Koneko\VuexyAdmin\Models\User;
+
+$user = User::create([
+ 'name' => 'Juan Pérez',
+ 'email' => 'juan@example.com',
+ 'password' => bcrypt('secret'),
+]);
+```
+
+---
+
+## 📚 Configuración adicional
+
+Si necesitas personalizar la configuración del módulo, publica el archivo de configuración:
+
+```bash
+php artisan vendor:publish --tag=vuexy-admin-config
+```
+
+Esto generará `config/vuexy_menu.php`, donde puedes modificar valores predeterminados.
+
+---
+
+## 🛠 Dependencias
+
+Este paquete requiere las siguientes dependencias:
+- Laravel 11
+- `laravel/fortify` (autenticación)
+- `spatie/laravel-permission` (gestión de roles y permisos)
+- `owen-it/laravel-auditing` (auditoría de usuarios)
+- `livewire/livewire` (interfaz dinámica)
+
+---
+
+## 📦 Publicación de Assets y Configuraciones
+
+Para publicar configuraciones y seeders:
+
+```bash
+php artisan vendor:publish --tag=vuexy-admin-config
+php artisan vendor:publish --tag=vuexy-admin-seeders
php artisan migrate --seed
```
-Finalmente, compila los activos iniciales:
+Para publicar imágenes del tema:
```bash
-npm install
-npm run dev
-```
-
-Inicia el servidor local con:
-
-```bash
-php artisan serve
+php artisan vendor:publish --tag=vuexy-admin-images
```
---
-### Opción 2: Instalación manual
+## 🌍 Repositorio Principal y Sincronización
-Si prefieres instalar el proyecto de forma manual, sigue estos pasos:
+Este repositorio es una **copia sincronizada** del repositorio principal alojado en **[Tea - Koneko Git](https://git.koneko.mx/koneko/laravel-vuexy-admin)**.
-1. Clona el repositorio:
- ```bash
- git clone https://git.koneko.mx/Koneko-ST/laravel-vuexy-admin.git
- cd laravel-vuexy-admin
- ```
+### 🔄 Sincronización con GitHub
+- **Repositorio Principal:** [git.koneko.mx](https://git.koneko.mx/koneko/laravel-vuexy-admin)
+- **Repositorio en GitHub:** [github.com/koneko-mx/laravel-vuexy-admin](https://github.com/koneko-mx/laravel-vuexy-admin)
+- **Los cambios pueden reflejarse primero en Tea antes de GitHub.**
-2. Instala las dependencias de Composer:
- ```bash
- composer install
- ```
+### 🤝 Contribuciones
+Si deseas contribuir:
+1. Puedes abrir un **Issue** en [GitHub Issues](https://github.com/koneko-mx/laravel-vuexy-admin/issues).
+2. Para Pull Requests, **preferimos contribuciones en Tea**. Contacta a `admin@koneko.mx` para solicitar acceso.
-3. Instala las dependencias de npm:
- ```bash
- npm install
- ```
-
-4. Configura las variables de entorno:
- ```bash
- cp .env.example .env
- ```
-
-5. Configura una base de datos válida en el archivo `.env`.
-
-6. Genera la clave de la aplicación:
- ```bash
- php artisan key:generate
- ```
-
-7. Migra y llena la base de datos:
- ```bash
- php artisan migrate --seed
- ```
-
-8. Compila los activos frontend:
- ```bash
- npm run dev
- ```
-
-9. Inicia el servidor de desarrollo:
- ```bash
- php artisan serve
- ```
+⚠️ **Nota:** Algunos cambios pueden tardar en reflejarse en GitHub, ya que este repositorio se actualiza automáticamente desde Tea.
---
-## Notas importantes
+## 🏅 Licencia
-- Asegúrate de tener instalado:
- - **PHP**: >= 8.2
- - **Composer**: >= 2.0
- - **Node.js**: >= 16.x
-- Este proyecto utiliza los catálogos SAT de la versión CFDI 4.0. Si deseas más información, visita la documentación oficial del SAT en [Anexo 20](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/anexo_20.htm).
+Este paquete es de código abierto bajo la licencia [MIT](LICENSE).
---
-## Uso del Template Vuexy
-
-Este proyecto está diseñado para funcionar con el template premium [Vuexy](https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599). Para utilizarlo:
-
-1. Adquiere una licencia válida de Vuexy en [ThemeForest](https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599).
-2. Incluye los archivos necesarios en las carpetas correspondientes (`resources`, `public`, etc.) de este proyecto.
-
----
-
-## Créditos
-
-Este proyecto utiliza herramientas y recursos de código abierto, así como un template premium. Queremos agradecer a los desarrolladores y diseñadores que hacen posible esta implementación:
-
-- [Laravel](https://laravel.com)
-- [Vuexy Template](https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599)
-- [Spatie Permission](https://spatie.be/docs/laravel-permission)
-- [Yajra Datatables](https://yajrabox.com/docs/laravel-datatables)
-
----
-
-## Licencia
-
-Este proyecto está licenciado bajo la licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.
-
-El template "Vuexy" debe adquirirse por separado y está sujeto a su propia licencia comercial.
-
----
Hecho con ❤️ por Koneko Soluciones Tecnológicas
-
diff --git a/Rules/NotEmptyHtml.php b/Rules/NotEmptyHtml.php
new file mode 100644
index 0000000..885ec53
--- /dev/null
+++ b/Rules/NotEmptyHtml.php
@@ -0,0 +1,20 @@
+ [180, 180],
+ '192x192' => [192, 192],
+ '152x152' => [152, 152],
+ '120x120' => [120, 120],
+ '76x76' => [76, 76],
+ '16x16' => [16, 16],
+ ];
+
+ private $imageLogoMaxPixels1 = 22500; // Primera versión (px^2)
+ private $imageLogoMaxPixels2 = 75625; // Segunda versión (px^2)
+ private $imageLogoMaxPixels3 = 262144; // Tercera versión (px^2)
+ private $imageLogoMaxPixels4 = 230400; // Tercera versión (px^2) en Base64
+
+ protected $cacheTTL = 60 * 24 * 30; // 30 días en minutos
+
+ public function __construct()
+ {
+ $this->driver = config('image.driver', 'gd');
+ }
+
+ public function updateSetting(string $key, string $value): bool
+ {
+ $setting = Setting::updateOrCreate(
+ ['key' => $key],
+ ['value' => trim($value)]
+ );
+
+ return $setting->save();
+ }
+
+ public function processAndSaveFavicon($image): void
+ {
+ Storage::makeDirectory($this->imageDisk . '/' . $this->favicon_basePath);
+
+ // Eliminar favicons antiguos
+ $this->deleteOldFavicons();
+
+ // Guardar imagen original
+ $imageManager = new ImageManager($this->driver);
+
+ $imageName = uniqid('admin_favicon_');
+
+ $image = $imageManager->read($image->getRealPath());
+
+ foreach ($this->faviconsSizes as $size => [$width, $height]) {
+ $resizedPath = $this->favicon_basePath . $imageName . "_{$size}.png";
+
+ $image->cover($width, $height);
+
+ Storage::disk($this->imageDisk)->put($resizedPath, $image->toPng(indexed: true));
+ }
+
+ $this->updateSetting('admin_favicon_ns', $this->favicon_basePath . $imageName);
+ }
+
+ protected function deleteOldFavicons(): void
+ {
+ // Obtener el favicon actual desde la base de datos
+ $currentFavicon = Setting::where('key', 'admin_favicon_ns')->value('value');
+
+ if ($currentFavicon) {
+ $filePaths = [
+ $this->imageDisk . '/' . $currentFavicon,
+ $this->imageDisk . '/' . $currentFavicon . '_16x16.png',
+ $this->imageDisk . '/' . $currentFavicon . '_76x76.png',
+ $this->imageDisk . '/' . $currentFavicon . '_120x120.png',
+ $this->imageDisk . '/' . $currentFavicon . '_152x152.png',
+ $this->imageDisk . '/' . $currentFavicon . '_180x180.png',
+ $this->imageDisk . '/' . $currentFavicon . '_192x192.png',
+ ];
+
+ foreach ($filePaths as $filePath) {
+ if (Storage::exists($filePath)) {
+ Storage::delete($filePath);
+ }
+ }
+ }
+ }
+
+ public function processAndSaveImageLogo($image, string $type = ''): void
+ {
+ // Crear directorio si no existe
+ Storage::makeDirectory($this->imageDisk . '/' . $this->image_logo_basePath);
+
+ // Eliminar imágenes antiguas
+ $this->deleteOldImageWebapp($type);
+
+ // Leer imagen original
+ $imageManager = new ImageManager($this->driver);
+ $image = $imageManager->read($image->getRealPath());
+
+ // Generar tres versiones con diferentes áreas máximas
+ $this->generateAndSaveImage($image, $type, $this->imageLogoMaxPixels1, 'small'); // Versión 1
+ $this->generateAndSaveImage($image, $type, $this->imageLogoMaxPixels2, 'medium'); // Versión 2
+ $this->generateAndSaveImage($image, $type, $this->imageLogoMaxPixels3); // Versión 3
+ $this->generateAndSaveImageAsBase64($image, $type, $this->imageLogoMaxPixels4); // Versión 3
+ }
+
+ private function generateAndSaveImage($image, string $type, int $maxPixels, string $suffix = ''): void
+ {
+ $imageClone = clone $image;
+
+ // Escalar imagen conservando aspecto
+ $this->resizeImageToMaxPixels($imageClone, $maxPixels);
+
+ $imageName = 'admin_image_logo' . ($suffix ? '_' . $suffix : '') . ($type == 'dark' ? '_dark' : '');
+
+ // Generar nombre y ruta
+ $imageNameUid = uniqid($imageName . '_', ".png");
+ $resizedPath = $this->image_logo_basePath . $imageNameUid;
+
+ // Guardar imagen en PNG
+ Storage::disk($this->imageDisk)->put($resizedPath, $imageClone->toPng(indexed: true));
+
+ // Actualizar configuración
+ $this->updateSetting($imageName, $resizedPath);
+ }
+
+ private function resizeImageToMaxPixels($image, int $maxPixels)
+ {
+ // Obtener dimensiones originales de la imagen
+ $originalWidth = $image->width(); // Método para obtener el ancho
+ $originalHeight = $image->height(); // Método para obtener el alto
+
+ // Calcular el aspecto
+ $aspectRatio = $originalWidth / $originalHeight;
+
+ // Calcular dimensiones redimensionadas conservando aspecto
+ if ($aspectRatio > 1) { // Ancho es dominante
+ $newWidth = sqrt($maxPixels * $aspectRatio);
+ $newHeight = $newWidth / $aspectRatio;
+ } else { // Alto es dominante
+ $newHeight = sqrt($maxPixels / $aspectRatio);
+ $newWidth = $newHeight * $aspectRatio;
+ }
+
+ // Redimensionar la imagen
+ $image->resize(
+ round($newWidth), // Redondear para evitar problemas con números decimales
+ round($newHeight),
+ function ($constraint) {
+ $constraint->aspectRatio();
+ $constraint->upsize();
+ }
+ );
+
+ return $image;
+ }
+
+
+ private function generateAndSaveImageAsBase64($image, string $type, int $maxPixels): void
+ {
+ $imageClone = clone $image;
+
+ // Redimensionar imagen conservando el aspecto
+ $this->resizeImageToMaxPixels($imageClone, $maxPixels);
+
+ // Convertir a Base64
+ $base64Image = (string) $imageClone->toJpg(40)->toDataUri();
+
+ // Guardar como configuración
+ $this->updateSetting(
+ "admin_image_logo_base64" . ($type === 'dark' ? '_dark' : ''),
+ $base64Image // Ya incluye "data:image/png;base64,"
+ );
+ }
+
+ protected function deleteOldImageWebapp(string $type = ''): void
+ {
+ // Determinar prefijo según el tipo (normal o dark)
+ $suffix = $type === 'dark' ? '_dark' : '';
+
+ // Claves relacionadas con las imágenes que queremos limpiar
+ $imageKeys = [
+ "admin_image_logo{$suffix}",
+ "admin_image_logo_small{$suffix}",
+ "admin_image_logo_medium{$suffix}",
+ ];
+
+ // Recuperar las imágenes actuales en una sola consulta
+ $settings = Setting::whereIn('key', $imageKeys)->pluck('value', 'key');
+
+ foreach ($imageKeys as $key) {
+ // Obtener la imagen correspondiente
+ $currentImage = $settings[$key] ?? null;
+
+ if ($currentImage) {
+ // Construir la ruta del archivo y eliminarlo si existe
+ $filePath = $this->imageDisk . '/' . $currentImage;
+ if (Storage::exists($filePath)) {
+ Storage::delete($filePath);
+ }
+
+ // Eliminar la configuración de la base de datos
+ Setting::where('key', $key)->delete();
+ }
+ }
+ }
+}
diff --git a/Services/AdminTemplateService.php b/Services/AdminTemplateService.php
new file mode 100644
index 0000000..b1d177f
--- /dev/null
+++ b/Services/AdminTemplateService.php
@@ -0,0 +1,156 @@
+ $key],
+ ['value' => trim($value)]
+ );
+
+ return $setting->save();
+ }
+
+ public function getAdminVars($adminSetting = false): array
+ {
+ try {
+ // Verificar si el sistema está inicializado (la tabla `migrations` existe)
+ if (!Schema::hasTable('migrations')) {
+ return $this->getDefaultAdminVars($adminSetting);
+ }
+
+ // Cargar desde el caché o la base de datos si está disponible
+ return Cache::remember('admin_settings', $this->cacheTTL, function () use ($adminSetting) {
+ $settings = Setting::global()
+ ->where('key', 'LIKE', 'admin_%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ $adminSettings = $this->buildAdminVarsArray($settings);
+
+ return $adminSetting
+ ? $adminSettings[$adminSetting]
+ : $adminSettings;
+ });
+ } catch (\Exception $e) {
+ // En caso de error, devolver valores predeterminados
+ return $this->getDefaultAdminVars($adminSetting);
+ }
+ }
+
+ private function getDefaultAdminVars($adminSetting = false): array
+ {
+ $defaultSettings = [
+ 'title' => config('koneko.appTitle', 'Default Title'),
+ 'author' => config('koneko.author', 'Default Author'),
+ 'description' => config('koneko.description', 'Default Description'),
+ 'favicon' => $this->getFaviconPaths([]),
+ 'app_name' => config('koneko.appName', 'Default App Name'),
+ 'image_logo' => $this->getImageLogoPaths([]),
+ ];
+
+ return $adminSetting
+ ? $defaultSettings[$adminSetting] ?? null
+ : $defaultSettings;
+ }
+
+ private function buildAdminVarsArray(array $settings): array
+ {
+ return [
+ 'title' => $settings['admin_title'] ?? config('koneko.appTitle'),
+ 'author' => config('koneko.author'),
+ 'description' => config('koneko.description'),
+ 'favicon' => $this->getFaviconPaths($settings),
+ 'app_name' => $settings['admin_app_name'] ?? config('koneko.appName'),
+ 'image_logo' => $this->getImageLogoPaths($settings),
+ ];
+ }
+
+ public function getVuexyCustomizerVars()
+ {
+ // Obtener valores de la base de datos
+ $settings = Setting::global()
+ ->where('key', 'LIKE', 'vuexy_%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ // Obtener configuraciones predeterminadas
+ $defaultConfig = Config::get('vuexy.custom', []);
+
+ // Mezclar las configuraciones predeterminadas con las de la base de datos
+ return collect($defaultConfig)
+ ->mapWithKeys(function ($defaultValue, $key) use ($settings) {
+ $vuexyKey = 'vuexy_' . $key; // Convertir clave al formato de la base de datos
+
+ // Obtener valor desde la base de datos o usar el predeterminado
+ $value = $settings[$vuexyKey] ?? $defaultValue;
+
+ // Forzar booleanos para claves específicas
+ if (in_array($key, ['displayCustomizer', 'footerFixed', 'menuFixed', 'menuCollapsed', 'showDropdownOnHover'])) {
+ $value = filter_var($value, FILTER_VALIDATE_BOOLEAN);
+ }
+
+ return [$key => $value];
+ })
+ ->toArray();
+ }
+
+ /**
+ * Obtiene los paths de favicon en distintos tamaños.
+ */
+ private function getFaviconPaths(array $settings): array
+ {
+ $defaultFavicon = config('koneko.appFavicon');
+ $namespace = $settings['admin_favicon_ns'] ?? null;
+
+ return [
+ 'namespace' => $namespace,
+ '16x16' => $namespace ? "{$namespace}_16x16.png" : $defaultFavicon,
+ '76x76' => $namespace ? "{$namespace}_76x76.png" : $defaultFavicon,
+ '120x120' => $namespace ? "{$namespace}_120x120.png" : $defaultFavicon,
+ '152x152' => $namespace ? "{$namespace}_152x152.png" : $defaultFavicon,
+ '180x180' => $namespace ? "{$namespace}_180x180.png" : $defaultFavicon,
+ '192x192' => $namespace ? "{$namespace}_192x192.png" : $defaultFavicon,
+ ];
+ }
+
+ /**
+ * Obtiene los paths de los logos en distintos tamaños.
+ */
+ private function getImageLogoPaths(array $settings): array
+ {
+ $defaultLogo = config('koneko.appLogo');
+
+ return [
+ 'small' => $this->getImagePath($settings, 'admin_image_logo_small', $defaultLogo),
+ 'medium' => $this->getImagePath($settings, 'admin_image_logo_medium', $defaultLogo),
+ 'large' => $this->getImagePath($settings, 'admin_image_logo', $defaultLogo),
+ 'small_dark' => $this->getImagePath($settings, 'admin_image_logo_small_dark', $defaultLogo),
+ 'medium_dark' => $this->getImagePath($settings, 'admin_image_logo_medium_dark', $defaultLogo),
+ 'large_dark' => $this->getImagePath($settings, 'admin_image_logo_dark', $defaultLogo),
+ ];
+ }
+
+ /**
+ * Obtiene un path de imagen o retorna un valor predeterminado.
+ */
+ private function getImagePath(array $settings, string $key, string $default): string
+ {
+ return $settings[$key] ?? $default;
+ }
+
+ public static function clearAdminVarsCache()
+ {
+ Cache::forget("admin_settings");
+ }
+}
diff --git a/Services/AvatarImageService.php b/Services/AvatarImageService.php
new file mode 100644
index 0000000..5efc78f
--- /dev/null
+++ b/Services/AvatarImageService.php
@@ -0,0 +1,76 @@
+getRealPath())) {
+ throw new \Exception('El archivo no existe en la ruta especificada.');
+ }
+
+ if (!in_array($image_avatar->getClientOriginalExtension(), ['jpg', 'jpeg', 'png'])) {
+ throw new \Exception('El formato del archivo debe ser JPG o PNG.');
+ }
+
+ $avatarName = uniqid('avatar_') . '.png';
+ $driver = config('image.driver', 'gd');
+
+ $manager = new ImageManager($driver);
+
+ if (!Storage::disk($this->avatarDisk)->exists($this->profilePhotoDir)) {
+ Storage::disk($this->avatarDisk)->makeDirectory($this->profilePhotoDir);
+ }
+
+ $image = $manager->read($image_avatar->getRealPath());
+ $image->cover($this->avatarWidth, $this->avatarHeight);
+ Storage::disk($this->avatarDisk)->put($this->profilePhotoDir . '/' . $avatarName, $image->toPng(indexed: true));
+
+ // Eliminar avatar existente
+ $this->deleteProfilePhoto($user);
+
+ $user->forceFill([
+ 'profile_photo_path' => $avatarName,
+ ])->save();
+ }
+
+
+ /**
+ * Elimina la foto de perfil actual del usuario.
+ *
+ * @param mixed $user Objeto usuario.
+ *
+ * @return void
+ */
+ public function deleteProfilePhoto($user)
+ {
+ if (!empty($user->profile_photo_path)) {
+ Storage::disk($this->avatarDisk)->delete($user->profile_photo_path);
+
+ $user->forceFill([
+ 'profile_photo_path' => null,
+ ])->save();
+ }
+ }
+}
diff --git a/Services/AvatarInitialsService.php b/Services/AvatarInitialsService.php
new file mode 100644
index 0000000..df045eb
--- /dev/null
+++ b/Services/AvatarInitialsService.php
@@ -0,0 +1,124 @@
+getAvatarColor($name);
+ $background = ltrim(self::AVATAR_BACKGROUND, '#');
+ $size = ($this->avatarWidth + $this->avatarHeight) / 2;
+ $initials = self::getInitials($name);
+ $cacheKey = "avatar-{$initials}-{$color}-{$background}-{$size}";
+ $path = "{$this->initialAvatarDir}/{$cacheKey}.png";
+ $storagePath = storage_path("app/public/{$path}");
+
+ if (Storage::disk($this->avatarDisk)->exists($path)) {
+ return response()->file($storagePath);
+ }
+
+ $image = $this->createAvatarImage($name, $color, self::AVATAR_BACKGROUND, $size);
+ Storage::disk($this->avatarDisk)->put($path, $image->toPng(indexed: true));
+
+ return response()->file($storagePath);
+ }
+
+ /**
+ * Crea la imagen del avatar con las iniciales.
+ *
+ * @param string $name Nombre completo.
+ * @param string $color Color del texto.
+ * @param string $background Color de fondo.
+ * @param int $size Tamaño de la imagen.
+ *
+ * @return \Intervention\Image\Image La imagen generada.
+ */
+ protected function createAvatarImage($name, $color, $background, $size)
+ {
+ $driver = config('image.driver', 'gd');
+ $manager = new ImageManager($driver);
+ $initials = self::getInitials($name);
+ $fontPath = __DIR__ . '/../storage/fonts/OpenSans-Bold.ttf';
+
+ $image = $manager->create($size, $size)
+ ->fill($background);
+
+ $image->text(
+ $initials,
+ $size / 2,
+ $size / 2,
+ function (FontFactory $font) use ($color, $size, $fontPath) {
+ $font->file($fontPath);
+ $font->size($size * 0.4);
+ $font->color($color);
+ $font->align('center');
+ $font->valign('middle');
+ }
+ );
+
+ return $image;
+ }
+
+ /**
+ * Calcula las iniciales a partir del nombre.
+ *
+ * @param string $name Nombre completo.
+ *
+ * @return string Iniciales en mayúsculas.
+ */
+ public static function getInitials($name)
+ {
+ if (empty($name)) {
+ return 'NA';
+ }
+
+ $initials = implode('', array_map(function ($word) {
+ return mb_substr($word, 0, 1);
+ }, explode(' ', $name)));
+
+ return strtoupper(substr($initials, 0, self::INITIAL_MAX_LENGTH));
+ }
+
+ /**
+ * Selecciona un color basado en el nombre.
+ *
+ * @param string $name Nombre del usuario.
+ *
+ * @return string Color seleccionado.
+ */
+ public function getAvatarColor($name)
+ {
+ // Por ejemplo, se puede basar en la suma de los códigos ASCII de las letras del nombre
+ $hash = array_sum(array_map('ord', str_split($name)));
+
+ return self::AVATAR_COLORS[$hash % count(self::AVATAR_COLORS)];
+ }
+}
diff --git a/Services/CacheConfigService.php b/Services/CacheConfigService.php
new file mode 100644
index 0000000..0d16a91
--- /dev/null
+++ b/Services/CacheConfigService.php
@@ -0,0 +1,235 @@
+ $this->getCacheConfig(),
+ 'session' => $this->getSessionConfig(),
+ 'database' => $this->getDatabaseConfig(),
+ 'driver' => $this->getDriverVersion(),
+ 'memcachedInUse' => $this->isDriverInUse('memcached'),
+ 'redisInUse' => $this->isDriverInUse('redis'),
+ ];
+ }
+
+
+ private function getCacheConfig(): array
+ {
+ $cacheConfig = Config::get('cache');
+ $driver = $cacheConfig['default'];
+
+ switch ($driver) {
+ case 'redis':
+ $connection = config('database.redis.cache');
+ $cacheConfig['host'] = $connection['host'] ?? 'localhost';
+ $cacheConfig['database'] = $connection['database'] ?? 'N/A';
+ break;
+
+ case 'database':
+ $connection = config('database.connections.' . config('cache.stores.database.connection'));
+ $cacheConfig['host'] = $connection['host'] ?? 'localhost';
+ $cacheConfig['database'] = $connection['database'] ?? 'N/A';
+ break;
+
+ case 'memcached':
+ $servers = config('cache.stores.memcached.servers');
+ $cacheConfig['host'] = $servers[0]['host'] ?? 'localhost';
+ $cacheConfig['database'] = 'N/A';
+ break;
+
+ case 'file':
+ $cacheConfig['host'] = storage_path('framework/cache/data');
+ $cacheConfig['database'] = 'N/A';
+ break;
+
+ default:
+ $cacheConfig['host'] = 'N/A';
+ $cacheConfig['database'] = 'N/A';
+ break;
+ }
+
+ return $cacheConfig;
+ }
+
+ private function getSessionConfig(): array
+ {
+ $sessionConfig = Config::get('session');
+ $driver = $sessionConfig['driver'];
+
+ switch ($driver) {
+ case 'redis':
+ $connection = config('database.redis.sessions');
+ $sessionConfig['host'] = $connection['host'] ?? 'localhost';
+ $sessionConfig['database'] = $connection['database'] ?? 'N/A';
+ break;
+
+ case 'database':
+ $connection = config('database.connections.' . $sessionConfig['connection']);
+ $sessionConfig['host'] = $connection['host'] ?? 'localhost';
+ $sessionConfig['database'] = $connection['database'] ?? 'N/A';
+ break;
+
+ case 'memcached':
+ $servers = config('cache.stores.memcached.servers');
+ $sessionConfig['host'] = $servers[0]['host'] ?? 'localhost';
+ $sessionConfig['database'] = 'N/A';
+ break;
+
+ case 'file':
+ $sessionConfig['host'] = storage_path('framework/sessions');
+ $sessionConfig['database'] = 'N/A';
+ break;
+
+ default:
+ $sessionConfig['host'] = 'N/A';
+ $sessionConfig['database'] = 'N/A';
+ break;
+ }
+
+ return $sessionConfig;
+ }
+
+ private function getDatabaseConfig(): array
+ {
+ $databaseConfig = Config::get('database');
+ $connection = $databaseConfig['default'];
+
+ $connectionConfig = config('database.connections.' . $connection);
+ $databaseConfig['host'] = $connectionConfig['host'] ?? 'localhost';
+ $databaseConfig['database'] = $connectionConfig['database'] ?? 'N/A';
+
+ return $databaseConfig;
+ }
+
+
+ private function getDriverVersion(): array
+ {
+ $drivers = [];
+ $defaultDatabaseDriver = config('database.default'); // Obtén el driver predeterminado
+
+ switch ($defaultDatabaseDriver) {
+ case 'mysql':
+ case 'mariadb':
+ $drivers['mysql'] = [
+ 'version' => $this->getMySqlVersion(),
+ 'details' => config("database.connections.$defaultDatabaseDriver"),
+ ];
+
+ $drivers['mariadb'] = $drivers['mysql'];
+
+ case 'pgsql':
+ $drivers['pgsql'] = [
+ 'version' => $this->getPgSqlVersion(),
+ 'details' => config("database.connections.pgsql"),
+ ];
+ break;
+
+ case 'sqlsrv':
+ $drivers['sqlsrv'] = [
+ 'version' => $this->getSqlSrvVersion(),
+ 'details' => config("database.connections.sqlsrv"),
+ ];
+ break;
+
+ default:
+ $drivers['unknown'] = [
+ 'version' => 'No disponible',
+ 'details' => 'Driver no identificado',
+ ];
+ break;
+ }
+
+ // Opcional: Agrega detalles de Redis y Memcached si están en uso
+ if ($this->isDriverInUse('redis')) {
+ $drivers['redis'] = [
+ 'version' => $this->getRedisVersion(),
+ ];
+ }
+
+ if ($this->isDriverInUse('memcached')) {
+ $drivers['memcached'] = [
+ 'version' => $this->getMemcachedVersion(),
+ ];
+ }
+
+ return $drivers;
+ }
+
+ private function getMySqlVersion(): string
+ {
+ try {
+ $version = DB::selectOne('SELECT VERSION() as version');
+ return $version->version ?? 'No disponible';
+ } catch (\Exception $e) {
+ return 'Error: ' . $e->getMessage();
+ }
+ }
+
+ private function getPgSqlVersion(): string
+ {
+ try {
+ $version = DB::selectOne("SHOW server_version");
+ return $version->server_version ?? 'No disponible';
+ } catch (\Exception $e) {
+ return 'Error: ' . $e->getMessage();
+ }
+ }
+
+ private function getSqlSrvVersion(): string
+ {
+ try {
+ $version = DB::selectOne("SELECT @@VERSION as version");
+ return $version->version ?? 'No disponible';
+ } catch (\Exception $e) {
+ return 'Error: ' . $e->getMessage();
+ }
+ }
+
+ private function getMemcachedVersion(): string
+ {
+ try {
+ $memcached = new \Memcached();
+ $memcached->addServer(
+ Config::get('cache.stores.memcached.servers.0.host'),
+ Config::get('cache.stores.memcached.servers.0.port')
+ );
+
+ $stats = $memcached->getStats();
+ foreach ($stats as $serverStats) {
+ return $serverStats['version'] ?? 'No disponible';
+ }
+
+ return 'No disponible';
+ } catch (\Exception $e) {
+ return 'Error: ' . $e->getMessage();
+ }
+ }
+
+ private function getRedisVersion(): string
+ {
+ try {
+ $info = Redis::info();
+ return $info['redis_version'] ?? 'No disponible';
+ } catch (\Exception $e) {
+ return 'Error: ' . $e->getMessage();
+ }
+ }
+
+
+ protected function isDriverInUse(string $driver): bool
+ {
+ return in_array($driver, [
+ Config::get('cache.default'),
+ Config::get('session.driver'),
+ Config::get('queue.default'),
+ ]);
+ }
+}
diff --git a/Services/CacheManagerService.php b/Services/CacheManagerService.php
new file mode 100644
index 0000000..6db4419
--- /dev/null
+++ b/Services/CacheManagerService.php
@@ -0,0 +1,389 @@
+driver = $driver ?? config('cache.default');
+ }
+
+ /**
+ * Obtiene estadísticas de caché para el driver especificado.
+ */
+ public function getCacheStats(string $driver = null): array
+ {
+ $driver = $driver ?? $this->driver;
+
+ if (!$this->isSupportedDriver($driver)) {
+ return $this->response('warning', 'Driver no soportado o no configurado.');
+ }
+
+ try {
+ return match ($driver) {
+ 'database' => $this->_getDatabaseStats(),
+ 'file' => $this->_getFilecacheStats(),
+ 'redis' => $this->_getRedisStats(),
+ 'memcached' => $this->_getMemcachedStats(),
+ default => $this->response('info', 'No hay estadísticas disponibles para este driver.'),
+ };
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al obtener estadísticas: ' . $e->getMessage());
+ }
+ }
+
+ public function clearCache(string $driver = null): array
+ {
+ $driver = $driver ?? $this->driver;
+
+ if (!$this->isSupportedDriver($driver)) {
+ return $this->response('warning', 'Driver no soportado o no configurado.');
+ }
+
+ try {
+ switch ($driver) {
+ case 'redis':
+ $keysCleared = $this->clearRedisCache();
+
+ return $keysCleared
+ ? $this->response('warning', 'Se ha purgado toda la caché de Redis.')
+ : $this->response('info', 'No se encontraron claves en Redis para eliminar.');
+
+ case 'memcached':
+ $keysCleared = $this->clearMemcachedCache();
+
+ return $keysCleared
+ ? $this->response('warning', 'Se ha purgado toda la caché de Memcached.')
+ : $this->response('info', 'No se encontraron claves en Memcached para eliminar.');
+
+ case 'database':
+ $rowsDeleted = $this->clearDatabaseCache();
+
+ return $rowsDeleted
+ ? $this->response('warning', 'Se ha purgado toda la caché almacenada en la base de datos.')
+ : $this->response('info', 'No se encontraron registros en la caché de la base de datos.');
+
+ case 'file':
+ $filesDeleted = $this->clearFilecache();
+
+ return $filesDeleted
+ ? $this->response('warning', 'Se ha purgado toda la caché de archivos.')
+ : $this->response('info', 'No se encontraron archivos en la caché para eliminar.');
+
+ default:
+ Cache::flush();
+
+ return $this->response('warning', 'Caché purgada.');
+ }
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al limpiar la caché: ' . $e->getMessage());
+ }
+ }
+
+ public function getRedisStats()
+ {
+ try {
+ if (!Redis::ping()) {
+ return $this->response('warning', 'No se puede conectar con el servidor Redis.');
+ }
+
+ $info = Redis::info();
+
+ $databases = $this->getRedisDatabases();
+
+ $redisInfo = [
+ 'server' => config('database.redis.default.host'),
+ 'redis_version' => $info['redis_version'] ?? 'N/A',
+ 'os' => $info['os'] ?? 'N/A',
+ 'tcp_port' => $info['tcp_port'] ?? 'N/A',
+ 'connected_clients' => $info['connected_clients'] ?? 'N/A',
+ 'blocked_clients' => $info['blocked_clients'] ?? 'N/A',
+ 'maxmemory' => $info['maxmemory'] ?? 0,
+ 'used_memory_human' => $info['used_memory_human'] ?? 'N/A',
+ 'used_memory_peak' => $info['used_memory_peak'] ?? 'N/A',
+ 'used_memory_peak_human' => $info['used_memory_peak_human'] ?? 'N/A',
+ 'total_system_memory' => $info['total_system_memory'] ?? 0,
+ 'total_system_memory_human' => $info['total_system_memory_human'] ?? 'N/A',
+ 'maxmemory_human' => $info['maxmemory_human'] !== '0B' ? $info['maxmemory_human'] : 'Sin Límite',
+ 'total_connections_received' => number_format($info['total_connections_received']) ?? 'N/A',
+ 'total_commands_processed' => number_format($info['total_commands_processed']) ?? 'N/A',
+ 'maxmemory_policy' => $info['maxmemory_policy'] ?? 'N/A',
+ 'role' => $info['role'] ?? 'N/A',
+ 'cache_database' => '',
+ 'sessions_database' => '',
+ 'general_database' => ',',
+ 'keys' => $databases['total_keys'],
+ 'used_memory' => $info['used_memory'] ?? 0,
+ 'uptime' => gmdate('H\h i\m s\s', $info['uptime_in_seconds'] ?? 0),
+ 'databases' => $databases,
+ ];
+
+ return $this->response('success', 'Se a recargado las estadísticas de Redis.', ['info' => $redisInfo]);
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al conectar con el servidor Redis: ' . Redis::getLastError());
+ }
+ }
+
+ public function getMemcachedStats()
+ {
+ try {
+ $memcachedStats = [];
+
+ // Crear instancia del cliente Memcached
+ $memcached = new \Memcached();
+ $memcached->addServer(config('memcached.host'), config('memcached.port'));
+
+ // Obtener estadísticas del servidor
+ $stats = $memcached->getStats();
+
+ foreach ($stats as $server => $data) {
+ $server = explode(':', $server);
+
+ $memcachedStats[] = [
+ 'server' => $server[0],
+ 'tcp_port' => $server[1],
+ 'uptime' => $data['uptime'] ?? 'N/A',
+ 'version' => $data['version'] ?? 'N/A',
+ 'libevent' => $data['libevent'] ?? 'N/A',
+ 'max_connections' => $data['max_connections'] ?? 0,
+ 'total_connections' => $data['total_connections'] ?? 0,
+ 'rejected_connections' => $data['rejected_connections'] ?? 0,
+ 'curr_items' => $data['curr_items'] ?? 0, // Claves almacenadas
+ 'bytes' => $data['bytes'] ?? 0, // Memoria usada
+ 'limit_maxbytes' => $data['limit_maxbytes'] ?? 0, // Memoria máxima
+ 'cmd_get' => $data['cmd_get'] ?? 0, // Comandos GET ejecutados
+ 'cmd_set' => $data['cmd_set'] ?? 0, // Comandos SET ejecutados
+ 'get_hits' => $data['get_hits'] ?? 0, // GET exitosos
+ 'get_misses' => $data['get_misses'] ?? 0, // GET fallidos
+ 'evictions' => $data['evictions'] ?? 0, // Claves expulsadas
+ 'bytes_read' => $data['bytes_read'] ?? 0, // Bytes leídos
+ 'bytes_written' => $data['bytes_written'] ?? 0, // Bytes escritos
+ 'total_items' => $data['total_items'] ?? 0,
+ ];
+ }
+
+ return $this->response('success', 'Se a recargado las estadísticas de Memcached.', ['info' => $memcachedStats]);
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al conectar con el servidor Memcached: ' . $e->getMessage());
+ }
+ }
+
+
+ /**
+ * Obtiene estadísticas para caché en base de datos.
+ */
+ private function _getDatabaseStats(): array
+ {
+ try {
+ $recordCount = DB::table('cache')->count();
+ $tableInfo = DB::select("SHOW TABLE STATUS WHERE Name = 'cache'");
+
+ $memory_usage = isset($tableInfo[0]) ? $this->formatBytes($tableInfo[0]->Data_length + $tableInfo[0]->Index_length) : 'N/A';
+
+ return $this->response('success', 'Se ha recargado la información de la caché de base de datos.', ['item_count' => $recordCount, 'memory_usage' => $memory_usage]);
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al obtener estadísticas de la base de datos: ' . $e->getMessage());
+ }
+ }
+
+ /**
+ * Obtiene estadísticas para caché en archivos.
+ */
+ private function _getFilecacheStats(): array
+ {
+ try {
+ $cachePath = config('cache.stores.file.path');
+ $files = glob($cachePath . '/*');
+
+ $memory_usage = $this->formatBytes(array_sum(array_map('filesize', $files)));
+
+ return $this->response('success', 'Se ha recargado la información de la caché de archivos.', ['item_count' => count($files), 'memory_usage' => $memory_usage]);
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al obtener estadísticas de archivos: ' . $e->getMessage());
+ }
+ }
+
+ private function _getRedisStats()
+ {
+ try {
+ $prefix = config('cache.prefix'); // Asegúrate de agregar el sufijo correcto si es necesario
+
+ $info = Redis::info();
+ $keys = Redis::connection('cache')->keys($prefix . '*');
+
+ $memory_usage = $this->formatBytes($info['used_memory'] ?? 0);
+
+ return $this->response('success', 'Se ha recargado la información de la caché de Redis.', ['item_count' => count($keys), 'memory_usage' => $memory_usage]);
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al obtener estadísticas de Redis: ' . $e->getMessage());
+ }
+ }
+
+ public function _getMemcachedStats(): array
+ {
+ try {
+ // Obtener estadísticas generales del servidor
+ $stats = Cache::getStore()->getMemcached()->getStats();
+
+ if (empty($stats)) {
+ return $this->response('error', 'No se pudieron obtener las estadísticas del servidor Memcached.', ['item_count' => 0, 'memory_usage' => 0]);
+ }
+
+ // Usar el primer servidor configurado (en la mayoría de los casos hay uno)
+ $serverStats = array_shift($stats);
+
+ return $this->response(
+ 'success',
+ 'Estadísticas del servidor Memcached obtenidas correctamente.',
+ [
+ 'item_count' => $serverStats['curr_items'] ?? 0, // Número total de claves
+ 'memory_usage' => $this->formatBytes($serverStats['bytes'] ?? 0), // Memoria usada
+ 'max_memory' => $this->formatBytes($serverStats['limit_maxbytes'] ?? 0), // Memoria máxima asignada
+ ]
+ );
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al obtener estadísticas de Memcached: ' . $e->getMessage());
+ }
+ }
+
+ private function getRedisDatabases(): array
+ {
+ // Verificar si Redis está en uso
+ $isRedisUsed = collect([
+ config('cache.default'),
+ config('session.driver'),
+ config('queue.default'),
+ ])->contains('redis');
+
+ if (!$isRedisUsed) {
+ return []; // Si Redis no está en uso, devolver un arreglo vacío
+ }
+
+ // Configuraciones de bases de datos de Redis según su uso
+ $databases = [
+ 'default' => config('database.redis.default.database', 0), // REDIS_DB
+ 'cache' => config('database.redis.cache.database', 0), // REDIS_CACHE_DB
+ 'sessions' => config('database.redis.sessions.database', 0), // REDIS_SESSION_DB
+ ];
+
+ $result = [];
+ $totalKeys = 0;
+
+ // Recorrer solo las bases configuradas y activas
+ foreach ($databases as $type => $db) {
+ Redis::select($db); // Seleccionar la base de datos
+
+ $keys = Redis::dbsize(); // Contar las claves en la base
+
+ if ($keys > 0) {
+ $result[$type] = [
+ 'database' => $db,
+ 'keys' => $keys,
+ ];
+
+ $totalKeys += $keys;
+ }
+ }
+
+ if (!empty($result)) {
+ $result['total_keys'] = $totalKeys;
+ }
+
+ return $result;
+ }
+
+
+ private function clearDatabaseCache(): bool
+ {
+ $count = DB::table(config('cache.stores.database.table'))->count();
+
+ if ($count > 0) {
+ DB::table(config('cache.stores.database.table'))->truncate();
+ return true;
+ }
+
+ return false;
+ }
+
+ private function clearFilecache(): bool
+ {
+ $cachePath = config('cache.stores.file.path');
+ $files = glob($cachePath . '/*');
+
+ if (!empty($files)) {
+ File::deleteDirectory($cachePath);
+ return true;
+ }
+
+ return false;
+ }
+
+ private function clearRedisCache(): bool
+ {
+ $prefix = config('cache.prefix', '');
+ $keys = Redis::connection('cache')->keys($prefix . '*');
+
+ if (!empty($keys)) {
+ Redis::connection('cache')->flushdb();
+
+ // Simulate cache clearing delay
+ sleep(1);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private function clearMemcachedCache(): bool
+ {
+ // Obtener el cliente Memcached directamente
+ $memcached = Cache::store('memcached')->getStore()->getMemcached();
+
+ // Ejecutar flush para eliminar todo
+ if ($memcached->flush()) {
+ // Simulate cache clearing delay
+ sleep(1);
+
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Verifica si un driver es soportado.
+ */
+ private function isSupportedDriver(string $driver): bool
+ {
+ return in_array($driver, ['redis', 'memcached', 'database', 'file']);
+ }
+
+ /**
+ * Convierte bytes en un formato legible.
+ */
+ private function formatBytes($bytes)
+ {
+ $sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
+ $factor = floor((strlen($bytes) - 1) / 3);
+
+ return sprintf('%.2f', $bytes / pow(1024, $factor)) . ' ' . $sizes[$factor];
+ }
+
+ /**
+ * Genera una respuesta estandarizada.
+ */
+ private function response(string $status, string $message, array $data = []): array
+ {
+ return array_merge(compact('status', 'message'), $data);
+ }
+}
diff --git a/Services/GlobalSettingsService.php b/Services/GlobalSettingsService.php
new file mode 100644
index 0000000..404fd66
--- /dev/null
+++ b/Services/GlobalSettingsService.php
@@ -0,0 +1,225 @@
+ $key],
+ ['value' => trim($value)]
+ );
+
+ return $setting->save();
+ }
+
+ /**
+ * Carga y sobrescribe las configuraciones del sistema.
+ */
+ public function loadSystemConfig(): void
+ {
+ try {
+ if (!Schema::hasTable('migrations')) {
+ // Base de datos no inicializada: usar valores predeterminados
+ $config = $this->getDefaultSystemConfig();
+ } else {
+ // Cargar configuración desde la caché o base de datos
+ $config = Cache::remember('global_system_config', $this->cacheTTL, function () {
+ $settings = Setting::global()
+ ->where('key', 'LIKE', 'config.%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ return [
+ 'servicesFacebook' => $this->buildServiceConfig($settings, 'config.services.facebook.', 'services.facebook'),
+ 'servicesGoogle' => $this->buildServiceConfig($settings, 'config.services.google.', 'services.google'),
+ 'vuexy' => $this->buildVuexyConfig($settings),
+ ];
+ });
+ }
+
+ // Aplicar configuración al sistema
+ Config::set('services.facebook', $config['servicesFacebook']);
+ Config::set('services.google', $config['servicesGoogle']);
+ Config::set('vuexy', $config['vuexy']);
+ } catch (\Exception $e) {
+ // Manejo silencioso de errores para evitar interrupciones
+ Config::set('services.facebook', config('services.facebook', []));
+ Config::set('services.google', config('services.google', []));
+ Config::set('vuexy', config('vuexy', []));
+ }
+ }
+
+ /**
+ * Devuelve una configuración predeterminada si la base de datos no está inicializada.
+ */
+ private function getDefaultSystemConfig(): array
+ {
+ return [
+ 'servicesFacebook' => config('services.facebook', [
+ 'client_id' => '',
+ 'client_secret' => '',
+ 'redirect' => '',
+ ]),
+ 'servicesGoogle' => config('services.google', [
+ 'client_id' => '',
+ 'client_secret' => '',
+ 'redirect' => '',
+ ]),
+ 'vuexy' => config('vuexy', []),
+ ];
+ }
+
+ /**
+ * Verifica si un bloque de configuraciones está presente.
+ */
+ protected function hasBlockConfig(array $settings, string $blockPrefix): bool
+ {
+ return array_key_exists($blockPrefix, array_filter($settings, fn($key) => str_starts_with($key, $blockPrefix), ARRAY_FILTER_USE_KEY));
+ }
+
+ /**
+ * Construye la configuración de un servicio (Facebook, Google, etc.).
+ */
+ protected function buildServiceConfig(array $settings, string $blockPrefix, string $defaultConfigKey): array
+ {
+ if (!$this->hasBlockConfig($settings, $blockPrefix)) {
+ return [];
+ return config($defaultConfigKey);
+ }
+
+ return [
+ 'client_id' => $settings["{$blockPrefix}client_id"] ?? '',
+ 'client_secret' => $settings["{$blockPrefix}client_secret"] ?? '',
+ 'redirect' => $settings["{$blockPrefix}redirect"] ?? '',
+ ];
+ }
+
+ /**
+ * Construye la configuración personalizada de Vuexy.
+ */
+ protected function buildVuexyConfig(array $settings): array
+ {
+ // Configuración predeterminada del sistema
+ $defaultVuexyConfig = config('vuexy', []);
+
+ // Convertimos las claves planas a un array multidimensional
+ $settingsNested = Arr::undot($settings);
+
+ // Navegamos hasta la parte relevante del array desanidado
+ $vuexySettings = $settingsNested['config']['vuexy'] ?? [];
+
+ // Fusionamos la configuración predeterminada con los valores del sistema
+ $mergedConfig = array_replace_recursive($defaultVuexyConfig, $vuexySettings);
+
+ // Normalizamos los valores booleanos
+ return $this->normalizeBooleanFields($mergedConfig);
+ }
+
+ /**
+ * Normaliza los campos booleanos.
+ */
+ protected function normalizeBooleanFields(array $config): array
+ {
+ $booleanFields = [
+ 'myRTLSupport',
+ 'myRTLMode',
+ 'hasCustomizer',
+ 'displayCustomizer',
+ 'footerFixed',
+ 'menuFixed',
+ 'menuCollapsed',
+ 'showDropdownOnHover',
+ ];
+
+ foreach ($booleanFields as $field) {
+ if (isset($config['vuexy'][$field])) {
+ $config['vuexy'][$field] = (bool) $config['vuexy'][$field];
+ }
+ }
+
+ return $config;
+ }
+
+ /**
+ * Limpia el caché de la configuración del sistema.
+ */
+ public static function clearSystemConfigCache(): void
+ {
+ Cache::forget('global_system_config');
+ }
+
+ /**
+ * Elimina las claves config.vuexy.* y limpia global_system_config
+ */
+ public static function clearVuexyConfig(): void
+ {
+ Setting::where('key', 'LIKE', 'config.vuexy.%')->delete();
+ Cache::forget('global_system_config');
+ }
+
+ /**
+ * Obtiene y sobrescribe la configuración de correo electrónico.
+ */
+ public function getMailSystemConfig(): array
+ {
+ return Cache::remember('mail_system_config', $this->cacheTTL, function () {
+ $settings = Setting::global()
+ ->where('key', 'LIKE', 'mail.%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ $defaultMailersSmtpVars = config('mail.mailers.smtp');
+
+ return [
+ 'mailers' => [
+ 'smtp' => array_merge($defaultMailersSmtpVars, [
+ 'url' => $settings['mail.mailers.smtp.url'] ?? $defaultMailersSmtpVars['url'],
+ 'host' => $settings['mail.mailers.smtp.host'] ?? $defaultMailersSmtpVars['host'],
+ 'port' => $settings['mail.mailers.smtp.port'] ?? $defaultMailersSmtpVars['port'],
+ 'encryption' => $settings['mail.mailers.smtp.encryption'] ?? 'TLS',
+ 'username' => $settings['mail.mailers.smtp.username'] ?? $defaultMailersSmtpVars['username'],
+ 'password' => isset($settings['mail.mailers.smtp.password']) && !empty($settings['mail.mailers.smtp.password'])
+ ? Crypt::decryptString($settings['mail.mailers.smtp.password'])
+ : $defaultMailersSmtpVars['password'],
+ 'timeout' => $settings['mail.mailers.smtp.timeout'] ?? $defaultMailersSmtpVars['timeout'],
+ ]),
+ ],
+ 'from' => [
+ 'address' => $settings['mail.from.address'] ?? config('mail.from.address'),
+ 'name' => $settings['mail.from.name'] ?? config('mail.from.name'),
+ ],
+ 'reply_to' => [
+ 'method' => $settings['mail.reply_to.method'] ?? config('mail.reply_to.method'),
+ 'email' => $settings['mail.reply_to.email'] ?? config('mail.reply_to.email'),
+ 'name' => $settings['mail.reply_to.name'] ?? config('mail.reply_to.name'),
+ ],
+ ];
+ });
+ }
+
+ /**
+ * Limpia el caché de la configuración de correo electrónico.
+ */
+ public static function clearMailSystemConfigCache(): void
+ {
+ Cache::forget('mail_system_config');
+ }
+
+}
diff --git a/Services/RBACService.php b/Services/RBACService.php
new file mode 100644
index 0000000..f38db6b
--- /dev/null
+++ b/Services/RBACService.php
@@ -0,0 +1,28 @@
+ $perm]);
+ }
+
+ foreach ($rbacData['roles'] as $name => $role) {
+ $roleInstance = Role::updateOrCreate(['name' => $name, 'style' => $role['style']]);
+ $roleInstance->syncPermissions($role['permissions']);
+ }
+ }
+}
diff --git a/Services/SessionManagerService.php b/Services/SessionManagerService.php
new file mode 100644
index 0000000..d57d05f
--- /dev/null
+++ b/Services/SessionManagerService.php
@@ -0,0 +1,153 @@
+driver = $driver ?? config('session.driver');
+ }
+
+ public function getSessionStats(string $driver = null): array
+ {
+ $driver = $driver ?? $this->driver;
+
+ if (!$this->isSupportedDriver($driver))
+ return $this->response('warning', 'Driver no soportado o no configurado.', ['session_count' => 0]);
+
+ try {
+ switch ($driver) {
+ case 'redis':
+ return $this->getRedisStats();
+
+ case 'database':
+ return $this->getDatabaseStats();
+
+ case 'file':
+ return $this->getFileStats();
+
+ default:
+ return $this->response('warning', 'Driver no reconocido.', ['session_count' => 0]);
+ }
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al obtener estadísticas: ' . $e->getMessage(), ['session_count' => 0]);
+ }
+ }
+
+ public function clearSessions(string $driver = null): array
+ {
+ $driver = $driver ?? $this->driver;
+
+ if (!$this->isSupportedDriver($driver)) {
+ return $this->response('warning', 'Driver no soportado o no configurado.');
+ }
+
+ try {
+ switch ($driver) {
+ case 'redis':
+ return $this->clearRedisSessions();
+
+ case 'memcached':
+ Cache::getStore()->flush();
+ return $this->response('success', 'Se eliminó la memoria caché de sesiones en Memcached.');
+
+ case 'database':
+ DB::table('sessions')->truncate();
+ return $this->response('success', 'Se eliminó la memoria caché de sesiones en la base de datos.');
+
+ case 'file':
+ return $this->clearFileSessions();
+
+ default:
+ return $this->response('warning', 'Driver no reconocido.');
+ }
+ } catch (\Exception $e) {
+ return $this->response('danger', 'Error al limpiar las sesiones: ' . $e->getMessage());
+ }
+ }
+
+
+ private function getRedisStats()
+ {
+ $prefix = config('cache.prefix'); // Asegúrate de agregar el sufijo correcto si es necesario
+ $keys = Redis::connection('sessions')->keys($prefix . '*');
+
+ return $this->response('success', 'Se ha recargado la información de la caché de Redis.', ['session_count' => count($keys)]);
+ }
+
+ private function getDatabaseStats(): array
+ {
+ $sessionCount = DB::table('sessions')->count();
+
+ return $this->response('success', 'Se ha recargado la información de la base de datos.', ['session_count' => $sessionCount]);
+ }
+
+ private function getFileStats(): array
+ {
+ $cachePath = config('session.files');
+ $files = glob($cachePath . '/*');
+
+ return $this->response('success', 'Se ha recargado la información de sesiones de archivos.', ['session_count' => count($files)]);
+ }
+
+
+ /**
+ * Limpia sesiones en Redis.
+ */
+ private function clearRedisSessions(): array
+ {
+ $prefix = config('cache.prefix', '');
+ $keys = Redis::connection('sessions')->keys($prefix . '*');
+
+ if (!empty($keys)) {
+ Redis::connection('sessions')->flushdb();
+
+ // Simulate cache clearing delay
+ sleep(1);
+
+ return $this->response('success', 'Se eliminó la memoria caché de sesiones en Redis.');
+ }
+
+ return $this->response('info', 'No se encontraron claves para eliminar en Redis.');
+ }
+
+ /**
+ * Limpia sesiones en archivos.
+ */
+ private function clearFileSessions(): array
+ {
+ $cachePath = config('session.files');
+ $files = glob($cachePath . '/*');
+
+ if (!empty($files)) {
+ foreach ($files as $file) {
+ unlink($file);
+ }
+
+ return $this->response('success', 'Se eliminó la memoria caché de sesiones en archivos.');
+ }
+
+ return $this->response('info', 'No se encontraron sesiones en archivos para eliminar.');
+ }
+
+
+ private function isSupportedDriver(string $driver): bool
+ {
+ return in_array($driver, ['redis', 'memcached', 'database', 'file']);
+ }
+
+ /**
+ * Genera una respuesta estandarizada.
+ */
+ private function response(string $status, string $message, array $data = []): array
+ {
+ return array_merge(compact('status', 'message'), $data);
+ }
+}
diff --git a/Services/VuexyAdminService.php b/Services/VuexyAdminService.php
new file mode 100644
index 0000000..64d3982
--- /dev/null
+++ b/Services/VuexyAdminService.php
@@ -0,0 +1,623 @@
+ 'Inicio',
+ 'route' => 'admin.core.home.index',
+ ];
+
+ private $user;
+
+ public function __construct()
+ {
+ $this->user = Auth::user();
+ $this->vuexySearch = Auth::user() !== null;
+ $this->orientation = config('vuexy.custom.myLayout');
+ }
+
+ /**
+ * Obtiene el menú según el estado del usuario (autenticado o no).
+ */
+ public function getMenu()
+ {
+ // Obtener el menú desde la caché
+ $menu = $this->user === null
+ ? $this->getGuestMenu()
+ : $this->getUserMenu();
+
+ // Marcar la ruta actual como activa
+ $currentRoute = Route::currentRouteName();
+
+ return $this->markActive($menu, $currentRoute);
+ }
+
+ /**
+ * Menú para usuarios no autenticados.dump
+ */
+ private function getGuestMenu()
+ {
+ return Cache::remember('vuexy_menu_guest', now()->addDays(7), function () {
+ return $this->getMenuArray();
+ });
+ }
+
+ /**
+ * Menú para usuarios autenticados.
+ */
+ private function getUserMenu()
+ {
+ Cache::forget("vuexy_menu_user_{$this->user->id}"); // Borrar la caché anterior para actualizarla
+
+ return Cache::remember("vuexy_menu_user_{$this->user->id}", now()->addHours(24), function () {
+ return $this->getMenuArray();
+ });
+ }
+
+ private function markActive($menu, $currentRoute)
+ {
+ foreach ($menu as &$item) {
+ $item['active'] = false;
+
+ // Check if the route matches
+ if (isset($item['route']) && $item['route'] === $currentRoute)
+ $item['active'] = true;
+
+ // Process submenus recursively
+ if (isset($item['submenu']) && !empty($item['submenu'])) {
+ $item['submenu'] = $this->markActive($item['submenu'], $currentRoute);
+
+ // If any submenu is active, mark the parent as active
+ if (collect($item['submenu'])->contains('active', true))
+ $item['active'] = true;
+ }
+ }
+
+ return $menu;
+ }
+
+ /**
+ * Invalida el cache del menú de un usuario.
+ */
+ public static function clearUserMenuCache()
+ {
+ $user = Auth::user();
+
+ if ($user !== null)
+ Cache::forget("vuexy_menu_user_{$user->id}");
+ }
+
+ /**
+ * Invalida el cache del menú de invitados.
+ */
+ public static function clearGuestMenuCache()
+ {
+ Cache::forget('vuexy_menu_guest');
+ }
+
+
+
+
+ public function getSearch()
+ {
+ return $this->vuexySearch;
+ }
+
+ public function getVuexySearchData()
+ {
+ if ($this->user === null)
+ return null;
+
+ $pages = Cache::remember("vuexy_search_user_{$this->user->id}", now()->addDays(7), function () {
+ return $this->cacheVuexySearchData();
+ });
+
+ // Formatear como JSON esperado
+ return [
+ 'pages' => $pages,
+ ];
+ }
+
+ private function cacheVuexySearchData()
+ {
+ $originalMenu = $this->getUserMenu();
+
+ return $this->getPagesSearchMenu($originalMenu);
+ }
+
+ private function getPagesSearchMenu(array $menu, string $parentPath = '')
+ {
+ $formattedMenu = [];
+
+ foreach ($menu as $name => $item) {
+ // Construir la ruta jerárquica (menu / submenu / submenu)
+ $currentPath = $parentPath ? $parentPath . ' / ' . $name : $name;
+
+ // Verificar si el elemento tiene una URL o una ruta
+ $url = $item['url'] ?? (isset($item['route']) && route::has($item['route']) ? route($item['route']) : null);
+
+ // Agregar el elemento al menú formateado
+ if ($url) {
+ $formattedMenu[] = [
+ 'name' => $currentPath, // Usar la ruta completa
+ 'icon' => $item['icon'] ?? 'ti ti-point',
+ 'url' => $url,
+ ];
+ }
+
+ // Si hay un submenú, procesarlo recursivamente
+ if (isset($item['submenu']) && is_array($item['submenu'])) {
+ $formattedMenu = array_merge(
+ $formattedMenu,
+ $this->getPagesSearchMenu($item['submenu'], $currentPath) // Pasar el path acumulado
+ );
+ }
+ }
+
+ return $formattedMenu;
+ }
+
+ public static function clearSearchMenuCache()
+ {
+ $user = Auth::user();
+
+ if ($user !== null)
+ Cache::forget("vuexy_search_user_{$user->id}");
+ }
+
+
+
+
+ public function getQuickLinks()
+ {
+ if ($this->user === null)
+ return null;
+
+ // Recuperar enlaces desde la caché
+ $quickLinks = Cache::remember("vuexy_quick_links_user_{$this->user->id}", now()->addDays(7), function () {
+ return $this->cacheQuickLinks();
+ });
+
+ // Verificar si la ruta actual está en la lista
+ $currentRoute = Route::currentRouteName();
+ $currentPageInList = $this->isCurrentPageInList($quickLinks, $currentRoute);
+
+ // Agregar la verificación al resultado
+ $quickLinks['current_page_in_list'] = $currentPageInList;
+
+ return $quickLinks;
+ }
+
+ private function cacheQuickLinks()
+ {
+ $originalMenu = $this->getUserMenu();
+
+ $quickLinks = [];
+
+ $quicklinks = Setting::where('user_id', Auth::user()->id)
+ ->where('key', 'quicklinks')
+ ->first();
+
+ $this->quicklinksRouteNames = $quicklinks ? json_decode($quicklinks->value, true) : [];
+
+ // Ordenar y generar los quickLinks según el orden del menú
+ $this->collectQuickLinksFromMenu($originalMenu, $quickLinks);
+
+ $quickLinksData = [
+ 'totalLinks' => count($quickLinks),
+ 'rows' => array_chunk($quickLinks, 2), // Agrupar los atajos en filas de dos
+ ];
+
+ return $quickLinksData;
+ }
+
+ private function collectQuickLinksFromMenu(array $menu, array &$quickLinks, string $parentTitle = null)
+ {
+ foreach ($menu as $title => $item) {
+ // Verificar si el elemento está en la lista de quicklinksRouteNames
+ if (isset($item['route']) && in_array($item['route'], $this->quicklinksRouteNames)) {
+ $quickLinks[] = [
+ 'title' => $title,
+ 'subtitle' => $parentTitle ?? env('APP_NAME'),
+ 'icon' => $item['icon'] ?? 'ti ti-point',
+ 'url' => isset($item['route']) ? route($item['route']) : ($item['url'] ?? '#'),
+ 'route' => $item['route'],
+ ];
+ }
+
+ // Si tiene submenú, procesarlo recursivamente
+ if (isset($item['submenu']) && is_array($item['submenu'])) {
+ $this->collectQuickLinksFromMenu(
+ $item['submenu'],
+ $quickLinks,
+ $title // Pasar el título actual como subtítulo
+ );
+ }
+ }
+ }
+
+ /**
+ * Verifica si la ruta actual existe en la lista de enlaces.
+ */
+ private function isCurrentPageInList(array $quickLinks, string $currentRoute): bool
+ {
+ foreach ($quickLinks['rows'] as $row) {
+ foreach ($row as $link) {
+ if (isset($link['route']) && $link['route'] === $currentRoute) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public static function clearQuickLinksCache()
+ {
+ $user = Auth::user();
+
+ if ($user !== null)
+ Cache::forget("vuexy_quick_links_user_{$user->id}");
+ }
+
+
+
+
+ public function getNotifications()
+ {
+ if ($this->user === null)
+ return null;
+
+ return Cache::remember("vuexy_notifications_user_{$this->user->id}", now()->addHours(4), function () {
+ return $this->cacheNotifications();
+ });
+ }
+
+ private function cacheNotifications()
+ {
+ return "
+
+
+
+
+
+
+
+ ";
+ }
+
+ public static function clearNotificationsCache()
+ {
+ $user = Auth::user();
+
+ if ($user !== null)
+ Cache::forget("vuexy_notifications_user_{$user->id}");
+ }
+
+
+
+
+ public function getBreadcrumbs()
+ {
+ $originalMenu = $this->user === null
+ ? $this->getGuestMenu()
+ : $this->getUserMenu();
+
+ // Lógica para construir los breadcrumbs
+ $breadcrumbs = $this->findBreadcrumbTrail($originalMenu);
+
+ // Asegurar que el primer elemento siempre sea "Inicio"
+ array_unshift($breadcrumbs, $this->homeRoute);
+
+ return $breadcrumbs;
+ }
+
+ private function findBreadcrumbTrail(array $menu, array $breadcrumbs = []): array
+ {
+ foreach ($menu as $title => $item) {
+ $skipBreadcrumb = isset($item['breadcrumbs']) && $item['breadcrumbs'] === false;
+
+ $itemRoute = isset($item['route']) ? implode('.', array_slice(explode('.', $item['route']), 0, -1)): '';
+ $currentRoute = implode('.', array_slice(explode('.', Route::currentRouteName()), 0, -1));
+
+ if ($itemRoute === $currentRoute) {
+ if (!$skipBreadcrumb) {
+ $breadcrumbs[] = [
+ 'name' => $title,
+ 'active' => true,
+ ];
+ }
+
+ return $breadcrumbs;
+ }
+
+ if (isset($item['submenu']) && is_array($item['submenu'])) {
+ $newBreadcrumbs = $breadcrumbs;
+
+ if (!$skipBreadcrumb)
+ $newBreadcrumbs[] = [
+ 'name' => $title,
+ 'route' => $item['route'] ?? null,
+ ];
+
+ $found = $this->findBreadcrumbTrail($item['submenu'], $newBreadcrumbs);
+
+ if ($found)
+ return $found;
+ }
+ }
+
+ return [];
+ }
+
+
+
+
+ private function getMenuArray()
+ {
+ $configMenu = config('vuexy_menu');
+
+ return $this->filterMenu($configMenu);
+ }
+
+ private function filterMenu(array $menu)
+ {
+ $filteredMenu = [];
+
+ foreach ($menu as $key => $item) {
+ // Evaluar permisos con Spatie y eliminar elementos no autorizados
+ if (isset($item['can']) && !$this->userCan($item['can'])) {
+ continue;
+ }
+
+ if (isset($item['canNot']) && $this->userCannot($item['canNot'])) {
+ continue;
+ }
+
+ // Si tiene un submenú, filtrarlo recursivamente
+ if (isset($item['submenu'])) {
+ $item['submenu'] = $this->filterMenu($item['submenu']);
+
+ // Si el submenú queda vacío, eliminar el menú
+ if (empty($item['submenu'])) {
+ continue;
+ }
+ }
+
+ // Removemos los atributos 'can' y 'canNot' del resultado final
+ unset($item['can'], $item['canNot']);
+
+ if(isset($item['route']) && route::has($item['route'])){
+ $item['url'] = route($item['route'])?? '';
+ }
+
+ // Agregar elemento filtrado al menú resultante
+ $filteredMenu[$key] = $item;
+ }
+
+ return $filteredMenu;
+ }
+
+ private function userCan($permissions)
+ {
+ if (is_array($permissions)) {
+ foreach ($permissions as $permission) {
+ if (Gate::allows($permission)) {
+ return true; // Si tiene al menos un permiso, lo mostramos
+ }
+ }
+ return true;
+ }
+
+ return Gate::allows($permissions);
+ }
+
+ private function userCannot($permissions)
+ {
+ if (is_array($permissions)) {
+ foreach ($permissions as $permission) {
+ if (Gate::denies($permission)) {
+ return true; // Si se le ha denegado al menos un permiso, lo ocultamos
+ }
+ }
+ return false;
+ }
+
+ return Gate::denies($permissions);
+ }
+}
diff --git a/composer.json b/composer.json
index 3f3d1f3..7fe74eb 100644
--- a/composer.json
+++ b/composer.json
@@ -1,40 +1,28 @@
{
- "name": "koneko/laravel-vuexy-admin-module",
- "description": "Base modular para proyectos Laravel altamente personalizados.",
+ "name": "koneko/laravel-vuexy-admin",
+ "description": "Laravel Vuexy Admin, un modulo de administracion optimizado para México.",
+ "keywords": ["laravel", "koneko", "framework", "vuexy", "admin", "mexico"],
"type": "library",
"license": "MIT",
"require": {
"php": "^8.2",
- "intervention/image-laravel": "^1.3",
+ "intervention/image-laravel": "^1.4",
+ "laravel/framework": "^11.31",
"laravel/fortify": "^1.25",
- "laravel/framework": "^11.0",
"laravel/sanctum": "^4.0",
- "laravel/tinker": "^2.9",
"livewire/livewire": "^3.5",
- "maatwebsite/excel": "^3.1",
"owen-it/laravel-auditing": "^13.6",
- "spatie/laravel-permission": "^6.10",
- "yajra/laravel-datatables-oracle": "^11.0"
- },
- "require-dev": {
- "barryvdh/laravel-debugbar": "^3.14",
- "fakerphp/faker": "^1.23",
- "laravel/pint": "^1.13",
- "laravel/sail": "^1.26",
- "mockery/mockery": "^1.6",
- "nunomaduro/collision": "^8.0",
- "phpunit/phpunit": "^11.0",
- "spatie/laravel-ignition": "^2.4"
+ "spatie/laravel-permission": "^6.10"
},
"autoload": {
"psr-4": {
- "Koneko\\VuexyAdminModule\\": "src/"
+ "Koneko\\VuexyAdmin\\": ""
}
},
"extra": {
"laravel": {
"providers": [
- "Koneko\\VuexyAdminModule\\BaseServiceProvider"
+ "Koneko\\VuexyAdmin\\Providers\\VuexyAdminServiceProvider"
]
}
},
@@ -43,5 +31,11 @@
"name": "Arturo Corro Pacheco",
"email": "arturo@koneko.mx"
}
- ]
+ ],
+ "support": {
+ "source": "https://github.com/koneko-mx/laravel-vuexy-admin",
+ "issues": "https://github.com/koneko-mx/laravel-vuexy-admin/issues"
+ },
+ "minimum-stability": "stable",
+ "prefer-stable": true
}
diff --git a/config/fortify.php b/config/fortify.php
new file mode 100644
index 0000000..9aec61d
--- /dev/null
+++ b/config/fortify.php
@@ -0,0 +1,159 @@
+ 'web',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Fortify Password Broker
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which password broker Fortify can use when a user
+ | is resetting their password. This configured value should match one
+ | of your password brokers setup in your "auth" configuration file.
+ |
+ */
+
+ 'passwords' => 'users',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Username / Email
+ |--------------------------------------------------------------------------
+ |
+ | This value defines which model attribute should be considered as your
+ | application's "username" field. Typically, this might be the email
+ | address of the users but you are free to change this value here.
+ |
+ | Out of the box, Fortify expects forgot password and reset password
+ | requests to have a field named 'email'. If the application uses
+ | another name for the field you may define it below as needed.
+ |
+ */
+
+ 'username' => 'email',
+
+ 'email' => 'email',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Lowercase Usernames
+ |--------------------------------------------------------------------------
+ |
+ | This value defines whether usernames should be lowercased before saving
+ | them in the database, as some database system string fields are case
+ | sensitive. You may disable this for your application if necessary.
+ |
+ */
+
+ 'lowercase_usernames' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Home Path
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the path where users will get redirected during
+ | authentication or password reset when the operations are successful
+ | and the user is authenticated. You are free to change this value.
+ |
+ */
+
+ 'home' => '/admin',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Fortify Routes Prefix / Subdomain
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which prefix Fortify will assign to all the routes
+ | that it registers with the application. If necessary, you may change
+ | subdomain under which all of the Fortify routes will be available.
+ |
+ */
+
+ 'prefix' => '',
+
+ 'domain' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Fortify Routes Middleware
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which middleware Fortify will assign to the routes
+ | that it registers with the application. If necessary, you may change
+ | these middleware but typically this provided default is preferred.
+ |
+ */
+
+ 'middleware' => ['web'],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Rate Limiting
+ |--------------------------------------------------------------------------
+ |
+ | By default, Fortify will throttle logins to five requests per minute for
+ | every email and IP address combination. However, if you would like to
+ | specify a custom rate limiter to call then you may specify it here.
+ |
+ */
+
+ 'limiters' => [
+ 'login' => 'login',
+ 'two-factor' => 'two-factor',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Register View Routes
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify if the routes returning views should be disabled as
+ | you may not need them when building your own application. This may be
+ | especially true if you're writing a custom single-page application.
+ |
+ */
+
+ 'views' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Features
+ |--------------------------------------------------------------------------
+ |
+ | Some of the Fortify features are optional. You may disable the features
+ | by removing them from this array. You're free to only remove some of
+ | these features or you can even remove all of these if you need to.
+ |
+ */
+
+ 'features' => [
+ Features::registration(),
+ Features::resetPasswords(),
+ Features::emailVerification(),
+ Features::updateProfileInformation(),
+ Features::updatePasswords(),
+ Features::twoFactorAuthentication([
+ 'confirm' => true,
+ 'confirmPassword' => true,
+ 'window' => 1,
+ ]),
+ ],
+
+];
diff --git a/config/image.php b/config/image.php
new file mode 100644
index 0000000..c6c0ebb
--- /dev/null
+++ b/config/image.php
@@ -0,0 +1,42 @@
+ \Intervention\Image\Drivers\Imagick\Driver::class,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Configuration Options
+ |--------------------------------------------------------------------------
+ |
+ | These options control the behavior of Intervention Image.
+ |
+ | - "autoOrientation" controls whether an imported image should be
+ | automatically rotated according to any existing Exif data.
+ |
+ | - "decodeAnimation" decides whether a possibly animated image is
+ | decoded as such or whether the animation is discarded.
+ |
+ | - "blendingColor" Defines the default blending color.
+ */
+
+ 'options' => [
+ 'autoOrientation' => true,
+ 'decodeAnimation' => true,
+ 'blendingColor' => 'ffffff',
+ ]
+];
diff --git a/config/koneko.php b/config/koneko.php
new file mode 100644
index 0000000..666842c
--- /dev/null
+++ b/config/koneko.php
@@ -0,0 +1,14 @@
+ "koneko.mx",
+ "appTitle" => "Koneko Soluciones Tecnológicas",
+ "appDescription" => "Koneko Soluciones Tecnológicas",
+ "appLogo" => "../vendor/vuexy-admin/img/logo/koneko-04.png",
+ "appFavicon" => "../vendor/vuexy-admin/img/logo/koneko-04.png",
+ "author" => "arturo@koneko.mx",
+ "creatorName" => "Koneko Soluciones Tecnológicas",
+ "creatorUrl" => "https://koneko.mx",
+ "licenseUrl" => "https://koneko.mx/koneko-admin/licencia",
+ "supportUrl" => "https://koneko.mx/soporte",
+];
diff --git a/config/vuexy.php b/config/vuexy.php
new file mode 100644
index 0000000..ab4980f
--- /dev/null
+++ b/config/vuexy.php
@@ -0,0 +1,36 @@
+ [
+ 'myLayout' => 'horizontal', // Options[String]: vertical(default), horizontal
+ 'myTheme' => 'theme-semi-dark', // Options[String]: theme-default(default), theme-bordered, theme-semi-dark
+ 'myStyle' => 'light', // Options[String]: light(default), dark & system mode
+ 'myRTLSupport' => false, // options[Boolean]: true(default), false // To provide RTLSupport or not
+ 'myRTLMode' => false, // options[Boolean]: false(default), true // To set layout to RTL layout (myRTLSupport must be true for rtl mode)
+ 'hasCustomizer' => true, // options[Boolean]: true(default), false // Display customizer or not THIS WILL REMOVE INCLUDED JS FILE. SO LOCAL STORAGE WON'T WORK
+ 'displayCustomizer' => true, // options[Boolean]: true(default), false // Display customizer UI or not, THIS WON'T REMOVE INCLUDED JS FILE. SO LOCAL STORAGE WILL WORK
+ 'contentLayout' => 'compact', // options[String]: 'compact', 'wide' (compact=container-xxl, wide=container-fluid)
+ 'navbarType' => 'static', // options[String]: 'sticky', 'static', 'hidden' (Only for vertical Layout)
+ 'footerFixed' => false, // options[Boolean]: false(default), true // Footer Fixed
+ 'menuFixed' => false, // options[Boolean]: true(default), false // Layout(menu) Fixed (Only for vertical Layout)
+ 'menuCollapsed' => true, // options[Boolean]: false(default), true // Show menu collapsed, (Only for vertical Layout)
+ 'headerType' => 'static', // options[String]: 'static', 'fixed' (for horizontal layout only)
+ 'showDropdownOnHover' => false, // true, false (for horizontal layout only)
+ 'authViewMode' => 'cover', // Options[String]: cover(default), basic
+ 'maxQuickLinks' => 8, // options[Integer]: 6(default), 8, 10
+ 'customizerControls' => [
+ //'rtl',
+ 'style',
+ 'headerType',
+ 'contentLayout',
+ 'layoutCollapsed',
+ 'layoutNavbarOptions',
+ 'themes',
+ ], // To show/hide customizer options
+ ],
+];
\ No newline at end of file
diff --git a/config/vuexy_menu.php b/config/vuexy_menu.php
new file mode 100644
index 0000000..4fdc3bc
--- /dev/null
+++ b/config/vuexy_menu.php
@@ -0,0 +1,848 @@
+ [
+ 'breadcrumbs' => false,
+ 'icon' => 'menu-icon tf-icons ti ti-home',
+ 'submenu' => [
+ 'Inicio' => [
+ 'route' => 'admin.core.home.index',
+ 'icon' => 'menu-icon tf-icons ti ti-home',
+ ],
+ 'Sitio Web' => [
+ 'url' => env('APP_URL'),
+ 'icon' => 'menu-icon tf-icons ti ti-world-www',
+ ],
+ 'Ajustes' => [
+ 'icon' => 'menu-icon tf-icons ti ti-settings-cog',
+ 'submenu' => [
+ 'Aplicación' => [
+ 'submenu' => [
+ 'Ajustes generales' => [
+ 'route' => 'admin.core.general-settings.index',
+ 'can' => 'admin.core.general-settings.allow',
+ ],
+ 'Ajustes de caché' => [
+ 'route' => 'admin.core.cache-manager.index',
+ 'can' => 'admin.core.cache-manager.view',
+ ],
+ 'Servidor de correo SMTP' => [
+ 'route' => 'admin.core.smtp-settings.index',
+ 'can' => 'admin.core.smtp-settings.allow',
+ ],
+ ],
+ ],
+ 'Empresa' => [
+ 'submenu' => [
+ 'Información general' => [
+ 'route' => 'admin.store-manager.company.index',
+ 'can' => 'admin.store-manager.company.view',
+ ],
+ 'Sucursales' => [
+ 'route' => 'admin.store-manager.stores.index',
+ 'can' => 'admin.store-manager.stores.view',
+ ],
+ 'Centros de trabajo' => [
+ 'route' => 'admin.store-manager.work-centers.index',
+ 'can' => 'admin.store-manager.stores.view',
+ ],
+ ]
+ ],
+ 'BANXICO' => [
+ 'route' => 'admin.finance.banxico.index',
+ 'can' => 'admin.finance.banxico.allow',
+ ],
+ 'Conectividad bancaria' => [
+ 'route' => 'admin.finance.banking.index',
+ 'can' => 'admin.finance.banking.allow',
+ ],
+ 'Punto de venta' => [
+ 'submenu' => [
+ 'Ticket' => [
+ 'route' => 'admin.sales.ticket-config.index',
+ 'can' => 'admin.sales.ticket-config.allow',
+ ],
+ ]
+ ],
+ 'Facturación' => [
+ 'submenu' => [
+ 'Certificados de Sello Digital' => [
+ 'route' => 'admin.billing.csds-settings.index',
+ 'can' => 'admin.billing.csds-settings.allow',
+ ],
+ 'Paquete de timbrado' => [
+ 'route' => 'admin.billing.stamping-package.index',
+ 'can' => 'admin.billing.stamping-package.allow',
+ ],
+ 'Servidor de correo SMTP' => [
+ 'route' => 'admin.billing.smtp-settings.index',
+ 'can' => 'admin.billing.smtp-settings.allow',
+ ],
+ 'Descarga masiva de CFDI' => [
+ 'route' => 'admin.billing.mass-cfdi-download.index',
+ 'can' => 'admin.billing.mass-cfdi-download.allow',
+ ],
+ ]
+ ],
+ ]
+ ],
+ 'Sistema' => [
+ 'icon' => 'menu-icon tf-icons ti ti-user-cog',
+ 'submenu' => [
+ 'Usuarios' => [
+ 'route' => 'admin.core.users.index',
+ 'can' => 'admin.core.users.view',
+ ],
+ 'Roles' => [
+ 'route' => 'admin.core.roles.index',
+ 'can' => 'admin.core.roles.view',
+ ],
+ 'Permisos' => [
+ 'route' => 'admin.core.permissions.index',
+ 'can' => 'admin.core.permissions.view',
+ ]
+ ]
+ ],
+ 'Catálogos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'submenu' => [
+ 'Importar catálogos SAT' => [
+ 'route' => 'admin.core.sat-catalogs.index',
+ 'can' => 'admin.core.sat-catalogs.allow',
+ ],
+ ]
+ ],
+ 'Configuración de cuenta' => [
+ 'route' => 'admin.core.user-profile.index',
+ 'icon' => 'menu-icon tf-icons ti ti-user-cog',
+ ],
+ 'Acerca de' => [
+ 'route' => 'admin.core.about.index',
+ 'icon' => 'menu-icon tf-icons ti ti-cat',
+ ],
+ ],
+ ],
+ 'Herramientas Avanzadas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-device-ipad-cog',
+ 'submenu' => [
+ 'Asistente AI' => [
+ 'icon' => 'menu-icon tf-icons ti ti-brain',
+ 'submenu' => [
+ 'Panel de IA' => [
+ 'route' => 'admin.ai.dashboard.index',
+ 'can' => 'ai.dashboard.view',
+ ],
+ 'Generación de Contenidos' => [
+ 'route' => 'admin.ai.content.index',
+ 'can' => 'ai.content.create',
+ ],
+ 'Análisis de Datos' => [
+ 'route' => 'admin.ai.analytics.index',
+ 'can' => 'ai.analytics.view',
+ ],
+ ],
+ ],
+ 'Chatbot' => [
+ 'icon' => 'menu-icon tf-icons ti ti-message-chatbot',
+ 'submenu' => [
+ 'Configuración' => [
+ 'route' => 'admin.chatbot.config.index',
+ 'can' => 'chatbot.config.view',
+ ],
+ 'Flujos de Conversación' => [
+ 'route' => 'admin.chatbot.flows.index',
+ 'can' => 'chatbot.flows.manage',
+ ],
+ 'Historial de Interacciones' => [
+ 'route' => 'admin.chatbot.history.index',
+ 'can' => 'chatbot.history.view',
+ ],
+ ],
+ ],
+ 'IoT Box' => [
+ 'icon' => 'menu-icon tf-icons ti ti-cpu',
+ 'submenu' => [
+ 'Dispositivos Conectados' => [
+ 'route' => 'admin.iot.devices.index',
+ 'can' => 'iot.devices.view',
+ ],
+ 'Sensores y Configuración' => [
+ 'route' => 'admin.iot.sensors.index',
+ 'can' => 'iot.sensors.manage',
+ ],
+ 'Monitoreo en Tiempo Real' => [
+ 'route' => 'admin.iot.monitoring.index',
+ 'can' => 'iot.monitoring.view',
+ ],
+ ],
+ ],
+ 'Reconocimiento Facial' => [
+ 'icon' => 'menu-icon tf-icons ti ti-face-id',
+ 'submenu' => [
+ 'Gestión de Perfiles' => [
+ 'route' => 'admin.facial-recognition.profiles.index',
+ 'can' => 'facial-recognition.profiles.manage',
+ ],
+ 'Verificación en Vivo' => [
+ 'route' => 'admin.facial-recognition.live.index',
+ 'can' => 'facial-recognition.live.verify',
+ ],
+ 'Historial de Accesos' => [
+ 'route' => 'admin.facial-recognition.history.index',
+ 'can' => 'facial-recognition.history.view',
+ ],
+ ],
+ ],
+ 'Servidor de Impresión' => [
+ 'icon' => 'menu-icon tf-icons ti ti-printer',
+ 'submenu' => [
+ 'Cola de Impresión' => [
+ 'route' => 'admin.print.queue.index',
+ 'can' => 'print.queue.view',
+ ],
+ 'Historial de Impresiones' => [
+ 'route' => 'admin.print.history.index',
+ 'can' => 'print.history.view',
+ ],
+ 'Configuración de Impresoras' => [
+ 'route' => 'admin.print.settings.index',
+ 'can' => 'print.settings.manage',
+ ],
+ ],
+ ],
+ ],
+ ],
+ 'Sitio Web' => [
+ 'icon' => 'menu-icon tf-icons ti ti-tools',
+ 'submenu' => [
+ 'Ajustes generales' => [
+ 'icon' => 'menu-icon tf-icons ti ti-tools',
+ 'route' => 'admin.website.general-settings.index',
+ 'can' => 'website.general-settings.allow',
+ ],
+ 'Avisos legales' => [
+ 'route' => 'admin.website.legal.index',
+ 'icon' => 'menu-icon tf-icons ti ti-writing-sign',
+ 'can' => 'website.legal.view',
+ ],
+ 'Preguntas frecuentes' => [
+ 'route' => 'admin.website.faq.index',
+ 'icon' => 'menu-icon tf-icons ti ti-bubble-text',
+ 'can' => 'website.faq.view',
+ ],
+ ]
+ ],
+ 'Blog' => [
+ 'icon' => 'menu-icon tf-icons ti ti-news',
+ 'submenu' => [
+ 'Categorias' => [
+ 'route' => 'admin.blog.categories.index',
+ 'icon' => 'menu-icon tf-icons ti ti-category',
+ 'can' => 'blog.categories.view',
+ ],
+ 'Etiquetas' => [
+ 'route' => 'admin.blog.tags.index',
+ 'icon' => 'menu-icon tf-icons ti ti-tags',
+ 'can' => 'blog.tags.view',
+ ],
+ 'Articulos' => [
+ 'route' => 'admin.blog.articles.index',
+ 'icon' => 'menu-icon tf-icons ti ti-news',
+ 'can' => 'blog.articles.view',
+ ],
+ 'Comentarios' => [
+ 'route' => 'admin.blog.comments.index',
+ 'icon' => 'menu-icon tf-icons ti ti-message',
+ 'can' => 'blog.comments.view',
+ ],
+ ]
+ ],
+ 'Contactos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-users',
+ 'submenu' => [
+ 'Contactos' => [
+ 'route' => 'admin.crm.contacts.index',
+ 'icon' => 'menu-icon tf-icons ti ti-users',
+ 'can' => 'crm.contacts.view',
+ ],
+ 'Campañas de marketing' => [
+ 'route' => 'admin.crm.marketing-campaigns.index',
+ 'icon' => 'menu-icon tf-icons ti ti-ad-2',
+ 'can' => 'crm.marketing-campaigns.view',
+ ],
+ 'Oportunidades ' => [
+ 'route' => 'admin.crm.leads.index',
+ 'icon' => 'menu-icon tf-icons ti ti-target-arrow',
+ 'can' => 'crm.leads.view',
+ ],
+ 'Newsletter' => [
+ 'route' => 'admin.crm.newsletter.index',
+ 'icon' => 'menu-icon tf-icons ti ti-notebook',
+ 'can' => 'crm.newsletter.view',
+ ],
+ ]
+ ],
+ 'RRHH' => [
+ 'icon' => 'menu-icon tf-icons ti ti-users-group',
+ 'submenu' => [
+ 'Gestión de Empleados' => [
+ 'icon' => 'menu-icon tf-icons ti ti-id-badge-2',
+ 'submenu' => [
+ 'Lista de Empleados' => [
+ 'route' => 'admin.rrhh.employees.index',
+ 'can' => 'rrhh.employees.view',
+ ],
+ 'Agregar Nuevo Empleado' => [
+ 'route' => 'admin.rrhh.employees.create',
+ 'can' => 'rrhh.employees.create',
+ ],
+ 'Puestos de trabajo' => [
+ 'route' => 'admin.rrhh.jobs.index',
+ 'can' => 'rrhh.jobs.view',
+ ],
+ 'Estructura Organizacional' => [
+ 'route' => 'admin.rrhh.organization.index',
+ 'can' => 'rrhh.organization.view',
+ ],
+ ],
+ ],
+ 'Reclutamiento' => [
+ 'icon' => 'menu-icon tf-icons ti ti-user-search',
+ 'submenu' => [
+ 'Vacantes Disponibles' => [
+ 'route' => 'admin.recruitment.jobs.index',
+ 'can' => 'recruitment.jobs.view',
+ ],
+ 'Seguimiento de Candidatos' => [
+ 'route' => 'admin.recruitment.candidates.index',
+ 'can' => 'recruitment.candidates.view',
+ ],
+ 'Entrevistas y Evaluaciones' => [
+ 'route' => 'admin.recruitment.interviews.index',
+ 'can' => 'recruitment.interviews.view',
+ ],
+ ],
+ ],
+ 'Nómina' => [
+ 'icon' => 'menu-icon tf-icons ti ti-cash',
+ 'submenu' => [
+ 'Contratos' => [
+ 'route' => 'admin.payroll.contracts.index',
+ 'can' => 'payroll.contracts.view',
+ ],
+ 'Procesar Nómina' => [
+ 'route' => 'admin.payroll.process.index',
+ 'can' => 'payroll.process.view',
+ ],
+ 'Recibos de Nómina' => [
+ 'route' => 'admin.payroll.receipts.index',
+ 'can' => 'payroll.receipts.view',
+ ],
+ 'Reportes Financieros' => [
+ 'route' => 'admin.payroll.reports.index',
+ 'can' => 'payroll.reports.view',
+ ],
+ ],
+ ],
+ 'Asistencia' => [
+ 'icon' => 'menu-icon tf-icons ti ti-calendar-exclamation',
+ 'submenu' => [
+ 'Registro de Horarios' => [
+ 'route' => 'admin.attendance.records.index',
+ 'can' => 'attendance.records.view',
+ ],
+ 'Asistencia con Biométricos' => [
+ 'route' => 'admin.attendance.biometric.index',
+ 'can' => 'attendance.biometric.view',
+ ],
+ 'Justificación de Ausencias' => [
+ 'route' => 'admin.attendance.absences.index',
+ 'can' => 'attendance.absences.view',
+ ],
+ ],
+ ],
+ ],
+ ],
+ 'Productos y servicios' => [
+ 'icon' => 'menu-icon tf-icons ti ti-package',
+ 'submenu' => [
+ 'Categorias' => [
+ 'route' => 'admin.inventory.product-categories.index',
+ 'icon' => 'menu-icon tf-icons ti ti-category',
+ 'can' => 'admin.inventory.product-categories.view',
+ ],
+ 'Catálogos' => [
+ 'route' => 'admin.inventory.product-catalogs.index',
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'can' => 'admin.inventory.product-catalogs.view',
+ ],
+ 'Productos y servicios' => [
+ 'route' => 'admin.inventory.products.index',
+ 'icon' => 'menu-icon tf-icons ti ti-packages',
+ 'can' => 'admin.inventory.products.view',
+ ],
+ 'Agregar producto o servicio' => [
+ 'route' => 'admin.inventory.products.create',
+ 'icon' => 'menu-icon tf-icons ti ti-package',
+ 'can' => 'admin.inventory.products.create',
+ ],
+ ]
+ ],
+ 'Ventas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.sales.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'can' => 'admin.sales.dashboard.allow',
+ ],
+ 'Clientes' => [
+ 'route' => 'admin.sales.customers.index',
+ 'icon' => 'menu-icon tf-icons ti ti-users-group',
+ 'can' => 'admin.sales.customers.view',
+ ],
+ 'Lista de precios' => [
+ 'route' => 'admin.sales.pricelist.index',
+ 'icon' => 'menu-icon tf-icons ti ti-report-search',
+ 'can' => 'admin.sales.sales.view',
+ ],
+ 'Cotizaciones' => [
+ 'route' => 'admin.sales.quotes.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-dollar',
+ 'can' => 'admin.sales.quotes.view',
+ ],
+ 'Ventas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'submenu' => [
+ 'Crear venta' => [
+ 'route' => 'admin.sales.sales.create',
+ 'can' => 'admin.sales.sales.create',
+ ],
+ 'Ventas' => [
+ 'route' => 'admin.sales.sales.index',
+ 'can' => 'admin.sales.sales.view',
+ ],
+ 'Ventas por producto o servicio' => [
+ 'route' => 'admin.sales.sales-by-product.index',
+ 'can' => 'admin.sales.sales.view',
+ ],
+ ]
+ ],
+ 'Remisiones' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt',
+ 'submenu' => [
+ 'Crear remisión' => [
+ 'route' => 'admin.sales.remissions.create',
+ 'can' => 'admin.sales.remissions.create',
+ ],
+ 'Remisiones' => [
+ 'route' => 'admin.sales.remissions.index',
+ 'can' => 'admin.sales.remissions.view',
+ ],
+ 'Remisiones por producto o servicio' => [
+ 'route' => 'admin.sales.remissions-by-product.index',
+ 'can' => 'admin.sales.remissions.view',
+ ],
+ ]
+ ],
+ 'Notas de crédito' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
+ 'submenu' => [
+ 'Crear nota de crédito' => [
+ 'route' => 'admin.sales.credit-notes.create',
+ 'can' => 'admin.sales.credit-notes.create',
+ ],
+ 'Notas de créditos' => [
+ 'route' => 'admin.sales.credit-notes.index',
+ 'can' => 'admin.sales.credit-notes.view',
+ ],
+ 'Notas de crédito por producto o servicio' => [
+ 'route' => 'admin.sales.credit-notes-by-product.index',
+ 'can' => 'admin.sales.credit-notes.view',
+ ],
+ ]
+ ],
+ ],
+ ],
+ 'Finanzas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-coins',
+ 'submenu' => [
+ 'Tablero Financiero' => [
+ 'route' => 'admin.accounting.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'can' => 'accounting.dashboard.view',
+ ],
+ 'Contabilidad' => [
+ 'icon' => 'menu-icon tf-icons ti ti-chart-pie',
+ 'submenu' => [
+ 'Cuentas Contables' => [
+ 'route' => 'admin.accounting.charts.index',
+ 'can' => 'accounting.charts.view',
+ ],
+ 'Cuentas por pagar' => [
+ 'route' => 'admin.finance.accounts-payable.index',
+ 'can' => 'finance.accounts-payable.view',
+ ],
+ 'Cuentas por cobrar' => [
+ 'route' => 'admin.finance.accounts-receivable.index',
+ 'can' => 'finance.accounts-receivable.view',
+ ],
+ 'Balance General' => [
+ 'route' => 'admin.accounting.balance.index',
+ 'can' => 'accounting.balance.view',
+ ],
+ 'Estado de Resultados' => [
+ 'route' => 'admin.accounting.income-statement.index',
+ 'can' => 'accounting.income-statement.view',
+ ],
+ 'Libro Mayor' => [
+ 'route' => 'admin.accounting.ledger.index',
+ 'can' => 'accounting.ledger.view',
+ ],
+ 'Registros Contables' => [
+ 'route' => 'admin.accounting.entries.index',
+ 'can' => 'accounting.entries.view',
+ ],
+ ],
+ ],
+ 'Tablero de Gastos' => [
+ 'route' => 'admin.expenses.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'can' => 'expenses.dashboard.view',
+ ],
+ 'Gestión de Gastos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-2',
+ 'submenu' => [
+ 'Nuevo gasto' => [
+ 'route' => 'admin.expenses.expenses.create',
+ 'can' => 'expenses.expenses.create',
+ ],
+ 'Gastos' => [
+ 'route' => 'admin.expenses.expenses.index',
+ 'can' => 'expenses.expenses.view',
+ ],
+ 'Categorías de Gastos' => [
+ 'route' => 'admin.expenses.categories.index',
+ 'can' => 'expenses.categories.view',
+ ],
+ 'Historial de Gastos' => [
+ 'route' => 'admin.expenses.history.index',
+ 'can' => 'expenses.history.view',
+ ],
+ ],
+ ],
+ ],
+ ],
+
+
+
+
+ 'Facturación' => [
+ 'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.billing.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'can' => 'admin.billing.dashboard.allow',
+ ],
+ 'Ingresos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'submenu' => [
+ 'Facturar ventas' => [
+ 'route' => 'admin.billing.ingresos-stamp.index',
+ 'can' => 'admin.billing.ingresos.create',
+ ],
+ 'CFDI Ingresos' => [
+ 'route' => 'admin.billing.ingresos.index',
+ 'can' => 'admin.billing.ingresos.view',
+ ],
+ 'CFDI Ingresos por producto o servicio' => [
+ 'route' => 'admin.billing.ingresos-by-product.index',
+ 'can' => 'admin.billing.ingresos.view',
+ ],
+ ]
+ ],
+ 'Egresos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'submenu' => [
+ 'Facturar notas de crédito' => [
+ 'route' => 'admin.billing.egresos-stamp.index',
+ 'can' => 'admin.billing.egresos.create',
+ ],
+ 'CFDI Engresos' => [
+ 'route' => 'admin.billing.egresos.index',
+ 'can' => 'admin.billing.egresos.view',
+ ],
+ 'CFDI Engresos por producto o servicio' => [
+ 'route' => 'admin.billing.egresos-by-product.index',
+ 'can' => 'admin.billing.egresos.view',
+ ],
+ ]
+ ],
+ 'Pagos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'submenu' => [
+ 'Facturar pagos' => [
+ 'route' => 'admin.billing.pagos-stamp.index',
+ 'can' => 'admin.billing.pagos.created',
+ ],
+ 'CFDI Pagos' => [
+ 'route' => 'admin.billing.pagos.index',
+ 'can' => 'admin.billing.pagos.view',
+ ],
+ ]
+ ],
+ 'CFDI Nómina' => [
+ 'route' => 'admin.billing.nomina.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'can' => 'admin.billing.nomina.view',
+ ],
+ 'Verificador de CFDI 4.0' => [
+ 'route' => 'admin.billing.verify-cfdi.index',
+ 'icon' => 'menu-icon tf-icons ti ti-rosette-discount-check',
+ 'can' => 'admin.billing.verify-cfdi.allow',
+ ],
+ ]
+ ],
+
+ 'Inventario y Logística' => [
+ 'icon' => 'menu-icon tf-icons ti ti-truck-delivery',
+ 'submenu' => [
+ 'Cadena de Suministro' => [
+ 'icon' => 'menu-icon tf-icons ti ti-chart-dots-3',
+ 'submenu' => [
+ 'Proveedores' => [
+ 'route' => 'admin.inventory.suppliers.index',
+ 'can' => 'admin.inventory.suppliers.view',
+ ],
+ 'Órdenes de Compra' => [
+ 'route' => 'admin.inventory.orders.index',
+ 'can' => 'admin.inventory.orders.view',
+ ],
+ 'Recepción de Productos' => [
+ 'route' => 'admin.inventory.reception.index',
+ 'can' => 'admin.inventory.reception.view',
+ ],
+ 'Gestión de Insumos' => [
+ 'route' => 'admin.inventory.materials.index',
+ 'can' => 'admin.inventory.materials.view',
+ ],
+ ],
+ ],
+ 'Gestión de Almacenes' => [
+ 'icon' => 'menu-icon tf-icons ti ti-building-warehouse',
+ 'submenu' => [
+ 'Almacenes' => [
+ 'route' => 'admin.inventory.warehouse.index',
+ 'can' => 'admin.inventory.warehouse.view',
+ ],
+ 'Stock de Inventario' => [
+ 'route' => 'admin.inventory.stock.index',
+ 'can' => 'admin.inventory.stock.view',
+ ],
+ 'Movimientos de almacenes' => [
+ 'route' => 'admin.inventory.movements.index',
+ 'can' => 'admin.inventory.movements.view',
+ ],
+ 'Transferencias entre Almacenes' => [
+ 'route' => 'admin.inventory.transfers.index',
+ 'can' => 'admin.inventory.transfers.view',
+ ],
+ ],
+ ],
+ 'Envíos y Logística' => [
+ 'icon' => 'menu-icon tf-icons ti ti-truck',
+ 'submenu' => [
+ 'Órdenes de Envío' => [
+ 'route' => 'admin.inventory.shipping-orders.index',
+ 'can' => 'admin.inventory.shipping-orders.view',
+ ],
+ 'Seguimiento de Envíos' => [
+ 'route' => 'admin.inventory.shipping-tracking.index',
+ 'can' => 'admin.inventory.shipping-tracking.view',
+ ],
+ 'Transportistas' => [
+ 'route' => 'admin.inventory.shipping-carriers.index',
+ 'can' => 'admin.inventory.shipping-carriers.view',
+ ],
+ 'Tarifas y Métodos de Envío' => [
+ 'route' => 'admin.inventory.shipping-rates.index',
+ 'can' => 'admin.inventory.shipping-rates.view',
+ ],
+ ],
+ ],
+ 'Gestión de Activos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-tools-kitchen',
+ 'submenu' => [
+ 'Activos Registrados' => [
+ 'route' => 'admin.inventory.asset.index',
+ 'can' => 'admin.inventory.asset.view',
+ ],
+ 'Mantenimiento Preventivo' => [
+ 'route' => 'admin.inventory.asset-maintenance.index',
+ 'can' => 'admin.inventory.asset-maintenance.view',
+ ],
+ 'Control de Vida Útil' => [
+ 'route' => 'admin.inventory.asset-lifecycle.index',
+ 'can' => 'admin.inventory.asset-lifecycle.view',
+ ],
+ 'Asignación de Activos' => [
+ 'route' => 'admin.inventory.asset-assignments.index',
+ 'can' => 'admin.inventory.asset-assignments.view',
+ ],
+ ],
+ ],
+ ],
+ ],
+
+ 'Gestión Empresarial' => [
+ 'icon' => 'menu-icon tf-icons ti ti-briefcase',
+ 'submenu' => [
+ 'Gestión de Proyectos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-layout-kanban',
+ 'submenu' => [
+ 'Tablero de Proyectos' => [
+ 'route' => 'admin.projects.dashboard.index',
+ 'can' => 'projects.dashboard.view',
+ ],
+ 'Proyectos Activos' => [
+ 'route' => 'admin.projects.index',
+ 'can' => 'projects.view',
+ ],
+ 'Crear Proyecto' => [
+ 'route' => 'admin.projects.create',
+ 'can' => 'projects.create',
+ ],
+ 'Gestión de Tareas' => [
+ 'route' => 'admin.projects.tasks.index',
+ 'can' => 'projects.tasks.view',
+ ],
+ 'Historial de Proyectos' => [
+ 'route' => 'admin.projects.history.index',
+ 'can' => 'projects.history.view',
+ ],
+ ],
+ ],
+ 'Producción y Manufactura' => [
+ 'icon' => 'menu-icon tf-icons ti ti-building-factory',
+ 'submenu' => [
+ 'Órdenes de Producción' => [
+ 'route' => 'admin.production.orders.index',
+ 'can' => 'production.orders.view',
+ ],
+ 'Nueva Orden de Producción' => [
+ 'route' => 'admin.production.orders.create',
+ 'can' => 'production.orders.create',
+ ],
+ 'Control de Procesos' => [
+ 'route' => 'admin.production.process.index',
+ 'can' => 'production.process.view',
+ ],
+ 'Historial de Producción' => [
+ 'route' => 'admin.production.history.index',
+ 'can' => 'production.history.view',
+ ],
+ ],
+ ],
+ 'Control de Calidad' => [
+ 'icon' => 'menu-icon tf-icons ti ti-award',
+ 'submenu' => [
+ 'Inspecciones de Calidad' => [
+ 'route' => 'admin.quality.inspections.index',
+ 'can' => 'quality.inspections.view',
+ ],
+ 'Crear Inspección' => [
+ 'route' => 'admin.quality.inspections.create',
+ 'can' => 'quality.inspections.create',
+ ],
+ 'Reportes de Calidad' => [
+ 'route' => 'admin.quality.reports.index',
+ 'can' => 'quality.reports.view',
+ ],
+ 'Historial de Inspecciones' => [
+ 'route' => 'admin.quality.history.index',
+ 'can' => 'quality.history.view',
+ ],
+ ],
+ ],
+ 'Flujos de Trabajo y Automatización' => [
+ 'icon' => 'menu-icon tf-icons ti ti-chart-dots-3',
+ 'submenu' => [
+ 'Gestión de Flujos de Trabajo' => [
+ 'route' => 'admin.workflows.index',
+ 'can' => 'workflows.view',
+ ],
+ 'Crear Flujo de Trabajo' => [
+ 'route' => 'admin.workflows.create',
+ 'can' => 'workflows.create',
+ ],
+ 'Automatizaciones' => [
+ 'route' => 'admin.workflows.automations.index',
+ 'can' => 'workflows.automations.view',
+ ],
+ 'Historial de Flujos' => [
+ 'route' => 'admin.workflows.history.index',
+ 'can' => 'workflows.history.view',
+ ],
+ ],
+ ],
+ ],
+ ],
+
+
+ 'Contratos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-writing-sign',
+ 'submenu' => [
+ 'Mis Contratos' => [
+ 'route' => 'admin.contracts.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-description',
+ 'can' => 'contracts.view',
+ ],
+ 'Firmar Contrato' => [
+ 'route' => 'admin.contracts.sign',
+ 'icon' => 'menu-icon tf-icons ti ti-signature',
+ 'can' => 'contracts.sign',
+ ],
+ 'Contratos Automatizados' => [
+ 'route' => 'admin.contracts.automated',
+ 'icon' => 'menu-icon tf-icons ti ti-robot',
+ 'can' => 'contracts.automated.view',
+ ],
+ 'Historial de Contratos' => [
+ 'route' => 'admin.contracts.history',
+ 'icon' => 'menu-icon tf-icons ti ti-archive',
+ 'can' => 'contracts.history.view',
+ ],
+ ]
+ ],
+ 'Atención al Cliente' => [
+ 'icon' => 'menu-icon tf-icons ti ti-messages',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.sales.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'can' => 'ticketing.dashboard.view',
+ ],
+ 'Mis Tickets' => [
+ 'route' => 'admin.ticketing.tickets.index',
+ 'icon' => 'menu-icon tf-icons ti ti-ticket',
+ 'can' => 'ticketing.tickets.view',
+ ],
+ 'Crear Ticket' => [
+ 'route' => 'admin.ticketing.tickets.create',
+ 'icon' => 'menu-icon tf-icons ti ti-square-plus',
+ 'can' => 'ticketing.tickets.create',
+ ],
+ 'Categorías de Tickets' => [
+ 'route' => 'admin.ticketing.categories.index',
+ 'icon' => 'menu-icon tf-icons ti ti-category',
+ 'can' => 'ticketing.categories.view',
+ ],
+ 'Estadísticas de Atención' => [
+ 'route' => 'admin.ticketing.analytics.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-bar',
+ 'can' => 'ticketing.analytics.view',
+ ],
+ ]
+ ],
+];
diff --git a/database/data/rbac-config.json b/database/data/rbac-config.json
new file mode 100644
index 0000000..249d102
--- /dev/null
+++ b/database/data/rbac-config.json
@@ -0,0 +1,510 @@
+{
+ "roles": {
+ "SuperAdmin" : {
+ "style": "dark",
+ "permissions" : [
+ "admin.core.general-settings.allow",
+ "admin.core.cache-manager.view",
+ "admin.core.smtp-settings.allow",
+ "admin.store-manager.company.view",
+ "admin.store-manager.stores.view",
+ "admin.store-manager.stores.view",
+ "admin.finance.banxico.allow",
+ "admin.finance.banking.allow",
+ "admin.sales.ticket-config.allow",
+ "admin.billing.csds-settings.allow",
+ "admin.billing.stamping-package.allow",
+ "admin.billing.smtp-settings.allow",
+ "admin.billing.mass-cfdi-download.allow",
+ "admin.core.users.view",
+ "admin.core.roles.view",
+ "admin.core.permissions.view",
+ "admin.core.import-sat-catalogs.allow",
+ "admin.ai.dashboard.view",
+ "admin.ai.content.create",
+ "admin.ai.analytics.view",
+ "admin.chatbot.config.view",
+ "admin.chatbot.flows.manage",
+ "admin.chatbot.history.view",
+ "admin.iot.devices.view",
+ "admin.iot.sensors.manage",
+ "admin.iot.monitoring.view",
+ "admin.facial-recognition.profiles.manage",
+ "admin.facial-recognition.live.verify",
+ "admin.facial-recognition.history.view",
+ "admin.print.queue.view",
+ "admin.print.history.view",
+ "admin.print.settings.manage",
+ "admin.website.general-settings.allow",
+ "admin.website.legal.view",
+ "admin.website.faq.view",
+ "admin.blog.categories.view",
+ "admin.blog.tags.view",
+ "admin.blog.articles.view",
+ "admin.blog.comments.view",
+ "admin.contacts.contacts.view",
+ "admin.contacts.employees.view",
+ "admin.contacts.employees.create",
+ "admin.rrhh.jobs.view",
+ "admin.rrhh.organization.view",
+ "admin.recruitment.jobs.view",
+ "admin.recruitment.candidates.view",
+ "admin.recruitment.interviews.view",
+ "admin.payroll.contracts.view",
+ "admin.payroll.process.view",
+ "admin.payroll.receipts.view",
+ "admin.payroll.reports.view",
+ "admin.attendance.records.view",
+ "admin.attendance.biometric.view",
+ "admin.attendance.absences.view",
+ "admin.inventory.product-categories.view",
+ "admin.inventory.product-catalogs.view",
+ "admin.inventory.products.view",
+ "admin.inventory.products.create",
+ "admin.sales.dashboard.allow",
+ "admin.contacts.customers.view",
+ "admin.sales.sales.view",
+ "admin.sales.quotes.view",
+ "admin.sales.sales.create",
+ "admin.sales.sales.view",
+ "admin.sales.sales.view",
+ "admin.sales.remissions.create",
+ "admin.sales.remissions.view",
+ "admin.sales.remissions.view",
+ "admin.sales.credit-notes.create",
+ "admin.sales.credit-notes.view",
+ "admin.sales.credit-notes.view",
+ "admin.accounting.dashboard.view",
+ "admin.accounting.charts.view",
+ "admin.finance.accounts-payable.view",
+ "admin.finance.accounts-receivable.view",
+ "admin.accounting.balance.view",
+ "admin.accounting.income-statement.view",
+ "admin.accounting.ledger.view",
+ "admin.accounting.entries.view",
+ "admin.expenses.dashboard.view",
+ "admin.expenses.expenses.create",
+ "admin.expenses.expenses.view",
+ "admin.expenses.categories.view",
+ "admin.expenses.history.view",
+ "admin.billing.dashboard.allow",
+ "admin.billing.ingresos.create",
+ "admin.billing.ingresos.view",
+ "admin.billing.ingresos.view",
+ "admin.billing.egresos.create",
+ "admin.billing.egresos.view",
+ "admin.billing.egresos.view",
+ "admin.billing.pagos.created",
+ "admin.billing.pagos.view",
+ "admin.billing.nomina.view",
+ "admin.billing.verify-cfdi.allow",
+ "admin.contacts.suppliers.view",
+ "admin.inventory.orders.view",
+ "admin.inventory.reception.view",
+ "admin.inventory.materials.view",
+ "admin.inventory.warehouse.view",
+ "admin.inventory.stock.view",
+ "admin.inventory.movements.view",
+ "admin.inventory.transfers.view",
+ "admin.inventory.shipping-orders.view",
+ "admin.inventory.shipping-tracking.view",
+ "admin.inventory.shipping-carriers.view",
+ "admin.inventory.shipping-rates.view",
+ "admin.inventory.assets.view",
+ "admin.inventory.asset-maintenance.view",
+ "admin.inventory.asset-lifecycle.view",
+ "admin.inventory.asset-assignments.view",
+ "admin.projects.dashboard.view",
+ "admin.projects.view",
+ "admin.projects.create",
+ "admin.projects.tasks.view",
+ "admin.projects.history.view",
+ "admin.production.orders.view",
+ "admin.production.orders.create",
+ "admin.production.process.view",
+ "admin.production.history.view",
+ "admin.quality.inspections.view",
+ "admin.quality.inspections.create",
+ "admin.quality.reports.view",
+ "admin.quality.history.view",
+ "admin.workflows.view",
+ "admin.workflows.create",
+ "admin.workflows.automations.view",
+ "admin.workflows.history.view",
+ "admin.contracts.view",
+ "admin.contracts.sign",
+ "admin.contracts.automated.view",
+ "admin.contracts.history.view",
+ "admin.ticketing.dashboard.view",
+ "admin.ticketing.tickets.view",
+ "admin.ticketing.tickets.create",
+ "admin.ticketing.categories.view",
+ "admin.ticketing.analytics.view"
+ ]
+ },
+ "Admin" : {
+ "style": "primary",
+ "permissions" : [
+ "admin.core.general-settings.allow",
+ "admin.core.cache-manager.view",
+ "admin.core.smtp-settings.allow",
+ "admin.website.general-settings.allow",
+ "admin.website.legal.view",
+ "admin.store-manager.company.view",
+ "admin.store-manager.stores.view",
+ "admin.store-manager.stores.view",
+ "admin.core.users.view",
+ "admin.core.roles.view",
+ "admin.core.permissions.view",
+ "admin.core.import-sat-catalogs.allow",
+ "admin.contacts.contacts.view",
+ "admin.contacts.contacts.create",
+ "admin.contacts.employees.view",
+ "admin.contacts.employees.create",
+ "admin.contacts.customers.view",
+ "admin.contacts.customers.create",
+ "admin.rrhh.jobs.view",
+ "admin.rrhh.organization.view",
+ "admin.inventory.product-categories.view",
+ "admin.inventory.product-catalogs.view",
+ "admin.inventory.products.view",
+ "admin.inventory.products.create",
+ "admin.contacts.suppliers.view",
+ "admin.contacts.suppliers.create",
+ "admin.inventory.warehouse.view",
+ "admin.inventory.orders.view",
+ "admin.inventory.reception.view",
+ "admin.inventory.materials.view",
+ "admin.inventory.stock.view",
+ "admin.inventory.movements.view",
+ "admin.inventory.transfers.view",
+ "admin.inventory.assets.view",
+ "admin.inventory.asset-maintenance.view",
+ "admin.inventory.asset-lifecycle.view",
+ "admin.inventory.asset-assignments.view"
+ ]
+ },
+ "Administrador Web" : {
+ "style": "primary",
+ "permissions" : []
+ },
+ "Editor" : {
+ "style": "primary",
+ "permissions" : []
+ },
+ "Almacenista" : {
+ "style": "success",
+ "permissions" : [
+ "admin.inventory.product-categories.view",
+ "admin.inventory.product-catalogs.view",
+ "admin.inventory.products.view",
+ "admin.inventory.products.create",
+ "admin.inventory.warehouse.view",
+ "admin.inventory.stock.view",
+ "admin.inventory.movements.view",
+ "admin.inventory.transfers.view"
+ ]
+ },
+ "Productos y servicios" : {
+ "style": "info",
+ "permissions" : []
+ },
+ "Recursos humanos" : {
+ "style": "success",
+ "permissions" : []
+ },
+ "Nómina" : {
+ "style": "success",
+ "permissions" : []
+ },
+ "Activos fijos" : {
+ "style": "secondary",
+ "permissions" : []
+ },
+ "Compras y gastos" : {
+ "style": "info",
+ "permissions" : []
+ },
+ "CRM" : {
+ "style": "warning",
+ "permissions" : []
+ },
+ "Vendedor" : {
+ "style": "info",
+ "permissions" : []
+ },
+ "Gerente" : {
+ "style": "danger",
+ "permissions" : []
+ },
+ "Facturación" : {
+ "style": "info",
+ "permissions" : []
+ },
+ "Facturación avanzado" : {
+ "style": "danger",
+ "permissions" : []
+ },
+ "Finanzas" : {
+ "style": "info",
+ "permissions" : []
+ },
+ "Auditor" : {
+ "style": "dark",
+ "permissions" : [
+ "admin.core.cache-manager.view",
+ "admin.store-manager.company.view",
+ "admin.store-manager.stores.view",
+ "admin.store-manager.stores.view",
+ "admin.core.users.view",
+ "admin.core.roles.view",
+ "admin.core.permissions.view",
+ "admin.ai.dashboard.view",
+ "admin.ai.analytics.view",
+ "admin.chatbot.config.view",
+ "admin.chatbot.history.view",
+ "admin.iot.devices.view",
+ "admin.iot.monitoring.view",
+ "admin.facial-recognition.history.view",
+ "admin.print.queue.view",
+ "admin.print.history.view",
+ "admin.website.legal.view",
+ "admin.website.faq.view",
+ "admin.blog.categories.view",
+ "admin.blog.tags.view",
+ "admin.blog.articles.view",
+ "admin.blog.comments.view",
+ "admin.contacts.contacts.view",
+ "admin.crm.marketing-campaigns.view",
+ "admin.crm.leads.view",
+ "admin.crm.newsletter.view",
+ "admin.contacts.employees.view",
+ "admin.rrhh.jobs.view",
+ "admin.rrhh.organization.view",
+ "admin.recruitment.jobs.view",
+ "admin.recruitment.candidates.view",
+ "admin.recruitment.interviews.view",
+ "admin.payroll.contracts.view",
+ "admin.payroll.process.view",
+ "admin.payroll.receipts.view",
+ "admin.payroll.reports.view",
+ "admin.attendance.records.view",
+ "admin.attendance.biometric.view",
+ "admin.attendance.absences.view",
+ "admin.inventory.product-categories.view",
+ "admin.inventory.product-catalogs.view",
+ "admin.inventory.products.view",
+ "admin.contacts.customers.view",
+ "admin.sales.sales.view",
+ "admin.sales.quotes.view",
+ "admin.sales.sales.view",
+ "admin.sales.sales.view",
+ "admin.sales.remissions.view",
+ "admin.sales.remissions.view",
+ "admin.sales.credit-notes.view",
+ "admin.sales.credit-notes.view",
+ "admin.accounting.dashboard.view",
+ "admin.accounting.charts.view",
+ "admin.finance.accounts-payable.view",
+ "admin.finance.accounts-receivable.view",
+ "admin.accounting.balance.view",
+ "admin.accounting.income-statement.view",
+ "admin.accounting.ledger.view",
+ "admin.accounting.entries.view",
+ "admin.expenses.dashboard.view",
+ "admin.expenses.expenses.view",
+ "admin.expenses.categories.view",
+ "admin.expenses.history.view",
+ "admin.billing.ingresos.view",
+ "admin.billing.ingresos.view",
+ "admin.billing.egresos.view",
+ "admin.billing.egresos.view",
+ "admin.billing.pagos.view",
+ "admin.billing.nomina.view",
+ "admin.contacts.suppliers.view",
+ "admin.inventory.orders.view",
+ "admin.inventory.reception.view",
+ "admin.inventory.materials.view",
+ "admin.inventory.warehouse.view",
+ "admin.inventory.stock.view",
+ "admin.inventory.movements.view",
+ "admin.inventory.transfers.view",
+ "admin.inventory.shipping-orders.view",
+ "admin.inventory.shipping-tracking.view",
+ "admin.inventory.shipping-carriers.view",
+ "admin.inventory.shipping-rates.view",
+ "admin.inventory.assets.view",
+ "admin.inventory.asset-maintenance.view",
+ "admin.inventory.asset-lifecycle.view",
+ "admin.inventory.asset-assignments.view",
+ "admin.projects.dashboard.view",
+ "admin.projects.view",
+ "admin.projects.tasks.view",
+ "admin.projects.history.view",
+ "admin.production.orders.view",
+ "admin.production.process.view",
+ "admin.production.history.view",
+ "admin.quality.inspections.view",
+ "admin.quality.reports.view",
+ "admin.quality.history.view",
+ "admin.workflows.view",
+ "admin.workflows.automations.view",
+ "admin.workflows.history.view",
+ "admin.contracts.view",
+ "admin.contracts.automated.view",
+ "admin.contracts.history.view",
+ "admin.ticketing.dashboard.view",
+ "admin.ticketing.tickets.view",
+ "admin.ticketing.categories.view",
+ "admin.ticketing.analytics.view"
+ ]
+ }
+ },
+ "permissions": [
+ "admin.core.general-settings.allow",
+ "admin.core.cache-manager.view",
+ "admin.core.smtp-settings.allow",
+ "admin.store-manager.company.view",
+ "admin.store-manager.stores.view",
+ "admin.store-manager.stores.view",
+ "admin.finance.banxico.allow",
+ "admin.finance.banking.allow",
+ "admin.sales.ticket-config.allow",
+ "admin.billing.csds-settings.allow",
+ "admin.billing.stamping-package.allow",
+ "admin.billing.smtp-settings.allow",
+ "admin.billing.mass-cfdi-download.allow",
+ "admin.core.users.view",
+ "admin.core.roles.view",
+ "admin.core.permissions.view",
+ "admin.core.import-sat-catalogs.allow",
+ "admin.ai.dashboard.view",
+ "admin.ai.content.create",
+ "admin.ai.analytics.view",
+ "admin.chatbot.config.view",
+ "admin.chatbot.flows.manage",
+ "admin.chatbot.history.view",
+ "admin.iot.devices.view",
+ "admin.iot.sensors.manage",
+ "admin.iot.monitoring.view",
+ "admin.facial-recognition.profiles.manage",
+ "admin.facial-recognition.live.verify",
+ "admin.facial-recognition.history.view",
+ "admin.print.queue.view",
+ "admin.print.history.view",
+ "admin.print.settings.manage",
+ "admin.website.general-settings.allow",
+ "admin.website.legal.view",
+ "admin.website.faq.view",
+ "admin.blog.categories.view",
+ "admin.blog.tags.view",
+ "admin.blog.articles.view",
+ "admin.blog.comments.view",
+ "admin.contacts.contacts.view",
+ "admin.contacts.contacts.create",
+ "admin.crm.marketing-campaigns.view",
+ "admin.crm.leads.view",
+ "admin.crm.newsletter.view",
+ "admin.contacts.employees.view",
+ "admin.contacts.employees.create",
+ "admin.rrhh.jobs.view",
+ "admin.rrhh.organization.view",
+ "admin.recruitment.jobs.view",
+ "admin.recruitment.candidates.view",
+ "admin.recruitment.interviews.view",
+ "admin.payroll.contracts.view",
+ "admin.payroll.process.view",
+ "admin.payroll.receipts.view",
+ "admin.payroll.reports.view",
+ "admin.attendance.records.view",
+ "admin.attendance.biometric.view",
+ "admin.attendance.absences.view",
+ "admin.inventory.product-categories.view",
+ "admin.inventory.product-catalogs.view",
+ "admin.inventory.products.view",
+ "admin.inventory.products.create",
+ "admin.sales.dashboard.allow",
+ "admin.contacts.customers.view",
+ "admin.contacts.customers.create",
+ "admin.sales.sales.view",
+ "admin.sales.quotes.view",
+ "admin.sales.sales.create",
+ "admin.sales.sales.view",
+ "admin.sales.sales.view",
+ "admin.sales.remissions.create",
+ "admin.sales.remissions.view",
+ "admin.sales.remissions.view",
+ "admin.sales.credit-notes.create",
+ "admin.sales.credit-notes.view",
+ "admin.sales.credit-notes.view",
+ "admin.accounting.dashboard.view",
+ "admin.accounting.charts.view",
+ "admin.finance.accounts-payable.view",
+ "admin.finance.accounts-receivable.view",
+ "admin.accounting.balance.view",
+ "admin.accounting.income-statement.view",
+ "admin.accounting.ledger.view",
+ "admin.accounting.entries.view",
+ "admin.expenses.dashboard.view",
+ "admin.expenses.expenses.create",
+ "admin.expenses.expenses.view",
+ "admin.expenses.categories.view",
+ "admin.expenses.history.view",
+ "admin.billing.dashboard.allow",
+ "admin.billing.ingresos.create",
+ "admin.billing.ingresos.view",
+ "admin.billing.ingresos.view",
+ "admin.billing.egresos.create",
+ "admin.billing.egresos.view",
+ "admin.billing.egresos.view",
+ "admin.billing.pagos.created",
+ "admin.billing.pagos.view",
+ "admin.billing.nomina.view",
+ "admin.billing.verify-cfdi.allow",
+ "admin.contacts.suppliers.view",
+ "admin.contacts.suppliers.create",
+ "admin.inventory.orders.view",
+ "admin.inventory.reception.view",
+ "admin.inventory.materials.view",
+ "admin.inventory.warehouse.view",
+ "admin.inventory.stock.view",
+ "admin.inventory.movements.view",
+ "admin.inventory.transfers.view",
+ "admin.inventory.shipping-orders.view",
+ "admin.inventory.shipping-tracking.view",
+ "admin.inventory.shipping-carriers.view",
+ "admin.inventory.shipping-rates.view",
+ "admin.inventory.assets.view",
+ "admin.inventory.asset-maintenance.view",
+ "admin.inventory.asset-lifecycle.view",
+ "admin.inventory.asset-assignments.view",
+ "admin.projects.dashboard.view",
+ "admin.projects.view",
+ "admin.projects.create",
+ "admin.projects.tasks.view",
+ "admin.projects.history.view",
+ "admin.production.orders.view",
+ "admin.production.orders.create",
+ "admin.production.process.view",
+ "admin.production.history.view",
+ "admin.quality.inspections.view",
+ "admin.quality.inspections.create",
+ "admin.quality.reports.view",
+ "admin.quality.history.view",
+ "admin.workflows.view",
+ "admin.workflows.create",
+ "admin.workflows.automations.view",
+ "admin.workflows.history.view",
+ "admin.contracts.view",
+ "admin.contracts.sign",
+ "admin.contracts.automated.view",
+ "admin.contracts.history.view",
+ "admin.ticketing.dashboard.view",
+ "admin.ticketing.tickets.view",
+ "admin.ticketing.tickets.create",
+ "admin.ticketing.categories.view",
+ "admin.ticketing.analytics.view"
+ ]
+}
+
+
diff --git a/database/data/users.csv b/database/data/users.csv
new file mode 100644
index 0000000..403ec91
--- /dev/null
+++ b/database/data/users.csv
@@ -0,0 +1,14 @@
+name,email,role,password
+Administrador Web,webadmin@concierge.test,Administrador Web,LAdmin123
+Productos y servicios,productos@concierge.test,Productos y servicios,LAdmin123
+Recursos humanos,rrhh@concierge.test,Recursos humanos,LAdmin123
+Nómina,nomina@concierge.test,Nómina,LAdmin123
+Activos fijos,activos@concierge.test,Activos fijos,LAdmin123
+Compras y gastos,compras@concierge.test,Compras y gastos,LAdmin123
+CRM,crm@concierge.test,CRM,LAdmin123
+Vendedor,vendedor@concierge.test,Vendedor,LAdmin123
+Gerente,gerente@concierge.test,Gerente,LAdmin123
+Facturación,facturacion@concierge.test,Facturación,LAdmin123
+Facturación avanzado,facturacion_avanzado@concierge.test,Facturación avanzado,LAdmin123
+Finanzas,finanzas@concierge.test,Finanzas,LAdmin123
+Auditor,auditor@concierge.test,Auditor,LAdmin123
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
new file mode 100644
index 0000000..ba86720
--- /dev/null
+++ b/database/factories/UserFactory.php
@@ -0,0 +1,49 @@
+
+ */
+class UserFactory extends Factory
+{
+ /**
+ * The current password being used by the factory.
+ */
+ protected static ?string $password;
+
+ /**
+ * Define the model's default state.
+ *
+ * @return array
+ */
+ public function definition(): array
+ {
+ return [
+ 'name' => fake()->name(),
+ 'email' => fake()->unique()->safeEmail(),
+ 'email_verified_at' => now(),
+ 'password' => static::$password ??= Hash::make('password'),
+ 'two_factor_secret' => null,
+ 'two_factor_recovery_codes' => null,
+ 'remember_token' => Str::random(10),
+ 'profile_photo_path' => null,
+ 'status' => fake()->randomElement([User::STATUS_ENABLED, User::STATUS_DISABLED])
+ ];
+ }
+
+ /**
+ * Indicate that the model's email address should be unverified.
+ */
+ public function unverified(): static
+ {
+ return $this->state(fn(array $attributes) => [
+ 'email_verified_at' => null,
+ ]);
+ }
+}
diff --git a/database/migrations/2024_12_14_030215_modify_users_table.php b/database/migrations/2024_12_14_030215_modify_users_table.php
new file mode 100644
index 0000000..f4567b4
--- /dev/null
+++ b/database/migrations/2024_12_14_030215_modify_users_table.php
@@ -0,0 +1,44 @@
+string('last_name', 100)->nullable()->comment('Apellidos')->index()->after('name');
+ $table->string('profile_photo_path', 2048)->nullable()->after('remember_token');
+ $table->unsignedTinyInteger('status')->default(User::STATUS_DISABLED)->after('profile_photo_path');
+ $table->unsignedMediumInteger('created_by')->nullable()->index()->after('status');
+
+ // Definir la relación con created_by
+ $table->foreign('created_by')->references('id')->on('users')->onUpdate('restrict')->onDelete('restrict');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ DB::statement('ALTER TABLE `users` MODIFY `id` MEDIUMINT UNSIGNED NOT NULL;');
+ DB::statement('ALTER TABLE `users` DROP PRIMARY KEY;');
+ DB::statement('ALTER TABLE `users` MODIFY `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`id`);');
+
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropColumn(['last_name', 'profile_photo_path', 'status', 'created_by']);
+
+ });
+ }
+};
diff --git a/database/migrations/2024_12_14_035487_create_user_logins_table.php b/database/migrations/2024_12_14_035487_create_user_logins_table.php
new file mode 100644
index 0000000..84f5ba3
--- /dev/null
+++ b/database/migrations/2024_12_14_035487_create_user_logins_table.php
@@ -0,0 +1,36 @@
+integerIncrements('id');
+
+ $table->unsignedMediumInteger('user_id')->nullable()->index();
+ $table->ipAddress('ip_address')->nullable();
+ $table->string('user_agent')->nullable();
+
+ $table->timestamps();
+
+ // Relaciones
+ $table->foreign('user_id')->references('id')->on('users');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ // Elimina tablas solo si existen
+ Schema::dropIfExists('user_logins');
+ }
+};
diff --git a/database/migrations/2024_12_14_073441_create_personal_access_tokens_table.php b/database/migrations/2024_12_14_073441_create_personal_access_tokens_table.php
new file mode 100644
index 0000000..e828ad8
--- /dev/null
+++ b/database/migrations/2024_12_14_073441_create_personal_access_tokens_table.php
@@ -0,0 +1,33 @@
+id();
+ $table->morphs('tokenable');
+ $table->string('name');
+ $table->string('token', 64)->unique();
+ $table->text('abilities')->nullable();
+ $table->timestamp('last_used_at')->nullable();
+ $table->timestamp('expires_at')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('personal_access_tokens');
+ }
+};
diff --git a/database/migrations/2024_12_14_074756_create_permission_tables.php b/database/migrations/2024_12_14_074756_create_permission_tables.php
new file mode 100644
index 0000000..347947f
--- /dev/null
+++ b/database/migrations/2024_12_14_074756_create_permission_tables.php
@@ -0,0 +1,153 @@
+engine('InnoDB');
+ $table->bigIncrements('id'); // permission id
+ $table->string('name'); // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format)
+ $table->string('group_name')->nullable()->index();
+ $table->string('sub_group_name')->nullable()->index();
+ $table->string('action')->nullable()->index();
+ $table->string('guard_name'); // For MyISAM use string('guard_name', 25);
+ $table->timestamps();
+
+ $table->unique(['name', 'guard_name']);
+ $table->unique(['group_name', 'sub_group_name', 'action', 'guard_name']);
+ });
+
+ Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) {
+ //$table->engine('InnoDB');
+ $table->bigIncrements('id'); // role id
+ if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing
+ $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable();
+ $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index');
+ }
+ $table->string('name'); // For MyISAM use string('name', 225); // (or 166 for InnoDB with Redundant/Compact row format)
+ $table->string('style')->nullable();
+ $table->string('guard_name'); // For MyISAM use string('guard_name', 25);
+ $table->timestamps();
+ if ($teams || config('permission.testing')) {
+ $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']);
+ } else {
+ $table->unique(['name', 'guard_name']);
+ }
+ });
+
+ Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames, $pivotPermission, $teams) {
+ $table->unsignedBigInteger($pivotPermission);
+
+ $table->string('model_type');
+ $table->unsignedBigInteger($columnNames['model_morph_key']);
+ $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index');
+
+ $table->foreign($pivotPermission)
+ ->references('id') // permission id
+ ->on($tableNames['permissions'])
+ ->onDelete('cascade');
+ if ($teams) {
+ $table->unsignedBigInteger($columnNames['team_foreign_key']);
+ $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index');
+
+ $table->primary(
+ [$columnNames['team_foreign_key'], $pivotPermission, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_permissions_permission_model_type_primary'
+ );
+ } else {
+ $table->primary(
+ [$pivotPermission, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_permissions_permission_model_type_primary'
+ );
+ }
+ });
+
+ Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $pivotRole, $teams) {
+ $table->unsignedBigInteger($pivotRole);
+
+ $table->string('model_type');
+ $table->unsignedBigInteger($columnNames['model_morph_key']);
+ $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index');
+
+ $table->foreign($pivotRole)
+ ->references('id') // role id
+ ->on($tableNames['roles'])
+ ->onDelete('cascade');
+ if ($teams) {
+ $table->unsignedBigInteger($columnNames['team_foreign_key']);
+ $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index');
+
+ $table->primary(
+ [$columnNames['team_foreign_key'], $pivotRole, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_roles_role_model_type_primary'
+ );
+ } else {
+ $table->primary(
+ [$pivotRole, $columnNames['model_morph_key'], 'model_type'],
+ 'model_has_roles_role_model_type_primary'
+ );
+ }
+ });
+
+ Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames, $pivotRole, $pivotPermission) {
+ $table->unsignedBigInteger($pivotPermission);
+ $table->unsignedBigInteger($pivotRole);
+
+ $table->foreign($pivotPermission)
+ ->references('id') // permission id
+ ->on($tableNames['permissions'])
+ ->onDelete('cascade');
+
+ $table->foreign($pivotRole)
+ ->references('id') // role id
+ ->on($tableNames['roles'])
+ ->onDelete('cascade');
+
+ $table->primary([$pivotPermission, $pivotRole], 'role_has_permissions_permission_id_role_id_primary');
+ });
+
+ app('cache')
+ ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null)
+ ->forget(config('permission.cache.key'));
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ $tableNames = config('permission.table_names');
+
+ if (empty($tableNames)) {
+ throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.');
+ }
+
+ Schema::drop($tableNames['role_has_permissions']);
+ Schema::drop($tableNames['model_has_roles']);
+ Schema::drop($tableNames['model_has_permissions']);
+ Schema::drop($tableNames['roles']);
+ Schema::drop($tableNames['permissions']);
+ }
+};
diff --git a/database/migrations/2024_12_14_081739_add_two_factor_columns_to_users_table.php b/database/migrations/2024_12_14_081739_add_two_factor_columns_to_users_table.php
new file mode 100644
index 0000000..b490e24
--- /dev/null
+++ b/database/migrations/2024_12_14_081739_add_two_factor_columns_to_users_table.php
@@ -0,0 +1,46 @@
+text('two_factor_secret')
+ ->after('password')
+ ->nullable();
+
+ $table->text('two_factor_recovery_codes')
+ ->after('two_factor_secret')
+ ->nullable();
+
+ if (Fortify::confirmsTwoFactorAuthentication()) {
+ $table->timestamp('two_factor_confirmed_at')
+ ->after('two_factor_recovery_codes')
+ ->nullable();
+ }
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropColumn(array_merge([
+ 'two_factor_secret',
+ 'two_factor_recovery_codes',
+ ], Fortify::confirmsTwoFactorAuthentication() ? [
+ 'two_factor_confirmed_at',
+ ] : []));
+ });
+ }
+};
diff --git a/database/migrations/2024_12_14_082234_create_settings_table.php b/database/migrations/2024_12_14_082234_create_settings_table.php
new file mode 100644
index 0000000..db08618
--- /dev/null
+++ b/database/migrations/2024_12_14_082234_create_settings_table.php
@@ -0,0 +1,37 @@
+mediumIncrements('id');
+
+ $table->string('key')->index();
+ $table->text('value');
+ $table->unsignedMediumInteger('user_id')->nullable()->index();
+
+ // Unique constraints
+ $table->unique(['user_id', 'key']);
+
+ // Relaciones
+ $table->foreign('user_id')->references('id')->on('users');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('settings');
+ }
+
+};
diff --git a/database/migrations/2024_12_14_083409_create_media_items_table.php b/database/migrations/2024_12_14_083409_create_media_items_table.php
new file mode 100644
index 0000000..aa1a5cb
--- /dev/null
+++ b/database/migrations/2024_12_14_083409_create_media_items_table.php
@@ -0,0 +1,48 @@
+mediumIncrements('id');
+
+ // Relación polimórfica
+ $table->unsignedMediumInteger('mediaable_id');
+ $table->string('mediaable_type');
+
+ $table->unsignedTinyInteger('type')->index(); // Tipo de medio: 'image', 'video', 'file', 'youtube'
+ $table->unsignedTinyInteger('sub_type')->index(); // Subtipo de medio: 'thumbnail', 'main', 'additional'
+
+ $table->string('url', 255)->nullable(); // URL del medio
+ $table->string('path')->nullable(); // Ruta del archivo si está almacenado localmente
+
+ $table->string('title')->nullable()->index(); // Título del medio
+ $table->mediumText('description')->nullable(); // Descripción del medio
+ $table->unsignedTinyInteger('order')->nullable(); // Orden de presentación
+
+ // Authoría
+ $table->timestamps();
+
+ // Índices
+ $table->index(['mediaable_type', 'mediaable_id']);
+ $table->index(['mediaable_type', 'mediaable_id', 'type']);
+ });
+
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('images');
+ }
+};
diff --git a/database/migrations/2024_12_14_092026_create_audits_table.php b/database/migrations/2024_12_14_092026_create_audits_table.php
new file mode 100644
index 0000000..709069d
--- /dev/null
+++ b/database/migrations/2024_12_14_092026_create_audits_table.php
@@ -0,0 +1,52 @@
+create($table, function (Blueprint $table) {
+
+ $morphPrefix = config('audit.user.morph_prefix', 'user');
+
+ $table->bigIncrements('id');
+ $table->string($morphPrefix . '_type')->nullable();
+ $table->unsignedBigInteger($morphPrefix . '_id')->nullable();
+ $table->string('event');
+ $table->morphs('auditable');
+ $table->text('old_values')->nullable();
+ $table->text('new_values')->nullable();
+ $table->text('url')->nullable();
+ $table->ipAddress('ip_address')->nullable();
+ $table->string('user_agent', 1023)->nullable();
+ $table->string('tags')->nullable();
+ $table->timestamps();
+
+ $table->index([$morphPrefix . '_id', $morphPrefix . '_type']);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ $connection = config('audit.drivers.database.connection', config('database.default'));
+ $table = config('audit.drivers.database.table', 'audits');
+
+ Schema::connection($connection)->drop($table);
+ }
+};
diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php
new file mode 100644
index 0000000..88a695c
--- /dev/null
+++ b/database/seeders/PermissionSeeder.php
@@ -0,0 +1,14 @@
+ 'Quimiplastic S.A de C.V.',
+ 'app_faviconIcon' => '../assets/img/logo/koneko-02.png',
+ 'app_name' => 'Quimiplastic',
+ 'app_imageLogo' => '../assets/img/logo/koneko-02.png',
+
+ 'app_myLayout' => 'vertical',
+ 'app_myTheme' => 'theme-default',
+ 'app_myStyle' => 'light',
+ 'app_navbarType' => 'sticky',
+ 'app_menuFixed' => true,
+ 'app_menuCollapsed' => false,
+ 'app_headerType' => 'static',
+ 'app_showDropdownOnHover' => false,
+ 'app_authViewMode' => 'cover',
+ 'app_maxQuickLinks' => 5,
+
+
+
+ 'smtp.host' => 'webmail.koneko.mx',
+ 'smtp.port' => 465,
+ 'smtp.encryption' => 'tls',
+ 'smtp.username' => 'no-responder@koneko.mx',
+ 'smtp.password' => null,
+ 'smtp.from_email' => 'no-responder@koneko.mx',
+ 'smtp.from_name' => 'Koneko Soluciones en Tecnología',
+ 'smtp.reply_to_method' => 'smtp',
+ 'smtp.reply_to_email' => null,
+ 'smtp.reply_to_name' => null,
+
+
+
+ 'website.title',
+ 'website.favicon',
+ 'website.description',
+ 'website.image_logo',
+ 'website.image_logoDark',
+
+ 'admin.title',
+ 'admin.favicon',
+ 'admin.description',
+ 'admin.image_logo',
+ 'admin.image_logoDark',
+
+
+ 'favicon.icon' => null,
+
+ 'contact.phone_number' => '(222) 462 0903',
+ 'contact.phone_number_ext' => 'Ext. 5',
+ 'contact.email' => 'virtualcompras@live.com.mx',
+ 'contact.form.email' => 'contacto@conciergetravellife.com',
+ 'contact.form.email_cc' => 'arturo@koneko.mx',
+ 'contact.form.subject' => 'Has recibido un mensaje del formulario de covirsast.com',
+ 'contact.direccion' => '51 PTE 505 loc. 14, Puebla, Pue.',
+ 'contact.horario' => '9am - 7 pm',
+ 'contact.location.lat' => '19.024439',
+ 'contact.location.lng' => '-98.215777',
+
+ 'social.whatsapp' => '',
+ 'social.whatsapp.message' => '👋 Hola! Estoy buscando más información sobre Covirsa Soluciones en Tecnología. ¿Podrías proporcionarme los detalles que necesito? ¡Te lo agradecería mucho! 💻✨',
+
+ 'social.facebook' => 'https://www.facebook.com/covirsast/?locale=es_LA',
+ 'social.Whatsapp' => '2228 200 201',
+ 'social.Whatsapp.message' => '¡Hola! 🌟 Estoy interesado en obtener más información acerca de Concierge Travel. ¿Podrías ayudarme con los detalles? ¡Gracias de antemano! ✈️🏝',
+ 'social.Facebook' => 'test',
+ 'social.Instagram' => 'test',
+ 'social.Linkedin' => 'test',
+ 'social.Tiktok' => 'test',
+ 'social.X_twitter' => 'test',
+ 'social.Google' => 'test',
+ 'social.Pinterest' => 'test',
+ 'social.Youtube' => 'test',
+ 'social.Vimeo' => 'test',
+
+
+ 'chat.provider' => '',
+ 'chat.whatsapp.number' => '',
+ 'chat.whatsapp.message' => '👋 Hola! Estoy buscando más información sobre Covirsa Soluciones en Tecnología. ¿Podrías proporcionarme los detalles que necesito? ¡Te lo agradecería mucho! 💻✨',
+
+ 'webTpl.container' => 'custom-container',
+*/];
+
+ foreach ($settings_array as $key => $value) {
+ Setting::create([
+ 'key' => $key,
+ 'value' => $value,
+ ]);
+ };
+ }
+}
diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php
new file mode 100644
index 0000000..658a6bc
--- /dev/null
+++ b/database/seeders/UserSeeder.php
@@ -0,0 +1,97 @@
+exists($directory))
+ Storage::disk($disk)->deleteDirectory($directory);
+
+ //
+ $avatarImageService = new AvatarImageService();
+
+ // Super admin
+ $user = User::create([
+ 'name' => 'Koneko Admin',
+ 'email' => 'arturo@koneko.mx',
+ 'email_verified_at' => now(),
+ 'password' => bcrypt('LAdmin123'),
+ 'status' => User::STATUS_ENABLED,
+ ])->assignRole('SuperAdmin');
+
+ // Actualizamos la foto
+ $avatarImageService->updateProfilePhoto($user, new UploadedFile(
+ 'public/vendor/vuexy-admin/img/logo/koneko-02.png',
+ 'koneko-02.png'
+ ));
+
+
+ // admin
+ $avatarImageService = User::create([
+ 'name' => 'Admin',
+ 'email' => 'admin@koneko.mx',
+ 'email_verified_at' => now(),
+ 'password' => bcrypt('LAdmin123'),
+ 'status' => User::STATUS_ENABLED,
+ ])->assignRole('Admin');
+
+ $avatarImageService->updateProfilePhoto($user, new UploadedFile(
+ 'public/vendor/vuexy-admin/img/logo/koneko-03.png',
+ 'koneko-03.png'
+ ));
+
+ // Almacenista
+ $avatarImageService = User::create([
+ 'name' => 'Almacenista',
+ 'email' => 'almacenista@koneko.mx',
+ 'email_verified_at' => now(),
+ 'password' => bcrypt('LAdmin123'),
+ 'status' => User::STATUS_ENABLED,
+ ])->assignRole('Almacenista');
+
+ $avatarImageService->updateProfilePhoto($user, new UploadedFile(
+ 'public/vendor/vuexy-admin/img/logo/koneko-03.png',
+ 'koneko-03.png'
+ ));
+
+
+ // Usuarios CSV
+ $csvFile = fopen(base_path("database/data/users.csv"), "r");
+
+ $firstline = true;
+
+ while (($data = fgetcsv($csvFile, 2000, ",")) !== FALSE) {
+ if (!$firstline) {
+ User::create([
+ 'name' => $data['0'],
+ 'email' => $data['1'],
+ 'email_verified_at' => now(),
+ 'password' => bcrypt($data['3']),
+ 'status' => User::STATUS_ENABLED,
+ ])->assignRole($data['2']);
+ }
+
+ $firstline = false;
+ }
+
+ fclose($csvFile);
+ }
+}
diff --git a/resources/assets/css/demo.css b/resources/assets/css/demo.css
new file mode 100644
index 0000000..ec996c1
--- /dev/null
+++ b/resources/assets/css/demo.css
@@ -0,0 +1,129 @@
+/*
+* demo.css
+* File include item demo only specific css only
+******************************************************************************/
+
+.light-style .menu .app-brand.demo {
+ height: 64px;
+}
+
+.dark-style .menu .app-brand.demo {
+ height: 64px;
+}
+
+.app-brand-logo.demo {
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ display: -ms-flexbox;
+ display: flex;
+ width: 34px;
+ height: 24px;
+}
+
+.app-brand-logo.demo svg {
+ width: 35px;
+ height: 24px;
+}
+
+.app-brand-text.demo {
+ font-size: 1.375rem;
+}
+
+/* ! For .layout-navbar-fixed added fix padding top tpo .layout-page */
+.layout-navbar-fixed .layout-wrapper:not(.layout-without-menu) .layout-page {
+ padding-top: 64px !important;
+}
+.layout-navbar-fixed .layout-wrapper:not(.layout-horizontal):not(.layout-without-menu) .layout-page {
+ padding-top: 72px !important;
+}
+/* Navbar page z-index issue solution */
+.content-wrapper .navbar {
+ z-index: auto;
+}
+
+/*
+* Content
+******************************************************************************/
+
+.demo-blocks > * {
+ display: block !important;
+}
+
+.demo-inline-spacing > * {
+ margin: 1rem 0.375rem 0 0 !important;
+}
+
+/* ? .demo-vertical-spacing class is used to have vertical margins between elements. To remove margin-top from the first-child, use .demo-only-element class with .demo-vertical-spacing class. For example, we have used this class in forms-input-groups.html file. */
+.demo-vertical-spacing > * {
+ margin-top: 1rem !important;
+ margin-bottom: 0 !important;
+}
+.demo-vertical-spacing.demo-only-element > :first-child {
+ margin-top: 0 !important;
+}
+
+.demo-vertical-spacing-lg > * {
+ margin-top: 1.875rem !important;
+ margin-bottom: 0 !important;
+}
+.demo-vertical-spacing-lg.demo-only-element > :first-child {
+ margin-top: 0 !important;
+}
+
+.demo-vertical-spacing-xl > * {
+ margin-top: 5rem !important;
+ margin-bottom: 0 !important;
+}
+.demo-vertical-spacing-xl.demo-only-element > :first-child {
+ margin-top: 0 !important;
+}
+
+.rtl-only {
+ display: none !important;
+ text-align: left !important;
+ direction: ltr !important;
+}
+
+[dir='rtl'] .rtl-only {
+ display: block !important;
+}
+
+/* Dropdown buttons going out of small screens */
+@media (max-width: 576px) {
+ #dropdown-variation-demo .btn-group .text-truncate {
+ width: 254px;
+ position: relative;
+ }
+ #dropdown-variation-demo .btn-group .text-truncate::after {
+ position: absolute;
+ top: 45%;
+ right: 0.65rem;
+ }
+}
+
+/*
+* Layout demo
+******************************************************************************/
+
+.layout-demo-wrapper {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-top: 1rem;
+}
+.layout-demo-placeholder img {
+ width: 900px;
+}
+.layout-demo-info {
+ text-align: center;
+ margin-top: 1rem;
+}
diff --git a/resources/assets/js/bootstrap-table/bootstrapTableManager.js b/resources/assets/js/bootstrap-table/bootstrapTableManager.js
new file mode 100644
index 0000000..9e272c0
--- /dev/null
+++ b/resources/assets/js/bootstrap-table/bootstrapTableManager.js
@@ -0,0 +1,245 @@
+import '../../vendor/libs/bootstrap-table/bootstrap-table';
+import '../notifications/LivewireNotification';
+
+class BootstrapTableManager {
+ constructor(bootstrapTableWrap, config = {}) {
+ const defaultConfig = {
+ header: [],
+ format: [],
+ search_columns: [],
+ actionColumn: false,
+ height: 'auto',
+ minHeight: 300,
+ bottomMargin : 195,
+ search: true,
+ showColumns: true,
+ showColumnsToggleAll: true,
+ showExport: true,
+ exportfileName: 'datatTable',
+ exportWithDatetime: true,
+ showFullscreen: true,
+ showPaginationSwitch: true,
+ showRefresh: true,
+ showToggle: true,
+ /*
+ smartDisplay: false,
+ searchOnEnterKey: true,
+ showHeader: false,
+ showFooter: true,
+ showRefresh: true,
+ showToggle: true,
+ showFullscreen: true,
+ detailView: true,
+ searchAlign: 'right',
+ buttonsAlign: 'right',
+ toolbarAlign: 'left',
+ paginationVAlign: 'bottom',
+ paginationHAlign: 'right',
+ paginationDetailHAlign: 'left',
+ paginationSuccessivelySize: 5,
+ paginationPagesBySide: 3,
+ paginationUseIntermediate: true,
+ */
+ clickToSelect: true,
+ minimumCountColumns: 4,
+ fixedColumns: true,
+ fixedNumber: 1,
+ idField: 'id',
+ pagination: true,
+ pageList: [25, 50, 100, 500, 1000],
+ sortName: 'id',
+ sortOrder: 'asc',
+ cookie: false,
+ cookieExpire: '365d',
+ cookieIdTable: 'myTableCookies', // Nombre único para las cookies de la tabla
+ cookieStorage: 'localStorage',
+ cookiePath: '/',
+ };
+
+ this.$bootstrapTable = $('.bootstrap-table', bootstrapTableWrap);
+ this.$toolbar = $('.bt-toolbar', bootstrapTableWrap);
+ this.$searchColumns = $('.search_columns', bootstrapTableWrap);
+ this.$btnRefresh = $('.btn-refresh', bootstrapTableWrap);
+ this.$btnClearFilters = $('.btn-clear-filters', bootstrapTableWrap);
+
+ this.config = { ...defaultConfig, ...config };
+
+ this.config.toolbar = `${bootstrapTableWrap} .bt-toolbar`;
+ this.config.height = this.config.height == 'auto'? this.getTableHeight(): this.config.height;
+ this.config.cookieIdTable = this.config.exportWithDatetime? this.config.cookieIdTable + '-' + this.getFormattedDateYMDHm(): this.config.cookieIdTable;
+
+ this.tableFormatters = {}; // Mueve la carga de formatters aquí
+
+ this.initTable();
+ }
+
+ /**
+ * Calcula la altura de la tabla.
+ */
+ getTableHeight() {
+ const btHeight = window.innerHeight - this.$toolbar.height() - this.bottomMargin;
+
+ return btHeight < this.config.minHeight ? this.config.minHeight : btHeight;
+ }
+
+ /**
+ * Genera un ID único para la tabla basado en una cookie.
+ */
+ getCookieId() {
+ const generateShortHash = (str) => {
+ let hash = 0;
+
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+
+ hash = (hash << 5) - hash + char;
+ hash &= hash; // Convertir a entero de 32 bits
+ }
+
+ return Math.abs(hash).toString().substring(0, 12);
+ };
+
+ return `bootstrap-table-cache-${generateShortHash(this.config.title)}`;
+ }
+
+ /**
+ * Carga los formatters dinámicamente
+ */
+ async loadFormatters() {
+ const formattersModules = import.meta.glob('../../../../../**/resources/assets/js/bootstrap-table/*Formatters.js');
+
+ const formatterPromises = Object.entries(formattersModules).map(async ([path, importer]) => {
+ const module = await importer();
+ Object.assign(this.tableFormatters, module);
+ });
+
+ await Promise.all(formatterPromises);
+ }
+
+ btColumns() {
+ const columns = [];
+
+ Object.entries(this.config.header).forEach(([key, value]) => {
+ const columnFormat = this.config.format[key] || {};
+
+ if (typeof columnFormat.formatter === 'object') {
+ const formatterName = columnFormat.formatter.name;
+ const formatterParams = columnFormat.formatter.params || {};
+
+ const formatterFunction = this.tableFormatters[formatterName];
+ if (formatterFunction) {
+ columnFormat.formatter = (value, row, index) => formatterFunction(value, row, index, formatterParams);
+ } else {
+ console.warn(`Formatter "${formatterName}" no encontrado para la columna "${key}"`);
+ }
+ } else if (typeof columnFormat.formatter === 'string') {
+ const formatterFunction = this.tableFormatters[columnFormat.formatter];
+ if (formatterFunction) {
+ columnFormat.formatter = formatterFunction;
+ }
+ }
+
+ if (columnFormat.onlyFormatter) {
+ columns.push({
+ align: 'center',
+ formatter: columnFormat.formatter || (() => ''),
+ forceHide: true,
+ switchable: false,
+ field: key,
+ title: value,
+ });
+ return;
+ }
+
+ const column = {
+ title: value,
+ field: key,
+ sortable: true,
+ };
+
+ columns.push({ ...column, ...columnFormat });
+ });
+
+ return columns;
+ }
+
+
+
+ /**
+ * Petición AJAX para la tabla.
+ */
+ ajaxRequest(params) {
+ const url = `${window.location.href}?${$.param(params.data)}&${$('.bt-toolbar :input').serialize()}`;
+
+ $.get(url).then((res) => params.success(res));
+ }
+
+ toValidFilename(str, extension = 'txt') {
+ return str
+ .normalize("NFD") // 🔹 Normaliza caracteres con tilde
+ .replace(/[\u0300-\u036f]/g, "") // 🔹 Elimina acentos y diacríticos
+ .replace(/[<>:"\/\\|?*\x00-\x1F]/g, '') // 🔹 Elimina caracteres inválidos
+ .replace(/\s+/g, '-') // 🔹 Reemplaza espacios con guiones
+ .replace(/-+/g, '-') // 🔹 Evita múltiples guiones seguidos
+ .replace(/^-+|-+$/g, '') // 🔹 Elimina guiones al inicio y fin
+ .toLowerCase() // 🔹 Convierte a minúsculas
+ + (extension ? '.' + extension.replace(/^\.+/, '') : ''); // 🔹 Asegura la extensión válida
+ }
+
+ getFormattedDateYMDHm(date = new Date()) {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0'); // 🔹 Asegura dos dígitos
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+
+ return `${year}${month}${day}-${hours}${minutes}`;
+ }
+
+
+ /**
+ * Inicia la tabla después de cargar los formatters
+ */
+ async initTable() {
+ await this.loadFormatters(); // Asegura que los formatters estén listos antes de inicializar
+
+ this.$bootstrapTable
+ .bootstrapTable('destroy').bootstrapTable({
+ height: this.config.height,
+ locale: 'es-MX',
+ ajax: (params) => this.ajaxRequest(params),
+ toolbar: this.config.toolbar,
+ search: this.config.search,
+ showColumns: this.config.showColumns,
+ showColumnsToggleAll: this.config.showColumnsToggleAll,
+ showExport: this.config.showExport,
+ exportTypes: ['csv', 'txt', 'xlsx'],
+ exportOptions: {
+ fileName: this.config.fileName,
+ },
+ showFullscreen: this.config.showFullscreen,
+ showPaginationSwitch: this.config.showPaginationSwitch,
+ showRefresh: this.config.showRefresh,
+ showToggle: this.config.showToggle,
+ clickToSelect: this.config.clickToSelect,
+ minimumCountColumns: this.config.minimumCountColumns,
+ fixedColumns: this.config.fixedColumns,
+ fixedNumber: this.config.fixedNumber,
+ idField: this.config.idField,
+ pagination: this.config.pagination,
+ pageList: this.config.pageList,
+ sidePagination: "server",
+ sortName: this.config.sortName,
+ sortOrder: this.config.sortOrder,
+ mobileResponsive: true,
+ resizable: true,
+ cookie: this.config.cookie,
+ cookieExpire: this.config.cookieExpire,
+ cookieIdTable: this.config.cookieIdTable,
+ columns: this.btColumns(),
+ });
+ }
+
+}
+
+window.BootstrapTableManager = BootstrapTableManager;
diff --git a/resources/assets/js/bootstrap-table/globalConfig.js b/resources/assets/js/bootstrap-table/globalConfig.js
new file mode 100644
index 0000000..7276fd9
--- /dev/null
+++ b/resources/assets/js/bootstrap-table/globalConfig.js
@@ -0,0 +1,132 @@
+const appRoutesElement = document.getElementById('app-routes');
+
+export const routes = appRoutesElement ? JSON.parse(appRoutesElement.textContent) : {};
+
+export const booleanStatusCatalog = {
+ activo: {
+ trueText: 'Activo',
+ falseText: 'Inactivo',
+ trueClass: 'badge bg-label-success',
+ falseClass: 'badge bg-label-danger',
+ },
+ habilitado: {
+ trueText: 'Habilitado',
+ falseText: 'Deshabilitado',
+ trueClass: 'badge bg-label-success',
+ falseClass: 'badge bg-label-danger',
+ trueIcon: 'ti ti-checkup-list',
+ falseIcon: 'ti ti-ban',
+ },
+ checkSI: {
+ trueText: 'SI',
+ falseIcon: '',
+ trueClass: 'badge bg-label-info',
+ falseText: '',
+ },
+ check: {
+ trueIcon: 'ti ti-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ checkbox: {
+ trueIcon: 'ti ti-checkbox',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ checklist: {
+ trueIcon: 'ti ti-checklist',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ phone_done: {
+ trueIcon: 'ti ti-phone-done',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ checkup_list: {
+ trueIcon: 'ti ti-checkup-list',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ list_check: {
+ trueIcon: 'ti ti-list-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ camera_check: {
+ trueIcon: 'ti ti-camera-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ mail_check: {
+ trueIcon: 'ti ti-mail-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ clock_check: {
+ trueIcon: 'ti ti-clock-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ user_check: {
+ trueIcon: 'ti ti-user-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ circle_check: {
+ trueIcon: 'ti ti-circle-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ shield_check: {
+ trueIcon: 'ti ti-shield-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ },
+ calendar_check: {
+ trueIcon: 'ti ti-calendar-check',
+ falseIcon: '',
+ trueClass: 'text-green-800',
+ falseClass: '',
+ }
+};
+
+export const badgeColorCatalog = {
+ primary: { color: 'primary' },
+ secondary: { color: 'secondary' },
+ success: { color: 'success' },
+ danger: { color: 'danger' },
+ warning: { color: 'warning' },
+ info: { color: 'info' },
+ dark: { color: 'dark' },
+ light: { color: 'light', textColor: 'text-dark' }
+};
+
+export const statusIntBadgeBgCatalogCss = {
+ 1: 'warning',
+ 2: 'info',
+ 10: 'success',
+ 12: 'danger',
+ 11: 'warning'
+};
+
+export const statusIntBadgeBgCatalog = {
+ 1: 'Inactivo',
+ 2: 'En proceso',
+ 10: 'Activo',
+ 11: 'Archivado',
+ 12: 'Cancelado',
+};
+
diff --git a/resources/assets/js/bootstrap-table/globalFormatters.js b/resources/assets/js/bootstrap-table/globalFormatters.js
new file mode 100644
index 0000000..909c5ab
--- /dev/null
+++ b/resources/assets/js/bootstrap-table/globalFormatters.js
@@ -0,0 +1,193 @@
+import { booleanStatusCatalog, statusIntBadgeBgCatalogCss, statusIntBadgeBgCatalog } from './globalConfig';
+import {routes} from '../../../../../laravel-vuexy-admin/resources/assets/js/bootstrap-table/globalConfig.js';
+
+export const userActionFormatter = (value, row, index) => {
+ if (!row.id) return '';
+
+ const showUrl = routes['admin.user.show'].replace(':id', row.id);
+ const editUrl = routes['admin.user.edit'].replace(':id', row.id);
+ const deleteUrl = routes['admin.user.delete'].replace(':id', row.id);
+
+ return `
+
+ `.trim();
+};
+
+export const dynamicBooleanFormatter = (value, row, index, options = {}) => {
+ const { tag = 'default', customOptions = {} } = options;
+ const catalogConfig = booleanStatusCatalog[tag] || {};
+
+ const finalOptions = {
+ ...catalogConfig,
+ ...customOptions, // Permite sobreescribir la configuración predeterminada
+ ...options // Permite pasar opciones rápidas
+ };
+
+ const {
+ trueIcon = '',
+ falseIcon = '',
+ trueText = 'Sí',
+ falseText = 'No',
+ trueClass = 'badge bg-label-success',
+ falseClass = 'badge bg-label-danger',
+ iconClass = 'text-green-800'
+ } = finalOptions;
+
+ const trueElement = !trueIcon && !trueText ? '' : `${trueIcon ? ` ` : ''}${trueText} `;
+ const falseElement = !falseIcon && !falseText ? '' : `${falseIcon ? ` ` : ''}${falseText} `;
+
+ return value? trueElement : falseElement;
+};
+
+export const dynamicBadgeFormatter = (value, row, index, options = {}) => {
+ const {
+ color = 'primary', // Valor por defecto
+ textColor = '', // Permite agregar color de texto si es necesario
+ additionalClass = '' // Permite añadir clases adicionales
+ } = options;
+
+ return `${value} `;
+};
+
+export const statusIntBadgeBgFormatter = (value, row, index) => {
+ return value
+ ? `${statusIntBadgeBgCatalog[value]} `
+ : '';
+}
+
+export const textNowrapFormatter = (value, row, index) => {
+ if (!value) return '';
+ return `${value} `;
+}
+
+
+export const toCurrencyFormatter = (value, row, index) => {
+ return isNaN(value) ? '' : Number(value).toCurrency();
+}
+
+export const numberFormatter = (value, row, index) => {
+ return isNaN(value) ? '' : Number(value);
+}
+
+export const monthFormatter = (value, row, index) => {
+ switch (parseInt(value)) {
+ case 1:
+ return 'Enero';
+ case 2:
+ return 'Febrero';
+ case 3:
+ return 'Marzo';
+ case 4:
+ return 'Abril';
+ case 5:
+ return 'Mayo';
+ case 6:
+ return 'Junio';
+ case 7:
+ return 'Julio';
+ case 8:
+ return 'Agosto';
+ case 9:
+ return 'Septiembre';
+ case 10:
+ return 'Octubre';
+ case 11:
+ return 'Noviembre';
+ case 12:
+ return 'Diciembre';
+ }
+}
+
+export const humaneTimeFormatter = (value, row, index) => {
+ return isNaN(value) ? '' : Number(value).humaneTime();
+}
+
+/**
+ * Genera la URL del avatar basado en iniciales o devuelve la foto de perfil si está disponible.
+ * @param {string} fullName - Nombre completo del usuario.
+ * @param {string|null} profilePhoto - Ruta de la foto de perfil.
+ * @returns {string} - URL del avatar.
+ */
+function getAvatarUrl(fullName, profilePhoto) {
+ const baseUrl = window.baseUrl || '';
+
+ if (profilePhoto) {
+ return `${baseUrl}storage/profile-photos/${profilePhoto}`;
+ }
+
+ return `${baseUrl}admin/usuario/avatar/?name=${fullName}`;
+}
+
+/**
+ * Formatea la columna del perfil de usuario con avatar, nombre y correo.
+ */
+export const userProfileFormatter = (value, row, index) => {
+ if (!row.id) return '';
+
+ const profileUrl = routes['admin.user.show'].replace(':id', row.id);
+ const avatar = getAvatarUrl(row.full_name, row.profile_photo_path);
+ const email = row.email ? row.email : 'Sin correo';
+
+ return `
+
+ `;
+};
+
+/**
+ * Formatea la columna del perfil de contacto con avatar, nombre y correo.
+ */
+export const contactProfileFormatter = (value, row, index) => {
+ if (!row.id) return '';
+
+ const profileUrl = routes['admin.contact.show'].replace(':id', row.id);
+ const avatar = getAvatarUrl(row.full_name, row.profile_photo_path);
+ const email = row.email ? row.email : 'Sin correo';
+
+ return `
+
+ `;
+};
+
+
+
+export const creatorFormatter = (value, row, index) => {
+ if (!row.creator) return '';
+
+ const email = row.creator_email || 'Sin correo';
+ const showUrl = routes['admin.user.show'].replace(':id', row.id);
+
+
+ return `
+
+ `;
+};
+
diff --git a/resources/assets/js/config.js b/resources/assets/js/config.js
new file mode 100644
index 0000000..a1316d7
--- /dev/null
+++ b/resources/assets/js/config.js
@@ -0,0 +1,53 @@
+/**
+ * Config
+ * -------------------------------------------------------------------------------------
+ * ! IMPORTANT: Make sure you clear the browser local storage In order to see the config changes in the template.
+ * ! To clear local storage: (https://www.leadshook.com/help/how-to-clear-local-storage-in-google-chrome-browser/).
+ */
+
+'use strict';
+
+// JS global variables
+window.config = {
+ colors: {
+ primary: '#7367f0',
+ secondary: '#808390',
+ success: '#28c76f',
+ info: '#00bad1',
+ warning: '#ff9f43',
+ danger: '#FF4C51',
+ dark: '#4b4b4b',
+ black: '#000',
+ white: '#fff',
+ cardColor: '#fff',
+ bodyBg: '#f8f7fa',
+ bodyColor: '#6d6b77',
+ headingColor: '#444050',
+ textMuted: '#acaab1',
+ borderColor: '#e6e6e8'
+ },
+ colors_label: {
+ primary: '#7367f029',
+ secondary: '#a8aaae29',
+ success: '#28c76f29',
+ info: '#00cfe829',
+ warning: '#ff9f4329',
+ danger: '#ea545529',
+ dark: '#4b4b4b29'
+ },
+ colors_dark: {
+ cardColor: '#2f3349',
+ bodyBg: '#25293c',
+ bodyColor: '#b2b1cb',
+ headingColor: '#cfcce4',
+ textMuted: '#8285a0',
+ borderColor: '#565b79'
+ },
+ enableMenuLocalStorage: true // Enable menu state with local storage support
+};
+
+window.assetsPath = document.documentElement.getAttribute('data-assets-path');
+window.baseUrl = document.documentElement.getAttribute('data-base-url');
+window.quicklinksUpdateUrl = document.documentElement.getAttribute('data-quicklinks-update-url');
+window.templateName = document.documentElement.getAttribute('data-template');
+window.rtlSupport = false; // set true for rtl support (rtl + ltr), false for ltr only.
diff --git a/resources/assets/js/forms/formConvasHelper.js b/resources/assets/js/forms/formConvasHelper.js
new file mode 100644
index 0000000..3dc6b70
--- /dev/null
+++ b/resources/assets/js/forms/formConvasHelper.js
@@ -0,0 +1,477 @@
+/**
+ * FormCanvasHelper
+ *
+ * Clase para orquestar la interacción entre un formulario dentro de un Offcanvas
+ * de Bootstrap y el estado de Livewire (modo create/edit/delete), además de
+ * manipular ciertos componentes externos como Select2.
+ *
+ * Se diseñó teniendo en cuenta que el DOM del Offcanvas puede reconstruirse
+ * (re-render) de manera frecuente, por lo que muchos getters reacceden al DOM
+ * dinámicamente.
+ */
+export default class FormCanvasHelper {
+ /**
+ * @param {string} offcanvasId - ID del elemento Offcanvas en el DOM.
+ * @param {object} liveWireInstance - Instancia de Livewire asociada al formulario.
+ */
+ constructor(offcanvasId, liveWireInstance) {
+ this.offcanvasId = offcanvasId;
+ this.liveWireInstance = liveWireInstance;
+
+ // Validamos referencias mínimas para evitar errores tempranos
+ // Si alguna falta, se mostrará un error en consola.
+ this.validateInitialDomRefs();
+ }
+
+ /**
+ * Verifica la existencia básica de elementos en el DOM.
+ * Muestra errores en consola si faltan elementos críticos.
+ */
+ validateInitialDomRefs() {
+ const offcanvasEl = document.getElementById(this.offcanvasId);
+
+ if (!offcanvasEl) {
+ console.error(`❌ No se encontró el contenedor Offcanvas con ID: ${this.offcanvasId}`);
+ return;
+ }
+
+ const formEl = offcanvasEl.querySelector('form');
+ if (!formEl) {
+ console.error(`❌ No se encontró el formulario dentro de #${this.offcanvasId}`);
+ return;
+ }
+
+ const offcanvasTitle = offcanvasEl.querySelector('.offcanvas-title');
+ const submitButtons = formEl.querySelectorAll('.btn-submit');
+ const resetButtons = formEl.querySelectorAll('.btn-reset');
+
+ if (!offcanvasTitle || !submitButtons.length || !resetButtons.length) {
+ console.error(`❌ Faltan el título, botones de submit o reset dentro de #${this.offcanvasId}`);
+ }
+ }
+
+ /**
+ * Getter para el contenedor Offcanvas actual.
+ * Retorna siempre la referencia más reciente del DOM.
+ */
+ get offcanvasEl() {
+ return document.getElementById(this.offcanvasId);
+ }
+
+ /**
+ * Getter para el formulario dentro del Offcanvas.
+ */
+ get formEl() {
+ return this.offcanvasEl?.querySelector('form') ?? null;
+ }
+
+ /**
+ * Getter para el título del Offcanvas.
+ */
+ get offcanvasTitleEl() {
+ return this.offcanvasEl?.querySelector('.offcanvas-title') ?? null;
+ }
+
+ /**
+ * Getter para la instancia de Bootstrap Offcanvas.
+ * Siempre retorna la instancia más reciente en caso de re-render.
+ */
+ get offcanvasInstance() {
+ if (!this.offcanvasEl) return null;
+ return bootstrap.Offcanvas.getOrCreateInstance(this.offcanvasEl);
+ }
+
+ /**
+ * Retorna todos los botones de submit en el formulario.
+ */
+ get submitButtons() {
+ return this.formEl?.querySelectorAll('.btn-submit') ?? [];
+ }
+
+ /**
+ * Retorna todos los botones de reset en el formulario.
+ */
+ get resetButtons() {
+ return this.formEl?.querySelectorAll('.btn-reset') ?? [];
+ }
+
+ /**
+ * Método principal para manejar la recarga del Offcanvas según los estados en Livewire.
+ * Se encarga de resetear el formulario, limpiar errores y cerrar/abrir el Offcanvas
+ * según sea necesario.
+ *
+ * @param {string|null} triggerMode - Forzar la acción (e.g., 'reset', 'create'). Si no se especifica, se verifica según Livewire.
+ */
+ reloadOffcanvas(triggerMode = null) {
+ setTimeout(() => {
+ const mode = this.liveWireInstance.get('mode');
+ const successProcess = this.liveWireInstance.get('successProcess');
+ const validationError = this.liveWireInstance.get('validationError');
+
+ // Si se completa la acción o triggerMode = 'reset',
+ // reseteamos completamente y cerramos el Offcanvas.
+ if (triggerMode === 'reset' || successProcess) {
+ this.resetFormAndState('create');
+
+ return;
+ }
+
+ // Forzar modo create si se solicita explícitamente
+ if (triggerMode === 'create') {
+ // Evitamos re-reset si ya estamos en 'create'
+ if (mode === 'create') return;
+
+ this.resetFormAndState('create');
+
+ this.focusOnOpen();
+
+ return;
+ }
+
+ // Si no, simplemente preparamos la UI según el modo actual.
+ this.prepareOffcanvasUI(mode);
+
+ // Si hay errores de validación, reabrimos el Offcanvas para mostrarlos.
+ if (validationError) {
+ this.liveWireInstance.set('validationError', null, false);
+
+ return;
+ }
+
+ // Si estamos en edit o delete, solo abrimos el Offcanvas.
+ if (mode === 'edit' || mode === 'delete') {
+ this.clearErrors();
+
+ if(mode === 'edit') {
+ this.focusOnOpen();
+ }
+
+ return;
+ }
+ }, 20);
+ }
+
+ /**
+ * Reabre o fuerza la apertura del Offcanvas si hay errores de validación
+ * o si el modo de Livewire es 'edit' o 'delete'.
+ *
+ * Normalmente se llama cuando hay un dispatch/evento de Livewire,
+ * por ejemplo si el servidor devuelve un error de validación (para mostrarlo)
+ * o si se acaba de cargar un registro para editar o eliminar.
+ *
+ * - Si hay `validationError`, forzamos la reapertura con `toggleOffcanvas(true, true)`
+ * para que se refresque correctamente y el usuario vea los errores.
+ * - Si el modo es 'edit' o 'delete', simplemente mostramos el Offcanvas sin forzar
+ * un refresco de la interfaz.
+ */
+ refresh() {
+ setTimeout(() => {
+ const mode = this.liveWireInstance.get('mode');
+ const successProcess = this.liveWireInstance.get('successProcess');
+ const validationError = this.liveWireInstance.get('validationError');
+
+ // cerramos el Offcanvas.
+ if (successProcess) {
+ this.toggleOffcanvas(false);
+
+ this.resetFormAndState('create');
+
+ return;
+ }
+
+
+ if (validationError) {
+ // Forzamos la reapertura para que se rendericen
+ this.toggleOffcanvas(true, true);
+
+ return;
+ }
+
+ if (mode === 'edit' || mode === 'delete') {
+ // Abrimos el Offcanvas para edición o eliminación
+ this.toggleOffcanvas(true);
+
+ return;
+ }
+ }, 10);
+ }
+
+
+ /**
+ * Prepara la UI del Offcanvas según el modo actual: cambia texto de botones, título,
+ * habilita o deshabilita campos, etc.
+ *
+ * @param {string} mode - Modo actual en Livewire: 'create', 'edit' o 'delete'
+ */
+ prepareOffcanvasUI(mode) {
+ // Configura el texto y estilo de botones
+ this.configureButtons(mode);
+
+ // Ajusta el título del Offcanvas
+ this.configureTitle(mode);
+
+ // Activa o desactiva campos según el modo
+ this.configureReadonlyMode(mode === 'delete');
+ }
+
+ /**
+ * Cierra o muestra el Offcanvas.
+ *
+ * @param {boolean} show - true para mostrar, false para ocultar.
+ * @param {boolean} force - true para forzar el refresco rápido del Offcanvas.
+ */
+ toggleOffcanvas(show = false, force = false) {
+ const instance = this.offcanvasInstance;
+
+ if (!instance) return;
+
+ if (show) {
+ if (force) {
+ // "Force" hace un hide + show para asegurar un nuevo render
+ instance.hide();
+ setTimeout(() => instance.show(), 10);
+
+ } else {
+ instance.show();
+ }
+
+ } else {
+ instance.hide();
+ }
+ }
+
+ /**
+ * Resetea el formulario y el estado en Livewire (modo, id, errores).
+ *
+ * @param {string} targetMode - Modo al que queremos resetear, típicamente 'create'.
+ */
+ resetFormAndState(targetMode) {
+ if (!this.formEl) return;
+
+ // Restablecemos en Livewire
+ this.liveWireInstance.set('successProcess', null, false);
+ this.liveWireInstance.set('validationError', null, false);
+ this.liveWireInstance.set('mode', targetMode, false);
+ this.liveWireInstance.set('id', null, false);
+
+ // Limpiamos el formulario
+ this.formEl.reset();
+ this.clearErrors();
+
+ // Restablecemos valores por defecto del formulario
+ const defaults = this.liveWireInstance.get('defaultValues');
+ if (defaults && typeof defaults === 'object') {
+ Object.entries(defaults).forEach(([key, value]) => {
+ this.liveWireInstance.set(key, value, false);
+ });
+ }
+
+ // Limpiar select2 automáticamente
+ $(this.formEl)
+ .find('select.select2-hidden-accessible')
+ .each(function () {
+ $(this).val(null).trigger('change');
+ });
+
+ // Desactivamos el modo lectura
+ this.configureReadonlyMode(false);
+
+ // Reconfiguramos el Offcanvas UI
+ this.prepareOffcanvasUI(targetMode);
+ }
+
+ /**
+ * Configura el texto y estilo de los botones de submit y reset
+ * según el modo de Livewire.
+ *
+ * @param {string} mode - 'create', 'edit' o 'delete'
+ */
+ configureButtons(mode) {
+ const singularName = this.liveWireInstance.get('singularName');
+
+ // Limpiar clases previas
+ this.submitButtons.forEach(button => {
+ button.classList.remove('btn-danger', 'btn-primary');
+ });
+ this.resetButtons.forEach(button => {
+ button.classList.remove('btn-text-secondary', 'btn-label-secondary');
+ });
+
+ // Configurar botón de submit según el modo
+ this.submitButtons.forEach(button => {
+ switch (mode) {
+ case 'create':
+ button.classList.add('btn-primary');
+ button.textContent = `Crear ${singularName.toLowerCase()}`;
+ break;
+ case 'edit':
+ button.classList.add('btn-primary');
+ button.textContent = `Guardar cambios`;
+ break;
+ case 'delete':
+ button.classList.add('btn-danger');
+ button.textContent = `Eliminar ${singularName.toLowerCase()}`;
+ break;
+ }
+ });
+
+ // Configurar botones de reset según el modo
+ this.resetButtons.forEach(button => {
+ // Cambia la clase dependiendo si se trata de un modo 'delete' o no
+ const buttonClass = (mode === 'delete') ? 'btn-text-secondary' : 'btn-label-secondary';
+ button.classList.add(buttonClass);
+ });
+ }
+
+ /**
+ * Ajusta el título del Offcanvas según el modo y la propiedad configurada en Livewire.
+ *
+ * @param {string} mode - 'create', 'edit' o 'delete'
+ */
+ configureTitle(mode) {
+ if (!this.offcanvasTitleEl) return;
+
+ const capitalizeFirstLetter =(str) => {
+ return str.charAt(0).toUpperCase() + str.slice(1);
+ }
+
+ const singularName = this.liveWireInstance.get('singularName');
+ const columnNameLabel = this.liveWireInstance.get('columnNameLabel');
+ const editName = this.liveWireInstance.get(columnNameLabel);
+
+ switch (mode) {
+ case 'create':
+ this.offcanvasTitleEl.innerHTML = ` ${capitalizeFirstLetter(singularName)} `;
+ break;
+ case 'edit':
+ this.offcanvasTitleEl.innerHTML = `${editName} `;
+ break;
+ case 'delete':
+ this.offcanvasTitleEl.innerHTML = `${editName} `;
+ break;
+ }
+ }
+
+ /**
+ * Configura el modo de solo lectura/edición en los campos del formulario.
+ * Deshabilita inputs y maneja el "readonly" en checkboxes/radios.
+ *
+ * @param {boolean} readOnly - true si queremos modo lectura, false para edición.
+ */
+ configureReadonlyMode(readOnly) {
+ if (!this.formEl) return;
+
+ const inputs = this.formEl.querySelectorAll('input, textarea, select');
+
+ inputs.forEach(el => {
+ // Saltar campos marcados como "data-always-enabled"
+ if (el.hasAttribute('data-always-enabled')) return;
+
+ // Para selects
+ if (el.tagName === 'SELECT') {
+ if ($(el).hasClass('select2-hidden-accessible')) {
+ // Deshabilitar select2
+ $(el).prop('disabled', readOnly).trigger('change.select2');
+ } else {
+ this.toggleSelectReadonly(el, readOnly);
+ }
+ return;
+ }
+
+ // Para checkboxes / radios
+ if (el.type === 'checkbox' || el.type === 'radio') {
+ this.toggleCheckboxReadonly(el, readOnly);
+ return;
+ }
+
+ // Para inputs de texto / textarea
+ el.readOnly = readOnly;
+ });
+ }
+
+ /**
+ * Alterna modo "readonly" en un checkbox/radio simulando la inhabilitación
+ * sin marcarlo como 'disabled' (para mantener su apariencia).
+ *
+ * @param {HTMLElement} checkbox - Elemento checkbox o radio.
+ * @param {boolean} enabled - true si se quiere modo lectura, false en caso contrario.
+ */
+ toggleCheckboxReadonly(checkbox, enabled) {
+ if (enabled) {
+ checkbox.setAttribute('readonly-mode', 'true');
+ checkbox.style.pointerEvents = 'none';
+ checkbox.onclick = function (event) {
+ event.preventDefault();
+ };
+ } else {
+ checkbox.removeAttribute('readonly-mode');
+ checkbox.style.pointerEvents = '';
+ checkbox.onclick = null;
+ }
+ }
+
+ /**
+ * Alterna modo "readonly" para un convencional.
+ *
+ * @param {HTMLElement} select - Elemento select.
+ * @param {boolean} enabled - true si queremos readonly, false si editable.
+ */
+ toggleSelectReadonly(select, enabled) {
+ if (enabled) {
+ select.setAttribute('readonly-mode', 'true');
+ select.style.pointerEvents = 'none';
+ select.tabIndex = -1;
+ } else {
+ select.removeAttribute('readonly-mode');
+ select.style.pointerEvents = '';
+ select.tabIndex = '';
+ }
+ }
+
+ /**
+ * Hace focus en el elemento con el selector dado.
+ */
+ focusOnOpen() {
+ const focusSelector = this.liveWireInstance.get('focusOnOpen'); // Obtiene el selector de Livewire
+
+ if (!focusSelector) return;
+
+ setTimeout(() => {
+ // Buscar el elemento real en el DOM
+ const focusElement = document.getElementById(focusSelector);
+
+ // Si existe, hacer focus
+ if (focusElement) {
+ focusElement.focus();
+ } else {
+ console.warn(`Elemento no encontrado: ${focusSelector}`);
+ }
+ }, 250);
+ }
+
+ /**
+ * Limpia mensajes de error y la clase 'is-invalid' en el formulario.
+ */
+ clearErrors() {
+ if (!this.formEl) return;
+
+ // Remover mensajes de error en texto
+ this.formEl.querySelectorAll('.text-danger').forEach(el => el.remove());
+
+ // Remover la clase 'is-invalid' de los inputs afectados
+ this.formEl.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));
+
+ // Remover las notificaciones
+ this.formEl.querySelectorAll('.notification-container').forEach(el => el.innerHTML = '');
+
+ // Removemos el checkbox de confirmación de eliminar
+ const confirmDeletion = this.formEl.querySelector('.confirm-deletion');
+
+ if (confirmDeletion) {
+ confirmDeletion.remove();
+ }
+ }
+}
+
+// Exponemos la clase en window para acceso global (si fuese necesario)
+window.FormCanvasHelper = FormCanvasHelper;
diff --git a/resources/assets/js/forms/formCustomListener.js b/resources/assets/js/forms/formCustomListener.js
new file mode 100644
index 0000000..644a7d3
--- /dev/null
+++ b/resources/assets/js/forms/formCustomListener.js
@@ -0,0 +1,245 @@
+export default class FormCustomListener {
+ constructor(config = {}) {
+ const defaultConfig = {
+ formSelector: '.form-custom-listener', // Selector para formularios
+ buttonSelectors: [], // Selectores específicos para botones
+ callbacks: [], // Callbacks correspondientes a los botones específicos
+ allowedInputTags: ['INPUT', 'SELECT', 'TEXTAREA'], // Tags permitidos para cambios
+ validationConfig: null, // Nueva propiedad para la configuración de validación
+ dispatchOnSubmit: null // Callback Livewire para disparar al enviar el formulario
+ };
+
+ this.config = { ...defaultConfig, ...config };
+
+ // Aseguramos que los métodos que dependen de `this` estén vinculados al contexto correcto
+ this.defaultButtonHandler = this.defaultButtonHandler.bind(this);
+ this.formValidationInstance = null;
+
+ this.initForms();
+ }
+
+ /**
+ * Inicializa los formularios encontrados en el DOM.
+ */
+ initForms() {
+ const forms = document.querySelectorAll(this.config.formSelector);
+
+ if (forms.length === 0) {
+ console.error(`No se encontraron formularios con el selector ${this.config.formSelector}.`);
+ return;
+ }
+
+ forms.forEach(form => {
+ if (form.dataset.initialized === 'true') {
+ console.warn(`Formulario ya inicializado: ${form}`);
+ return;
+ }
+
+ this.initFormEvents(form);
+
+ // Si se pasó configuración de validación, inicialízala
+ if (this.config.validationConfig) {
+ this.initializeValidation(form);
+ }
+
+ form.dataset.initialized = 'true'; // Marcar formulario como inicializado
+ });
+ }
+
+ /**
+ * Configura los eventos para un formulario individual.
+ * @param {HTMLElement} form - El formulario que será manejado.
+ */
+ initFormEvents(form) {
+ const buttons = this.getButtons(form);
+
+ buttons.forEach(({ button, callback }, index) => {
+ if (button) {
+ button.addEventListener('click', () => {
+ this.handleButtonClick(index, form, buttons, callback);
+ });
+ }
+ });
+
+ form.addEventListener('input', event =>
+ this.handleInputChange(
+ event,
+ form,
+ buttons.map(b => b.button)
+ )
+ );
+ }
+
+ /**
+ * Obtiene los botones y sus callbacks según la configuración.
+ * @param {HTMLElement} form - El formulario del cual obtener botones.
+ * @returns {Array} Array de objetos con { button, callback }.
+ */
+ getButtons(form) {
+ const buttons = [];
+
+ this.config.buttonSelectors.forEach((selector, index) => {
+ const buttonList = Array.from(form.querySelectorAll(selector));
+ const callback = this.config.callbacks[index];
+
+ buttonList.forEach(button => {
+ buttons.push({ button, callback });
+ });
+ });
+
+ return buttons;
+ }
+
+ /**
+ * Maneja los cambios en los campos de entrada.
+ * @param {Event} event - El evento del cambio.
+ * @param {HTMLElement} form - El formulario actual.
+ * @param {HTMLElement[]} buttons - Array de botones en el formulario.
+ */
+ handleInputChange(event, form, buttons) {
+ const target = event.target;
+
+ if (['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)) {
+ this.toggleButtonsState(buttons, true);
+ }
+ }
+
+ /**
+ * Maneja el clic en un botón específico.
+ * @param {number} index - Índice del botón.
+ * @param {HTMLElement} form - El formulario actual.
+ * @param {Array} buttons - Array de objetos { button, callback }.
+ * @param {function|null} callback - Callback definido para el botón.
+ */
+ handleButtonClick(index, form, buttons, callback) {
+ if (typeof callback === 'function') {
+ callback(
+ form,
+ buttons[index].button,
+ buttons.map(b => b.button)
+ );
+ } else {
+ this.defaultButtonHandler(
+ form,
+ buttons[index].button,
+ buttons.map(b => b.button)
+ );
+ }
+ }
+
+ /**
+ * Maneja la acción cuando el formulario es válido.
+ * Este método puede ser sobreescrito para personalizar el comportamiento.
+ */
+ handleFormValid(form) {
+ // Ejecutar callback opcional (si lo proporcionaste)
+ if (typeof this.config.handleValidForm === 'function') {
+ this.config.handleValidForm(form);
+ } else if (this.config.dispatchOnSubmit) {
+ this.handleValidForm(form);
+ } else {
+ form.submit();
+ }
+ }
+
+ /**
+ * Método que maneja la acción cuando el formulario es válido.
+ * Al ser un método de la clase, no necesitamos usar bind.
+ */
+ handleValidForm(form) {
+ const saveButton = form.querySelector('#save_website_button');
+ const allButtons = Array.from(form.querySelectorAll('.btn'));
+
+ this.toggleButtonsState(allButtons, false); // Deshabilitar todos los botones
+ this.toggleFormFields(form, false); // Deshabilitar todos los campos del formulario
+ this.setButtonLoadingState(saveButton, true); // Poner en estado de carga al botón anfitrión
+
+ // Enviar la solicitud de Livewire correspondiente al enviar el formulario
+ Livewire.dispatch(this.config.dispatchOnSubmit);
+ }
+
+ /**
+ * Manejador por defecto para los botones.
+ * @param {HTMLElement} form - El formulario actual.
+ * @param {HTMLElement} hostButton - El botón anfitrión que disparó el evento.
+ * @param {HTMLElement[]} allButtons - Todos los botones relevantes del formulario.
+ */
+ defaultButtonHandler(form, hostButton, allButtons) {
+ this.toggleButtonsState(allButtons, false); // Deshabilitar todos los botones
+ this.toggleFormFields(form, false); // Deshabilitar todos los campos del formulario
+ this.setButtonLoadingState(hostButton, true); // Poner en estado de carga al botón anfitrión
+ }
+
+ /**
+ * Deshabilita o habilita los campos del formulario.
+ * @param {HTMLElement} form - El formulario actual.
+ * @param {boolean} isEnabled - Si los campos deben habilitarse.
+ */
+ toggleFormFields(form, isEnabled) {
+ form.querySelectorAll('input, select, textarea').forEach(field => {
+ field.disabled = !isEnabled;
+ });
+ }
+
+ /**
+ * Habilita o deshabilita los botones.
+ * @param {HTMLElement[]} buttons - Array de botones.
+ * @param {boolean} isEnabled - Si los botones deben habilitarse.
+ */
+ toggleButtonsState(buttons, isEnabled) {
+ buttons.forEach(button => {
+ if (button) button.disabled = !isEnabled;
+ });
+ }
+
+ /**
+ * Cambia el estado de carga de un botón.
+ * @param {HTMLElement} button - Botón que se manejará.
+ * @param {boolean} isLoading - Si el botón está en estado de carga.
+ */
+ setButtonLoadingState(button, isLoading) {
+ if (!button) return;
+
+ const loadingText = button.getAttribute('data-loading-text');
+ if (loadingText && isLoading) {
+ button.setAttribute('data-original-text', button.innerHTML);
+ button.innerHTML = loadingText;
+ button.disabled = true;
+ } else if (!isLoading) {
+ button.innerHTML = button.getAttribute('data-original-text') || button.innerHTML;
+ button.disabled = false;
+ }
+ }
+
+ /**
+ * Inicializa la validación del formulario con la configuración proporcionada.
+ * @param {HTMLElement} form - El formulario que va a ser validado.
+ */
+ initializeValidation(form) {
+ if (this.config.validationConfig) {
+ this.formValidationInstance = FormValidation.formValidation(form, this.config.validationConfig).on(
+ 'core.form.valid',
+ () => this.handleFormValid(form)
+ );
+ }
+ }
+
+ reloadValidation() {
+ const form = document.querySelector(this.config.formSelector);
+
+ // Verificar si el formulario existe y si la validación está inicializada
+ if (form && this.formValidationInstance) {
+ try {
+ // En lugar de destruir la validación, simplemente reiniciamos la validación.
+ this.formValidationInstance.resetForm(); // Resetear el formulario, limpiando los errores
+
+ // Reinicializar la validación con la configuración actual
+ this.initializeValidation(form);
+ } catch (error) {
+ console.error('Error al reiniciar la validación:', error);
+ }
+ } else {
+ console.warn('Formulario no encontrado o instancia de validación no disponible.');
+ }
+ }
+}
diff --git a/resources/assets/js/layout/quicklinks-navbar.js b/resources/assets/js/layout/quicklinks-navbar.js
new file mode 100644
index 0000000..1fd95cb
--- /dev/null
+++ b/resources/assets/js/layout/quicklinks-navbar.js
@@ -0,0 +1,56 @@
+/**
+ * Quicklinks Navbar
+ */
+
+'use strict';
+
+$(function () {
+ // Navbar Quicklinks with autosuggest (typeahead)
+ const $dropdownShortcuts = $('.dropdown-shortcuts'),
+ $dropdownShortcutsAdd = $('.dropdown-shortcuts-add'),
+ $dropdownShortcutsRemove = $('.dropdown-shortcuts-remove');
+
+ const route = document.documentElement.getAttribute('data-route');
+
+ if ($dropdownShortcuts.length) {
+ $dropdownShortcutsAdd.on('click', function () {
+ $.ajax({
+ url: quicklinksUpdateUrl,
+ method: 'POST',
+ data: {
+ action: 'update',
+ route: route
+ },
+ headers: {
+ 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
+ },
+ success: function (response) {
+ location.reload();
+ },
+ error: function (xhr) {
+ console.error(xhr.responseJSON.message);
+ }
+ });
+ });
+
+ $dropdownShortcutsRemove.on('click', function () {
+ $.ajax({
+ url: quicklinksUpdateUrl,
+ method: 'POST',
+ data: {
+ action: 'remove',
+ route: route
+ },
+ headers: {
+ 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
+ },
+ success: function (response) {
+ location.reload();
+ },
+ error: function (xhr) {
+ console.error(xhr.responseJSON.message);
+ }
+ });
+ });
+ }
+});
diff --git a/resources/assets/js/layout/search-navbar.js b/resources/assets/js/layout/search-navbar.js
new file mode 100644
index 0000000..7eb2085
--- /dev/null
+++ b/resources/assets/js/layout/search-navbar.js
@@ -0,0 +1,201 @@
+/**
+ * Search Navbar
+ */
+
+'use strict';
+
+$(function () {
+ window.Helpers.initSidebarToggle();
+ // Toggle Universal Sidebar
+
+ // Navbar Search with autosuggest (typeahead)
+ var searchToggler = $('.search-toggler'),
+ searchInputWrapper = $('.search-input-wrapper'),
+ searchInput = $('.search-input'),
+ contentBackdrop = $('.content-backdrop');
+
+ // Open search input on click of search icon
+ if (searchToggler.length) {
+ searchToggler.on('click', function () {
+ if (searchInputWrapper.length) {
+ searchInputWrapper.toggleClass('d-none');
+ searchInput.trigger('focus');
+ }
+ });
+
+ document.addEventListener('keydown', function (event) {
+ const ctrlKey = event.ctrlKey;
+ const slashKey = event.key === '/'; // Usa 'key' para obtener la tecla como texto
+
+ if (ctrlKey && slashKey) {
+ const searchInputWrapper = document.querySelector('.search-input-wrapper');
+ const searchInput = document.querySelector('.search-input');
+
+ if (searchInputWrapper) {
+ searchInputWrapper.classList.toggle('d-none'); // Alterna la visibilidad
+ if (searchInput) {
+ searchInput.focus(); // Coloca el foco en el input
+ }
+ }
+ }
+ });
+
+ // Note: Following code is required to update container class of typeahead dropdown width on focus of search input. setTimeout is required to allow time to initiate Typeahead UI.
+ setTimeout(function () {
+ var twitterTypeahead = $('.twitter-typeahead');
+
+ searchInput.on('focus', function () {
+ if (searchInputWrapper.hasClass('container-xxl')) {
+ searchInputWrapper.find(twitterTypeahead).addClass('container-xxl');
+ twitterTypeahead.removeClass('container-fluid');
+ } else if (searchInputWrapper.hasClass('container-fluid')) {
+ searchInputWrapper.find(twitterTypeahead).addClass('container-fluid');
+ twitterTypeahead.removeClass('container-xxl');
+ }
+ });
+ }, 10);
+ }
+
+ if (searchInput.length) {
+ // Función para normalizar cadenas (eliminar acentos)
+ function normalizeString(str) {
+ return str
+ .normalize('NFD')
+ .replace(/[\u0300-\u036f]/g, '')
+ .toLowerCase();
+ }
+
+ // Filter config con soporte para ignorar acentos
+ var filterConfig = function (data) {
+ return function findMatches(q, cb) {
+ let matches = [];
+
+ // Normalizar la consulta
+ const normalizedQuery = normalizeString(q);
+
+ data.filter(function (i) {
+ const normalizedName = normalizeString(i.name);
+
+ if (normalizedName.startsWith(normalizedQuery)) {
+ matches.push(i);
+ } else if (
+ !normalizedName.startsWith(normalizedQuery) &&
+ normalizedName.includes(normalizedQuery)
+ ) {
+ matches.push(i);
+
+ // Ordenar por coincidencia secundaria
+ matches.sort(function (a, b) {
+ return b.name < a.name ? 1 : -1;
+ });
+ }
+ });
+
+ cb(matches);
+ };
+ };
+
+ // Search JSON
+ var searchJson = 'search-navbar'; // For vertical layout
+
+ if ($('#layout-menu').hasClass('menu-horizontal')) {
+ var searchJson = 'search-navbar'; // For vertical layout
+ }
+
+ // Search API AJAX call
+ var searchData = $.ajax({
+ url: assetsPath + '../../admin/' + searchJson, //? Use your own search api instead
+ dataType: 'json',
+ async: false
+ }).responseJSON;
+
+ // Init typeahead on searchInput
+ searchInput.each(function () {
+ var $this = $(this);
+
+ searchInput
+ .typeahead(
+ {
+ hint: false,
+ classNames: {
+ menu: 'tt-menu navbar-search-suggestion',
+ cursor: 'active',
+ suggestion: 'suggestion d-flex justify-content-between px-4 py-2 w-100'
+ }
+ },
+ // Páginas
+ {
+ name: 'pages',
+ display: 'name',
+ limit: 8,
+ source: filterConfig(searchData.pages),
+ templates: {
+ header: '',
+ suggestion: function ({ url, icon, name }) {
+ return (
+ '' +
+ '' +
+ ' ' +
+ '' +
+ name +
+ ' ' +
+ '
' +
+ ' '
+ );
+ },
+ notFound:
+ '' +
+ '' +
+ '
No se encontro resultados
' +
+ '
'
+ }
+ }
+ )
+ //On typeahead result render.
+ .on('typeahead:render', function () {
+ // Show content backdrop,
+ contentBackdrop.addClass('show').removeClass('fade');
+ })
+ // On typeahead select
+ .on('typeahead:select', function (ev, suggestion) {
+ // Open selected page
+ if (suggestion.url !== 'javascript:;') window.location = suggestion.url;
+ })
+ // On typeahead close
+ .on('typeahead:close', function () {
+ // Clear search
+ searchInput.val('');
+ $this.typeahead('val', '');
+
+ // Hide search input wrapper
+ searchInputWrapper.addClass('d-none');
+
+ // Fade content backdrop
+ contentBackdrop.addClass('fade').removeClass('show');
+ });
+
+ // On searchInput keyup, Fade content backdrop if search input is blank
+ searchInput.on('keyup', function () {
+ if (searchInput.val() == '') contentBackdrop.addClass('fade').removeClass('show');
+ });
+ });
+
+ // Init PerfectScrollbar in search result
+ var psSearch;
+
+ $('.navbar-search-suggestion').each(function () {
+ psSearch = new PerfectScrollbar($(this)[0], {
+ wheelPropagation: false,
+ suppressScrollX: true
+ });
+ });
+
+ searchInput.on('keyup', function () {
+ psSearch.update();
+ });
+ }
+});
diff --git a/resources/assets/js/main.js b/resources/assets/js/main.js
new file mode 100644
index 0000000..25da9e3
--- /dev/null
+++ b/resources/assets/js/main.js
@@ -0,0 +1,375 @@
+import './layout/quicklinks-navbar.js';
+import './layout/search-navbar.js';
+
+('use strict');
+
+window.isRtl = window.Helpers.isRtl();
+window.isDarkStyle = window.Helpers.isDarkStyle();
+
+let menu,
+ animate,
+ isHorizontalLayout = false;
+
+if (document.getElementById('layout-menu')) {
+ isHorizontalLayout = document.getElementById('layout-menu').classList.contains('menu-horizontal');
+}
+
+(function () {
+ setTimeout(function () {
+ window.Helpers.initCustomOptionCheck();
+ }, 1000);
+
+ if (typeof Waves !== 'undefined') {
+ Waves.init();
+ Waves.attach(
+ ".btn[class*='btn-']:not(.position-relative):not([class*='btn-outline-']):not([class*='btn-label-'])",
+ ['waves-light']
+ );
+ Waves.attach("[class*='btn-outline-']:not(.position-relative)");
+ Waves.attach("[class*='btn-label-']:not(.position-relative)");
+ Waves.attach('.pagination .page-item .page-link');
+ Waves.attach('.dropdown-menu .dropdown-item');
+ Waves.attach('.light-style .list-group .list-group-item-action');
+ Waves.attach('.dark-style .list-group .list-group-item-action', ['waves-light']);
+ Waves.attach('.nav-tabs:not(.nav-tabs-widget) .nav-item .nav-link');
+ Waves.attach('.nav-pills .nav-item .nav-link', ['waves-light']);
+ }
+
+ // Initialize menu
+ //-----------------
+
+ let layoutMenuEl = document.querySelectorAll('#layout-menu');
+ layoutMenuEl.forEach(function (element) {
+ menu = new Menu(element, {
+ orientation: isHorizontalLayout ? 'horizontal' : 'vertical',
+ closeChildren: isHorizontalLayout ? true : false,
+ // ? This option only works with Horizontal menu
+ showDropdownOnHover: localStorage.getItem('templateCustomizer-' + templateName + '--ShowDropdownOnHover') // If value(showDropdownOnHover) is set in local storage
+ ? localStorage.getItem('templateCustomizer-' + templateName + '--ShowDropdownOnHover') === 'true' // Use the local storage value
+ : window.templateCustomizer !== undefined // If value is set in config.js
+ ? window.templateCustomizer.settings.defaultShowDropdownOnHover // Use the config.js value
+ : true // Use this if you are not using the config.js and want to set value directly from here
+ });
+ // Change parameter to true if you want scroll animation
+ window.Helpers.scrollToActive((animate = false));
+ window.Helpers.mainMenu = menu;
+ });
+
+ // Initialize menu togglers and bind click on each
+ let menuToggler = document.querySelectorAll('.layout-menu-toggle');
+ menuToggler.forEach(item => {
+ item.addEventListener('click', event => {
+ event.preventDefault();
+ window.Helpers.toggleCollapsed();
+ // Enable menu state with local storage support if enableMenuLocalStorage = true from config.js
+ if (config.enableMenuLocalStorage && !window.Helpers.isSmallScreen()) {
+ try {
+ localStorage.setItem(
+ 'templateCustomizer-' + templateName + '--LayoutCollapsed',
+ String(window.Helpers.isCollapsed())
+ );
+ // Update customizer checkbox state on click of menu toggler
+ let layoutCollapsedCustomizerOptions = document.querySelector(
+ '.template-customizer-layouts-options'
+ );
+ if (layoutCollapsedCustomizerOptions) {
+ let layoutCollapsedVal = window.Helpers.isCollapsed() ? 'collapsed' : 'expanded';
+ layoutCollapsedCustomizerOptions.querySelector(`input[value="${layoutCollapsedVal}"]`).click();
+ }
+ } catch (e) {}
+ }
+ });
+ });
+
+ // Menu swipe gesture
+
+ // Detect swipe gesture on the target element and call swipe In
+ window.Helpers.swipeIn('.drag-target', function (e) {
+ window.Helpers.setCollapsed(false);
+ });
+
+ // Detect swipe gesture on the target element and call swipe Out
+ window.Helpers.swipeOut('#layout-menu', function (e) {
+ if (window.Helpers.isSmallScreen()) window.Helpers.setCollapsed(true);
+ });
+
+ // Display in main menu when menu scrolls
+ let menuInnerContainer = document.getElementsByClassName('menu-inner'),
+ menuInnerShadow = document.getElementsByClassName('menu-inner-shadow')[0];
+ if (menuInnerContainer.length > 0 && menuInnerShadow) {
+ menuInnerContainer[0].addEventListener('ps-scroll-y', function () {
+ if (this.querySelector('.ps__thumb-y').offsetTop) {
+ menuInnerShadow.style.display = 'block';
+ } else {
+ menuInnerShadow.style.display = 'none';
+ }
+ });
+ }
+
+ // Update light/dark image based on current style
+ function switchImage(style) {
+ if (style === 'system') {
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ style = 'dark';
+ } else {
+ style = 'light';
+ }
+ }
+ const switchImagesList = [].slice.call(document.querySelectorAll('[data-app-' + style + '-img]'));
+ switchImagesList.map(function (imageEl) {
+ const setImage = imageEl.getAttribute('data-app-' + style + '-img');
+ imageEl.src = baseUrl + 'vendor/vuexy-admin/img/' + setImage; // Using window.assetsPath to get the exact relative path
+ });
+ }
+
+ //Style Switcher (Light/Dark/System Mode)
+ let styleSwitcher = document.querySelector('.dropdown-style-switcher');
+
+ // Active class on style switcher dropdown items
+ const activeStyle = document.documentElement.getAttribute('data-style');
+
+ // Get style from local storage or use 'system' as default
+ let storedStyle =
+ localStorage.getItem('templateCustomizer-' + templateName + '--Style') || //if no template style then use Customizer style
+ (window.templateCustomizer?.settings?.defaultStyle ?? 'light'); //!if there is no Customizer then use default style as light
+
+ // Set style on click of style switcher item if template customizer is enabled
+ if (window.templateCustomizer && styleSwitcher) {
+ let styleSwitcherItems = [].slice.call(styleSwitcher.children[1].querySelectorAll('.dropdown-item'));
+ styleSwitcherItems.forEach(function (item) {
+ item.classList.remove('active');
+ item.addEventListener('click', function () {
+ let currentStyle = this.getAttribute('data-theme');
+ if (currentStyle === 'light') {
+ window.templateCustomizer.setStyle('light');
+ } else if (currentStyle === 'dark') {
+ window.templateCustomizer.setStyle('dark');
+ } else {
+ window.templateCustomizer.setStyle('system');
+ }
+ });
+
+ if (item.getAttribute('data-theme') === activeStyle) {
+ // Add 'active' class to the item if it matches the activeStyle
+ item.classList.add('active');
+ }
+ });
+
+ // Update style switcher icon based on the stored style
+
+ const styleSwitcherIcon = styleSwitcher.querySelector('i');
+
+ if (storedStyle === 'light') {
+ styleSwitcherIcon.classList.add('ti-sun');
+ new bootstrap.Tooltip(styleSwitcherIcon, {
+ title: 'Light Mode',
+ fallbackPlacements: ['bottom']
+ });
+ } else if (storedStyle === 'dark') {
+ styleSwitcherIcon.classList.add('ti-moon-stars');
+ new bootstrap.Tooltip(styleSwitcherIcon, {
+ title: 'Dark Mode',
+ fallbackPlacements: ['bottom']
+ });
+ } else {
+ styleSwitcherIcon.classList.add('ti-device-desktop-analytics');
+ new bootstrap.Tooltip(styleSwitcherIcon, {
+ title: 'System Mode',
+ fallbackPlacements: ['bottom']
+ });
+ }
+ }
+
+ // Run switchImage function based on the stored style
+ switchImage(storedStyle);
+
+ let languageDropdown = document.getElementsByClassName('dropdown-language');
+
+ if (languageDropdown.length) {
+ let dropdownItems = languageDropdown[0].querySelectorAll('.dropdown-item');
+ const dropdownActiveItem = languageDropdown[0].querySelector('.dropdown-item.active');
+
+ directionChange(dropdownActiveItem.dataset.textDirection);
+
+ for (let i = 0; i < dropdownItems.length; i++) {
+ dropdownItems[i].addEventListener('click', function () {
+ let textDirection = this.getAttribute('data-text-direction');
+ window.templateCustomizer.setLang(this.getAttribute('data-language'));
+ directionChange(textDirection);
+ });
+ }
+ function directionChange(textDirection) {
+ if (textDirection === 'rtl') {
+ if (localStorage.getItem('templateCustomizer-' + templateName + '--Rtl') !== 'true')
+ window.templateCustomizer ? window.templateCustomizer.setRtl(true) : '';
+ } else {
+ if (localStorage.getItem('templateCustomizer-' + templateName + '--Rtl') === 'true')
+ window.templateCustomizer ? window.templateCustomizer.setRtl(false) : '';
+ }
+ }
+ }
+
+ // add on click javascript for template customizer reset button id template-customizer-reset-btn
+
+ setTimeout(function () {
+ let templateCustomizerResetBtn = document.querySelector('.template-customizer-reset-btn');
+ if (templateCustomizerResetBtn) {
+ templateCustomizerResetBtn.onclick = function () {
+ window.location.href = baseUrl + 'lang/en';
+ };
+ }
+ }, 1500);
+
+ // Notification
+ // ------------
+ const notificationMarkAsReadAll = document.querySelector('.dropdown-notifications-all');
+ const notificationMarkAsReadList = document.querySelectorAll('.dropdown-notifications-read');
+
+ // Notification: Mark as all as read
+ if (notificationMarkAsReadAll) {
+ notificationMarkAsReadAll.addEventListener('click', event => {
+ notificationMarkAsReadList.forEach(item => {
+ item.closest('.dropdown-notifications-item').classList.add('marked-as-read');
+ });
+ });
+ }
+ // Notification: Mark as read/unread onclick of dot
+ if (notificationMarkAsReadList) {
+ notificationMarkAsReadList.forEach(item => {
+ item.addEventListener('click', event => {
+ item.closest('.dropdown-notifications-item').classList.toggle('marked-as-read');
+ });
+ });
+ }
+
+ // Notification: Mark as read/unread onclick of dot
+ const notificationArchiveMessageList = document.querySelectorAll('.dropdown-notifications-archive');
+ notificationArchiveMessageList.forEach(item => {
+ item.addEventListener('click', event => {
+ item.closest('.dropdown-notifications-item').remove();
+ });
+ });
+
+ // Init helpers & misc
+ // --------------------
+
+ // Init BS Tooltip
+ const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
+ tooltipTriggerList.map(function (tooltipTriggerEl) {
+ return new bootstrap.Tooltip(tooltipTriggerEl);
+ });
+
+ // Accordion active class
+ const accordionActiveFunction = function (e) {
+ if (e.type == 'show.bs.collapse' || e.type == 'show.bs.collapse') {
+ e.target.closest('.accordion-item').classList.add('active');
+ } else {
+ e.target.closest('.accordion-item').classList.remove('active');
+ }
+ };
+
+ const accordionTriggerList = [].slice.call(document.querySelectorAll('.accordion'));
+ const accordionList = accordionTriggerList.map(function (accordionTriggerEl) {
+ accordionTriggerEl.addEventListener('show.bs.collapse', accordionActiveFunction);
+ accordionTriggerEl.addEventListener('hide.bs.collapse', accordionActiveFunction);
+ });
+
+ // If layout is RTL add .dropdown-menu-end class to .dropdown-menu
+ // if (isRtl) {
+ // Helpers._addClass('dropdown-menu-end', document.querySelectorAll('#layout-navbar .dropdown-menu'));
+ // }
+
+ // Auto update layout based on screen size
+ window.Helpers.setAutoUpdate(true);
+
+ // Toggle Password Visibility
+ window.Helpers.initPasswordToggle();
+
+ // Speech To Text
+ window.Helpers.initSpeechToText();
+
+ // Init PerfectScrollbar in Navbar Dropdown (i.e notification)
+ window.Helpers.initNavbarDropdownScrollbar();
+
+ let horizontalMenuTemplate = document.querySelector("[data-template^='horizontal-menu']");
+ if (horizontalMenuTemplate) {
+ // if screen size is small then set navbar fixed
+ if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
+ window.Helpers.setNavbarFixed('fixed');
+ } else {
+ window.Helpers.setNavbarFixed('');
+ }
+ }
+
+ // On window resize listener
+ // -------------------------
+ document.addEventListener(
+ 'resize',
+ function (event) {
+ // Hide open search input and set value blank
+ if (window.innerWidth >= window.Helpers.LAYOUT_BREAKPOINT) {
+ if (document.querySelector('.search-input-wrapper')) {
+ document.querySelector('.search-input-wrapper').classList.add('d-none');
+ document.querySelector('.search-input').value = '';
+ }
+ }
+ // Horizontal Layout : Update menu based on window size
+ if (horizontalMenuTemplate) {
+ // if screen size is small then set navbar fixed
+ if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
+ window.Helpers.setNavbarFixed('fixed');
+ } else {
+ window.Helpers.setNavbarFixed('');
+ }
+ setTimeout(function () {
+ if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
+ if (document.getElementById('layout-menu')) {
+ if (document.getElementById('layout-menu').classList.contains('menu-horizontal')) {
+ menu.switchMenu('vertical');
+ }
+ }
+ } else {
+ if (document.getElementById('layout-menu')) {
+ if (document.getElementById('layout-menu').classList.contains('menu-vertical')) {
+ menu.switchMenu('horizontal');
+ }
+ }
+ }
+ }, 100);
+ }
+ },
+ true
+ );
+
+ // Manage menu expanded/collapsed with templateCustomizer & local storage
+ //------------------------------------------------------------------
+
+ // If current layout is horizontal OR current window screen is small (overlay menu) than return from here
+ if (isHorizontalLayout || window.Helpers.isSmallScreen()) {
+ return;
+ }
+
+ // If current layout is vertical and current window screen is > small
+
+ // Auto update menu collapsed/expanded based on the themeConfig
+ if (typeof TemplateCustomizer !== 'undefined') {
+ if (window.templateCustomizer.settings.defaultMenuCollapsed) {
+ window.Helpers.setCollapsed(true, false);
+ } else {
+ window.Helpers.setCollapsed(false, false);
+ }
+ }
+
+ // Manage menu expanded/collapsed state with local storage support If enableMenuLocalStorage = true in config.js
+ if (typeof config !== 'undefined') {
+ if (config.enableMenuLocalStorage) {
+ try {
+ if (localStorage.getItem('templateCustomizer-' + templateName + '--LayoutCollapsed') !== null)
+ window.Helpers.setCollapsed(
+ localStorage.getItem('templateCustomizer-' + templateName + '--LayoutCollapsed') === 'true',
+ false
+ );
+ } catch (e) {}
+ }
+ }
+})();
diff --git a/resources/assets/js/maps/LeafletMapHelper.js b/resources/assets/js/maps/LeafletMapHelper.js
new file mode 100644
index 0000000..4821267
--- /dev/null
+++ b/resources/assets/js/maps/LeafletMapHelper.js
@@ -0,0 +1,133 @@
+import './../../vendor/libs/leaflet/leaflet'
+
+export const LeafletMapHelper = (() => {
+ let mapInstance, markerInstance;
+
+ const DEFAULT_COORDS = [19.4326, -99.1332]; // Coordenadas de CDMX por defecto
+
+ // Valida coordenadas
+ const isValidCoordinate = (lat, lng) => {
+ return lat && !isNaN(lat) && lat >= -90 && lat <= 90 && lat !== 0 &&
+ lng && !isNaN(lng) && lng >= -180 && lng <= 180 && lng !== 0;
+ };
+
+ // Crea opciones del mapa según el modo
+ const getMapOptions = (mode) => ({
+ scrollWheelZoom: mode !== 'delete',
+ dragging: mode !== 'delete',
+ doubleClickZoom: mode !== 'delete',
+ boxZoom: mode !== 'delete',
+ keyboard: mode !== 'delete',
+ zoomControl: mode !== 'delete',
+ touchZoom: mode !== 'delete'
+ });
+
+ // Destruir el mapa existente
+ const destroyMap = () => {
+ if (mapInstance) {
+ mapInstance.off();
+ mapInstance.remove();
+ mapInstance = null;
+ }
+ removeMarker();
+ };
+
+ // Crear marcador en el mapa
+ const createMarker = (lat, lng, draggable = false, onDragEnd) => {
+ if (isValidCoordinate(lat, lng)) {
+ markerInstance = L.marker([lat, lng], { draggable }).addTo(mapInstance)
+ .bindPopup('Ubicación seleccionada ').openPopup();
+
+ if (draggable && onDragEnd) {
+ markerInstance.on('dragend', (e) => {
+ const { lat, lng } = e.target.getLatLng();
+ onDragEnd(lat, lng);
+ });
+ }
+ }
+ };
+
+ // Eliminar marcador
+ const removeMarker = () => {
+ if (markerInstance) {
+ markerInstance.remove();
+ markerInstance = null;
+ }
+ };
+
+ // Actualizar coordenadas en formulario
+ const updateCoordinates = (lat, lng, latSelector, lngSelector, livewireInstance) => {
+ const latInput = document.querySelector(latSelector);
+ const lngInput = document.querySelector(lngSelector);
+
+ if (!latInput || !lngInput) {
+ console.warn(`⚠️ No se encontró el elemento del DOM para latitud (${latSelector}) o longitud (${lngSelector})`);
+ return;
+ }
+
+ latInput.value = lat ? lat.toFixed(6) : '';
+ lngInput.value = lng ? lng.toFixed(6) : '';
+
+ if (livewireInstance) {
+ livewireInstance.lat = lat ? lat.toFixed(6) : null;
+ livewireInstance.lng = lng ? lng.toFixed(6) : null;
+ }
+ };
+
+ // Inicializar el mapa
+ const initializeMap = (locationInputs, mode = 'create', livewireInstance = null) => {
+ const mapElement = document.getElementById(locationInputs.mapId);
+
+ if (!mapElement) {
+ console.error(`❌ No se encontró el contenedor del mapa con ID: ${locationInputs.mapId}`);
+ return;
+ }
+
+ let latElement = document.querySelector(locationInputs.lat);
+ let lngElement = document.querySelector(locationInputs.lng);
+
+ if (!latElement || !lngElement) {
+ console.error(`❌ No se encontraron los campos de latitud (${locationInputs.lat}) o longitud (${locationInputs.lng})`);
+ return;
+ }
+
+ let lat = parseFloat(latElement.value);
+ let lng = parseFloat(lngElement.value);
+
+ const mapCoords = isValidCoordinate(lat, lng) ? [lat, lng] : DEFAULT_COORDS;
+ const zoomLevel = isValidCoordinate(lat, lng) ? 16 : 13;
+
+ if (mapInstance) destroyMap();
+
+ mapInstance = L.map(locationInputs.mapId, getMapOptions(mode)).setView(mapCoords, zoomLevel);
+ L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(mapInstance);
+
+ if (mode !== 'create') createMarker(lat, lng, mode === 'edit', (lat, lng) => updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance));
+
+ if (mode !== 'delete') {
+ mapInstance.on('click', (e) => {
+ const { lat, lng } = e.latlng;
+ removeMarker();
+ createMarker(lat, lng, true, (lat, lng) => updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance));
+ updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance);
+ });
+ }
+
+ /*
+ const btnClearElement = document.querySelector(locationInputs.btnClear);
+
+ if(!btnClearElement){
+ console.error(`❌ No se encontró el botón de limpiar con ID: ${locationInputs.btnClear}`);return;
+ }
+ */
+ };
+
+ return {
+ initializeMap,
+ clearCoordinates: () => {
+ removeMarker();
+ },
+ };
+})();
+
+window.LeafletMapHelper = LeafletMapHelper;
diff --git a/resources/assets/js/maps/LocationIQSearchHelper.js b/resources/assets/js/maps/LocationIQSearchHelper.js
new file mode 100644
index 0000000..18941d3
--- /dev/null
+++ b/resources/assets/js/maps/LocationIQSearchHelper.js
@@ -0,0 +1,12 @@
+export class LocationIQSearchHelper {
+ constructor(apiKey) {
+ this.apiKey = apiKey;
+ this.baseUrl = 'https://us1.locationiq.com/v1/search.php';
+ }
+
+ async searchAddress(query) {
+ const response = await fetch(`${this.baseUrl}?key=${this.apiKey}&q=${query}&format=json`);
+ if (!response.ok) throw new Error('Error al buscar la dirección');
+ return await response.json();
+ }
+}
diff --git a/resources/assets/js/notifications/LivewireNotification.js b/resources/assets/js/notifications/LivewireNotification.js
new file mode 100644
index 0000000..1a87713
--- /dev/null
+++ b/resources/assets/js/notifications/LivewireNotification.js
@@ -0,0 +1,207 @@
+export default class LivewireNotification {
+ constructor(config = {}) {
+ const defaultConfig = {
+ delay: 9000, // Tiempo predeterminado para las notificaciones
+ onNotificationShown: null, // Callback al mostrar una notificación
+ onNotificationRemoved: null, // Callback al eliminar una notificación
+ onNotificationClosed: null // Callback al cerrar una notificación mediante botón
+ };
+
+ this.config = { ...defaultConfig, ...config };
+ this.initLivewireNotification();
+ }
+
+ /**
+ * Inicializa la escucha de notificaciones desde Livewire.
+ */
+ initLivewireNotification() {
+ // Mostrar notificación almacenada después de la recarga
+ const storedNotification = localStorage.getItem('pendingNotification');
+
+ if (storedNotification) {
+ const event = JSON.parse(storedNotification);
+ this.showStoredNotification(event);
+ localStorage.removeItem('pendingNotification'); // Limpiar después de mostrar
+ }
+
+ // Escuchar nuevas notificaciones desde Livewire
+ Livewire.on('notification', event => {
+ if (event.deferReload) {
+ // Guardar la notificación en localStorage para mostrar después de la recarga
+ localStorage.setItem('pendingNotification', JSON.stringify(event));
+
+ window.location.reload();
+ } else {
+ // Mostrar la notificación inmediatamente
+ this.showNotification(event);
+ }
+ });
+
+ // Escuchar evento personalizado para almacenar la notificación en localStorage
+ document.addEventListener('store-notification', (event) => {
+ const notification = {
+ type: event.detail.type || 'info',
+ message: event.detail.message || 'Notificación',
+ delay: event.detail.delay || 5000,
+ target: event.detail.target || 'body'
+ };
+ localStorage.setItem('pendingNotification', JSON.stringify(notification));
+ });
+ }
+
+ /**
+ * Método para emitir notificaciones desde JavaScript.
+ * @param {Object} options - Opciones de la notificación.
+ * @param {Function} callback - Callback opcional que se ejecutará después de mostrar la notificación.
+ * @param {number} customTimeout - Timeout personalizado (opcional).
+ */
+ emitNotification(options, callback, customTimeout) {
+ const event = {
+ target: options.target || 'body',
+ message: options.message || 'Notificación',
+ type: options.type || 'info',
+ deferReload: options.deferReload || false,
+ delay: customTimeout || options.delay || this.config.delay // Usar el timeout personalizado o el predeterminado
+ };
+
+ // Mostrar la notificación
+ this.showNotification(event);
+
+ // Ejecutar callback si está definido
+ if (typeof callback === 'function') {
+ callback(event);
+ }
+ }
+
+ /**
+ * Muestra una notificación almacenada.
+ * @param {Object} event - Datos del evento de notificación.
+ */
+ showStoredNotification(event) {
+ this.showNotification(event);
+ }
+
+ /**
+ * Muestra una notificación.
+ * @param {Object} event - Datos del evento de notificación.
+ */
+ showNotification(event) {
+ setTimeout(() => {
+ const targetElement = document.querySelector(event.target);
+
+ if (!targetElement) {
+ console.error(`Target ${event.target} no encontrado. Mostrando en el contenedor global.`);
+
+ this.showInGlobalContainer(event);
+ return;
+ }
+
+ // Crear un contenedor para notificaciones si no existe
+ if (!targetElement.querySelector('.notification-container')) {
+ const container = document.createElement('div');
+
+ container.className = 'notification-container';
+ targetElement.appendChild(container);
+ }
+
+ const notificationContainer = targetElement.querySelector('.notification-container');
+ const notificationElement = this.renderNotification(notificationContainer, event);
+
+ // Callback opcional al mostrar la notificación
+ if (typeof this.config.onNotificationShown === 'function') {
+ this.config.onNotificationShown(notificationElement, event);
+ }
+
+ // Configurar el timeout para eliminar la notificación
+ this.setdelay(notificationElement, event);
+
+ // Configurar el evento para el botón de cierre
+ this.setupCloseButton(notificationElement, event);
+ }, 5);
+ }
+
+ /**
+ * Renderiza una notificación en el contenedor global (body).
+ * @param {Object} event - Datos del evento de notificación.
+ */
+ showInGlobalContainer(event) {
+ const globalContainer = document.body;
+ if (!globalContainer.querySelector('.notification-container')) {
+ const container = document.createElement('div');
+
+ container.className = 'notification-container';
+ globalContainer.appendChild(container);
+ }
+
+ const notificationContainer = globalContainer.querySelector('.notification-container');
+ const notificationElement = this.renderNotification(notificationContainer, event);
+
+ if (typeof this.config.onNotificationShown === 'function') {
+ this.config.onNotificationShown(notificationElement, event);
+ }
+
+ this.setdelay(notificationElement, event);
+ this.setupCloseButton(notificationElement, event);
+ }
+
+ /**
+ * Renderiza una notificación en el contenedor.
+ * @param {HTMLElement} container - Contenedor de notificaciones.
+ * @param {Object} event - Evento de notificación con tipo y mensaje.
+ * @returns {HTMLElement} - Elemento de la notificación recién creada.
+ */
+ renderNotification(container, event) {
+ const notificationElement = document.createElement('div');
+
+ notificationElement.className = `alert alert-${event.type} alert-dismissible fade show`;
+ notificationElement.role = 'alert';
+ notificationElement.innerHTML = `${event.message} `;
+
+ container.appendChild(notificationElement);
+
+ return notificationElement;
+ }
+
+ /**
+ * Configura un timeout para limpiar una notificación específica.
+ * @param {HTMLElement} notificationElement - Elemento de la notificación.
+ * @param {Object} event - Evento asociado a la notificación.
+ */
+ setdelay(notificationElement, event) {
+ const timeout = event.delay || this.config.delay;
+
+ setTimeout(() => {
+ if (notificationElement && notificationElement.parentElement) {
+ notificationElement.remove();
+
+ // Callback opcional al eliminar la notificación
+ if (typeof this.config.onNotificationRemoved === 'function') {
+ this.config.onNotificationRemoved(notificationElement, event);
+ }
+ }
+ }, timeout);
+ }
+
+ /**
+ * Configura el cierre manual de una notificación mediante el botón "Cerrar".
+ * @param {HTMLElement} notificationElement - Elemento de la notificación.
+ * @param {Object} event - Evento asociado a la notificación.
+ */
+ setupCloseButton(notificationElement, event) {
+ const closeButton = notificationElement.querySelector('.btn-close');
+ if (closeButton) {
+ closeButton.addEventListener('click', () => {
+ notificationElement.remove();
+
+ // Callback opcional al cerrar la notificación manualmente
+ if (typeof this.config.onNotificationClosed === 'function') {
+ this.config.onNotificationClosed(notificationElement, event);
+ }
+ });
+ }
+ }
+}
+
+if(!window.livewireNotification) {
+ window.livewireNotification = new LivewireNotification();
+}
diff --git a/resources/assets/vendor/fonts/bootstrap-icons.scss b/resources/assets/vendor/fonts/bootstrap-icons.scss
new file mode 100644
index 0000000..209e8cf
--- /dev/null
+++ b/resources/assets/vendor/fonts/bootstrap-icons.scss
@@ -0,0 +1,2090 @@
+/*!
+ * Bootstrap Icons v1.11.3 (https://icons.getbootstrap.com/)
+ * Copyright 2019-2024 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE)
+ */
+
+$bootstrap-icons-font: "bootstrap-icons" !default;
+$bootstrap-icons-font-dir: "bootstrap-icons" !default;
+$bootstrap-icons-font-file: "#{$bootstrap-icons-font-dir}/#{$bootstrap-icons-font}" !default;
+$bootstrap-icons-font-hash: "24e3eb84d0bcaf83d77f904c78ac1f47" !default;
+$bootstrap-icons-font-src: url("#{$bootstrap-icons-font-file}.woff2?#{$bootstrap-icons-font-hash}") format("woff2"),
+ url("#{$bootstrap-icons-font-file}.woff?#{$bootstrap-icons-font-hash}") format("woff") !default;
+
+@font-face {
+ font-display: block;
+ font-family: $bootstrap-icons-font;
+ src: $bootstrap-icons-font-src;
+}
+
+.bi::before,
+[class^="bi-"]::before,
+[class*=" bi-"]::before {
+ display: inline-block;
+ font-family: $bootstrap-icons-font !important;
+ font-style: normal;
+ font-weight: normal !important;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ vertical-align: -.125em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+$bootstrap-icons-map: (
+ "123": "\f67f",
+ "alarm-fill": "\f101",
+ "alarm": "\f102",
+ "align-bottom": "\f103",
+ "align-center": "\f104",
+ "align-end": "\f105",
+ "align-middle": "\f106",
+ "align-start": "\f107",
+ "align-top": "\f108",
+ "alt": "\f109",
+ "app-indicator": "\f10a",
+ "app": "\f10b",
+ "archive-fill": "\f10c",
+ "archive": "\f10d",
+ "arrow-90deg-down": "\f10e",
+ "arrow-90deg-left": "\f10f",
+ "arrow-90deg-right": "\f110",
+ "arrow-90deg-up": "\f111",
+ "arrow-bar-down": "\f112",
+ "arrow-bar-left": "\f113",
+ "arrow-bar-right": "\f114",
+ "arrow-bar-up": "\f115",
+ "arrow-clockwise": "\f116",
+ "arrow-counterclockwise": "\f117",
+ "arrow-down-circle-fill": "\f118",
+ "arrow-down-circle": "\f119",
+ "arrow-down-left-circle-fill": "\f11a",
+ "arrow-down-left-circle": "\f11b",
+ "arrow-down-left-square-fill": "\f11c",
+ "arrow-down-left-square": "\f11d",
+ "arrow-down-left": "\f11e",
+ "arrow-down-right-circle-fill": "\f11f",
+ "arrow-down-right-circle": "\f120",
+ "arrow-down-right-square-fill": "\f121",
+ "arrow-down-right-square": "\f122",
+ "arrow-down-right": "\f123",
+ "arrow-down-short": "\f124",
+ "arrow-down-square-fill": "\f125",
+ "arrow-down-square": "\f126",
+ "arrow-down-up": "\f127",
+ "arrow-down": "\f128",
+ "arrow-left-circle-fill": "\f129",
+ "arrow-left-circle": "\f12a",
+ "arrow-left-right": "\f12b",
+ "arrow-left-short": "\f12c",
+ "arrow-left-square-fill": "\f12d",
+ "arrow-left-square": "\f12e",
+ "arrow-left": "\f12f",
+ "arrow-repeat": "\f130",
+ "arrow-return-left": "\f131",
+ "arrow-return-right": "\f132",
+ "arrow-right-circle-fill": "\f133",
+ "arrow-right-circle": "\f134",
+ "arrow-right-short": "\f135",
+ "arrow-right-square-fill": "\f136",
+ "arrow-right-square": "\f137",
+ "arrow-right": "\f138",
+ "arrow-up-circle-fill": "\f139",
+ "arrow-up-circle": "\f13a",
+ "arrow-up-left-circle-fill": "\f13b",
+ "arrow-up-left-circle": "\f13c",
+ "arrow-up-left-square-fill": "\f13d",
+ "arrow-up-left-square": "\f13e",
+ "arrow-up-left": "\f13f",
+ "arrow-up-right-circle-fill": "\f140",
+ "arrow-up-right-circle": "\f141",
+ "arrow-up-right-square-fill": "\f142",
+ "arrow-up-right-square": "\f143",
+ "arrow-up-right": "\f144",
+ "arrow-up-short": "\f145",
+ "arrow-up-square-fill": "\f146",
+ "arrow-up-square": "\f147",
+ "arrow-up": "\f148",
+ "arrows-angle-contract": "\f149",
+ "arrows-angle-expand": "\f14a",
+ "arrows-collapse": "\f14b",
+ "arrows-expand": "\f14c",
+ "arrows-fullscreen": "\f14d",
+ "arrows-move": "\f14e",
+ "aspect-ratio-fill": "\f14f",
+ "aspect-ratio": "\f150",
+ "asterisk": "\f151",
+ "at": "\f152",
+ "award-fill": "\f153",
+ "award": "\f154",
+ "back": "\f155",
+ "backspace-fill": "\f156",
+ "backspace-reverse-fill": "\f157",
+ "backspace-reverse": "\f158",
+ "backspace": "\f159",
+ "badge-3d-fill": "\f15a",
+ "badge-3d": "\f15b",
+ "badge-4k-fill": "\f15c",
+ "badge-4k": "\f15d",
+ "badge-8k-fill": "\f15e",
+ "badge-8k": "\f15f",
+ "badge-ad-fill": "\f160",
+ "badge-ad": "\f161",
+ "badge-ar-fill": "\f162",
+ "badge-ar": "\f163",
+ "badge-cc-fill": "\f164",
+ "badge-cc": "\f165",
+ "badge-hd-fill": "\f166",
+ "badge-hd": "\f167",
+ "badge-tm-fill": "\f168",
+ "badge-tm": "\f169",
+ "badge-vo-fill": "\f16a",
+ "badge-vo": "\f16b",
+ "badge-vr-fill": "\f16c",
+ "badge-vr": "\f16d",
+ "badge-wc-fill": "\f16e",
+ "badge-wc": "\f16f",
+ "bag-check-fill": "\f170",
+ "bag-check": "\f171",
+ "bag-dash-fill": "\f172",
+ "bag-dash": "\f173",
+ "bag-fill": "\f174",
+ "bag-plus-fill": "\f175",
+ "bag-plus": "\f176",
+ "bag-x-fill": "\f177",
+ "bag-x": "\f178",
+ "bag": "\f179",
+ "bar-chart-fill": "\f17a",
+ "bar-chart-line-fill": "\f17b",
+ "bar-chart-line": "\f17c",
+ "bar-chart-steps": "\f17d",
+ "bar-chart": "\f17e",
+ "basket-fill": "\f17f",
+ "basket": "\f180",
+ "basket2-fill": "\f181",
+ "basket2": "\f182",
+ "basket3-fill": "\f183",
+ "basket3": "\f184",
+ "battery-charging": "\f185",
+ "battery-full": "\f186",
+ "battery-half": "\f187",
+ "battery": "\f188",
+ "bell-fill": "\f189",
+ "bell": "\f18a",
+ "bezier": "\f18b",
+ "bezier2": "\f18c",
+ "bicycle": "\f18d",
+ "binoculars-fill": "\f18e",
+ "binoculars": "\f18f",
+ "blockquote-left": "\f190",
+ "blockquote-right": "\f191",
+ "book-fill": "\f192",
+ "book-half": "\f193",
+ "book": "\f194",
+ "bookmark-check-fill": "\f195",
+ "bookmark-check": "\f196",
+ "bookmark-dash-fill": "\f197",
+ "bookmark-dash": "\f198",
+ "bookmark-fill": "\f199",
+ "bookmark-heart-fill": "\f19a",
+ "bookmark-heart": "\f19b",
+ "bookmark-plus-fill": "\f19c",
+ "bookmark-plus": "\f19d",
+ "bookmark-star-fill": "\f19e",
+ "bookmark-star": "\f19f",
+ "bookmark-x-fill": "\f1a0",
+ "bookmark-x": "\f1a1",
+ "bookmark": "\f1a2",
+ "bookmarks-fill": "\f1a3",
+ "bookmarks": "\f1a4",
+ "bookshelf": "\f1a5",
+ "bootstrap-fill": "\f1a6",
+ "bootstrap-reboot": "\f1a7",
+ "bootstrap": "\f1a8",
+ "border-all": "\f1a9",
+ "border-bottom": "\f1aa",
+ "border-center": "\f1ab",
+ "border-inner": "\f1ac",
+ "border-left": "\f1ad",
+ "border-middle": "\f1ae",
+ "border-outer": "\f1af",
+ "border-right": "\f1b0",
+ "border-style": "\f1b1",
+ "border-top": "\f1b2",
+ "border-width": "\f1b3",
+ "border": "\f1b4",
+ "bounding-box-circles": "\f1b5",
+ "bounding-box": "\f1b6",
+ "box-arrow-down-left": "\f1b7",
+ "box-arrow-down-right": "\f1b8",
+ "box-arrow-down": "\f1b9",
+ "box-arrow-in-down-left": "\f1ba",
+ "box-arrow-in-down-right": "\f1bb",
+ "box-arrow-in-down": "\f1bc",
+ "box-arrow-in-left": "\f1bd",
+ "box-arrow-in-right": "\f1be",
+ "box-arrow-in-up-left": "\f1bf",
+ "box-arrow-in-up-right": "\f1c0",
+ "box-arrow-in-up": "\f1c1",
+ "box-arrow-left": "\f1c2",
+ "box-arrow-right": "\f1c3",
+ "box-arrow-up-left": "\f1c4",
+ "box-arrow-up-right": "\f1c5",
+ "box-arrow-up": "\f1c6",
+ "box-seam": "\f1c7",
+ "box": "\f1c8",
+ "braces": "\f1c9",
+ "bricks": "\f1ca",
+ "briefcase-fill": "\f1cb",
+ "briefcase": "\f1cc",
+ "brightness-alt-high-fill": "\f1cd",
+ "brightness-alt-high": "\f1ce",
+ "brightness-alt-low-fill": "\f1cf",
+ "brightness-alt-low": "\f1d0",
+ "brightness-high-fill": "\f1d1",
+ "brightness-high": "\f1d2",
+ "brightness-low-fill": "\f1d3",
+ "brightness-low": "\f1d4",
+ "broadcast-pin": "\f1d5",
+ "broadcast": "\f1d6",
+ "brush-fill": "\f1d7",
+ "brush": "\f1d8",
+ "bucket-fill": "\f1d9",
+ "bucket": "\f1da",
+ "bug-fill": "\f1db",
+ "bug": "\f1dc",
+ "building": "\f1dd",
+ "bullseye": "\f1de",
+ "calculator-fill": "\f1df",
+ "calculator": "\f1e0",
+ "calendar-check-fill": "\f1e1",
+ "calendar-check": "\f1e2",
+ "calendar-date-fill": "\f1e3",
+ "calendar-date": "\f1e4",
+ "calendar-day-fill": "\f1e5",
+ "calendar-day": "\f1e6",
+ "calendar-event-fill": "\f1e7",
+ "calendar-event": "\f1e8",
+ "calendar-fill": "\f1e9",
+ "calendar-minus-fill": "\f1ea",
+ "calendar-minus": "\f1eb",
+ "calendar-month-fill": "\f1ec",
+ "calendar-month": "\f1ed",
+ "calendar-plus-fill": "\f1ee",
+ "calendar-plus": "\f1ef",
+ "calendar-range-fill": "\f1f0",
+ "calendar-range": "\f1f1",
+ "calendar-week-fill": "\f1f2",
+ "calendar-week": "\f1f3",
+ "calendar-x-fill": "\f1f4",
+ "calendar-x": "\f1f5",
+ "calendar": "\f1f6",
+ "calendar2-check-fill": "\f1f7",
+ "calendar2-check": "\f1f8",
+ "calendar2-date-fill": "\f1f9",
+ "calendar2-date": "\f1fa",
+ "calendar2-day-fill": "\f1fb",
+ "calendar2-day": "\f1fc",
+ "calendar2-event-fill": "\f1fd",
+ "calendar2-event": "\f1fe",
+ "calendar2-fill": "\f1ff",
+ "calendar2-minus-fill": "\f200",
+ "calendar2-minus": "\f201",
+ "calendar2-month-fill": "\f202",
+ "calendar2-month": "\f203",
+ "calendar2-plus-fill": "\f204",
+ "calendar2-plus": "\f205",
+ "calendar2-range-fill": "\f206",
+ "calendar2-range": "\f207",
+ "calendar2-week-fill": "\f208",
+ "calendar2-week": "\f209",
+ "calendar2-x-fill": "\f20a",
+ "calendar2-x": "\f20b",
+ "calendar2": "\f20c",
+ "calendar3-event-fill": "\f20d",
+ "calendar3-event": "\f20e",
+ "calendar3-fill": "\f20f",
+ "calendar3-range-fill": "\f210",
+ "calendar3-range": "\f211",
+ "calendar3-week-fill": "\f212",
+ "calendar3-week": "\f213",
+ "calendar3": "\f214",
+ "calendar4-event": "\f215",
+ "calendar4-range": "\f216",
+ "calendar4-week": "\f217",
+ "calendar4": "\f218",
+ "camera-fill": "\f219",
+ "camera-reels-fill": "\f21a",
+ "camera-reels": "\f21b",
+ "camera-video-fill": "\f21c",
+ "camera-video-off-fill": "\f21d",
+ "camera-video-off": "\f21e",
+ "camera-video": "\f21f",
+ "camera": "\f220",
+ "camera2": "\f221",
+ "capslock-fill": "\f222",
+ "capslock": "\f223",
+ "card-checklist": "\f224",
+ "card-heading": "\f225",
+ "card-image": "\f226",
+ "card-list": "\f227",
+ "card-text": "\f228",
+ "caret-down-fill": "\f229",
+ "caret-down-square-fill": "\f22a",
+ "caret-down-square": "\f22b",
+ "caret-down": "\f22c",
+ "caret-left-fill": "\f22d",
+ "caret-left-square-fill": "\f22e",
+ "caret-left-square": "\f22f",
+ "caret-left": "\f230",
+ "caret-right-fill": "\f231",
+ "caret-right-square-fill": "\f232",
+ "caret-right-square": "\f233",
+ "caret-right": "\f234",
+ "caret-up-fill": "\f235",
+ "caret-up-square-fill": "\f236",
+ "caret-up-square": "\f237",
+ "caret-up": "\f238",
+ "cart-check-fill": "\f239",
+ "cart-check": "\f23a",
+ "cart-dash-fill": "\f23b",
+ "cart-dash": "\f23c",
+ "cart-fill": "\f23d",
+ "cart-plus-fill": "\f23e",
+ "cart-plus": "\f23f",
+ "cart-x-fill": "\f240",
+ "cart-x": "\f241",
+ "cart": "\f242",
+ "cart2": "\f243",
+ "cart3": "\f244",
+ "cart4": "\f245",
+ "cash-stack": "\f246",
+ "cash": "\f247",
+ "cast": "\f248",
+ "chat-dots-fill": "\f249",
+ "chat-dots": "\f24a",
+ "chat-fill": "\f24b",
+ "chat-left-dots-fill": "\f24c",
+ "chat-left-dots": "\f24d",
+ "chat-left-fill": "\f24e",
+ "chat-left-quote-fill": "\f24f",
+ "chat-left-quote": "\f250",
+ "chat-left-text-fill": "\f251",
+ "chat-left-text": "\f252",
+ "chat-left": "\f253",
+ "chat-quote-fill": "\f254",
+ "chat-quote": "\f255",
+ "chat-right-dots-fill": "\f256",
+ "chat-right-dots": "\f257",
+ "chat-right-fill": "\f258",
+ "chat-right-quote-fill": "\f259",
+ "chat-right-quote": "\f25a",
+ "chat-right-text-fill": "\f25b",
+ "chat-right-text": "\f25c",
+ "chat-right": "\f25d",
+ "chat-square-dots-fill": "\f25e",
+ "chat-square-dots": "\f25f",
+ "chat-square-fill": "\f260",
+ "chat-square-quote-fill": "\f261",
+ "chat-square-quote": "\f262",
+ "chat-square-text-fill": "\f263",
+ "chat-square-text": "\f264",
+ "chat-square": "\f265",
+ "chat-text-fill": "\f266",
+ "chat-text": "\f267",
+ "chat": "\f268",
+ "check-all": "\f269",
+ "check-circle-fill": "\f26a",
+ "check-circle": "\f26b",
+ "check-square-fill": "\f26c",
+ "check-square": "\f26d",
+ "check": "\f26e",
+ "check2-all": "\f26f",
+ "check2-circle": "\f270",
+ "check2-square": "\f271",
+ "check2": "\f272",
+ "chevron-bar-contract": "\f273",
+ "chevron-bar-down": "\f274",
+ "chevron-bar-expand": "\f275",
+ "chevron-bar-left": "\f276",
+ "chevron-bar-right": "\f277",
+ "chevron-bar-up": "\f278",
+ "chevron-compact-down": "\f279",
+ "chevron-compact-left": "\f27a",
+ "chevron-compact-right": "\f27b",
+ "chevron-compact-up": "\f27c",
+ "chevron-contract": "\f27d",
+ "chevron-double-down": "\f27e",
+ "chevron-double-left": "\f27f",
+ "chevron-double-right": "\f280",
+ "chevron-double-up": "\f281",
+ "chevron-down": "\f282",
+ "chevron-expand": "\f283",
+ "chevron-left": "\f284",
+ "chevron-right": "\f285",
+ "chevron-up": "\f286",
+ "circle-fill": "\f287",
+ "circle-half": "\f288",
+ "circle-square": "\f289",
+ "circle": "\f28a",
+ "clipboard-check": "\f28b",
+ "clipboard-data": "\f28c",
+ "clipboard-minus": "\f28d",
+ "clipboard-plus": "\f28e",
+ "clipboard-x": "\f28f",
+ "clipboard": "\f290",
+ "clock-fill": "\f291",
+ "clock-history": "\f292",
+ "clock": "\f293",
+ "cloud-arrow-down-fill": "\f294",
+ "cloud-arrow-down": "\f295",
+ "cloud-arrow-up-fill": "\f296",
+ "cloud-arrow-up": "\f297",
+ "cloud-check-fill": "\f298",
+ "cloud-check": "\f299",
+ "cloud-download-fill": "\f29a",
+ "cloud-download": "\f29b",
+ "cloud-drizzle-fill": "\f29c",
+ "cloud-drizzle": "\f29d",
+ "cloud-fill": "\f29e",
+ "cloud-fog-fill": "\f29f",
+ "cloud-fog": "\f2a0",
+ "cloud-fog2-fill": "\f2a1",
+ "cloud-fog2": "\f2a2",
+ "cloud-hail-fill": "\f2a3",
+ "cloud-hail": "\f2a4",
+ "cloud-haze-fill": "\f2a6",
+ "cloud-haze": "\f2a7",
+ "cloud-haze2-fill": "\f2a8",
+ "cloud-lightning-fill": "\f2a9",
+ "cloud-lightning-rain-fill": "\f2aa",
+ "cloud-lightning-rain": "\f2ab",
+ "cloud-lightning": "\f2ac",
+ "cloud-minus-fill": "\f2ad",
+ "cloud-minus": "\f2ae",
+ "cloud-moon-fill": "\f2af",
+ "cloud-moon": "\f2b0",
+ "cloud-plus-fill": "\f2b1",
+ "cloud-plus": "\f2b2",
+ "cloud-rain-fill": "\f2b3",
+ "cloud-rain-heavy-fill": "\f2b4",
+ "cloud-rain-heavy": "\f2b5",
+ "cloud-rain": "\f2b6",
+ "cloud-slash-fill": "\f2b7",
+ "cloud-slash": "\f2b8",
+ "cloud-sleet-fill": "\f2b9",
+ "cloud-sleet": "\f2ba",
+ "cloud-snow-fill": "\f2bb",
+ "cloud-snow": "\f2bc",
+ "cloud-sun-fill": "\f2bd",
+ "cloud-sun": "\f2be",
+ "cloud-upload-fill": "\f2bf",
+ "cloud-upload": "\f2c0",
+ "cloud": "\f2c1",
+ "clouds-fill": "\f2c2",
+ "clouds": "\f2c3",
+ "cloudy-fill": "\f2c4",
+ "cloudy": "\f2c5",
+ "code-slash": "\f2c6",
+ "code-square": "\f2c7",
+ "code": "\f2c8",
+ "collection-fill": "\f2c9",
+ "collection-play-fill": "\f2ca",
+ "collection-play": "\f2cb",
+ "collection": "\f2cc",
+ "columns-gap": "\f2cd",
+ "columns": "\f2ce",
+ "command": "\f2cf",
+ "compass-fill": "\f2d0",
+ "compass": "\f2d1",
+ "cone-striped": "\f2d2",
+ "cone": "\f2d3",
+ "controller": "\f2d4",
+ "cpu-fill": "\f2d5",
+ "cpu": "\f2d6",
+ "credit-card-2-back-fill": "\f2d7",
+ "credit-card-2-back": "\f2d8",
+ "credit-card-2-front-fill": "\f2d9",
+ "credit-card-2-front": "\f2da",
+ "credit-card-fill": "\f2db",
+ "credit-card": "\f2dc",
+ "crop": "\f2dd",
+ "cup-fill": "\f2de",
+ "cup-straw": "\f2df",
+ "cup": "\f2e0",
+ "cursor-fill": "\f2e1",
+ "cursor-text": "\f2e2",
+ "cursor": "\f2e3",
+ "dash-circle-dotted": "\f2e4",
+ "dash-circle-fill": "\f2e5",
+ "dash-circle": "\f2e6",
+ "dash-square-dotted": "\f2e7",
+ "dash-square-fill": "\f2e8",
+ "dash-square": "\f2e9",
+ "dash": "\f2ea",
+ "diagram-2-fill": "\f2eb",
+ "diagram-2": "\f2ec",
+ "diagram-3-fill": "\f2ed",
+ "diagram-3": "\f2ee",
+ "diamond-fill": "\f2ef",
+ "diamond-half": "\f2f0",
+ "diamond": "\f2f1",
+ "dice-1-fill": "\f2f2",
+ "dice-1": "\f2f3",
+ "dice-2-fill": "\f2f4",
+ "dice-2": "\f2f5",
+ "dice-3-fill": "\f2f6",
+ "dice-3": "\f2f7",
+ "dice-4-fill": "\f2f8",
+ "dice-4": "\f2f9",
+ "dice-5-fill": "\f2fa",
+ "dice-5": "\f2fb",
+ "dice-6-fill": "\f2fc",
+ "dice-6": "\f2fd",
+ "disc-fill": "\f2fe",
+ "disc": "\f2ff",
+ "discord": "\f300",
+ "display-fill": "\f301",
+ "display": "\f302",
+ "distribute-horizontal": "\f303",
+ "distribute-vertical": "\f304",
+ "door-closed-fill": "\f305",
+ "door-closed": "\f306",
+ "door-open-fill": "\f307",
+ "door-open": "\f308",
+ "dot": "\f309",
+ "download": "\f30a",
+ "droplet-fill": "\f30b",
+ "droplet-half": "\f30c",
+ "droplet": "\f30d",
+ "earbuds": "\f30e",
+ "easel-fill": "\f30f",
+ "easel": "\f310",
+ "egg-fill": "\f311",
+ "egg-fried": "\f312",
+ "egg": "\f313",
+ "eject-fill": "\f314",
+ "eject": "\f315",
+ "emoji-angry-fill": "\f316",
+ "emoji-angry": "\f317",
+ "emoji-dizzy-fill": "\f318",
+ "emoji-dizzy": "\f319",
+ "emoji-expressionless-fill": "\f31a",
+ "emoji-expressionless": "\f31b",
+ "emoji-frown-fill": "\f31c",
+ "emoji-frown": "\f31d",
+ "emoji-heart-eyes-fill": "\f31e",
+ "emoji-heart-eyes": "\f31f",
+ "emoji-laughing-fill": "\f320",
+ "emoji-laughing": "\f321",
+ "emoji-neutral-fill": "\f322",
+ "emoji-neutral": "\f323",
+ "emoji-smile-fill": "\f324",
+ "emoji-smile-upside-down-fill": "\f325",
+ "emoji-smile-upside-down": "\f326",
+ "emoji-smile": "\f327",
+ "emoji-sunglasses-fill": "\f328",
+ "emoji-sunglasses": "\f329",
+ "emoji-wink-fill": "\f32a",
+ "emoji-wink": "\f32b",
+ "envelope-fill": "\f32c",
+ "envelope-open-fill": "\f32d",
+ "envelope-open": "\f32e",
+ "envelope": "\f32f",
+ "eraser-fill": "\f330",
+ "eraser": "\f331",
+ "exclamation-circle-fill": "\f332",
+ "exclamation-circle": "\f333",
+ "exclamation-diamond-fill": "\f334",
+ "exclamation-diamond": "\f335",
+ "exclamation-octagon-fill": "\f336",
+ "exclamation-octagon": "\f337",
+ "exclamation-square-fill": "\f338",
+ "exclamation-square": "\f339",
+ "exclamation-triangle-fill": "\f33a",
+ "exclamation-triangle": "\f33b",
+ "exclamation": "\f33c",
+ "exclude": "\f33d",
+ "eye-fill": "\f33e",
+ "eye-slash-fill": "\f33f",
+ "eye-slash": "\f340",
+ "eye": "\f341",
+ "eyedropper": "\f342",
+ "eyeglasses": "\f343",
+ "facebook": "\f344",
+ "file-arrow-down-fill": "\f345",
+ "file-arrow-down": "\f346",
+ "file-arrow-up-fill": "\f347",
+ "file-arrow-up": "\f348",
+ "file-bar-graph-fill": "\f349",
+ "file-bar-graph": "\f34a",
+ "file-binary-fill": "\f34b",
+ "file-binary": "\f34c",
+ "file-break-fill": "\f34d",
+ "file-break": "\f34e",
+ "file-check-fill": "\f34f",
+ "file-check": "\f350",
+ "file-code-fill": "\f351",
+ "file-code": "\f352",
+ "file-diff-fill": "\f353",
+ "file-diff": "\f354",
+ "file-earmark-arrow-down-fill": "\f355",
+ "file-earmark-arrow-down": "\f356",
+ "file-earmark-arrow-up-fill": "\f357",
+ "file-earmark-arrow-up": "\f358",
+ "file-earmark-bar-graph-fill": "\f359",
+ "file-earmark-bar-graph": "\f35a",
+ "file-earmark-binary-fill": "\f35b",
+ "file-earmark-binary": "\f35c",
+ "file-earmark-break-fill": "\f35d",
+ "file-earmark-break": "\f35e",
+ "file-earmark-check-fill": "\f35f",
+ "file-earmark-check": "\f360",
+ "file-earmark-code-fill": "\f361",
+ "file-earmark-code": "\f362",
+ "file-earmark-diff-fill": "\f363",
+ "file-earmark-diff": "\f364",
+ "file-earmark-easel-fill": "\f365",
+ "file-earmark-easel": "\f366",
+ "file-earmark-excel-fill": "\f367",
+ "file-earmark-excel": "\f368",
+ "file-earmark-fill": "\f369",
+ "file-earmark-font-fill": "\f36a",
+ "file-earmark-font": "\f36b",
+ "file-earmark-image-fill": "\f36c",
+ "file-earmark-image": "\f36d",
+ "file-earmark-lock-fill": "\f36e",
+ "file-earmark-lock": "\f36f",
+ "file-earmark-lock2-fill": "\f370",
+ "file-earmark-lock2": "\f371",
+ "file-earmark-medical-fill": "\f372",
+ "file-earmark-medical": "\f373",
+ "file-earmark-minus-fill": "\f374",
+ "file-earmark-minus": "\f375",
+ "file-earmark-music-fill": "\f376",
+ "file-earmark-music": "\f377",
+ "file-earmark-person-fill": "\f378",
+ "file-earmark-person": "\f379",
+ "file-earmark-play-fill": "\f37a",
+ "file-earmark-play": "\f37b",
+ "file-earmark-plus-fill": "\f37c",
+ "file-earmark-plus": "\f37d",
+ "file-earmark-post-fill": "\f37e",
+ "file-earmark-post": "\f37f",
+ "file-earmark-ppt-fill": "\f380",
+ "file-earmark-ppt": "\f381",
+ "file-earmark-richtext-fill": "\f382",
+ "file-earmark-richtext": "\f383",
+ "file-earmark-ruled-fill": "\f384",
+ "file-earmark-ruled": "\f385",
+ "file-earmark-slides-fill": "\f386",
+ "file-earmark-slides": "\f387",
+ "file-earmark-spreadsheet-fill": "\f388",
+ "file-earmark-spreadsheet": "\f389",
+ "file-earmark-text-fill": "\f38a",
+ "file-earmark-text": "\f38b",
+ "file-earmark-word-fill": "\f38c",
+ "file-earmark-word": "\f38d",
+ "file-earmark-x-fill": "\f38e",
+ "file-earmark-x": "\f38f",
+ "file-earmark-zip-fill": "\f390",
+ "file-earmark-zip": "\f391",
+ "file-earmark": "\f392",
+ "file-easel-fill": "\f393",
+ "file-easel": "\f394",
+ "file-excel-fill": "\f395",
+ "file-excel": "\f396",
+ "file-fill": "\f397",
+ "file-font-fill": "\f398",
+ "file-font": "\f399",
+ "file-image-fill": "\f39a",
+ "file-image": "\f39b",
+ "file-lock-fill": "\f39c",
+ "file-lock": "\f39d",
+ "file-lock2-fill": "\f39e",
+ "file-lock2": "\f39f",
+ "file-medical-fill": "\f3a0",
+ "file-medical": "\f3a1",
+ "file-minus-fill": "\f3a2",
+ "file-minus": "\f3a3",
+ "file-music-fill": "\f3a4",
+ "file-music": "\f3a5",
+ "file-person-fill": "\f3a6",
+ "file-person": "\f3a7",
+ "file-play-fill": "\f3a8",
+ "file-play": "\f3a9",
+ "file-plus-fill": "\f3aa",
+ "file-plus": "\f3ab",
+ "file-post-fill": "\f3ac",
+ "file-post": "\f3ad",
+ "file-ppt-fill": "\f3ae",
+ "file-ppt": "\f3af",
+ "file-richtext-fill": "\f3b0",
+ "file-richtext": "\f3b1",
+ "file-ruled-fill": "\f3b2",
+ "file-ruled": "\f3b3",
+ "file-slides-fill": "\f3b4",
+ "file-slides": "\f3b5",
+ "file-spreadsheet-fill": "\f3b6",
+ "file-spreadsheet": "\f3b7",
+ "file-text-fill": "\f3b8",
+ "file-text": "\f3b9",
+ "file-word-fill": "\f3ba",
+ "file-word": "\f3bb",
+ "file-x-fill": "\f3bc",
+ "file-x": "\f3bd",
+ "file-zip-fill": "\f3be",
+ "file-zip": "\f3bf",
+ "file": "\f3c0",
+ "files-alt": "\f3c1",
+ "files": "\f3c2",
+ "film": "\f3c3",
+ "filter-circle-fill": "\f3c4",
+ "filter-circle": "\f3c5",
+ "filter-left": "\f3c6",
+ "filter-right": "\f3c7",
+ "filter-square-fill": "\f3c8",
+ "filter-square": "\f3c9",
+ "filter": "\f3ca",
+ "flag-fill": "\f3cb",
+ "flag": "\f3cc",
+ "flower1": "\f3cd",
+ "flower2": "\f3ce",
+ "flower3": "\f3cf",
+ "folder-check": "\f3d0",
+ "folder-fill": "\f3d1",
+ "folder-minus": "\f3d2",
+ "folder-plus": "\f3d3",
+ "folder-symlink-fill": "\f3d4",
+ "folder-symlink": "\f3d5",
+ "folder-x": "\f3d6",
+ "folder": "\f3d7",
+ "folder2-open": "\f3d8",
+ "folder2": "\f3d9",
+ "fonts": "\f3da",
+ "forward-fill": "\f3db",
+ "forward": "\f3dc",
+ "front": "\f3dd",
+ "fullscreen-exit": "\f3de",
+ "fullscreen": "\f3df",
+ "funnel-fill": "\f3e0",
+ "funnel": "\f3e1",
+ "gear-fill": "\f3e2",
+ "gear-wide-connected": "\f3e3",
+ "gear-wide": "\f3e4",
+ "gear": "\f3e5",
+ "gem": "\f3e6",
+ "geo-alt-fill": "\f3e7",
+ "geo-alt": "\f3e8",
+ "geo-fill": "\f3e9",
+ "geo": "\f3ea",
+ "gift-fill": "\f3eb",
+ "gift": "\f3ec",
+ "github": "\f3ed",
+ "globe": "\f3ee",
+ "globe2": "\f3ef",
+ "google": "\f3f0",
+ "graph-down": "\f3f1",
+ "graph-up": "\f3f2",
+ "grid-1x2-fill": "\f3f3",
+ "grid-1x2": "\f3f4",
+ "grid-3x2-gap-fill": "\f3f5",
+ "grid-3x2-gap": "\f3f6",
+ "grid-3x2": "\f3f7",
+ "grid-3x3-gap-fill": "\f3f8",
+ "grid-3x3-gap": "\f3f9",
+ "grid-3x3": "\f3fa",
+ "grid-fill": "\f3fb",
+ "grid": "\f3fc",
+ "grip-horizontal": "\f3fd",
+ "grip-vertical": "\f3fe",
+ "hammer": "\f3ff",
+ "hand-index-fill": "\f400",
+ "hand-index-thumb-fill": "\f401",
+ "hand-index-thumb": "\f402",
+ "hand-index": "\f403",
+ "hand-thumbs-down-fill": "\f404",
+ "hand-thumbs-down": "\f405",
+ "hand-thumbs-up-fill": "\f406",
+ "hand-thumbs-up": "\f407",
+ "handbag-fill": "\f408",
+ "handbag": "\f409",
+ "hash": "\f40a",
+ "hdd-fill": "\f40b",
+ "hdd-network-fill": "\f40c",
+ "hdd-network": "\f40d",
+ "hdd-rack-fill": "\f40e",
+ "hdd-rack": "\f40f",
+ "hdd-stack-fill": "\f410",
+ "hdd-stack": "\f411",
+ "hdd": "\f412",
+ "headphones": "\f413",
+ "headset": "\f414",
+ "heart-fill": "\f415",
+ "heart-half": "\f416",
+ "heart": "\f417",
+ "heptagon-fill": "\f418",
+ "heptagon-half": "\f419",
+ "heptagon": "\f41a",
+ "hexagon-fill": "\f41b",
+ "hexagon-half": "\f41c",
+ "hexagon": "\f41d",
+ "hourglass-bottom": "\f41e",
+ "hourglass-split": "\f41f",
+ "hourglass-top": "\f420",
+ "hourglass": "\f421",
+ "house-door-fill": "\f422",
+ "house-door": "\f423",
+ "house-fill": "\f424",
+ "house": "\f425",
+ "hr": "\f426",
+ "hurricane": "\f427",
+ "image-alt": "\f428",
+ "image-fill": "\f429",
+ "image": "\f42a",
+ "images": "\f42b",
+ "inbox-fill": "\f42c",
+ "inbox": "\f42d",
+ "inboxes-fill": "\f42e",
+ "inboxes": "\f42f",
+ "info-circle-fill": "\f430",
+ "info-circle": "\f431",
+ "info-square-fill": "\f432",
+ "info-square": "\f433",
+ "info": "\f434",
+ "input-cursor-text": "\f435",
+ "input-cursor": "\f436",
+ "instagram": "\f437",
+ "intersect": "\f438",
+ "journal-album": "\f439",
+ "journal-arrow-down": "\f43a",
+ "journal-arrow-up": "\f43b",
+ "journal-bookmark-fill": "\f43c",
+ "journal-bookmark": "\f43d",
+ "journal-check": "\f43e",
+ "journal-code": "\f43f",
+ "journal-medical": "\f440",
+ "journal-minus": "\f441",
+ "journal-plus": "\f442",
+ "journal-richtext": "\f443",
+ "journal-text": "\f444",
+ "journal-x": "\f445",
+ "journal": "\f446",
+ "journals": "\f447",
+ "joystick": "\f448",
+ "justify-left": "\f449",
+ "justify-right": "\f44a",
+ "justify": "\f44b",
+ "kanban-fill": "\f44c",
+ "kanban": "\f44d",
+ "key-fill": "\f44e",
+ "key": "\f44f",
+ "keyboard-fill": "\f450",
+ "keyboard": "\f451",
+ "ladder": "\f452",
+ "lamp-fill": "\f453",
+ "lamp": "\f454",
+ "laptop-fill": "\f455",
+ "laptop": "\f456",
+ "layer-backward": "\f457",
+ "layer-forward": "\f458",
+ "layers-fill": "\f459",
+ "layers-half": "\f45a",
+ "layers": "\f45b",
+ "layout-sidebar-inset-reverse": "\f45c",
+ "layout-sidebar-inset": "\f45d",
+ "layout-sidebar-reverse": "\f45e",
+ "layout-sidebar": "\f45f",
+ "layout-split": "\f460",
+ "layout-text-sidebar-reverse": "\f461",
+ "layout-text-sidebar": "\f462",
+ "layout-text-window-reverse": "\f463",
+ "layout-text-window": "\f464",
+ "layout-three-columns": "\f465",
+ "layout-wtf": "\f466",
+ "life-preserver": "\f467",
+ "lightbulb-fill": "\f468",
+ "lightbulb-off-fill": "\f469",
+ "lightbulb-off": "\f46a",
+ "lightbulb": "\f46b",
+ "lightning-charge-fill": "\f46c",
+ "lightning-charge": "\f46d",
+ "lightning-fill": "\f46e",
+ "lightning": "\f46f",
+ "link-45deg": "\f470",
+ "link": "\f471",
+ "linkedin": "\f472",
+ "list-check": "\f473",
+ "list-nested": "\f474",
+ "list-ol": "\f475",
+ "list-stars": "\f476",
+ "list-task": "\f477",
+ "list-ul": "\f478",
+ "list": "\f479",
+ "lock-fill": "\f47a",
+ "lock": "\f47b",
+ "mailbox": "\f47c",
+ "mailbox2": "\f47d",
+ "map-fill": "\f47e",
+ "map": "\f47f",
+ "markdown-fill": "\f480",
+ "markdown": "\f481",
+ "mask": "\f482",
+ "megaphone-fill": "\f483",
+ "megaphone": "\f484",
+ "menu-app-fill": "\f485",
+ "menu-app": "\f486",
+ "menu-button-fill": "\f487",
+ "menu-button-wide-fill": "\f488",
+ "menu-button-wide": "\f489",
+ "menu-button": "\f48a",
+ "menu-down": "\f48b",
+ "menu-up": "\f48c",
+ "mic-fill": "\f48d",
+ "mic-mute-fill": "\f48e",
+ "mic-mute": "\f48f",
+ "mic": "\f490",
+ "minecart-loaded": "\f491",
+ "minecart": "\f492",
+ "moisture": "\f493",
+ "moon-fill": "\f494",
+ "moon-stars-fill": "\f495",
+ "moon-stars": "\f496",
+ "moon": "\f497",
+ "mouse-fill": "\f498",
+ "mouse": "\f499",
+ "mouse2-fill": "\f49a",
+ "mouse2": "\f49b",
+ "mouse3-fill": "\f49c",
+ "mouse3": "\f49d",
+ "music-note-beamed": "\f49e",
+ "music-note-list": "\f49f",
+ "music-note": "\f4a0",
+ "music-player-fill": "\f4a1",
+ "music-player": "\f4a2",
+ "newspaper": "\f4a3",
+ "node-minus-fill": "\f4a4",
+ "node-minus": "\f4a5",
+ "node-plus-fill": "\f4a6",
+ "node-plus": "\f4a7",
+ "nut-fill": "\f4a8",
+ "nut": "\f4a9",
+ "octagon-fill": "\f4aa",
+ "octagon-half": "\f4ab",
+ "octagon": "\f4ac",
+ "option": "\f4ad",
+ "outlet": "\f4ae",
+ "paint-bucket": "\f4af",
+ "palette-fill": "\f4b0",
+ "palette": "\f4b1",
+ "palette2": "\f4b2",
+ "paperclip": "\f4b3",
+ "paragraph": "\f4b4",
+ "patch-check-fill": "\f4b5",
+ "patch-check": "\f4b6",
+ "patch-exclamation-fill": "\f4b7",
+ "patch-exclamation": "\f4b8",
+ "patch-minus-fill": "\f4b9",
+ "patch-minus": "\f4ba",
+ "patch-plus-fill": "\f4bb",
+ "patch-plus": "\f4bc",
+ "patch-question-fill": "\f4bd",
+ "patch-question": "\f4be",
+ "pause-btn-fill": "\f4bf",
+ "pause-btn": "\f4c0",
+ "pause-circle-fill": "\f4c1",
+ "pause-circle": "\f4c2",
+ "pause-fill": "\f4c3",
+ "pause": "\f4c4",
+ "peace-fill": "\f4c5",
+ "peace": "\f4c6",
+ "pen-fill": "\f4c7",
+ "pen": "\f4c8",
+ "pencil-fill": "\f4c9",
+ "pencil-square": "\f4ca",
+ "pencil": "\f4cb",
+ "pentagon-fill": "\f4cc",
+ "pentagon-half": "\f4cd",
+ "pentagon": "\f4ce",
+ "people-fill": "\f4cf",
+ "people": "\f4d0",
+ "percent": "\f4d1",
+ "person-badge-fill": "\f4d2",
+ "person-badge": "\f4d3",
+ "person-bounding-box": "\f4d4",
+ "person-check-fill": "\f4d5",
+ "person-check": "\f4d6",
+ "person-circle": "\f4d7",
+ "person-dash-fill": "\f4d8",
+ "person-dash": "\f4d9",
+ "person-fill": "\f4da",
+ "person-lines-fill": "\f4db",
+ "person-plus-fill": "\f4dc",
+ "person-plus": "\f4dd",
+ "person-square": "\f4de",
+ "person-x-fill": "\f4df",
+ "person-x": "\f4e0",
+ "person": "\f4e1",
+ "phone-fill": "\f4e2",
+ "phone-landscape-fill": "\f4e3",
+ "phone-landscape": "\f4e4",
+ "phone-vibrate-fill": "\f4e5",
+ "phone-vibrate": "\f4e6",
+ "phone": "\f4e7",
+ "pie-chart-fill": "\f4e8",
+ "pie-chart": "\f4e9",
+ "pin-angle-fill": "\f4ea",
+ "pin-angle": "\f4eb",
+ "pin-fill": "\f4ec",
+ "pin": "\f4ed",
+ "pip-fill": "\f4ee",
+ "pip": "\f4ef",
+ "play-btn-fill": "\f4f0",
+ "play-btn": "\f4f1",
+ "play-circle-fill": "\f4f2",
+ "play-circle": "\f4f3",
+ "play-fill": "\f4f4",
+ "play": "\f4f5",
+ "plug-fill": "\f4f6",
+ "plug": "\f4f7",
+ "plus-circle-dotted": "\f4f8",
+ "plus-circle-fill": "\f4f9",
+ "plus-circle": "\f4fa",
+ "plus-square-dotted": "\f4fb",
+ "plus-square-fill": "\f4fc",
+ "plus-square": "\f4fd",
+ "plus": "\f4fe",
+ "power": "\f4ff",
+ "printer-fill": "\f500",
+ "printer": "\f501",
+ "puzzle-fill": "\f502",
+ "puzzle": "\f503",
+ "question-circle-fill": "\f504",
+ "question-circle": "\f505",
+ "question-diamond-fill": "\f506",
+ "question-diamond": "\f507",
+ "question-octagon-fill": "\f508",
+ "question-octagon": "\f509",
+ "question-square-fill": "\f50a",
+ "question-square": "\f50b",
+ "question": "\f50c",
+ "rainbow": "\f50d",
+ "receipt-cutoff": "\f50e",
+ "receipt": "\f50f",
+ "reception-0": "\f510",
+ "reception-1": "\f511",
+ "reception-2": "\f512",
+ "reception-3": "\f513",
+ "reception-4": "\f514",
+ "record-btn-fill": "\f515",
+ "record-btn": "\f516",
+ "record-circle-fill": "\f517",
+ "record-circle": "\f518",
+ "record-fill": "\f519",
+ "record": "\f51a",
+ "record2-fill": "\f51b",
+ "record2": "\f51c",
+ "reply-all-fill": "\f51d",
+ "reply-all": "\f51e",
+ "reply-fill": "\f51f",
+ "reply": "\f520",
+ "rss-fill": "\f521",
+ "rss": "\f522",
+ "rulers": "\f523",
+ "save-fill": "\f524",
+ "save": "\f525",
+ "save2-fill": "\f526",
+ "save2": "\f527",
+ "scissors": "\f528",
+ "screwdriver": "\f529",
+ "search": "\f52a",
+ "segmented-nav": "\f52b",
+ "server": "\f52c",
+ "share-fill": "\f52d",
+ "share": "\f52e",
+ "shield-check": "\f52f",
+ "shield-exclamation": "\f530",
+ "shield-fill-check": "\f531",
+ "shield-fill-exclamation": "\f532",
+ "shield-fill-minus": "\f533",
+ "shield-fill-plus": "\f534",
+ "shield-fill-x": "\f535",
+ "shield-fill": "\f536",
+ "shield-lock-fill": "\f537",
+ "shield-lock": "\f538",
+ "shield-minus": "\f539",
+ "shield-plus": "\f53a",
+ "shield-shaded": "\f53b",
+ "shield-slash-fill": "\f53c",
+ "shield-slash": "\f53d",
+ "shield-x": "\f53e",
+ "shield": "\f53f",
+ "shift-fill": "\f540",
+ "shift": "\f541",
+ "shop-window": "\f542",
+ "shop": "\f543",
+ "shuffle": "\f544",
+ "signpost-2-fill": "\f545",
+ "signpost-2": "\f546",
+ "signpost-fill": "\f547",
+ "signpost-split-fill": "\f548",
+ "signpost-split": "\f549",
+ "signpost": "\f54a",
+ "sim-fill": "\f54b",
+ "sim": "\f54c",
+ "skip-backward-btn-fill": "\f54d",
+ "skip-backward-btn": "\f54e",
+ "skip-backward-circle-fill": "\f54f",
+ "skip-backward-circle": "\f550",
+ "skip-backward-fill": "\f551",
+ "skip-backward": "\f552",
+ "skip-end-btn-fill": "\f553",
+ "skip-end-btn": "\f554",
+ "skip-end-circle-fill": "\f555",
+ "skip-end-circle": "\f556",
+ "skip-end-fill": "\f557",
+ "skip-end": "\f558",
+ "skip-forward-btn-fill": "\f559",
+ "skip-forward-btn": "\f55a",
+ "skip-forward-circle-fill": "\f55b",
+ "skip-forward-circle": "\f55c",
+ "skip-forward-fill": "\f55d",
+ "skip-forward": "\f55e",
+ "skip-start-btn-fill": "\f55f",
+ "skip-start-btn": "\f560",
+ "skip-start-circle-fill": "\f561",
+ "skip-start-circle": "\f562",
+ "skip-start-fill": "\f563",
+ "skip-start": "\f564",
+ "slack": "\f565",
+ "slash-circle-fill": "\f566",
+ "slash-circle": "\f567",
+ "slash-square-fill": "\f568",
+ "slash-square": "\f569",
+ "slash": "\f56a",
+ "sliders": "\f56b",
+ "smartwatch": "\f56c",
+ "snow": "\f56d",
+ "snow2": "\f56e",
+ "snow3": "\f56f",
+ "sort-alpha-down-alt": "\f570",
+ "sort-alpha-down": "\f571",
+ "sort-alpha-up-alt": "\f572",
+ "sort-alpha-up": "\f573",
+ "sort-down-alt": "\f574",
+ "sort-down": "\f575",
+ "sort-numeric-down-alt": "\f576",
+ "sort-numeric-down": "\f577",
+ "sort-numeric-up-alt": "\f578",
+ "sort-numeric-up": "\f579",
+ "sort-up-alt": "\f57a",
+ "sort-up": "\f57b",
+ "soundwave": "\f57c",
+ "speaker-fill": "\f57d",
+ "speaker": "\f57e",
+ "speedometer": "\f57f",
+ "speedometer2": "\f580",
+ "spellcheck": "\f581",
+ "square-fill": "\f582",
+ "square-half": "\f583",
+ "square": "\f584",
+ "stack": "\f585",
+ "star-fill": "\f586",
+ "star-half": "\f587",
+ "star": "\f588",
+ "stars": "\f589",
+ "stickies-fill": "\f58a",
+ "stickies": "\f58b",
+ "sticky-fill": "\f58c",
+ "sticky": "\f58d",
+ "stop-btn-fill": "\f58e",
+ "stop-btn": "\f58f",
+ "stop-circle-fill": "\f590",
+ "stop-circle": "\f591",
+ "stop-fill": "\f592",
+ "stop": "\f593",
+ "stoplights-fill": "\f594",
+ "stoplights": "\f595",
+ "stopwatch-fill": "\f596",
+ "stopwatch": "\f597",
+ "subtract": "\f598",
+ "suit-club-fill": "\f599",
+ "suit-club": "\f59a",
+ "suit-diamond-fill": "\f59b",
+ "suit-diamond": "\f59c",
+ "suit-heart-fill": "\f59d",
+ "suit-heart": "\f59e",
+ "suit-spade-fill": "\f59f",
+ "suit-spade": "\f5a0",
+ "sun-fill": "\f5a1",
+ "sun": "\f5a2",
+ "sunglasses": "\f5a3",
+ "sunrise-fill": "\f5a4",
+ "sunrise": "\f5a5",
+ "sunset-fill": "\f5a6",
+ "sunset": "\f5a7",
+ "symmetry-horizontal": "\f5a8",
+ "symmetry-vertical": "\f5a9",
+ "table": "\f5aa",
+ "tablet-fill": "\f5ab",
+ "tablet-landscape-fill": "\f5ac",
+ "tablet-landscape": "\f5ad",
+ "tablet": "\f5ae",
+ "tag-fill": "\f5af",
+ "tag": "\f5b0",
+ "tags-fill": "\f5b1",
+ "tags": "\f5b2",
+ "telegram": "\f5b3",
+ "telephone-fill": "\f5b4",
+ "telephone-forward-fill": "\f5b5",
+ "telephone-forward": "\f5b6",
+ "telephone-inbound-fill": "\f5b7",
+ "telephone-inbound": "\f5b8",
+ "telephone-minus-fill": "\f5b9",
+ "telephone-minus": "\f5ba",
+ "telephone-outbound-fill": "\f5bb",
+ "telephone-outbound": "\f5bc",
+ "telephone-plus-fill": "\f5bd",
+ "telephone-plus": "\f5be",
+ "telephone-x-fill": "\f5bf",
+ "telephone-x": "\f5c0",
+ "telephone": "\f5c1",
+ "terminal-fill": "\f5c2",
+ "terminal": "\f5c3",
+ "text-center": "\f5c4",
+ "text-indent-left": "\f5c5",
+ "text-indent-right": "\f5c6",
+ "text-left": "\f5c7",
+ "text-paragraph": "\f5c8",
+ "text-right": "\f5c9",
+ "textarea-resize": "\f5ca",
+ "textarea-t": "\f5cb",
+ "textarea": "\f5cc",
+ "thermometer-half": "\f5cd",
+ "thermometer-high": "\f5ce",
+ "thermometer-low": "\f5cf",
+ "thermometer-snow": "\f5d0",
+ "thermometer-sun": "\f5d1",
+ "thermometer": "\f5d2",
+ "three-dots-vertical": "\f5d3",
+ "three-dots": "\f5d4",
+ "toggle-off": "\f5d5",
+ "toggle-on": "\f5d6",
+ "toggle2-off": "\f5d7",
+ "toggle2-on": "\f5d8",
+ "toggles": "\f5d9",
+ "toggles2": "\f5da",
+ "tools": "\f5db",
+ "tornado": "\f5dc",
+ "trash-fill": "\f5dd",
+ "trash": "\f5de",
+ "trash2-fill": "\f5df",
+ "trash2": "\f5e0",
+ "tree-fill": "\f5e1",
+ "tree": "\f5e2",
+ "triangle-fill": "\f5e3",
+ "triangle-half": "\f5e4",
+ "triangle": "\f5e5",
+ "trophy-fill": "\f5e6",
+ "trophy": "\f5e7",
+ "tropical-storm": "\f5e8",
+ "truck-flatbed": "\f5e9",
+ "truck": "\f5ea",
+ "tsunami": "\f5eb",
+ "tv-fill": "\f5ec",
+ "tv": "\f5ed",
+ "twitch": "\f5ee",
+ "twitter": "\f5ef",
+ "type-bold": "\f5f0",
+ "type-h1": "\f5f1",
+ "type-h2": "\f5f2",
+ "type-h3": "\f5f3",
+ "type-italic": "\f5f4",
+ "type-strikethrough": "\f5f5",
+ "type-underline": "\f5f6",
+ "type": "\f5f7",
+ "ui-checks-grid": "\f5f8",
+ "ui-checks": "\f5f9",
+ "ui-radios-grid": "\f5fa",
+ "ui-radios": "\f5fb",
+ "umbrella-fill": "\f5fc",
+ "umbrella": "\f5fd",
+ "union": "\f5fe",
+ "unlock-fill": "\f5ff",
+ "unlock": "\f600",
+ "upc-scan": "\f601",
+ "upc": "\f602",
+ "upload": "\f603",
+ "vector-pen": "\f604",
+ "view-list": "\f605",
+ "view-stacked": "\f606",
+ "vinyl-fill": "\f607",
+ "vinyl": "\f608",
+ "voicemail": "\f609",
+ "volume-down-fill": "\f60a",
+ "volume-down": "\f60b",
+ "volume-mute-fill": "\f60c",
+ "volume-mute": "\f60d",
+ "volume-off-fill": "\f60e",
+ "volume-off": "\f60f",
+ "volume-up-fill": "\f610",
+ "volume-up": "\f611",
+ "vr": "\f612",
+ "wallet-fill": "\f613",
+ "wallet": "\f614",
+ "wallet2": "\f615",
+ "watch": "\f616",
+ "water": "\f617",
+ "whatsapp": "\f618",
+ "wifi-1": "\f619",
+ "wifi-2": "\f61a",
+ "wifi-off": "\f61b",
+ "wifi": "\f61c",
+ "wind": "\f61d",
+ "window-dock": "\f61e",
+ "window-sidebar": "\f61f",
+ "window": "\f620",
+ "wrench": "\f621",
+ "x-circle-fill": "\f622",
+ "x-circle": "\f623",
+ "x-diamond-fill": "\f624",
+ "x-diamond": "\f625",
+ "x-octagon-fill": "\f626",
+ "x-octagon": "\f627",
+ "x-square-fill": "\f628",
+ "x-square": "\f629",
+ "x": "\f62a",
+ "youtube": "\f62b",
+ "zoom-in": "\f62c",
+ "zoom-out": "\f62d",
+ "bank": "\f62e",
+ "bank2": "\f62f",
+ "bell-slash-fill": "\f630",
+ "bell-slash": "\f631",
+ "cash-coin": "\f632",
+ "check-lg": "\f633",
+ "coin": "\f634",
+ "currency-bitcoin": "\f635",
+ "currency-dollar": "\f636",
+ "currency-euro": "\f637",
+ "currency-exchange": "\f638",
+ "currency-pound": "\f639",
+ "currency-yen": "\f63a",
+ "dash-lg": "\f63b",
+ "exclamation-lg": "\f63c",
+ "file-earmark-pdf-fill": "\f63d",
+ "file-earmark-pdf": "\f63e",
+ "file-pdf-fill": "\f63f",
+ "file-pdf": "\f640",
+ "gender-ambiguous": "\f641",
+ "gender-female": "\f642",
+ "gender-male": "\f643",
+ "gender-trans": "\f644",
+ "headset-vr": "\f645",
+ "info-lg": "\f646",
+ "mastodon": "\f647",
+ "messenger": "\f648",
+ "piggy-bank-fill": "\f649",
+ "piggy-bank": "\f64a",
+ "pin-map-fill": "\f64b",
+ "pin-map": "\f64c",
+ "plus-lg": "\f64d",
+ "question-lg": "\f64e",
+ "recycle": "\f64f",
+ "reddit": "\f650",
+ "safe-fill": "\f651",
+ "safe2-fill": "\f652",
+ "safe2": "\f653",
+ "sd-card-fill": "\f654",
+ "sd-card": "\f655",
+ "skype": "\f656",
+ "slash-lg": "\f657",
+ "translate": "\f658",
+ "x-lg": "\f659",
+ "safe": "\f65a",
+ "apple": "\f65b",
+ "microsoft": "\f65d",
+ "windows": "\f65e",
+ "behance": "\f65c",
+ "dribbble": "\f65f",
+ "line": "\f660",
+ "medium": "\f661",
+ "paypal": "\f662",
+ "pinterest": "\f663",
+ "signal": "\f664",
+ "snapchat": "\f665",
+ "spotify": "\f666",
+ "stack-overflow": "\f667",
+ "strava": "\f668",
+ "wordpress": "\f669",
+ "vimeo": "\f66a",
+ "activity": "\f66b",
+ "easel2-fill": "\f66c",
+ "easel2": "\f66d",
+ "easel3-fill": "\f66e",
+ "easel3": "\f66f",
+ "fan": "\f670",
+ "fingerprint": "\f671",
+ "graph-down-arrow": "\f672",
+ "graph-up-arrow": "\f673",
+ "hypnotize": "\f674",
+ "magic": "\f675",
+ "person-rolodex": "\f676",
+ "person-video": "\f677",
+ "person-video2": "\f678",
+ "person-video3": "\f679",
+ "person-workspace": "\f67a",
+ "radioactive": "\f67b",
+ "webcam-fill": "\f67c",
+ "webcam": "\f67d",
+ "yin-yang": "\f67e",
+ "bandaid-fill": "\f680",
+ "bandaid": "\f681",
+ "bluetooth": "\f682",
+ "body-text": "\f683",
+ "boombox": "\f684",
+ "boxes": "\f685",
+ "dpad-fill": "\f686",
+ "dpad": "\f687",
+ "ear-fill": "\f688",
+ "ear": "\f689",
+ "envelope-check-fill": "\f68b",
+ "envelope-check": "\f68c",
+ "envelope-dash-fill": "\f68e",
+ "envelope-dash": "\f68f",
+ "envelope-exclamation-fill": "\f691",
+ "envelope-exclamation": "\f692",
+ "envelope-plus-fill": "\f693",
+ "envelope-plus": "\f694",
+ "envelope-slash-fill": "\f696",
+ "envelope-slash": "\f697",
+ "envelope-x-fill": "\f699",
+ "envelope-x": "\f69a",
+ "explicit-fill": "\f69b",
+ "explicit": "\f69c",
+ "git": "\f69d",
+ "infinity": "\f69e",
+ "list-columns-reverse": "\f69f",
+ "list-columns": "\f6a0",
+ "meta": "\f6a1",
+ "nintendo-switch": "\f6a4",
+ "pc-display-horizontal": "\f6a5",
+ "pc-display": "\f6a6",
+ "pc-horizontal": "\f6a7",
+ "pc": "\f6a8",
+ "playstation": "\f6a9",
+ "plus-slash-minus": "\f6aa",
+ "projector-fill": "\f6ab",
+ "projector": "\f6ac",
+ "qr-code-scan": "\f6ad",
+ "qr-code": "\f6ae",
+ "quora": "\f6af",
+ "quote": "\f6b0",
+ "robot": "\f6b1",
+ "send-check-fill": "\f6b2",
+ "send-check": "\f6b3",
+ "send-dash-fill": "\f6b4",
+ "send-dash": "\f6b5",
+ "send-exclamation-fill": "\f6b7",
+ "send-exclamation": "\f6b8",
+ "send-fill": "\f6b9",
+ "send-plus-fill": "\f6ba",
+ "send-plus": "\f6bb",
+ "send-slash-fill": "\f6bc",
+ "send-slash": "\f6bd",
+ "send-x-fill": "\f6be",
+ "send-x": "\f6bf",
+ "send": "\f6c0",
+ "steam": "\f6c1",
+ "terminal-dash": "\f6c3",
+ "terminal-plus": "\f6c4",
+ "terminal-split": "\f6c5",
+ "ticket-detailed-fill": "\f6c6",
+ "ticket-detailed": "\f6c7",
+ "ticket-fill": "\f6c8",
+ "ticket-perforated-fill": "\f6c9",
+ "ticket-perforated": "\f6ca",
+ "ticket": "\f6cb",
+ "tiktok": "\f6cc",
+ "window-dash": "\f6cd",
+ "window-desktop": "\f6ce",
+ "window-fullscreen": "\f6cf",
+ "window-plus": "\f6d0",
+ "window-split": "\f6d1",
+ "window-stack": "\f6d2",
+ "window-x": "\f6d3",
+ "xbox": "\f6d4",
+ "ethernet": "\f6d5",
+ "hdmi-fill": "\f6d6",
+ "hdmi": "\f6d7",
+ "usb-c-fill": "\f6d8",
+ "usb-c": "\f6d9",
+ "usb-fill": "\f6da",
+ "usb-plug-fill": "\f6db",
+ "usb-plug": "\f6dc",
+ "usb-symbol": "\f6dd",
+ "usb": "\f6de",
+ "boombox-fill": "\f6df",
+ "displayport": "\f6e1",
+ "gpu-card": "\f6e2",
+ "memory": "\f6e3",
+ "modem-fill": "\f6e4",
+ "modem": "\f6e5",
+ "motherboard-fill": "\f6e6",
+ "motherboard": "\f6e7",
+ "optical-audio-fill": "\f6e8",
+ "optical-audio": "\f6e9",
+ "pci-card": "\f6ea",
+ "router-fill": "\f6eb",
+ "router": "\f6ec",
+ "thunderbolt-fill": "\f6ef",
+ "thunderbolt": "\f6f0",
+ "usb-drive-fill": "\f6f1",
+ "usb-drive": "\f6f2",
+ "usb-micro-fill": "\f6f3",
+ "usb-micro": "\f6f4",
+ "usb-mini-fill": "\f6f5",
+ "usb-mini": "\f6f6",
+ "cloud-haze2": "\f6f7",
+ "device-hdd-fill": "\f6f8",
+ "device-hdd": "\f6f9",
+ "device-ssd-fill": "\f6fa",
+ "device-ssd": "\f6fb",
+ "displayport-fill": "\f6fc",
+ "mortarboard-fill": "\f6fd",
+ "mortarboard": "\f6fe",
+ "terminal-x": "\f6ff",
+ "arrow-through-heart-fill": "\f700",
+ "arrow-through-heart": "\f701",
+ "badge-sd-fill": "\f702",
+ "badge-sd": "\f703",
+ "bag-heart-fill": "\f704",
+ "bag-heart": "\f705",
+ "balloon-fill": "\f706",
+ "balloon-heart-fill": "\f707",
+ "balloon-heart": "\f708",
+ "balloon": "\f709",
+ "box2-fill": "\f70a",
+ "box2-heart-fill": "\f70b",
+ "box2-heart": "\f70c",
+ "box2": "\f70d",
+ "braces-asterisk": "\f70e",
+ "calendar-heart-fill": "\f70f",
+ "calendar-heart": "\f710",
+ "calendar2-heart-fill": "\f711",
+ "calendar2-heart": "\f712",
+ "chat-heart-fill": "\f713",
+ "chat-heart": "\f714",
+ "chat-left-heart-fill": "\f715",
+ "chat-left-heart": "\f716",
+ "chat-right-heart-fill": "\f717",
+ "chat-right-heart": "\f718",
+ "chat-square-heart-fill": "\f719",
+ "chat-square-heart": "\f71a",
+ "clipboard-check-fill": "\f71b",
+ "clipboard-data-fill": "\f71c",
+ "clipboard-fill": "\f71d",
+ "clipboard-heart-fill": "\f71e",
+ "clipboard-heart": "\f71f",
+ "clipboard-minus-fill": "\f720",
+ "clipboard-plus-fill": "\f721",
+ "clipboard-pulse": "\f722",
+ "clipboard-x-fill": "\f723",
+ "clipboard2-check-fill": "\f724",
+ "clipboard2-check": "\f725",
+ "clipboard2-data-fill": "\f726",
+ "clipboard2-data": "\f727",
+ "clipboard2-fill": "\f728",
+ "clipboard2-heart-fill": "\f729",
+ "clipboard2-heart": "\f72a",
+ "clipboard2-minus-fill": "\f72b",
+ "clipboard2-minus": "\f72c",
+ "clipboard2-plus-fill": "\f72d",
+ "clipboard2-plus": "\f72e",
+ "clipboard2-pulse-fill": "\f72f",
+ "clipboard2-pulse": "\f730",
+ "clipboard2-x-fill": "\f731",
+ "clipboard2-x": "\f732",
+ "clipboard2": "\f733",
+ "emoji-kiss-fill": "\f734",
+ "emoji-kiss": "\f735",
+ "envelope-heart-fill": "\f736",
+ "envelope-heart": "\f737",
+ "envelope-open-heart-fill": "\f738",
+ "envelope-open-heart": "\f739",
+ "envelope-paper-fill": "\f73a",
+ "envelope-paper-heart-fill": "\f73b",
+ "envelope-paper-heart": "\f73c",
+ "envelope-paper": "\f73d",
+ "filetype-aac": "\f73e",
+ "filetype-ai": "\f73f",
+ "filetype-bmp": "\f740",
+ "filetype-cs": "\f741",
+ "filetype-css": "\f742",
+ "filetype-csv": "\f743",
+ "filetype-doc": "\f744",
+ "filetype-docx": "\f745",
+ "filetype-exe": "\f746",
+ "filetype-gif": "\f747",
+ "filetype-heic": "\f748",
+ "filetype-html": "\f749",
+ "filetype-java": "\f74a",
+ "filetype-jpg": "\f74b",
+ "filetype-js": "\f74c",
+ "filetype-jsx": "\f74d",
+ "filetype-key": "\f74e",
+ "filetype-m4p": "\f74f",
+ "filetype-md": "\f750",
+ "filetype-mdx": "\f751",
+ "filetype-mov": "\f752",
+ "filetype-mp3": "\f753",
+ "filetype-mp4": "\f754",
+ "filetype-otf": "\f755",
+ "filetype-pdf": "\f756",
+ "filetype-php": "\f757",
+ "filetype-png": "\f758",
+ "filetype-ppt": "\f75a",
+ "filetype-psd": "\f75b",
+ "filetype-py": "\f75c",
+ "filetype-raw": "\f75d",
+ "filetype-rb": "\f75e",
+ "filetype-sass": "\f75f",
+ "filetype-scss": "\f760",
+ "filetype-sh": "\f761",
+ "filetype-svg": "\f762",
+ "filetype-tiff": "\f763",
+ "filetype-tsx": "\f764",
+ "filetype-ttf": "\f765",
+ "filetype-txt": "\f766",
+ "filetype-wav": "\f767",
+ "filetype-woff": "\f768",
+ "filetype-xls": "\f76a",
+ "filetype-xml": "\f76b",
+ "filetype-yml": "\f76c",
+ "heart-arrow": "\f76d",
+ "heart-pulse-fill": "\f76e",
+ "heart-pulse": "\f76f",
+ "heartbreak-fill": "\f770",
+ "heartbreak": "\f771",
+ "hearts": "\f772",
+ "hospital-fill": "\f773",
+ "hospital": "\f774",
+ "house-heart-fill": "\f775",
+ "house-heart": "\f776",
+ "incognito": "\f777",
+ "magnet-fill": "\f778",
+ "magnet": "\f779",
+ "person-heart": "\f77a",
+ "person-hearts": "\f77b",
+ "phone-flip": "\f77c",
+ "plugin": "\f77d",
+ "postage-fill": "\f77e",
+ "postage-heart-fill": "\f77f",
+ "postage-heart": "\f780",
+ "postage": "\f781",
+ "postcard-fill": "\f782",
+ "postcard-heart-fill": "\f783",
+ "postcard-heart": "\f784",
+ "postcard": "\f785",
+ "search-heart-fill": "\f786",
+ "search-heart": "\f787",
+ "sliders2-vertical": "\f788",
+ "sliders2": "\f789",
+ "trash3-fill": "\f78a",
+ "trash3": "\f78b",
+ "valentine": "\f78c",
+ "valentine2": "\f78d",
+ "wrench-adjustable-circle-fill": "\f78e",
+ "wrench-adjustable-circle": "\f78f",
+ "wrench-adjustable": "\f790",
+ "filetype-json": "\f791",
+ "filetype-pptx": "\f792",
+ "filetype-xlsx": "\f793",
+ "1-circle-fill": "\f796",
+ "1-circle": "\f797",
+ "1-square-fill": "\f798",
+ "1-square": "\f799",
+ "2-circle-fill": "\f79c",
+ "2-circle": "\f79d",
+ "2-square-fill": "\f79e",
+ "2-square": "\f79f",
+ "3-circle-fill": "\f7a2",
+ "3-circle": "\f7a3",
+ "3-square-fill": "\f7a4",
+ "3-square": "\f7a5",
+ "4-circle-fill": "\f7a8",
+ "4-circle": "\f7a9",
+ "4-square-fill": "\f7aa",
+ "4-square": "\f7ab",
+ "5-circle-fill": "\f7ae",
+ "5-circle": "\f7af",
+ "5-square-fill": "\f7b0",
+ "5-square": "\f7b1",
+ "6-circle-fill": "\f7b4",
+ "6-circle": "\f7b5",
+ "6-square-fill": "\f7b6",
+ "6-square": "\f7b7",
+ "7-circle-fill": "\f7ba",
+ "7-circle": "\f7bb",
+ "7-square-fill": "\f7bc",
+ "7-square": "\f7bd",
+ "8-circle-fill": "\f7c0",
+ "8-circle": "\f7c1",
+ "8-square-fill": "\f7c2",
+ "8-square": "\f7c3",
+ "9-circle-fill": "\f7c6",
+ "9-circle": "\f7c7",
+ "9-square-fill": "\f7c8",
+ "9-square": "\f7c9",
+ "airplane-engines-fill": "\f7ca",
+ "airplane-engines": "\f7cb",
+ "airplane-fill": "\f7cc",
+ "airplane": "\f7cd",
+ "alexa": "\f7ce",
+ "alipay": "\f7cf",
+ "android": "\f7d0",
+ "android2": "\f7d1",
+ "box-fill": "\f7d2",
+ "box-seam-fill": "\f7d3",
+ "browser-chrome": "\f7d4",
+ "browser-edge": "\f7d5",
+ "browser-firefox": "\f7d6",
+ "browser-safari": "\f7d7",
+ "c-circle-fill": "\f7da",
+ "c-circle": "\f7db",
+ "c-square-fill": "\f7dc",
+ "c-square": "\f7dd",
+ "capsule-pill": "\f7de",
+ "capsule": "\f7df",
+ "car-front-fill": "\f7e0",
+ "car-front": "\f7e1",
+ "cassette-fill": "\f7e2",
+ "cassette": "\f7e3",
+ "cc-circle-fill": "\f7e6",
+ "cc-circle": "\f7e7",
+ "cc-square-fill": "\f7e8",
+ "cc-square": "\f7e9",
+ "cup-hot-fill": "\f7ea",
+ "cup-hot": "\f7eb",
+ "currency-rupee": "\f7ec",
+ "dropbox": "\f7ed",
+ "escape": "\f7ee",
+ "fast-forward-btn-fill": "\f7ef",
+ "fast-forward-btn": "\f7f0",
+ "fast-forward-circle-fill": "\f7f1",
+ "fast-forward-circle": "\f7f2",
+ "fast-forward-fill": "\f7f3",
+ "fast-forward": "\f7f4",
+ "filetype-sql": "\f7f5",
+ "fire": "\f7f6",
+ "google-play": "\f7f7",
+ "h-circle-fill": "\f7fa",
+ "h-circle": "\f7fb",
+ "h-square-fill": "\f7fc",
+ "h-square": "\f7fd",
+ "indent": "\f7fe",
+ "lungs-fill": "\f7ff",
+ "lungs": "\f800",
+ "microsoft-teams": "\f801",
+ "p-circle-fill": "\f804",
+ "p-circle": "\f805",
+ "p-square-fill": "\f806",
+ "p-square": "\f807",
+ "pass-fill": "\f808",
+ "pass": "\f809",
+ "prescription": "\f80a",
+ "prescription2": "\f80b",
+ "r-circle-fill": "\f80e",
+ "r-circle": "\f80f",
+ "r-square-fill": "\f810",
+ "r-square": "\f811",
+ "repeat-1": "\f812",
+ "repeat": "\f813",
+ "rewind-btn-fill": "\f814",
+ "rewind-btn": "\f815",
+ "rewind-circle-fill": "\f816",
+ "rewind-circle": "\f817",
+ "rewind-fill": "\f818",
+ "rewind": "\f819",
+ "train-freight-front-fill": "\f81a",
+ "train-freight-front": "\f81b",
+ "train-front-fill": "\f81c",
+ "train-front": "\f81d",
+ "train-lightrail-front-fill": "\f81e",
+ "train-lightrail-front": "\f81f",
+ "truck-front-fill": "\f820",
+ "truck-front": "\f821",
+ "ubuntu": "\f822",
+ "unindent": "\f823",
+ "unity": "\f824",
+ "universal-access-circle": "\f825",
+ "universal-access": "\f826",
+ "virus": "\f827",
+ "virus2": "\f828",
+ "wechat": "\f829",
+ "yelp": "\f82a",
+ "sign-stop-fill": "\f82b",
+ "sign-stop-lights-fill": "\f82c",
+ "sign-stop-lights": "\f82d",
+ "sign-stop": "\f82e",
+ "sign-turn-left-fill": "\f82f",
+ "sign-turn-left": "\f830",
+ "sign-turn-right-fill": "\f831",
+ "sign-turn-right": "\f832",
+ "sign-turn-slight-left-fill": "\f833",
+ "sign-turn-slight-left": "\f834",
+ "sign-turn-slight-right-fill": "\f835",
+ "sign-turn-slight-right": "\f836",
+ "sign-yield-fill": "\f837",
+ "sign-yield": "\f838",
+ "ev-station-fill": "\f839",
+ "ev-station": "\f83a",
+ "fuel-pump-diesel-fill": "\f83b",
+ "fuel-pump-diesel": "\f83c",
+ "fuel-pump-fill": "\f83d",
+ "fuel-pump": "\f83e",
+ "0-circle-fill": "\f83f",
+ "0-circle": "\f840",
+ "0-square-fill": "\f841",
+ "0-square": "\f842",
+ "rocket-fill": "\f843",
+ "rocket-takeoff-fill": "\f844",
+ "rocket-takeoff": "\f845",
+ "rocket": "\f846",
+ "stripe": "\f847",
+ "subscript": "\f848",
+ "superscript": "\f849",
+ "trello": "\f84a",
+ "envelope-at-fill": "\f84b",
+ "envelope-at": "\f84c",
+ "regex": "\f84d",
+ "text-wrap": "\f84e",
+ "sign-dead-end-fill": "\f84f",
+ "sign-dead-end": "\f850",
+ "sign-do-not-enter-fill": "\f851",
+ "sign-do-not-enter": "\f852",
+ "sign-intersection-fill": "\f853",
+ "sign-intersection-side-fill": "\f854",
+ "sign-intersection-side": "\f855",
+ "sign-intersection-t-fill": "\f856",
+ "sign-intersection-t": "\f857",
+ "sign-intersection-y-fill": "\f858",
+ "sign-intersection-y": "\f859",
+ "sign-intersection": "\f85a",
+ "sign-merge-left-fill": "\f85b",
+ "sign-merge-left": "\f85c",
+ "sign-merge-right-fill": "\f85d",
+ "sign-merge-right": "\f85e",
+ "sign-no-left-turn-fill": "\f85f",
+ "sign-no-left-turn": "\f860",
+ "sign-no-parking-fill": "\f861",
+ "sign-no-parking": "\f862",
+ "sign-no-right-turn-fill": "\f863",
+ "sign-no-right-turn": "\f864",
+ "sign-railroad-fill": "\f865",
+ "sign-railroad": "\f866",
+ "building-add": "\f867",
+ "building-check": "\f868",
+ "building-dash": "\f869",
+ "building-down": "\f86a",
+ "building-exclamation": "\f86b",
+ "building-fill-add": "\f86c",
+ "building-fill-check": "\f86d",
+ "building-fill-dash": "\f86e",
+ "building-fill-down": "\f86f",
+ "building-fill-exclamation": "\f870",
+ "building-fill-gear": "\f871",
+ "building-fill-lock": "\f872",
+ "building-fill-slash": "\f873",
+ "building-fill-up": "\f874",
+ "building-fill-x": "\f875",
+ "building-fill": "\f876",
+ "building-gear": "\f877",
+ "building-lock": "\f878",
+ "building-slash": "\f879",
+ "building-up": "\f87a",
+ "building-x": "\f87b",
+ "buildings-fill": "\f87c",
+ "buildings": "\f87d",
+ "bus-front-fill": "\f87e",
+ "bus-front": "\f87f",
+ "ev-front-fill": "\f880",
+ "ev-front": "\f881",
+ "globe-americas": "\f882",
+ "globe-asia-australia": "\f883",
+ "globe-central-south-asia": "\f884",
+ "globe-europe-africa": "\f885",
+ "house-add-fill": "\f886",
+ "house-add": "\f887",
+ "house-check-fill": "\f888",
+ "house-check": "\f889",
+ "house-dash-fill": "\f88a",
+ "house-dash": "\f88b",
+ "house-down-fill": "\f88c",
+ "house-down": "\f88d",
+ "house-exclamation-fill": "\f88e",
+ "house-exclamation": "\f88f",
+ "house-gear-fill": "\f890",
+ "house-gear": "\f891",
+ "house-lock-fill": "\f892",
+ "house-lock": "\f893",
+ "house-slash-fill": "\f894",
+ "house-slash": "\f895",
+ "house-up-fill": "\f896",
+ "house-up": "\f897",
+ "house-x-fill": "\f898",
+ "house-x": "\f899",
+ "person-add": "\f89a",
+ "person-down": "\f89b",
+ "person-exclamation": "\f89c",
+ "person-fill-add": "\f89d",
+ "person-fill-check": "\f89e",
+ "person-fill-dash": "\f89f",
+ "person-fill-down": "\f8a0",
+ "person-fill-exclamation": "\f8a1",
+ "person-fill-gear": "\f8a2",
+ "person-fill-lock": "\f8a3",
+ "person-fill-slash": "\f8a4",
+ "person-fill-up": "\f8a5",
+ "person-fill-x": "\f8a6",
+ "person-gear": "\f8a7",
+ "person-lock": "\f8a8",
+ "person-slash": "\f8a9",
+ "person-up": "\f8aa",
+ "scooter": "\f8ab",
+ "taxi-front-fill": "\f8ac",
+ "taxi-front": "\f8ad",
+ "amd": "\f8ae",
+ "database-add": "\f8af",
+ "database-check": "\f8b0",
+ "database-dash": "\f8b1",
+ "database-down": "\f8b2",
+ "database-exclamation": "\f8b3",
+ "database-fill-add": "\f8b4",
+ "database-fill-check": "\f8b5",
+ "database-fill-dash": "\f8b6",
+ "database-fill-down": "\f8b7",
+ "database-fill-exclamation": "\f8b8",
+ "database-fill-gear": "\f8b9",
+ "database-fill-lock": "\f8ba",
+ "database-fill-slash": "\f8bb",
+ "database-fill-up": "\f8bc",
+ "database-fill-x": "\f8bd",
+ "database-fill": "\f8be",
+ "database-gear": "\f8bf",
+ "database-lock": "\f8c0",
+ "database-slash": "\f8c1",
+ "database-up": "\f8c2",
+ "database-x": "\f8c3",
+ "database": "\f8c4",
+ "houses-fill": "\f8c5",
+ "houses": "\f8c6",
+ "nvidia": "\f8c7",
+ "person-vcard-fill": "\f8c8",
+ "person-vcard": "\f8c9",
+ "sina-weibo": "\f8ca",
+ "tencent-qq": "\f8cb",
+ "wikipedia": "\f8cc",
+ "alphabet-uppercase": "\f2a5",
+ "alphabet": "\f68a",
+ "amazon": "\f68d",
+ "arrows-collapse-vertical": "\f690",
+ "arrows-expand-vertical": "\f695",
+ "arrows-vertical": "\f698",
+ "arrows": "\f6a2",
+ "ban-fill": "\f6a3",
+ "ban": "\f6b6",
+ "bing": "\f6c2",
+ "cake": "\f6e0",
+ "cake2": "\f6ed",
+ "cookie": "\f6ee",
+ "copy": "\f759",
+ "crosshair": "\f769",
+ "crosshair2": "\f794",
+ "emoji-astonished-fill": "\f795",
+ "emoji-astonished": "\f79a",
+ "emoji-grimace-fill": "\f79b",
+ "emoji-grimace": "\f7a0",
+ "emoji-grin-fill": "\f7a1",
+ "emoji-grin": "\f7a6",
+ "emoji-surprise-fill": "\f7a7",
+ "emoji-surprise": "\f7ac",
+ "emoji-tear-fill": "\f7ad",
+ "emoji-tear": "\f7b2",
+ "envelope-arrow-down-fill": "\f7b3",
+ "envelope-arrow-down": "\f7b8",
+ "envelope-arrow-up-fill": "\f7b9",
+ "envelope-arrow-up": "\f7be",
+ "feather": "\f7bf",
+ "feather2": "\f7c4",
+ "floppy-fill": "\f7c5",
+ "floppy": "\f7d8",
+ "floppy2-fill": "\f7d9",
+ "floppy2": "\f7e4",
+ "gitlab": "\f7e5",
+ "highlighter": "\f7f8",
+ "marker-tip": "\f802",
+ "nvme-fill": "\f803",
+ "nvme": "\f80c",
+ "opencollective": "\f80d",
+ "pci-card-network": "\f8cd",
+ "pci-card-sound": "\f8ce",
+ "radar": "\f8cf",
+ "send-arrow-down-fill": "\f8d0",
+ "send-arrow-down": "\f8d1",
+ "send-arrow-up-fill": "\f8d2",
+ "send-arrow-up": "\f8d3",
+ "sim-slash-fill": "\f8d4",
+ "sim-slash": "\f8d5",
+ "sourceforge": "\f8d6",
+ "substack": "\f8d7",
+ "threads-fill": "\f8d8",
+ "threads": "\f8d9",
+ "transparency": "\f8da",
+ "twitter-x": "\f8db",
+ "type-h4": "\f8dc",
+ "type-h5": "\f8dd",
+ "type-h6": "\f8de",
+ "backpack-fill": "\f8df",
+ "backpack": "\f8e0",
+ "backpack2-fill": "\f8e1",
+ "backpack2": "\f8e2",
+ "backpack3-fill": "\f8e3",
+ "backpack3": "\f8e4",
+ "backpack4-fill": "\f8e5",
+ "backpack4": "\f8e6",
+ "brilliance": "\f8e7",
+ "cake-fill": "\f8e8",
+ "cake2-fill": "\f8e9",
+ "duffle-fill": "\f8ea",
+ "duffle": "\f8eb",
+ "exposure": "\f8ec",
+ "gender-neuter": "\f8ed",
+ "highlights": "\f8ee",
+ "luggage-fill": "\f8ef",
+ "luggage": "\f8f0",
+ "mailbox-flag": "\f8f1",
+ "mailbox2-flag": "\f8f2",
+ "noise-reduction": "\f8f3",
+ "passport-fill": "\f8f4",
+ "passport": "\f8f5",
+ "person-arms-up": "\f8f6",
+ "person-raised-hand": "\f8f7",
+ "person-standing-dress": "\f8f8",
+ "person-standing": "\f8f9",
+ "person-walking": "\f8fa",
+ "person-wheelchair": "\f8fb",
+ "shadows": "\f8fc",
+ "suitcase-fill": "\f8fd",
+ "suitcase-lg-fill": "\f8fe",
+ "suitcase-lg": "\f8ff",
+ "suitcase": "\f900",
+ "suitcase2-fill": "\f901",
+ "suitcase2": "\f902",
+ "vignette": "\f903",
+);
+
+@each $icon, $codepoint in $bootstrap-icons-map {
+ .bi-#{$icon}::before { content: $codepoint; }
+}
diff --git a/resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff b/resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff
new file mode 100644
index 0000000..51204d2
Binary files /dev/null and b/resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff differ
diff --git a/resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff2 b/resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff2
new file mode 100644
index 0000000..92c4830
Binary files /dev/null and b/resources/assets/vendor/fonts/bootstrap-icons/bootstrap-icons.woff2 differ
diff --git a/resources/assets/vendor/fonts/fontawesome.scss b/resources/assets/vendor/fonts/fontawesome.scss
new file mode 100644
index 0000000..323e2e2
--- /dev/null
+++ b/resources/assets/vendor/fonts/fontawesome.scss
@@ -0,0 +1,7 @@
+$fa-font-path: 'fontawesome';
+$fa-font-size-base: 16px;
+
+@import '@fortawesome/fontawesome-free/scss/fontawesome';
+@import '@fortawesome/fontawesome-free/scss/regular';
+@import '@fortawesome/fontawesome-free/scss/solid';
+@import '@fortawesome/fontawesome-free/scss/brands';
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf b/resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf
new file mode 100644
index 0000000..5efb1d4
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2 b/resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2
new file mode 100644
index 0000000..36fbda7
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2 differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf b/resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf
new file mode 100644
index 0000000..838b4e2
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2 b/resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2
new file mode 100644
index 0000000..b6cabba
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2 differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf b/resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf
new file mode 100644
index 0000000..ec24749
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2 b/resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2
new file mode 100644
index 0000000..824d518
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2 differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf b/resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf
new file mode 100644
index 0000000..b175aa8
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf differ
diff --git a/resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2 b/resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2
new file mode 100644
index 0000000..e09b5a5
Binary files /dev/null and b/resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2 differ
diff --git a/resources/assets/vendor/fonts/tabler-icons.scss b/resources/assets/vendor/fonts/tabler-icons.scss
new file mode 100644
index 0000000..3c1f105
--- /dev/null
+++ b/resources/assets/vendor/fonts/tabler-icons.scss
@@ -0,0 +1,21294 @@
+@charset "UTF-8";
+/*!
+ * Tabler Icons 3.4.0 by tabler - https://tabler.io
+ * License - https://github.com/tabler/tabler-icons/blob/master/LICENSE
+ */
+$ti-font-family: 'tabler-icons' !default;
+$ti-font-path: 'tabler' !default;
+$ti-font-display: null !default;
+$ti-prefix: 'ti' !default;
+
+@font-face {
+ font-family: $ti-font-family;
+ font-style: normal;
+ font-weight: 400;
+ font-display: $ti-font-display;
+ src:
+ url('#{$ti-font-path}/tabler-icons.woff2?v3.4.0') format('woff2'),
+ url('#{$ti-font-path}/tabler-icons.woff?') format('woff'),
+ url('#{$ti-font-path}/tabler-icons.ttf?v3.4.0') format('truetype');
+}
+
+// @media screen and (-webkit-min-device-pixel-ratio: 0) {
+// @font-face {
+// font-family: $ti-font-family;
+// src: url('#{$ti-font-path}/tabler-icons.svg\##{$ti-font-family}') format('svg');
+// }
+// }
+.ti {
+ vertical-align: middle;
+ font-size: 1.25rem;
+ line-height: 1;
+ display: inline-block;
+}
+
+.#{$ti-prefix} {
+ font-family: $ti-font-family !important;
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+
+ /* Better Font Rendering */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+@import '../libs/_tabler/_tabler.scss';
+
+@function unicode($str) {
+ @return unquote('"') + unquote(str-insert($str, '\\', 1)) + unquote('"');
+}
+
+$ti-icon-a-b: unicode('ec36');
+$ti-icon-a-b-2: unicode('f25f');
+$ti-icon-a-b-off: unicode('f0a6');
+$ti-icon-abacus: unicode('f05c');
+$ti-icon-abacus-off: unicode('f3b6');
+$ti-icon-abc: unicode('f567');
+$ti-icon-access-point: unicode('ed1b');
+$ti-icon-access-point-off: unicode('ed1a');
+$ti-icon-accessible: unicode('eba9');
+$ti-icon-accessible-filled: unicode('f6ea');
+$ti-icon-accessible-off: unicode('f0a7');
+$ti-icon-activity: unicode('ed23');
+$ti-icon-activity-heartbeat: unicode('f0db');
+$ti-icon-ad: unicode('ea02');
+$ti-icon-ad-2: unicode('ef1f');
+$ti-icon-ad-circle: unicode('f79e');
+$ti-icon-ad-circle-filled: unicode('f7d3');
+$ti-icon-ad-circle-off: unicode('f79d');
+$ti-icon-ad-filled: unicode('f6eb');
+$ti-icon-ad-off: unicode('f3b7');
+$ti-icon-address-book: unicode('f021');
+$ti-icon-address-book-off: unicode('f3b8');
+$ti-icon-adjustments: unicode('ea03');
+$ti-icon-adjustments-alt: unicode('ec37');
+$ti-icon-adjustments-bolt: unicode('f7fb');
+$ti-icon-adjustments-cancel: unicode('f7fc');
+$ti-icon-adjustments-check: unicode('f7fd');
+$ti-icon-adjustments-code: unicode('f7fe');
+$ti-icon-adjustments-cog: unicode('f7ff');
+$ti-icon-adjustments-dollar: unicode('f800');
+$ti-icon-adjustments-down: unicode('f801');
+$ti-icon-adjustments-exclamation: unicode('f802');
+$ti-icon-adjustments-filled: unicode('f6ec');
+$ti-icon-adjustments-heart: unicode('f803');
+$ti-icon-adjustments-horizontal: unicode('ec38');
+$ti-icon-adjustments-minus: unicode('f804');
+$ti-icon-adjustments-off: unicode('f0a8');
+$ti-icon-adjustments-pause: unicode('f805');
+$ti-icon-adjustments-pin: unicode('f806');
+$ti-icon-adjustments-plus: unicode('f807');
+$ti-icon-adjustments-question: unicode('f808');
+$ti-icon-adjustments-search: unicode('f809');
+$ti-icon-adjustments-share: unicode('f80a');
+$ti-icon-adjustments-star: unicode('f80b');
+$ti-icon-adjustments-up: unicode('f80c');
+$ti-icon-adjustments-x: unicode('f80d');
+$ti-icon-aerial-lift: unicode('edfe');
+$ti-icon-affiliate: unicode('edff');
+$ti-icon-affiliate-filled: unicode('f6ed');
+$ti-icon-ai: unicode('fee7');
+$ti-icon-air-balloon: unicode('f4a6');
+$ti-icon-air-conditioning: unicode('f3a2');
+$ti-icon-air-conditioning-disabled: unicode('f542');
+$ti-icon-air-traffic-control: unicode('fb01');
+$ti-icon-alarm: unicode('ea04');
+$ti-icon-alarm-average: unicode('fc9e');
+$ti-icon-alarm-filled: unicode('f709');
+$ti-icon-alarm-minus: unicode('f630');
+$ti-icon-alarm-minus-filled: unicode('f70a');
+$ti-icon-alarm-off: unicode('f0a9');
+$ti-icon-alarm-plus: unicode('f631');
+$ti-icon-alarm-plus-filled: unicode('f70b');
+$ti-icon-alarm-snooze: unicode('f632');
+$ti-icon-alarm-snooze-filled: unicode('f70c');
+$ti-icon-album: unicode('f022');
+$ti-icon-album-off: unicode('f3b9');
+$ti-icon-alert-circle: unicode('ea05');
+$ti-icon-alert-circle-filled: unicode('f6ee');
+$ti-icon-alert-circle-off: unicode('fc65');
+$ti-icon-alert-hexagon: unicode('f80e');
+$ti-icon-alert-hexagon-filled: unicode('fa34');
+$ti-icon-alert-hexagon-off: unicode('fc66');
+$ti-icon-alert-octagon: unicode('ecc6');
+$ti-icon-alert-octagon-filled: unicode('f6ef');
+$ti-icon-alert-small: unicode('f80f');
+$ti-icon-alert-small-off: unicode('fc67');
+$ti-icon-alert-square: unicode('f811');
+$ti-icon-alert-square-filled: unicode('fa35');
+$ti-icon-alert-square-rounded: unicode('f810');
+$ti-icon-alert-square-rounded-filled: unicode('fa36');
+$ti-icon-alert-square-rounded-off: unicode('fc68');
+$ti-icon-alert-triangle: unicode('ea06');
+$ti-icon-alert-triangle-filled: unicode('f6f0');
+$ti-icon-alert-triangle-off: unicode('fc69');
+$ti-icon-alien: unicode('ebde');
+$ti-icon-alien-filled: unicode('f70d');
+$ti-icon-align-box-bottom-center: unicode('f530');
+$ti-icon-align-box-bottom-center-filled: unicode('f70e');
+$ti-icon-align-box-bottom-left: unicode('f531');
+$ti-icon-align-box-bottom-left-filled: unicode('f70f');
+$ti-icon-align-box-bottom-right: unicode('f532');
+$ti-icon-align-box-bottom-right-filled: unicode('f710');
+$ti-icon-align-box-center-bottom: unicode('facb');
+$ti-icon-align-box-center-middle: unicode('f79f');
+$ti-icon-align-box-center-middle-filled: unicode('f7d4');
+$ti-icon-align-box-center-stretch: unicode('facc');
+$ti-icon-align-box-center-top: unicode('facd');
+$ti-icon-align-box-left-bottom: unicode('f533');
+$ti-icon-align-box-left-bottom-filled: unicode('f711');
+$ti-icon-align-box-left-middle: unicode('f534');
+$ti-icon-align-box-left-middle-filled: unicode('f712');
+$ti-icon-align-box-left-stretch: unicode('face');
+$ti-icon-align-box-left-top: unicode('f535');
+$ti-icon-align-box-left-top-filled: unicode('f713');
+$ti-icon-align-box-right-bottom: unicode('f536');
+$ti-icon-align-box-right-bottom-filled: unicode('f714');
+$ti-icon-align-box-right-middle: unicode('f537');
+$ti-icon-align-box-right-middle-filled: unicode('f7d5');
+$ti-icon-align-box-right-stretch: unicode('facf');
+$ti-icon-align-box-right-top: unicode('f538');
+$ti-icon-align-box-right-top-filled: unicode('f715');
+$ti-icon-align-box-top-center: unicode('f539');
+$ti-icon-align-box-top-center-filled: unicode('f716');
+$ti-icon-align-box-top-left: unicode('f53a');
+$ti-icon-align-box-top-left-filled: unicode('f717');
+$ti-icon-align-box-top-right: unicode('f53b');
+$ti-icon-align-box-top-right-filled: unicode('f718');
+$ti-icon-align-center: unicode('ea07');
+$ti-icon-align-justified: unicode('ea08');
+$ti-icon-align-left: unicode('ea09');
+$ti-icon-align-right: unicode('ea0a');
+$ti-icon-alpha: unicode('f543');
+$ti-icon-alphabet-cyrillic: unicode('f1df');
+$ti-icon-alphabet-greek: unicode('f1e0');
+$ti-icon-alphabet-latin: unicode('f1e1');
+$ti-icon-alt: unicode('fc54');
+$ti-icon-ambulance: unicode('ebf5');
+$ti-icon-ampersand: unicode('f229');
+$ti-icon-analyze: unicode('f3a3');
+$ti-icon-analyze-filled: unicode('f719');
+$ti-icon-analyze-off: unicode('f3ba');
+$ti-icon-anchor: unicode('eb76');
+$ti-icon-anchor-off: unicode('f0f7');
+$ti-icon-angle: unicode('ef20');
+$ti-icon-ankh: unicode('f1cd');
+$ti-icon-antenna: unicode('f094');
+$ti-icon-antenna-bars-1: unicode('ecc7');
+$ti-icon-antenna-bars-2: unicode('ecc8');
+$ti-icon-antenna-bars-3: unicode('ecc9');
+$ti-icon-antenna-bars-4: unicode('ecca');
+$ti-icon-antenna-bars-5: unicode('eccb');
+$ti-icon-antenna-bars-off: unicode('f0aa');
+$ti-icon-antenna-off: unicode('f3bb');
+$ti-icon-aperture: unicode('eb58');
+$ti-icon-aperture-off: unicode('f3bc');
+$ti-icon-api: unicode('effd');
+$ti-icon-api-app: unicode('effc');
+$ti-icon-api-app-off: unicode('f0ab');
+$ti-icon-api-off: unicode('f0f8');
+$ti-icon-app-window: unicode('efe6');
+$ti-icon-app-window-filled: unicode('f71a');
+$ti-icon-apple: unicode('ef21');
+$ti-icon-apps: unicode('ebb6');
+$ti-icon-apps-filled: unicode('f6f1');
+$ti-icon-apps-off: unicode('f0ac');
+$ti-icon-archery-arrow: unicode('fc55');
+$ti-icon-archive: unicode('ea0b');
+$ti-icon-archive-filled: unicode('fa82');
+$ti-icon-archive-off: unicode('f0ad');
+$ti-icon-armchair: unicode('ef9e');
+$ti-icon-armchair-2: unicode('efe7');
+$ti-icon-armchair-2-off: unicode('f3bd');
+$ti-icon-armchair-off: unicode('f3be');
+$ti-icon-arrow-autofit-content: unicode('ef31');
+$ti-icon-arrow-autofit-content-filled: unicode('f6f2');
+$ti-icon-arrow-autofit-down: unicode('ef32');
+$ti-icon-arrow-autofit-height: unicode('ef33');
+$ti-icon-arrow-autofit-left: unicode('ef34');
+$ti-icon-arrow-autofit-right: unicode('ef35');
+$ti-icon-arrow-autofit-up: unicode('ef36');
+$ti-icon-arrow-autofit-width: unicode('ef37');
+$ti-icon-arrow-back: unicode('ea0c');
+$ti-icon-arrow-back-up: unicode('eb77');
+$ti-icon-arrow-back-up-double: unicode('f9ec');
+$ti-icon-arrow-badge-down: unicode('f60b');
+$ti-icon-arrow-badge-down-filled: unicode('f7d6');
+$ti-icon-arrow-badge-left: unicode('f60c');
+$ti-icon-arrow-badge-left-filled: unicode('f7d7');
+$ti-icon-arrow-badge-right: unicode('f60d');
+$ti-icon-arrow-badge-right-filled: unicode('f7d8');
+$ti-icon-arrow-badge-up: unicode('f60e');
+$ti-icon-arrow-badge-up-filled: unicode('f7d9');
+$ti-icon-arrow-bar-both: unicode('fadd');
+$ti-icon-arrow-bar-down: unicode('ea0d');
+$ti-icon-arrow-bar-left: unicode('ea0e');
+$ti-icon-arrow-bar-right: unicode('ea0f');
+$ti-icon-arrow-bar-to-down: unicode('ec88');
+$ti-icon-arrow-bar-to-left: unicode('ec89');
+$ti-icon-arrow-bar-to-right: unicode('ec8a');
+$ti-icon-arrow-bar-to-up: unicode('ec8b');
+$ti-icon-arrow-bar-up: unicode('ea10');
+$ti-icon-arrow-bear-left: unicode('f045');
+$ti-icon-arrow-bear-left-2: unicode('f044');
+$ti-icon-arrow-bear-right: unicode('f047');
+$ti-icon-arrow-bear-right-2: unicode('f046');
+$ti-icon-arrow-big-down: unicode('edda');
+$ti-icon-arrow-big-down-filled: unicode('f6c6');
+$ti-icon-arrow-big-down-line: unicode('efe8');
+$ti-icon-arrow-big-down-line-filled: unicode('f6c7');
+$ti-icon-arrow-big-down-lines: unicode('efe9');
+$ti-icon-arrow-big-down-lines-filled: unicode('f6c8');
+$ti-icon-arrow-big-left: unicode('eddb');
+$ti-icon-arrow-big-left-filled: unicode('f6c9');
+$ti-icon-arrow-big-left-line: unicode('efea');
+$ti-icon-arrow-big-left-line-filled: unicode('f6ca');
+$ti-icon-arrow-big-left-lines: unicode('efeb');
+$ti-icon-arrow-big-left-lines-filled: unicode('f6cb');
+$ti-icon-arrow-big-right: unicode('eddc');
+$ti-icon-arrow-big-right-filled: unicode('f6cc');
+$ti-icon-arrow-big-right-line: unicode('efec');
+$ti-icon-arrow-big-right-line-filled: unicode('f6cd');
+$ti-icon-arrow-big-right-lines: unicode('efed');
+$ti-icon-arrow-big-right-lines-filled: unicode('f6ce');
+$ti-icon-arrow-big-up: unicode('eddd');
+$ti-icon-arrow-big-up-filled: unicode('f6cf');
+$ti-icon-arrow-big-up-line: unicode('efee');
+$ti-icon-arrow-big-up-line-filled: unicode('f6d0');
+$ti-icon-arrow-big-up-lines: unicode('efef');
+$ti-icon-arrow-big-up-lines-filled: unicode('f6d1');
+$ti-icon-arrow-bounce: unicode('f3a4');
+$ti-icon-arrow-capsule: unicode('fade');
+$ti-icon-arrow-curve-left: unicode('f048');
+$ti-icon-arrow-curve-right: unicode('f049');
+$ti-icon-arrow-down: unicode('ea16');
+$ti-icon-arrow-down-bar: unicode('ed98');
+$ti-icon-arrow-down-circle: unicode('ea11');
+$ti-icon-arrow-down-from-arc: unicode('fd86');
+$ti-icon-arrow-down-left: unicode('ea13');
+$ti-icon-arrow-down-left-circle: unicode('ea12');
+$ti-icon-arrow-down-rhombus: unicode('f61d');
+$ti-icon-arrow-down-right: unicode('ea15');
+$ti-icon-arrow-down-right-circle: unicode('ea14');
+$ti-icon-arrow-down-square: unicode('ed9a');
+$ti-icon-arrow-down-tail: unicode('ed9b');
+$ti-icon-arrow-down-to-arc: unicode('fd87');
+$ti-icon-arrow-elbow-left: unicode('f9ed');
+$ti-icon-arrow-elbow-right: unicode('f9ee');
+$ti-icon-arrow-fork: unicode('f04a');
+$ti-icon-arrow-forward: unicode('ea17');
+$ti-icon-arrow-forward-up: unicode('eb78');
+$ti-icon-arrow-forward-up-double: unicode('f9ef');
+$ti-icon-arrow-guide: unicode('f22a');
+$ti-icon-arrow-iteration: unicode('f578');
+$ti-icon-arrow-left: unicode('ea19');
+$ti-icon-arrow-left-bar: unicode('ed9c');
+$ti-icon-arrow-left-circle: unicode('ea18');
+$ti-icon-arrow-left-from-arc: unicode('fd88');
+$ti-icon-arrow-left-rhombus: unicode('f61e');
+$ti-icon-arrow-left-right: unicode('f04b');
+$ti-icon-arrow-left-square: unicode('ed9d');
+$ti-icon-arrow-left-tail: unicode('ed9e');
+$ti-icon-arrow-left-to-arc: unicode('fd89');
+$ti-icon-arrow-loop-left: unicode('ed9f');
+$ti-icon-arrow-loop-left-2: unicode('f04c');
+$ti-icon-arrow-loop-right: unicode('eda0');
+$ti-icon-arrow-loop-right-2: unicode('f04d');
+$ti-icon-arrow-merge: unicode('f04e');
+$ti-icon-arrow-merge-alt-left: unicode('fc9f');
+$ti-icon-arrow-merge-alt-right: unicode('fca0');
+$ti-icon-arrow-merge-both: unicode('f23b');
+$ti-icon-arrow-merge-left: unicode('f23c');
+$ti-icon-arrow-merge-right: unicode('f23d');
+$ti-icon-arrow-move-down: unicode('f2ba');
+$ti-icon-arrow-move-left: unicode('f2bb');
+$ti-icon-arrow-move-right: unicode('f2bc');
+$ti-icon-arrow-move-up: unicode('f2bd');
+$ti-icon-arrow-narrow-down: unicode('ea1a');
+$ti-icon-arrow-narrow-left: unicode('ea1b');
+$ti-icon-arrow-narrow-right: unicode('ea1c');
+$ti-icon-arrow-narrow-up: unicode('ea1d');
+$ti-icon-arrow-ramp-left: unicode('ed3c');
+$ti-icon-arrow-ramp-left-2: unicode('f04f');
+$ti-icon-arrow-ramp-left-3: unicode('f050');
+$ti-icon-arrow-ramp-right: unicode('ed3d');
+$ti-icon-arrow-ramp-right-2: unicode('f051');
+$ti-icon-arrow-ramp-right-3: unicode('f052');
+$ti-icon-arrow-right: unicode('ea1f');
+$ti-icon-arrow-right-bar: unicode('eda1');
+$ti-icon-arrow-right-circle: unicode('ea1e');
+$ti-icon-arrow-right-from-arc: unicode('fd8a');
+$ti-icon-arrow-right-rhombus: unicode('f61f');
+$ti-icon-arrow-right-square: unicode('eda2');
+$ti-icon-arrow-right-tail: unicode('eda3');
+$ti-icon-arrow-right-to-arc: unicode('fd8b');
+$ti-icon-arrow-rotary-first-left: unicode('f053');
+$ti-icon-arrow-rotary-first-right: unicode('f054');
+$ti-icon-arrow-rotary-last-left: unicode('f055');
+$ti-icon-arrow-rotary-last-right: unicode('f056');
+$ti-icon-arrow-rotary-left: unicode('f057');
+$ti-icon-arrow-rotary-right: unicode('f058');
+$ti-icon-arrow-rotary-straight: unicode('f059');
+$ti-icon-arrow-roundabout-left: unicode('f22b');
+$ti-icon-arrow-roundabout-right: unicode('f22c');
+$ti-icon-arrow-sharp-turn-left: unicode('f05a');
+$ti-icon-arrow-sharp-turn-right: unicode('f05b');
+$ti-icon-arrow-up: unicode('ea25');
+$ti-icon-arrow-up-bar: unicode('eda4');
+$ti-icon-arrow-up-circle: unicode('ea20');
+$ti-icon-arrow-up-from-arc: unicode('fd8c');
+$ti-icon-arrow-up-left: unicode('ea22');
+$ti-icon-arrow-up-left-circle: unicode('ea21');
+$ti-icon-arrow-up-rhombus: unicode('f620');
+$ti-icon-arrow-up-right: unicode('ea24');
+$ti-icon-arrow-up-right-circle: unicode('ea23');
+$ti-icon-arrow-up-square: unicode('eda6');
+$ti-icon-arrow-up-tail: unicode('eda7');
+$ti-icon-arrow-up-to-arc: unicode('fd8d');
+$ti-icon-arrow-wave-left-down: unicode('eda8');
+$ti-icon-arrow-wave-left-up: unicode('eda9');
+$ti-icon-arrow-wave-right-down: unicode('edaa');
+$ti-icon-arrow-wave-right-up: unicode('edab');
+$ti-icon-arrow-zig-zag: unicode('f4a7');
+$ti-icon-arrows-cross: unicode('effe');
+$ti-icon-arrows-diagonal: unicode('ea27');
+$ti-icon-arrows-diagonal-2: unicode('ea26');
+$ti-icon-arrows-diagonal-minimize: unicode('ef39');
+$ti-icon-arrows-diagonal-minimize-2: unicode('ef38');
+$ti-icon-arrows-diff: unicode('f296');
+$ti-icon-arrows-double-ne-sw: unicode('edde');
+$ti-icon-arrows-double-nw-se: unicode('eddf');
+$ti-icon-arrows-double-se-nw: unicode('ede0');
+$ti-icon-arrows-double-sw-ne: unicode('ede1');
+$ti-icon-arrows-down: unicode('edad');
+$ti-icon-arrows-down-up: unicode('edac');
+$ti-icon-arrows-exchange: unicode('f1f4');
+$ti-icon-arrows-exchange-2: unicode('f1f3');
+$ti-icon-arrows-horizontal: unicode('eb59');
+$ti-icon-arrows-join: unicode('edaf');
+$ti-icon-arrows-join-2: unicode('edae');
+$ti-icon-arrows-left: unicode('edb1');
+$ti-icon-arrows-left-down: unicode('ee00');
+$ti-icon-arrows-left-right: unicode('edb0');
+$ti-icon-arrows-maximize: unicode('ea28');
+$ti-icon-arrows-minimize: unicode('ea29');
+$ti-icon-arrows-move: unicode('f22f');
+$ti-icon-arrows-move-horizontal: unicode('f22d');
+$ti-icon-arrows-move-vertical: unicode('f22e');
+$ti-icon-arrows-random: unicode('f095');
+$ti-icon-arrows-right: unicode('edb3');
+$ti-icon-arrows-right-down: unicode('ee01');
+$ti-icon-arrows-right-left: unicode('edb2');
+$ti-icon-arrows-shuffle: unicode('f000');
+$ti-icon-arrows-shuffle-2: unicode('efff');
+$ti-icon-arrows-sort: unicode('eb5a');
+$ti-icon-arrows-split: unicode('edb5');
+$ti-icon-arrows-split-2: unicode('edb4');
+$ti-icon-arrows-transfer-down: unicode('f2cc');
+$ti-icon-arrows-transfer-up: unicode('f2cd');
+$ti-icon-arrows-up: unicode('edb7');
+$ti-icon-arrows-up-down: unicode('edb6');
+$ti-icon-arrows-up-left: unicode('ee02');
+$ti-icon-arrows-up-right: unicode('ee03');
+$ti-icon-arrows-vertical: unicode('eb5b');
+$ti-icon-artboard: unicode('ea2a');
+$ti-icon-artboard-filled: unicode('fa83');
+$ti-icon-artboard-off: unicode('f0ae');
+$ti-icon-article: unicode('f1e2');
+$ti-icon-article-filled: unicode('f7da');
+$ti-icon-article-off: unicode('f3bf');
+$ti-icon-aspect-ratio: unicode('ed30');
+$ti-icon-aspect-ratio-filled: unicode('f7db');
+$ti-icon-aspect-ratio-off: unicode('f0af');
+$ti-icon-assembly: unicode('f24d');
+$ti-icon-assembly-filled: unicode('fe9e');
+$ti-icon-assembly-off: unicode('f3c0');
+$ti-icon-asset: unicode('f1ce');
+$ti-icon-asset-filled: unicode('fe9d');
+$ti-icon-asterisk: unicode('efd5');
+$ti-icon-asterisk-simple: unicode('efd4');
+$ti-icon-at: unicode('ea2b');
+$ti-icon-at-off: unicode('f0b0');
+$ti-icon-atom: unicode('eb79');
+$ti-icon-atom-2: unicode('ebdf');
+$ti-icon-atom-2-filled: unicode('f71b');
+$ti-icon-atom-off: unicode('f0f9');
+$ti-icon-augmented-reality: unicode('f023');
+$ti-icon-augmented-reality-2: unicode('f37e');
+$ti-icon-augmented-reality-off: unicode('f3c1');
+$ti-icon-auth-2fa: unicode('eca0');
+$ti-icon-automatic-gearbox: unicode('fc89');
+$ti-icon-avocado: unicode('fd8e');
+$ti-icon-award: unicode('ea2c');
+$ti-icon-award-filled: unicode('f71c');
+$ti-icon-award-off: unicode('f0fa');
+$ti-icon-axe: unicode('ef9f');
+$ti-icon-axis-x: unicode('ef45');
+$ti-icon-axis-y: unicode('ef46');
+$ti-icon-baby-bottle: unicode('f5d2');
+$ti-icon-baby-carriage: unicode('f05d');
+$ti-icon-baby-carriage-filled: unicode('fe9c');
+$ti-icon-background: unicode('fd2c');
+$ti-icon-backhoe: unicode('ed86');
+$ti-icon-backpack: unicode('ef47');
+$ti-icon-backpack-off: unicode('f3c2');
+$ti-icon-backslash: unicode('fab9');
+$ti-icon-backspace: unicode('ea2d');
+$ti-icon-backspace-filled: unicode('f7dc');
+$ti-icon-badge: unicode('efc2');
+$ti-icon-badge-3d: unicode('f555');
+$ti-icon-badge-3d-filled: unicode('fe9b');
+$ti-icon-badge-4k: unicode('f556');
+$ti-icon-badge-4k-filled: unicode('fe9a');
+$ti-icon-badge-8k: unicode('f557');
+$ti-icon-badge-8k-filled: unicode('fe99');
+$ti-icon-badge-ad: unicode('f558');
+$ti-icon-badge-ad-filled: unicode('fe98');
+$ti-icon-badge-ad-off: unicode('fd8f');
+$ti-icon-badge-ar: unicode('f559');
+$ti-icon-badge-ar-filled: unicode('fe97');
+$ti-icon-badge-cc: unicode('f55a');
+$ti-icon-badge-cc-filled: unicode('fe96');
+$ti-icon-badge-filled: unicode('f667');
+$ti-icon-badge-hd: unicode('f55b');
+$ti-icon-badge-hd-filled: unicode('fe95');
+$ti-icon-badge-off: unicode('f0fb');
+$ti-icon-badge-sd: unicode('f55c');
+$ti-icon-badge-sd-filled: unicode('fe94');
+$ti-icon-badge-tm: unicode('f55d');
+$ti-icon-badge-tm-filled: unicode('fe93');
+$ti-icon-badge-vo: unicode('f55e');
+$ti-icon-badge-vo-filled: unicode('fe92');
+$ti-icon-badge-vr: unicode('f55f');
+$ti-icon-badge-vr-filled: unicode('fe91');
+$ti-icon-badge-wc: unicode('f560');
+$ti-icon-badge-wc-filled: unicode('fe90');
+$ti-icon-badges: unicode('efc3');
+$ti-icon-badges-filled: unicode('f7dd');
+$ti-icon-badges-off: unicode('f0fc');
+$ti-icon-baguette: unicode('f3a5');
+$ti-icon-ball-american-football: unicode('ee04');
+$ti-icon-ball-american-football-off: unicode('f3c3');
+$ti-icon-ball-baseball: unicode('efa0');
+$ti-icon-ball-basketball: unicode('ec28');
+$ti-icon-ball-bowling: unicode('ec29');
+$ti-icon-ball-football: unicode('ee06');
+$ti-icon-ball-football-off: unicode('ee05');
+$ti-icon-ball-tennis: unicode('ec2a');
+$ti-icon-ball-volleyball: unicode('ec2b');
+$ti-icon-balloon: unicode('ef3a');
+$ti-icon-balloon-filled: unicode('fa84');
+$ti-icon-balloon-off: unicode('f0fd');
+$ti-icon-ballpen: unicode('f06e');
+$ti-icon-ballpen-filled: unicode('fa85');
+$ti-icon-ballpen-off: unicode('f0b1');
+$ti-icon-ban: unicode('ea2e');
+$ti-icon-bandage: unicode('eb7a');
+$ti-icon-bandage-filled: unicode('f7de');
+$ti-icon-bandage-off: unicode('f3c4');
+$ti-icon-barbell: unicode('eff0');
+$ti-icon-barbell-filled: unicode('fe8f');
+$ti-icon-barbell-off: unicode('f0b2');
+$ti-icon-barcode: unicode('ebc6');
+$ti-icon-barcode-off: unicode('f0b3');
+$ti-icon-barrel: unicode('f0b4');
+$ti-icon-barrel-off: unicode('f0fe');
+$ti-icon-barrier-block: unicode('f00e');
+$ti-icon-barrier-block-filled: unicode('fe8e');
+$ti-icon-barrier-block-off: unicode('f0b5');
+$ti-icon-baseline: unicode('f024');
+$ti-icon-baseline-density-large: unicode('f9f0');
+$ti-icon-baseline-density-medium: unicode('f9f1');
+$ti-icon-baseline-density-small: unicode('f9f2');
+$ti-icon-basket: unicode('ebe1');
+$ti-icon-basket-bolt: unicode('fb43');
+$ti-icon-basket-cancel: unicode('fb44');
+$ti-icon-basket-check: unicode('fb45');
+$ti-icon-basket-code: unicode('fb46');
+$ti-icon-basket-cog: unicode('fb47');
+$ti-icon-basket-discount: unicode('fb48');
+$ti-icon-basket-dollar: unicode('fb49');
+$ti-icon-basket-down: unicode('fb4a');
+$ti-icon-basket-exclamation: unicode('fb4b');
+$ti-icon-basket-filled: unicode('f7df');
+$ti-icon-basket-heart: unicode('fb4c');
+$ti-icon-basket-minus: unicode('fb4d');
+$ti-icon-basket-off: unicode('f0b6');
+$ti-icon-basket-pause: unicode('fb4e');
+$ti-icon-basket-pin: unicode('fb4f');
+$ti-icon-basket-plus: unicode('fb50');
+$ti-icon-basket-question: unicode('fb51');
+$ti-icon-basket-search: unicode('fb52');
+$ti-icon-basket-share: unicode('fb53');
+$ti-icon-basket-star: unicode('fb54');
+$ti-icon-basket-up: unicode('fb55');
+$ti-icon-basket-x: unicode('fb56');
+$ti-icon-bat: unicode('f284');
+$ti-icon-bath: unicode('ef48');
+$ti-icon-bath-filled: unicode('f71d');
+$ti-icon-bath-off: unicode('f0ff');
+$ti-icon-battery: unicode('ea34');
+$ti-icon-battery-1: unicode('ea2f');
+$ti-icon-battery-1-filled: unicode('f71e');
+$ti-icon-battery-2: unicode('ea30');
+$ti-icon-battery-2-filled: unicode('f71f');
+$ti-icon-battery-3: unicode('ea31');
+$ti-icon-battery-3-filled: unicode('f720');
+$ti-icon-battery-4: unicode('ea32');
+$ti-icon-battery-4-filled: unicode('f721');
+$ti-icon-battery-automotive: unicode('ee07');
+$ti-icon-battery-charging: unicode('ea33');
+$ti-icon-battery-charging-2: unicode('ef3b');
+$ti-icon-battery-eco: unicode('ef3c');
+$ti-icon-battery-filled: unicode('f668');
+$ti-icon-battery-off: unicode('ed1c');
+$ti-icon-beach: unicode('ef3d');
+$ti-icon-beach-off: unicode('f0b7');
+$ti-icon-bed: unicode('eb5c');
+$ti-icon-bed-filled: unicode('f7e0');
+$ti-icon-bed-flat: unicode('fca1');
+$ti-icon-bed-flat-filled: unicode('fe8d');
+$ti-icon-bed-off: unicode('f100');
+$ti-icon-beer: unicode('efa1');
+$ti-icon-beer-filled: unicode('f7e1');
+$ti-icon-beer-off: unicode('f101');
+$ti-icon-bell: unicode('ea35');
+$ti-icon-bell-bolt: unicode('f812');
+$ti-icon-bell-cancel: unicode('f813');
+$ti-icon-bell-check: unicode('f814');
+$ti-icon-bell-code: unicode('f815');
+$ti-icon-bell-cog: unicode('f816');
+$ti-icon-bell-dollar: unicode('f817');
+$ti-icon-bell-down: unicode('f818');
+$ti-icon-bell-exclamation: unicode('f819');
+$ti-icon-bell-filled: unicode('f669');
+$ti-icon-bell-heart: unicode('f81a');
+$ti-icon-bell-minus: unicode('ede2');
+$ti-icon-bell-minus-filled: unicode('f722');
+$ti-icon-bell-off: unicode('ece9');
+$ti-icon-bell-pause: unicode('f81b');
+$ti-icon-bell-pin: unicode('f81c');
+$ti-icon-bell-plus: unicode('ede3');
+$ti-icon-bell-plus-filled: unicode('f723');
+$ti-icon-bell-question: unicode('f81d');
+$ti-icon-bell-ringing: unicode('ed07');
+$ti-icon-bell-ringing-2: unicode('ede4');
+$ti-icon-bell-ringing-2-filled: unicode('f724');
+$ti-icon-bell-ringing-filled: unicode('f725');
+$ti-icon-bell-school: unicode('f05e');
+$ti-icon-bell-search: unicode('f81e');
+$ti-icon-bell-share: unicode('f81f');
+$ti-icon-bell-star: unicode('f820');
+$ti-icon-bell-up: unicode('f821');
+$ti-icon-bell-x: unicode('ede5');
+$ti-icon-bell-x-filled: unicode('f726');
+$ti-icon-bell-z: unicode('eff1');
+$ti-icon-bell-z-filled: unicode('f727');
+$ti-icon-beta: unicode('f544');
+$ti-icon-bible: unicode('efc4');
+$ti-icon-bike: unicode('ea36');
+$ti-icon-bike-off: unicode('f0b8');
+$ti-icon-binary: unicode('ee08');
+$ti-icon-binary-off: unicode('f3c5');
+$ti-icon-binary-tree: unicode('f5d4');
+$ti-icon-binary-tree-2: unicode('f5d3');
+$ti-icon-biohazard: unicode('ecb8');
+$ti-icon-biohazard-filled: unicode('fe8c');
+$ti-icon-biohazard-off: unicode('f0b9');
+$ti-icon-blade: unicode('f4bd');
+$ti-icon-blade-filled: unicode('f7e2');
+$ti-icon-bleach: unicode('f2f3');
+$ti-icon-bleach-chlorine: unicode('f2f0');
+$ti-icon-bleach-no-chlorine: unicode('f2f1');
+$ti-icon-bleach-off: unicode('f2f2');
+$ti-icon-blend-mode: unicode('feb0');
+$ti-icon-blender: unicode('fca2');
+$ti-icon-blob: unicode('feaf');
+$ti-icon-blob-filled: unicode('feb1');
+$ti-icon-blockquote: unicode('ee09');
+$ti-icon-bluetooth: unicode('ea37');
+$ti-icon-bluetooth-connected: unicode('ecea');
+$ti-icon-bluetooth-off: unicode('eceb');
+$ti-icon-bluetooth-x: unicode('f081');
+$ti-icon-blur: unicode('ef8c');
+$ti-icon-blur-off: unicode('f3c6');
+$ti-icon-bmp: unicode('f3a6');
+$ti-icon-body-scan: unicode('fca3');
+$ti-icon-bold: unicode('eb7b');
+$ti-icon-bold-off: unicode('f0ba');
+$ti-icon-bolt: unicode('ea38');
+$ti-icon-bolt-off: unicode('ecec');
+$ti-icon-bomb: unicode('f59c');
+$ti-icon-bomb-filled: unicode('fa86');
+$ti-icon-bone: unicode('edb8');
+$ti-icon-bone-filled: unicode('fe8b');
+$ti-icon-bone-off: unicode('f0bb');
+$ti-icon-bong: unicode('f3a7');
+$ti-icon-bong-off: unicode('f3c7');
+$ti-icon-book: unicode('ea39');
+$ti-icon-book-2: unicode('efc5');
+$ti-icon-book-download: unicode('f070');
+$ti-icon-book-filled: unicode('fa87');
+$ti-icon-book-off: unicode('f0bc');
+$ti-icon-book-upload: unicode('f071');
+$ti-icon-bookmark: unicode('ea3a');
+$ti-icon-bookmark-ai: unicode('fc8a');
+$ti-icon-bookmark-edit: unicode('fa5e');
+$ti-icon-bookmark-filled: unicode('fa88');
+$ti-icon-bookmark-minus: unicode('fa5f');
+$ti-icon-bookmark-off: unicode('eced');
+$ti-icon-bookmark-plus: unicode('fa60');
+$ti-icon-bookmark-question: unicode('fa61');
+$ti-icon-bookmarks: unicode('ed08');
+$ti-icon-bookmarks-filled: unicode('fb1f');
+$ti-icon-bookmarks-off: unicode('f0bd');
+$ti-icon-books: unicode('eff2');
+$ti-icon-books-off: unicode('f0be');
+$ti-icon-boom: unicode('fdbe');
+$ti-icon-boom-filled: unicode('fe8a');
+$ti-icon-border-all: unicode('ea3b');
+$ti-icon-border-bottom: unicode('ea3c');
+$ti-icon-border-bottom-plus: unicode('fdbd');
+$ti-icon-border-corner-ios: unicode('fd98');
+$ti-icon-border-corner-pill: unicode('fd62');
+$ti-icon-border-corner-rounded: unicode('fd63');
+$ti-icon-border-corner-square: unicode('fd64');
+$ti-icon-border-corners: unicode('f7a0');
+$ti-icon-border-horizontal: unicode('ea3d');
+$ti-icon-border-inner: unicode('ea3e');
+$ti-icon-border-left: unicode('ea3f');
+$ti-icon-border-left-plus: unicode('fdbc');
+$ti-icon-border-none: unicode('ea40');
+$ti-icon-border-outer: unicode('ea41');
+$ti-icon-border-radius: unicode('eb7c');
+$ti-icon-border-right: unicode('ea42');
+$ti-icon-border-right-plus: unicode('fdbb');
+$ti-icon-border-sides: unicode('f7a1');
+$ti-icon-border-style: unicode('ee0a');
+$ti-icon-border-style-2: unicode('ef22');
+$ti-icon-border-top: unicode('ea43');
+$ti-icon-border-top-plus: unicode('fdba');
+$ti-icon-border-vertical: unicode('ea44');
+$ti-icon-bottle: unicode('ef0b');
+$ti-icon-bottle-filled: unicode('fa89');
+$ti-icon-bottle-off: unicode('f3c8');
+$ti-icon-bounce-left: unicode('f59d');
+$ti-icon-bounce-left-filled: unicode('fb20');
+$ti-icon-bounce-right: unicode('f59e');
+$ti-icon-bounce-right-filled: unicode('fb21');
+$ti-icon-bow: unicode('f096');
+$ti-icon-bow-filled: unicode('fe89');
+$ti-icon-bowl: unicode('f4fa');
+$ti-icon-bowl-chopsticks: unicode('fd90');
+$ti-icon-bowl-chopsticks-filled: unicode('fe88');
+$ti-icon-bowl-filled: unicode('fb22');
+$ti-icon-bowl-spoon: unicode('fd91');
+$ti-icon-bowl-spoon-filled: unicode('fe87');
+$ti-icon-box: unicode('ea45');
+$ti-icon-box-align-bottom: unicode('f2a8');
+$ti-icon-box-align-bottom-filled: unicode('fa8a');
+$ti-icon-box-align-bottom-left: unicode('f2ce');
+$ti-icon-box-align-bottom-left-filled: unicode('fa8b');
+$ti-icon-box-align-bottom-right: unicode('f2cf');
+$ti-icon-box-align-bottom-right-filled: unicode('fa8c');
+$ti-icon-box-align-left: unicode('f2a9');
+$ti-icon-box-align-left-filled: unicode('fa8d');
+$ti-icon-box-align-right: unicode('f2aa');
+$ti-icon-box-align-right-filled: unicode('fa8e');
+$ti-icon-box-align-top: unicode('f2ab');
+$ti-icon-box-align-top-filled: unicode('fa8f');
+$ti-icon-box-align-top-left: unicode('f2d0');
+$ti-icon-box-align-top-left-filled: unicode('fa90');
+$ti-icon-box-align-top-right: unicode('f2d1');
+$ti-icon-box-align-top-right-filled: unicode('fa91');
+$ti-icon-box-margin: unicode('ee0b');
+$ti-icon-box-model: unicode('ee0c');
+$ti-icon-box-model-2: unicode('ef23');
+$ti-icon-box-model-2-off: unicode('f3c9');
+$ti-icon-box-model-off: unicode('f3ca');
+$ti-icon-box-multiple: unicode('ee17');
+$ti-icon-box-multiple-0: unicode('ee0d');
+$ti-icon-box-multiple-1: unicode('ee0e');
+$ti-icon-box-multiple-2: unicode('ee0f');
+$ti-icon-box-multiple-3: unicode('ee10');
+$ti-icon-box-multiple-4: unicode('ee11');
+$ti-icon-box-multiple-5: unicode('ee12');
+$ti-icon-box-multiple-6: unicode('ee13');
+$ti-icon-box-multiple-7: unicode('ee14');
+$ti-icon-box-multiple-8: unicode('ee15');
+$ti-icon-box-multiple-9: unicode('ee16');
+$ti-icon-box-off: unicode('f102');
+$ti-icon-box-padding: unicode('ee18');
+$ti-icon-braces: unicode('ebcc');
+$ti-icon-braces-off: unicode('f0bf');
+$ti-icon-brackets: unicode('ebcd');
+$ti-icon-brackets-angle: unicode('fcb2');
+$ti-icon-brackets-angle-off: unicode('fcb1');
+$ti-icon-brackets-contain: unicode('f1e5');
+$ti-icon-brackets-contain-end: unicode('f1e3');
+$ti-icon-brackets-contain-start: unicode('f1e4');
+$ti-icon-brackets-off: unicode('f0c0');
+$ti-icon-braille: unicode('f545');
+$ti-icon-brain: unicode('f59f');
+$ti-icon-brand-4chan: unicode('f494');
+$ti-icon-brand-abstract: unicode('f495');
+$ti-icon-brand-adobe: unicode('f0dc');
+$ti-icon-brand-adonis-js: unicode('f496');
+$ti-icon-brand-airbnb: unicode('ed68');
+$ti-icon-brand-airtable: unicode('ef6a');
+$ti-icon-brand-algolia: unicode('f390');
+$ti-icon-brand-alipay: unicode('f7a2');
+$ti-icon-brand-alpine-js: unicode('f324');
+$ti-icon-brand-amazon: unicode('f230');
+$ti-icon-brand-amd: unicode('f653');
+$ti-icon-brand-amigo: unicode('f5f9');
+$ti-icon-brand-among-us: unicode('f205');
+$ti-icon-brand-android: unicode('ec16');
+$ti-icon-brand-angular: unicode('ef6b');
+$ti-icon-brand-ansible: unicode('fa70');
+$ti-icon-brand-ao3: unicode('f5e8');
+$ti-icon-brand-appgallery: unicode('f231');
+$ti-icon-brand-apple: unicode('ec17');
+$ti-icon-brand-apple-arcade: unicode('ed69');
+$ti-icon-brand-apple-filled: unicode('fd74');
+$ti-icon-brand-apple-podcast: unicode('f1e6');
+$ti-icon-brand-appstore: unicode('ed24');
+$ti-icon-brand-arc: unicode('feae');
+$ti-icon-brand-asana: unicode('edc5');
+$ti-icon-brand-astro: unicode('fdb9');
+$ti-icon-brand-auth0: unicode('fcb3');
+$ti-icon-brand-aws: unicode('fa4c');
+$ti-icon-brand-azure: unicode('fa4d');
+$ti-icon-brand-backbone: unicode('f325');
+$ti-icon-brand-badoo: unicode('f206');
+$ti-icon-brand-baidu: unicode('f5e9');
+$ti-icon-brand-bandcamp: unicode('f207');
+$ti-icon-brand-bandlab: unicode('f5fa');
+$ti-icon-brand-beats: unicode('f208');
+$ti-icon-brand-behance: unicode('ec6e');
+$ti-icon-brand-bilibili: unicode('f6d2');
+$ti-icon-brand-binance: unicode('f5a0');
+$ti-icon-brand-bing: unicode('edc6');
+$ti-icon-brand-bitbucket: unicode('edc7');
+$ti-icon-brand-blackberry: unicode('f568');
+$ti-icon-brand-blender: unicode('f326');
+$ti-icon-brand-blogger: unicode('f35a');
+$ti-icon-brand-bluesky: unicode('fd75');
+$ti-icon-brand-booking: unicode('edc8');
+$ti-icon-brand-bootstrap: unicode('ef3e');
+$ti-icon-brand-bulma: unicode('f327');
+$ti-icon-brand-bumble: unicode('f5fb');
+$ti-icon-brand-bunpo: unicode('f4cf');
+$ti-icon-brand-c-sharp: unicode('f003');
+$ti-icon-brand-cake: unicode('f7a3');
+$ti-icon-brand-cakephp: unicode('f7af');
+$ti-icon-brand-campaignmonitor: unicode('f328');
+$ti-icon-brand-carbon: unicode('f348');
+$ti-icon-brand-cashapp: unicode('f391');
+$ti-icon-brand-chrome: unicode('ec18');
+$ti-icon-brand-cinema-4d: unicode('fa71');
+$ti-icon-brand-citymapper: unicode('f5fc');
+$ti-icon-brand-cloudflare: unicode('fa4e');
+$ti-icon-brand-codecov: unicode('f329');
+$ti-icon-brand-codepen: unicode('ec6f');
+$ti-icon-brand-codesandbox: unicode('ed6a');
+$ti-icon-brand-cohost: unicode('f5d5');
+$ti-icon-brand-coinbase: unicode('f209');
+$ti-icon-brand-comedy-central: unicode('f217');
+$ti-icon-brand-coreos: unicode('f5fd');
+$ti-icon-brand-couchdb: unicode('f60f');
+$ti-icon-brand-couchsurfing: unicode('f392');
+$ti-icon-brand-cpp: unicode('f5fe');
+$ti-icon-brand-craft: unicode('fa72');
+$ti-icon-brand-crunchbase: unicode('f7e3');
+$ti-icon-brand-css3: unicode('ed6b');
+$ti-icon-brand-ctemplar: unicode('f4d0');
+$ti-icon-brand-cucumber: unicode('ef6c');
+$ti-icon-brand-cupra: unicode('f4d1');
+$ti-icon-brand-cypress: unicode('f333');
+$ti-icon-brand-d3: unicode('f24e');
+$ti-icon-brand-databricks: unicode('fc41');
+$ti-icon-brand-days-counter: unicode('f4d2');
+$ti-icon-brand-dcos: unicode('f32a');
+$ti-icon-brand-debian: unicode('ef57');
+$ti-icon-brand-deezer: unicode('f78b');
+$ti-icon-brand-deliveroo: unicode('f4d3');
+$ti-icon-brand-deno: unicode('f24f');
+$ti-icon-brand-denodo: unicode('f610');
+$ti-icon-brand-deviantart: unicode('ecfb');
+$ti-icon-brand-digg: unicode('fa73');
+$ti-icon-brand-dingtalk: unicode('f5ea');
+$ti-icon-brand-discord: unicode('ece3');
+$ti-icon-brand-discord-filled: unicode('f7e4');
+$ti-icon-brand-disney: unicode('f20a');
+$ti-icon-brand-disqus: unicode('edc9');
+$ti-icon-brand-django: unicode('f349');
+$ti-icon-brand-docker: unicode('edca');
+$ti-icon-brand-doctrine: unicode('ef6d');
+$ti-icon-brand-dolby-digital: unicode('f4d4');
+$ti-icon-brand-douban: unicode('f5ff');
+$ti-icon-brand-dribbble: unicode('ec19');
+$ti-icon-brand-dribbble-filled: unicode('f7e5');
+$ti-icon-brand-drops: unicode('f4d5');
+$ti-icon-brand-drupal: unicode('f393');
+$ti-icon-brand-edge: unicode('ecfc');
+$ti-icon-brand-elastic: unicode('f611');
+$ti-icon-brand-electronic-arts: unicode('fa74');
+$ti-icon-brand-ember: unicode('f497');
+$ti-icon-brand-envato: unicode('f394');
+$ti-icon-brand-etsy: unicode('f654');
+$ti-icon-brand-evernote: unicode('f600');
+$ti-icon-brand-facebook: unicode('ec1a');
+$ti-icon-brand-facebook-filled: unicode('f7e6');
+$ti-icon-brand-feedly: unicode('fa75');
+$ti-icon-brand-figma: unicode('ec93');
+$ti-icon-brand-filezilla: unicode('fa76');
+$ti-icon-brand-finder: unicode('f218');
+$ti-icon-brand-firebase: unicode('ef6e');
+$ti-icon-brand-firefox: unicode('ecfd');
+$ti-icon-brand-fiverr: unicode('f7a4');
+$ti-icon-brand-flickr: unicode('ecfe');
+$ti-icon-brand-flightradar24: unicode('f4d6');
+$ti-icon-brand-flipboard: unicode('f20b');
+$ti-icon-brand-flutter: unicode('f395');
+$ti-icon-brand-fortnite: unicode('f260');
+$ti-icon-brand-foursquare: unicode('ecff');
+$ti-icon-brand-framer: unicode('ec1b');
+$ti-icon-brand-framer-motion: unicode('f78c');
+$ti-icon-brand-funimation: unicode('f655');
+$ti-icon-brand-gatsby: unicode('f396');
+$ti-icon-brand-git: unicode('ef6f');
+$ti-icon-brand-github: unicode('ec1c');
+$ti-icon-brand-github-copilot: unicode('f4a8');
+$ti-icon-brand-github-filled: unicode('f7e7');
+$ti-icon-brand-gitlab: unicode('ec1d');
+$ti-icon-brand-gmail: unicode('efa2');
+$ti-icon-brand-golang: unicode('f78d');
+$ti-icon-brand-google: unicode('ec1f');
+$ti-icon-brand-google-analytics: unicode('edcb');
+$ti-icon-brand-google-big-query: unicode('f612');
+$ti-icon-brand-google-drive: unicode('ec1e');
+$ti-icon-brand-google-filled: unicode('fd1a');
+$ti-icon-brand-google-fit: unicode('f297');
+$ti-icon-brand-google-home: unicode('f601');
+$ti-icon-brand-google-maps: unicode('fa4f');
+$ti-icon-brand-google-one: unicode('f232');
+$ti-icon-brand-google-photos: unicode('f20c');
+$ti-icon-brand-google-play: unicode('ed25');
+$ti-icon-brand-google-podcasts: unicode('f656');
+$ti-icon-brand-grammarly: unicode('f32b');
+$ti-icon-brand-graphql: unicode('f32c');
+$ti-icon-brand-gravatar: unicode('edcc');
+$ti-icon-brand-grindr: unicode('f20d');
+$ti-icon-brand-guardian: unicode('f4fb');
+$ti-icon-brand-gumroad: unicode('f5d6');
+$ti-icon-brand-hbo: unicode('f657');
+$ti-icon-brand-headlessui: unicode('f32d');
+$ti-icon-brand-hexo: unicode('fa50');
+$ti-icon-brand-hipchat: unicode('edcd');
+$ti-icon-brand-html5: unicode('ed6c');
+$ti-icon-brand-inertia: unicode('f34a');
+$ti-icon-brand-instagram: unicode('ec20');
+$ti-icon-brand-intercom: unicode('f1cf');
+$ti-icon-brand-itch: unicode('fa22');
+$ti-icon-brand-javascript: unicode('ef0c');
+$ti-icon-brand-juejin: unicode('f7b0');
+$ti-icon-brand-kako-talk: unicode('fd2d');
+$ti-icon-brand-kbin: unicode('fad0');
+$ti-icon-brand-kick: unicode('fa23');
+$ti-icon-brand-kickstarter: unicode('edce');
+$ti-icon-brand-kotlin: unicode('ed6d');
+$ti-icon-brand-laravel: unicode('f34b');
+$ti-icon-brand-lastfm: unicode('f001');
+$ti-icon-brand-leetcode: unicode('fa51');
+$ti-icon-brand-letterboxd: unicode('fa24');
+$ti-icon-brand-line: unicode('f7e8');
+$ti-icon-brand-linkedin: unicode('ec8c');
+$ti-icon-brand-linktree: unicode('f1e7');
+$ti-icon-brand-linqpad: unicode('f562');
+$ti-icon-brand-livewire: unicode('fd76');
+$ti-icon-brand-loom: unicode('ef70');
+$ti-icon-brand-mailgun: unicode('f32e');
+$ti-icon-brand-mantine: unicode('f32f');
+$ti-icon-brand-mastercard: unicode('ef49');
+$ti-icon-brand-mastodon: unicode('f250');
+$ti-icon-brand-matrix: unicode('f5eb');
+$ti-icon-brand-mcdonalds: unicode('f251');
+$ti-icon-brand-medium: unicode('ec70');
+$ti-icon-brand-meetup: unicode('fc6a');
+$ti-icon-brand-mercedes: unicode('f072');
+$ti-icon-brand-messenger: unicode('ec71');
+$ti-icon-brand-meta: unicode('efb0');
+$ti-icon-brand-minecraft: unicode('faef');
+$ti-icon-brand-miniprogram: unicode('f602');
+$ti-icon-brand-mixpanel: unicode('f397');
+$ti-icon-brand-monday: unicode('f219');
+$ti-icon-brand-mongodb: unicode('f613');
+$ti-icon-brand-my-oppo: unicode('f4d7');
+$ti-icon-brand-mysql: unicode('f614');
+$ti-icon-brand-national-geographic: unicode('f603');
+$ti-icon-brand-nem: unicode('f5a1');
+$ti-icon-brand-netbeans: unicode('ef71');
+$ti-icon-brand-netease-music: unicode('f604');
+$ti-icon-brand-netflix: unicode('edcf');
+$ti-icon-brand-nexo: unicode('f5a2');
+$ti-icon-brand-nextcloud: unicode('f4d8');
+$ti-icon-brand-nextjs: unicode('f0dd');
+$ti-icon-brand-nodejs: unicode('fae0');
+$ti-icon-brand-nord-vpn: unicode('f37f');
+$ti-icon-brand-notion: unicode('ef7b');
+$ti-icon-brand-npm: unicode('f569');
+$ti-icon-brand-nuxt: unicode('f0de');
+$ti-icon-brand-nytimes: unicode('ef8d');
+$ti-icon-brand-oauth: unicode('fa52');
+$ti-icon-brand-office: unicode('f398');
+$ti-icon-brand-ok-ru: unicode('f399');
+$ti-icon-brand-onedrive: unicode('f5d7');
+$ti-icon-brand-onlyfans: unicode('f605');
+$ti-icon-brand-open-source: unicode('edd0');
+$ti-icon-brand-openai: unicode('f78e');
+$ti-icon-brand-openvpn: unicode('f39a');
+$ti-icon-brand-opera: unicode('ec21');
+$ti-icon-brand-pagekit: unicode('edd1');
+$ti-icon-brand-parsinta: unicode('fc42');
+$ti-icon-brand-patreon: unicode('edd2');
+$ti-icon-brand-patreon-filled: unicode('fcff');
+$ti-icon-brand-paypal: unicode('ec22');
+$ti-icon-brand-paypal-filled: unicode('f7e9');
+$ti-icon-brand-paypay: unicode('f5ec');
+$ti-icon-brand-peanut: unicode('f39b');
+$ti-icon-brand-pepsi: unicode('f261');
+$ti-icon-brand-php: unicode('ef72');
+$ti-icon-brand-picsart: unicode('f4d9');
+$ti-icon-brand-pinterest: unicode('ec8d');
+$ti-icon-brand-planetscale: unicode('f78f');
+$ti-icon-brand-pnpm: unicode('fd77');
+$ti-icon-brand-pocket: unicode('ed00');
+$ti-icon-brand-polymer: unicode('f498');
+$ti-icon-brand-powershell: unicode('f5ed');
+$ti-icon-brand-printables: unicode('fd1b');
+$ti-icon-brand-prisma: unicode('f499');
+$ti-icon-brand-producthunt: unicode('edd3');
+$ti-icon-brand-pushbullet: unicode('f330');
+$ti-icon-brand-pushover: unicode('f20e');
+$ti-icon-brand-python: unicode('ed01');
+$ti-icon-brand-qq: unicode('f606');
+$ti-icon-brand-radix-ui: unicode('f790');
+$ti-icon-brand-react: unicode('f34c');
+$ti-icon-brand-react-native: unicode('ef73');
+$ti-icon-brand-reason: unicode('f49a');
+$ti-icon-brand-reddit: unicode('ec8e');
+$ti-icon-brand-redhat: unicode('f331');
+$ti-icon-brand-redux: unicode('f3a8');
+$ti-icon-brand-revolut: unicode('f4da');
+$ti-icon-brand-rumble: unicode('fad1');
+$ti-icon-brand-rust: unicode('fa53');
+$ti-icon-brand-safari: unicode('ec23');
+$ti-icon-brand-samsungpass: unicode('f4db');
+$ti-icon-brand-sass: unicode('edd4');
+$ti-icon-brand-sentry: unicode('edd5');
+$ti-icon-brand-sharik: unicode('f4dc');
+$ti-icon-brand-shazam: unicode('edd6');
+$ti-icon-brand-shopee: unicode('f252');
+$ti-icon-brand-sketch: unicode('ec24');
+$ti-icon-brand-skype: unicode('ed02');
+$ti-icon-brand-slack: unicode('ec72');
+$ti-icon-brand-snapchat: unicode('ec25');
+$ti-icon-brand-snapseed: unicode('f253');
+$ti-icon-brand-snowflake: unicode('f615');
+$ti-icon-brand-socket-io: unicode('f49b');
+$ti-icon-brand-solidjs: unicode('f5ee');
+$ti-icon-brand-soundcloud: unicode('ed6e');
+$ti-icon-brand-spacehey: unicode('f4fc');
+$ti-icon-brand-speedtest: unicode('fa77');
+$ti-icon-brand-spotify: unicode('ed03');
+$ti-icon-brand-spotify-filled: unicode('fe86');
+$ti-icon-brand-stackoverflow: unicode('ef58');
+$ti-icon-brand-stackshare: unicode('f607');
+$ti-icon-brand-steam: unicode('ed6f');
+$ti-icon-brand-stocktwits: unicode('fd78');
+$ti-icon-brand-storj: unicode('fa54');
+$ti-icon-brand-storybook: unicode('f332');
+$ti-icon-brand-storytel: unicode('f608');
+$ti-icon-brand-strava: unicode('f254');
+$ti-icon-brand-stripe: unicode('edd7');
+$ti-icon-brand-sublime-text: unicode('ef74');
+$ti-icon-brand-sugarizer: unicode('f7a5');
+$ti-icon-brand-supabase: unicode('f6d3');
+$ti-icon-brand-superhuman: unicode('f50c');
+$ti-icon-brand-supernova: unicode('f49c');
+$ti-icon-brand-surfshark: unicode('f255');
+$ti-icon-brand-svelte: unicode('f0df');
+$ti-icon-brand-swift: unicode('fa55');
+$ti-icon-brand-symfony: unicode('f616');
+$ti-icon-brand-tabler: unicode('ec8f');
+$ti-icon-brand-tailwind: unicode('eca1');
+$ti-icon-brand-taobao: unicode('f5ef');
+$ti-icon-brand-teams: unicode('fadf');
+$ti-icon-brand-ted: unicode('f658');
+$ti-icon-brand-telegram: unicode('ec26');
+$ti-icon-brand-terraform: unicode('fa56');
+$ti-icon-brand-tether: unicode('f5a3');
+$ti-icon-brand-thingiverse: unicode('fd1c');
+$ti-icon-brand-threads: unicode('fb02');
+$ti-icon-brand-threejs: unicode('f5f0');
+$ti-icon-brand-tidal: unicode('ed70');
+$ti-icon-brand-tiktok: unicode('ec73');
+$ti-icon-brand-tiktok-filled: unicode('f7ea');
+$ti-icon-brand-tinder: unicode('ed71');
+$ti-icon-brand-topbuzz: unicode('f50d');
+$ti-icon-brand-torchain: unicode('f5a4');
+$ti-icon-brand-toyota: unicode('f262');
+$ti-icon-brand-trello: unicode('f39d');
+$ti-icon-brand-tripadvisor: unicode('f002');
+$ti-icon-brand-tumblr: unicode('ed04');
+$ti-icon-brand-twilio: unicode('f617');
+$ti-icon-brand-twitch: unicode('ed05');
+$ti-icon-brand-twitter: unicode('ec27');
+$ti-icon-brand-twitter-filled: unicode('f7eb');
+$ti-icon-brand-typescript: unicode('f5f1');
+$ti-icon-brand-uber: unicode('ef75');
+$ti-icon-brand-ubuntu: unicode('ef59');
+$ti-icon-brand-unity: unicode('f49d');
+$ti-icon-brand-unsplash: unicode('edd8');
+$ti-icon-brand-upwork: unicode('f39e');
+$ti-icon-brand-valorant: unicode('f39f');
+$ti-icon-brand-vercel: unicode('ef24');
+$ti-icon-brand-vimeo: unicode('ed06');
+$ti-icon-brand-vinted: unicode('f20f');
+$ti-icon-brand-visa: unicode('f380');
+$ti-icon-brand-visual-studio: unicode('ef76');
+$ti-icon-brand-vite: unicode('f5f2');
+$ti-icon-brand-vivaldi: unicode('f210');
+$ti-icon-brand-vk: unicode('ed72');
+$ti-icon-brand-vlc: unicode('fa78');
+$ti-icon-brand-volkswagen: unicode('f50e');
+$ti-icon-brand-vsco: unicode('f334');
+$ti-icon-brand-vscode: unicode('f3a0');
+$ti-icon-brand-vue: unicode('f0e0');
+$ti-icon-brand-walmart: unicode('f211');
+$ti-icon-brand-waze: unicode('f5d8');
+$ti-icon-brand-webflow: unicode('f2d2');
+$ti-icon-brand-wechat: unicode('f5f3');
+$ti-icon-brand-weibo: unicode('f609');
+$ti-icon-brand-whatsapp: unicode('ec74');
+$ti-icon-brand-wikipedia: unicode('fa79');
+$ti-icon-brand-windows: unicode('ecd8');
+$ti-icon-brand-windy: unicode('f4dd');
+$ti-icon-brand-wish: unicode('f212');
+$ti-icon-brand-wix: unicode('f3a1');
+$ti-icon-brand-wordpress: unicode('f2d3');
+$ti-icon-brand-x: unicode('fc0f');
+$ti-icon-brand-x-filled: unicode('fc21');
+$ti-icon-brand-xamarin: unicode('fa7a');
+$ti-icon-brand-xbox: unicode('f298');
+$ti-icon-brand-xdeep: unicode('fc10');
+$ti-icon-brand-xing: unicode('f21a');
+$ti-icon-brand-yahoo: unicode('ed73');
+$ti-icon-brand-yandex: unicode('fae1');
+$ti-icon-brand-yarn: unicode('fd79');
+$ti-icon-brand-yatse: unicode('f213');
+$ti-icon-brand-ycombinator: unicode('edd9');
+$ti-icon-brand-youtube: unicode('ec90');
+$ti-icon-brand-youtube-filled: unicode('fc22');
+$ti-icon-brand-youtube-kids: unicode('f214');
+$ti-icon-brand-zalando: unicode('f49e');
+$ti-icon-brand-zapier: unicode('f49f');
+$ti-icon-brand-zeit: unicode('f335');
+$ti-icon-brand-zhihu: unicode('f60a');
+$ti-icon-brand-zoom: unicode('f215');
+$ti-icon-brand-zulip: unicode('f4de');
+$ti-icon-brand-zwift: unicode('f216');
+$ti-icon-bread: unicode('efa3');
+$ti-icon-bread-filled: unicode('fe85');
+$ti-icon-bread-off: unicode('f3cb');
+$ti-icon-briefcase: unicode('ea46');
+$ti-icon-briefcase-2: unicode('fb03');
+$ti-icon-briefcase-2-filled: unicode('fe84');
+$ti-icon-briefcase-filled: unicode('fd00');
+$ti-icon-briefcase-off: unicode('f3cc');
+$ti-icon-brightness: unicode('eb7f');
+$ti-icon-brightness-2: unicode('ee19');
+$ti-icon-brightness-auto: unicode('fd99');
+$ti-icon-brightness-auto-filled: unicode('fe83');
+$ti-icon-brightness-down: unicode('eb7d');
+$ti-icon-brightness-down-filled: unicode('fb23');
+$ti-icon-brightness-filled: unicode('fe82');
+$ti-icon-brightness-half: unicode('ee1a');
+$ti-icon-brightness-off: unicode('f3cd');
+$ti-icon-brightness-up: unicode('eb7e');
+$ti-icon-brightness-up-filled: unicode('fb24');
+$ti-icon-broadcast: unicode('f1e9');
+$ti-icon-broadcast-off: unicode('f1e8');
+$ti-icon-browser: unicode('ebb7');
+$ti-icon-browser-check: unicode('efd6');
+$ti-icon-browser-off: unicode('f0c1');
+$ti-icon-browser-plus: unicode('efd7');
+$ti-icon-browser-x: unicode('efd8');
+$ti-icon-brush: unicode('ebb8');
+$ti-icon-brush-off: unicode('f0c2');
+$ti-icon-bubble: unicode('feba');
+$ti-icon-bubble-filled: unicode('fec3');
+$ti-icon-bubble-minus: unicode('febe');
+$ti-icon-bubble-plus: unicode('febd');
+$ti-icon-bubble-text: unicode('febc');
+$ti-icon-bubble-x: unicode('febb');
+$ti-icon-bucket: unicode('ea47');
+$ti-icon-bucket-droplet: unicode('f56a');
+$ti-icon-bucket-off: unicode('f103');
+$ti-icon-bug: unicode('ea48');
+$ti-icon-bug-filled: unicode('fd01');
+$ti-icon-bug-off: unicode('f0c3');
+$ti-icon-building: unicode('ea4f');
+$ti-icon-building-arch: unicode('ea49');
+$ti-icon-building-bank: unicode('ebe2');
+$ti-icon-building-bridge: unicode('ea4b');
+$ti-icon-building-bridge-2: unicode('ea4a');
+$ti-icon-building-broadcast-tower: unicode('f4be');
+$ti-icon-building-broadcast-tower-filled: unicode('fe81');
+$ti-icon-building-carousel: unicode('ed87');
+$ti-icon-building-castle: unicode('ed88');
+$ti-icon-building-church: unicode('ea4c');
+$ti-icon-building-circus: unicode('f4bf');
+$ti-icon-building-community: unicode('ebf6');
+$ti-icon-building-cottage: unicode('ee1b');
+$ti-icon-building-estate: unicode('f5a5');
+$ti-icon-building-factory: unicode('ee1c');
+$ti-icon-building-factory-2: unicode('f082');
+$ti-icon-building-fortress: unicode('ed89');
+$ti-icon-building-hospital: unicode('ea4d');
+$ti-icon-building-lighthouse: unicode('ed8a');
+$ti-icon-building-monument: unicode('ed26');
+$ti-icon-building-mosque: unicode('fa57');
+$ti-icon-building-pavilion: unicode('ebf7');
+$ti-icon-building-skyscraper: unicode('ec39');
+$ti-icon-building-stadium: unicode('f641');
+$ti-icon-building-store: unicode('ea4e');
+$ti-icon-building-tunnel: unicode('f5a6');
+$ti-icon-building-warehouse: unicode('ebe3');
+$ti-icon-building-wind-turbine: unicode('f4c0');
+$ti-icon-bulb: unicode('ea51');
+$ti-icon-bulb-filled: unicode('f66a');
+$ti-icon-bulb-off: unicode('ea50');
+$ti-icon-bulldozer: unicode('ee1d');
+$ti-icon-burger: unicode('fcb4');
+$ti-icon-bus: unicode('ebe4');
+$ti-icon-bus-off: unicode('f3ce');
+$ti-icon-bus-stop: unicode('f2d4');
+$ti-icon-businessplan: unicode('ee1e');
+$ti-icon-butterfly: unicode('efd9');
+$ti-icon-cactus: unicode('f21b');
+$ti-icon-cactus-filled: unicode('fb25');
+$ti-icon-cactus-off: unicode('f3cf');
+$ti-icon-cake: unicode('f00f');
+$ti-icon-cake-off: unicode('f104');
+$ti-icon-calculator: unicode('eb80');
+$ti-icon-calculator-filled: unicode('fb26');
+$ti-icon-calculator-off: unicode('f0c4');
+$ti-icon-calendar: unicode('ea53');
+$ti-icon-calendar-bolt: unicode('f822');
+$ti-icon-calendar-cancel: unicode('f823');
+$ti-icon-calendar-check: unicode('f824');
+$ti-icon-calendar-clock: unicode('fd2e');
+$ti-icon-calendar-code: unicode('f825');
+$ti-icon-calendar-cog: unicode('f826');
+$ti-icon-calendar-dollar: unicode('f827');
+$ti-icon-calendar-dot: unicode('fd3e');
+$ti-icon-calendar-down: unicode('f828');
+$ti-icon-calendar-due: unicode('f621');
+$ti-icon-calendar-event: unicode('ea52');
+$ti-icon-calendar-exclamation: unicode('f829');
+$ti-icon-calendar-filled: unicode('fb27');
+$ti-icon-calendar-heart: unicode('f82a');
+$ti-icon-calendar-minus: unicode('ebb9');
+$ti-icon-calendar-month: unicode('fd2f');
+$ti-icon-calendar-off: unicode('ee1f');
+$ti-icon-calendar-pause: unicode('f82b');
+$ti-icon-calendar-pin: unicode('f82c');
+$ti-icon-calendar-plus: unicode('ebba');
+$ti-icon-calendar-question: unicode('f82d');
+$ti-icon-calendar-repeat: unicode('fad2');
+$ti-icon-calendar-sad: unicode('fd1d');
+$ti-icon-calendar-search: unicode('f82e');
+$ti-icon-calendar-share: unicode('f82f');
+$ti-icon-calendar-smile: unicode('fd1e');
+$ti-icon-calendar-star: unicode('f830');
+$ti-icon-calendar-stats: unicode('ee20');
+$ti-icon-calendar-time: unicode('ee21');
+$ti-icon-calendar-up: unicode('f831');
+$ti-icon-calendar-user: unicode('fd1f');
+$ti-icon-calendar-week: unicode('fd30');
+$ti-icon-calendar-x: unicode('f832');
+$ti-icon-camera: unicode('ea54');
+$ti-icon-camera-bolt: unicode('f833');
+$ti-icon-camera-cancel: unicode('f834');
+$ti-icon-camera-check: unicode('f835');
+$ti-icon-camera-code: unicode('f836');
+$ti-icon-camera-cog: unicode('f837');
+$ti-icon-camera-dollar: unicode('f838');
+$ti-icon-camera-down: unicode('f839');
+$ti-icon-camera-exclamation: unicode('f83a');
+$ti-icon-camera-filled: unicode('fa37');
+$ti-icon-camera-heart: unicode('f83b');
+$ti-icon-camera-minus: unicode('ec3a');
+$ti-icon-camera-off: unicode('ecee');
+$ti-icon-camera-pause: unicode('f83c');
+$ti-icon-camera-pin: unicode('f83d');
+$ti-icon-camera-plus: unicode('ec3b');
+$ti-icon-camera-question: unicode('f83e');
+$ti-icon-camera-rotate: unicode('ee22');
+$ti-icon-camera-search: unicode('f83f');
+$ti-icon-camera-selfie: unicode('ee23');
+$ti-icon-camera-share: unicode('f840');
+$ti-icon-camera-star: unicode('f841');
+$ti-icon-camera-up: unicode('f842');
+$ti-icon-camera-x: unicode('f843');
+$ti-icon-camper: unicode('fa25');
+$ti-icon-campfire: unicode('f5a7');
+$ti-icon-campfire-filled: unicode('fb28');
+$ti-icon-candle: unicode('efc6');
+$ti-icon-candle-filled: unicode('fc23');
+$ti-icon-candy: unicode('ef0d');
+$ti-icon-candy-off: unicode('f0c5');
+$ti-icon-cane: unicode('f50f');
+$ti-icon-cannabis: unicode('f4c1');
+$ti-icon-capsule: unicode('fae3');
+$ti-icon-capsule-filled: unicode('fc24');
+$ti-icon-capsule-horizontal: unicode('fae2');
+$ti-icon-capsule-horizontal-filled: unicode('fc25');
+$ti-icon-capture: unicode('ec3c');
+$ti-icon-capture-filled: unicode('fb29');
+$ti-icon-capture-off: unicode('f0c6');
+$ti-icon-car: unicode('ebbb');
+$ti-icon-car-4wd: unicode('fdb8');
+$ti-icon-car-crane: unicode('ef25');
+$ti-icon-car-crash: unicode('efa4');
+$ti-icon-car-fan: unicode('fdb3');
+$ti-icon-car-fan-1: unicode('fdb7');
+$ti-icon-car-fan-2: unicode('fdb6');
+$ti-icon-car-fan-3: unicode('fdb5');
+$ti-icon-car-fan-auto: unicode('fdb4');
+$ti-icon-car-garage: unicode('fc77');
+$ti-icon-car-off: unicode('f0c7');
+$ti-icon-car-suv: unicode('fc8b');
+$ti-icon-car-turbine: unicode('f4fd');
+$ti-icon-carambola: unicode('feb9');
+$ti-icon-caravan: unicode('ec7c');
+$ti-icon-cardboards: unicode('ed74');
+$ti-icon-cardboards-off: unicode('f0c8');
+$ti-icon-cards: unicode('f510');
+$ti-icon-cards-filled: unicode('fc26');
+$ti-icon-caret-down: unicode('eb5d');
+$ti-icon-caret-down-filled: unicode('fb2a');
+$ti-icon-caret-left: unicode('eb5e');
+$ti-icon-caret-left-filled: unicode('fb2b');
+$ti-icon-caret-left-right: unicode('fc43');
+$ti-icon-caret-left-right-filled: unicode('fd02');
+$ti-icon-caret-right: unicode('eb5f');
+$ti-icon-caret-right-filled: unicode('fb2c');
+$ti-icon-caret-up: unicode('eb60');
+$ti-icon-caret-up-down: unicode('fc44');
+$ti-icon-caret-up-down-filled: unicode('fd03');
+$ti-icon-caret-up-filled: unicode('fb2d');
+$ti-icon-carousel-horizontal: unicode('f659');
+$ti-icon-carousel-horizontal-filled: unicode('fa92');
+$ti-icon-carousel-vertical: unicode('f65a');
+$ti-icon-carousel-vertical-filled: unicode('fa93');
+$ti-icon-carrot: unicode('f21c');
+$ti-icon-carrot-off: unicode('f3d0');
+$ti-icon-cash: unicode('ea55');
+$ti-icon-cash-banknote: unicode('ee25');
+$ti-icon-cash-banknote-filled: unicode('fe80');
+$ti-icon-cash-banknote-off: unicode('ee24');
+$ti-icon-cash-off: unicode('f105');
+$ti-icon-cash-register: unicode('fee6');
+$ti-icon-cast: unicode('ea56');
+$ti-icon-cast-off: unicode('f0c9');
+$ti-icon-cat: unicode('f65b');
+$ti-icon-category: unicode('f1f6');
+$ti-icon-category-2: unicode('f1f5');
+$ti-icon-category-filled: unicode('fb2e');
+$ti-icon-category-minus: unicode('fd20');
+$ti-icon-category-plus: unicode('fd21');
+$ti-icon-ce: unicode('ed75');
+$ti-icon-ce-off: unicode('f0ca');
+$ti-icon-cell: unicode('f05f');
+$ti-icon-cell-signal-1: unicode('f083');
+$ti-icon-cell-signal-2: unicode('f084');
+$ti-icon-cell-signal-3: unicode('f085');
+$ti-icon-cell-signal-4: unicode('f086');
+$ti-icon-cell-signal-5: unicode('f087');
+$ti-icon-cell-signal-off: unicode('f088');
+$ti-icon-certificate: unicode('ed76');
+$ti-icon-certificate-2: unicode('f073');
+$ti-icon-certificate-2-off: unicode('f0cb');
+$ti-icon-certificate-off: unicode('f0cc');
+$ti-icon-chair-director: unicode('f2d5');
+$ti-icon-chalkboard: unicode('f34d');
+$ti-icon-chalkboard-off: unicode('f3d1');
+$ti-icon-charging-pile: unicode('ee26');
+$ti-icon-chart-arcs: unicode('ee28');
+$ti-icon-chart-arcs-3: unicode('ee27');
+$ti-icon-chart-area: unicode('ea58');
+$ti-icon-chart-area-filled: unicode('f66b');
+$ti-icon-chart-area-line: unicode('ea57');
+$ti-icon-chart-area-line-filled: unicode('f66c');
+$ti-icon-chart-arrows: unicode('ee2a');
+$ti-icon-chart-arrows-vertical: unicode('ee29');
+$ti-icon-chart-bar: unicode('ea59');
+$ti-icon-chart-bar-off: unicode('f3d2');
+$ti-icon-chart-bubble: unicode('ec75');
+$ti-icon-chart-bubble-filled: unicode('f66d');
+$ti-icon-chart-candle: unicode('ea5a');
+$ti-icon-chart-candle-filled: unicode('f66e');
+$ti-icon-chart-circles: unicode('ee2b');
+$ti-icon-chart-donut: unicode('ea5b');
+$ti-icon-chart-donut-2: unicode('ee2c');
+$ti-icon-chart-donut-3: unicode('ee2d');
+$ti-icon-chart-donut-4: unicode('ee2e');
+$ti-icon-chart-donut-filled: unicode('f66f');
+$ti-icon-chart-dots: unicode('ee2f');
+$ti-icon-chart-dots-2: unicode('f097');
+$ti-icon-chart-dots-3: unicode('f098');
+$ti-icon-chart-dots-filled: unicode('fd04');
+$ti-icon-chart-grid-dots: unicode('f4c2');
+$ti-icon-chart-grid-dots-filled: unicode('fd05');
+$ti-icon-chart-histogram: unicode('f65c');
+$ti-icon-chart-infographic: unicode('ee30');
+$ti-icon-chart-line: unicode('ea5c');
+$ti-icon-chart-pie: unicode('ea5d');
+$ti-icon-chart-pie-2: unicode('ee31');
+$ti-icon-chart-pie-3: unicode('ee32');
+$ti-icon-chart-pie-4: unicode('ee33');
+$ti-icon-chart-pie-filled: unicode('f670');
+$ti-icon-chart-pie-off: unicode('f3d3');
+$ti-icon-chart-ppf: unicode('f618');
+$ti-icon-chart-radar: unicode('ed77');
+$ti-icon-chart-sankey: unicode('f619');
+$ti-icon-chart-scatter: unicode('fd93');
+$ti-icon-chart-scatter-3d: unicode('fd92');
+$ti-icon-chart-treemap: unicode('f381');
+$ti-icon-check: unicode('ea5e');
+$ti-icon-checkbox: unicode('eba6');
+$ti-icon-checklist: unicode('f074');
+$ti-icon-checks: unicode('ebaa');
+$ti-icon-checkup-list: unicode('ef5a');
+$ti-icon-cheese: unicode('ef26');
+$ti-icon-chef-hat: unicode('f21d');
+$ti-icon-chef-hat-off: unicode('f3d4');
+$ti-icon-cherry: unicode('f511');
+$ti-icon-cherry-filled: unicode('f728');
+$ti-icon-chess: unicode('f382');
+$ti-icon-chess-bishop: unicode('f56b');
+$ti-icon-chess-bishop-filled: unicode('f729');
+$ti-icon-chess-filled: unicode('f72a');
+$ti-icon-chess-king: unicode('f56c');
+$ti-icon-chess-king-filled: unicode('f72b');
+$ti-icon-chess-knight: unicode('f56d');
+$ti-icon-chess-knight-filled: unicode('f72c');
+$ti-icon-chess-queen: unicode('f56e');
+$ti-icon-chess-queen-filled: unicode('f72d');
+$ti-icon-chess-rook: unicode('f56f');
+$ti-icon-chess-rook-filled: unicode('f72e');
+$ti-icon-chevron-compact-down: unicode('faf0');
+$ti-icon-chevron-compact-left: unicode('faf1');
+$ti-icon-chevron-compact-right: unicode('faf2');
+$ti-icon-chevron-compact-up: unicode('faf3');
+$ti-icon-chevron-down: unicode('ea5f');
+$ti-icon-chevron-down-left: unicode('ed09');
+$ti-icon-chevron-down-right: unicode('ed0a');
+$ti-icon-chevron-left: unicode('ea60');
+$ti-icon-chevron-left-pipe: unicode('fae4');
+$ti-icon-chevron-right: unicode('ea61');
+$ti-icon-chevron-right-pipe: unicode('fae5');
+$ti-icon-chevron-up: unicode('ea62');
+$ti-icon-chevron-up-left: unicode('ed0b');
+$ti-icon-chevron-up-right: unicode('ed0c');
+$ti-icon-chevrons-down: unicode('ea63');
+$ti-icon-chevrons-down-left: unicode('ed0d');
+$ti-icon-chevrons-down-right: unicode('ed0e');
+$ti-icon-chevrons-left: unicode('ea64');
+$ti-icon-chevrons-right: unicode('ea65');
+$ti-icon-chevrons-up: unicode('ea66');
+$ti-icon-chevrons-up-left: unicode('ed0f');
+$ti-icon-chevrons-up-right: unicode('ed10');
+$ti-icon-chisel: unicode('f383');
+$ti-icon-christmas-ball: unicode('fd31');
+$ti-icon-christmas-tree: unicode('ed78');
+$ti-icon-christmas-tree-off: unicode('f3d5');
+$ti-icon-circle: unicode('ea6b');
+$ti-icon-circle-arrow-down: unicode('f6f9');
+$ti-icon-circle-arrow-down-filled: unicode('f6f4');
+$ti-icon-circle-arrow-down-left: unicode('f6f6');
+$ti-icon-circle-arrow-down-left-filled: unicode('f6f5');
+$ti-icon-circle-arrow-down-right: unicode('f6f8');
+$ti-icon-circle-arrow-down-right-filled: unicode('f6f7');
+$ti-icon-circle-arrow-left: unicode('f6fb');
+$ti-icon-circle-arrow-left-filled: unicode('f6fa');
+$ti-icon-circle-arrow-right: unicode('f6fd');
+$ti-icon-circle-arrow-right-filled: unicode('f6fc');
+$ti-icon-circle-arrow-up: unicode('f703');
+$ti-icon-circle-arrow-up-filled: unicode('f6fe');
+$ti-icon-circle-arrow-up-left: unicode('f700');
+$ti-icon-circle-arrow-up-left-filled: unicode('f6ff');
+$ti-icon-circle-arrow-up-right: unicode('f702');
+$ti-icon-circle-arrow-up-right-filled: unicode('f701');
+$ti-icon-circle-caret-down: unicode('f4a9');
+$ti-icon-circle-caret-left: unicode('f4aa');
+$ti-icon-circle-caret-right: unicode('f4ab');
+$ti-icon-circle-caret-up: unicode('f4ac');
+$ti-icon-circle-check: unicode('ea67');
+$ti-icon-circle-check-filled: unicode('f704');
+$ti-icon-circle-chevron-down: unicode('f622');
+$ti-icon-circle-chevron-left: unicode('f623');
+$ti-icon-circle-chevron-right: unicode('f624');
+$ti-icon-circle-chevron-up: unicode('f625');
+$ti-icon-circle-chevrons-down: unicode('f642');
+$ti-icon-circle-chevrons-left: unicode('f643');
+$ti-icon-circle-chevrons-right: unicode('f644');
+$ti-icon-circle-chevrons-up: unicode('f645');
+$ti-icon-circle-dashed: unicode('ed27');
+$ti-icon-circle-dashed-check: unicode('feb8');
+$ti-icon-circle-dashed-minus: unicode('feb7');
+$ti-icon-circle-dashed-number-0: unicode('fc6b');
+$ti-icon-circle-dashed-number-1: unicode('fc6c');
+$ti-icon-circle-dashed-number-2: unicode('fc6d');
+$ti-icon-circle-dashed-number-3: unicode('fc6e');
+$ti-icon-circle-dashed-number-4: unicode('fc6f');
+$ti-icon-circle-dashed-number-5: unicode('fc70');
+$ti-icon-circle-dashed-number-6: unicode('fc71');
+$ti-icon-circle-dashed-number-7: unicode('fc72');
+$ti-icon-circle-dashed-number-8: unicode('fc73');
+$ti-icon-circle-dashed-number-9: unicode('fc74');
+$ti-icon-circle-dashed-percentage: unicode('fd7a');
+$ti-icon-circle-dashed-plus: unicode('feb6');
+$ti-icon-circle-dashed-x: unicode('fc75');
+$ti-icon-circle-dot: unicode('efb1');
+$ti-icon-circle-dot-filled: unicode('f705');
+$ti-icon-circle-dotted: unicode('ed28');
+$ti-icon-circle-filled: unicode('f671');
+$ti-icon-circle-half: unicode('ee3f');
+$ti-icon-circle-half-2: unicode('eff3');
+$ti-icon-circle-half-vertical: unicode('ee3e');
+$ti-icon-circle-key: unicode('f633');
+$ti-icon-circle-key-filled: unicode('f706');
+$ti-icon-circle-letter-a: unicode('f441');
+$ti-icon-circle-letter-a-filled: unicode('fe7f');
+$ti-icon-circle-letter-b: unicode('f442');
+$ti-icon-circle-letter-b-filled: unicode('fe7e');
+$ti-icon-circle-letter-c: unicode('f443');
+$ti-icon-circle-letter-c-filled: unicode('fe7d');
+$ti-icon-circle-letter-d: unicode('f444');
+$ti-icon-circle-letter-d-filled: unicode('fe7c');
+$ti-icon-circle-letter-e: unicode('f445');
+$ti-icon-circle-letter-e-filled: unicode('fe7b');
+$ti-icon-circle-letter-f: unicode('f446');
+$ti-icon-circle-letter-f-filled: unicode('fe7a');
+$ti-icon-circle-letter-g: unicode('f447');
+$ti-icon-circle-letter-g-filled: unicode('fe79');
+$ti-icon-circle-letter-h: unicode('f448');
+$ti-icon-circle-letter-h-filled: unicode('fe78');
+$ti-icon-circle-letter-i: unicode('f449');
+$ti-icon-circle-letter-i-filled: unicode('fe77');
+$ti-icon-circle-letter-j: unicode('f44a');
+$ti-icon-circle-letter-j-filled: unicode('fe76');
+$ti-icon-circle-letter-k: unicode('f44b');
+$ti-icon-circle-letter-k-filled: unicode('fe75');
+$ti-icon-circle-letter-l: unicode('f44c');
+$ti-icon-circle-letter-l-filled: unicode('fe74');
+$ti-icon-circle-letter-m: unicode('f44d');
+$ti-icon-circle-letter-m-filled: unicode('fe73');
+$ti-icon-circle-letter-n: unicode('f44e');
+$ti-icon-circle-letter-n-filled: unicode('fe72');
+$ti-icon-circle-letter-o: unicode('f44f');
+$ti-icon-circle-letter-o-filled: unicode('fe71');
+$ti-icon-circle-letter-p: unicode('f450');
+$ti-icon-circle-letter-p-filled: unicode('fe70');
+$ti-icon-circle-letter-q: unicode('f451');
+$ti-icon-circle-letter-q-filled: unicode('fe6f');
+$ti-icon-circle-letter-r: unicode('f452');
+$ti-icon-circle-letter-r-filled: unicode('fe6e');
+$ti-icon-circle-letter-s: unicode('f453');
+$ti-icon-circle-letter-s-filled: unicode('fe6d');
+$ti-icon-circle-letter-t: unicode('f454');
+$ti-icon-circle-letter-t-filled: unicode('fe6c');
+$ti-icon-circle-letter-u: unicode('f455');
+$ti-icon-circle-letter-u-filled: unicode('fe6b');
+$ti-icon-circle-letter-v: unicode('f4ad');
+$ti-icon-circle-letter-v-filled: unicode('fe6a');
+$ti-icon-circle-letter-w: unicode('f456');
+$ti-icon-circle-letter-w-filled: unicode('fe69');
+$ti-icon-circle-letter-x: unicode('f4ae');
+$ti-icon-circle-letter-x-filled: unicode('fe68');
+$ti-icon-circle-letter-y: unicode('f457');
+$ti-icon-circle-letter-y-filled: unicode('fe67');
+$ti-icon-circle-letter-z: unicode('f458');
+$ti-icon-circle-letter-z-filled: unicode('fe66');
+$ti-icon-circle-minus: unicode('ea68');
+$ti-icon-circle-minus-2: unicode('fc8c');
+$ti-icon-circle-number-0: unicode('ee34');
+$ti-icon-circle-number-0-filled: unicode('f72f');
+$ti-icon-circle-number-1: unicode('ee35');
+$ti-icon-circle-number-1-filled: unicode('f730');
+$ti-icon-circle-number-2: unicode('ee36');
+$ti-icon-circle-number-2-filled: unicode('f731');
+$ti-icon-circle-number-3: unicode('ee37');
+$ti-icon-circle-number-3-filled: unicode('f732');
+$ti-icon-circle-number-4: unicode('ee38');
+$ti-icon-circle-number-4-filled: unicode('f733');
+$ti-icon-circle-number-5: unicode('ee39');
+$ti-icon-circle-number-5-filled: unicode('f734');
+$ti-icon-circle-number-6: unicode('ee3a');
+$ti-icon-circle-number-6-filled: unicode('f735');
+$ti-icon-circle-number-7: unicode('ee3b');
+$ti-icon-circle-number-7-filled: unicode('f736');
+$ti-icon-circle-number-8: unicode('ee3c');
+$ti-icon-circle-number-8-filled: unicode('f737');
+$ti-icon-circle-number-9: unicode('ee3d');
+$ti-icon-circle-number-9-filled: unicode('f738');
+$ti-icon-circle-off: unicode('ee40');
+$ti-icon-circle-percentage: unicode('fd7b');
+$ti-icon-circle-percentage-filled: unicode('fed5');
+$ti-icon-circle-plus: unicode('ea69');
+$ti-icon-circle-plus-2: unicode('fc8d');
+$ti-icon-circle-rectangle: unicode('f010');
+$ti-icon-circle-rectangle-off: unicode('f0cd');
+$ti-icon-circle-square: unicode('ece4');
+$ti-icon-circle-triangle: unicode('f011');
+$ti-icon-circle-x: unicode('ea6a');
+$ti-icon-circle-x-filled: unicode('f739');
+$ti-icon-circles: unicode('ece5');
+$ti-icon-circles-filled: unicode('f672');
+$ti-icon-circles-relation: unicode('f4c3');
+$ti-icon-circuit-ammeter: unicode('f271');
+$ti-icon-circuit-battery: unicode('f272');
+$ti-icon-circuit-bulb: unicode('f273');
+$ti-icon-circuit-capacitor: unicode('f275');
+$ti-icon-circuit-capacitor-polarized: unicode('f274');
+$ti-icon-circuit-cell: unicode('f277');
+$ti-icon-circuit-cell-plus: unicode('f276');
+$ti-icon-circuit-changeover: unicode('f278');
+$ti-icon-circuit-diode: unicode('f27a');
+$ti-icon-circuit-diode-zener: unicode('f279');
+$ti-icon-circuit-ground: unicode('f27c');
+$ti-icon-circuit-ground-digital: unicode('f27b');
+$ti-icon-circuit-inductor: unicode('f27d');
+$ti-icon-circuit-motor: unicode('f27e');
+$ti-icon-circuit-pushbutton: unicode('f27f');
+$ti-icon-circuit-resistor: unicode('f280');
+$ti-icon-circuit-switch-closed: unicode('f281');
+$ti-icon-circuit-switch-open: unicode('f282');
+$ti-icon-circuit-voltmeter: unicode('f283');
+$ti-icon-clear-all: unicode('ee41');
+$ti-icon-clear-formatting: unicode('ebe5');
+$ti-icon-click: unicode('ebbc');
+$ti-icon-clipboard: unicode('ea6f');
+$ti-icon-clipboard-check: unicode('ea6c');
+$ti-icon-clipboard-copy: unicode('f299');
+$ti-icon-clipboard-data: unicode('f563');
+$ti-icon-clipboard-heart: unicode('f34e');
+$ti-icon-clipboard-list: unicode('ea6d');
+$ti-icon-clipboard-off: unicode('f0ce');
+$ti-icon-clipboard-plus: unicode('efb2');
+$ti-icon-clipboard-smile: unicode('fd9a');
+$ti-icon-clipboard-text: unicode('f089');
+$ti-icon-clipboard-typography: unicode('f34f');
+$ti-icon-clipboard-x: unicode('ea6e');
+$ti-icon-clock: unicode('ea70');
+$ti-icon-clock-12: unicode('fc56');
+$ti-icon-clock-2: unicode('f099');
+$ti-icon-clock-24: unicode('fc57');
+$ti-icon-clock-bolt: unicode('f844');
+$ti-icon-clock-cancel: unicode('f546');
+$ti-icon-clock-check: unicode('f7c1');
+$ti-icon-clock-code: unicode('f845');
+$ti-icon-clock-cog: unicode('f7c2');
+$ti-icon-clock-dollar: unicode('f846');
+$ti-icon-clock-down: unicode('f7c3');
+$ti-icon-clock-edit: unicode('f547');
+$ti-icon-clock-exclamation: unicode('f847');
+$ti-icon-clock-filled: unicode('f73a');
+$ti-icon-clock-heart: unicode('f7c4');
+$ti-icon-clock-hour-1: unicode('f313');
+$ti-icon-clock-hour-1-filled: unicode('fe65');
+$ti-icon-clock-hour-10: unicode('f314');
+$ti-icon-clock-hour-10-filled: unicode('fe64');
+$ti-icon-clock-hour-11: unicode('f315');
+$ti-icon-clock-hour-11-filled: unicode('fe63');
+$ti-icon-clock-hour-12: unicode('f316');
+$ti-icon-clock-hour-12-filled: unicode('fe62');
+$ti-icon-clock-hour-2: unicode('f317');
+$ti-icon-clock-hour-2-filled: unicode('fe61');
+$ti-icon-clock-hour-3: unicode('f318');
+$ti-icon-clock-hour-3-filled: unicode('fe60');
+$ti-icon-clock-hour-4: unicode('f319');
+$ti-icon-clock-hour-4-filled: unicode('fe5f');
+$ti-icon-clock-hour-5: unicode('f31a');
+$ti-icon-clock-hour-5-filled: unicode('fe5e');
+$ti-icon-clock-hour-6: unicode('f31b');
+$ti-icon-clock-hour-6-filled: unicode('fe5d');
+$ti-icon-clock-hour-7: unicode('f31c');
+$ti-icon-clock-hour-7-filled: unicode('fe5c');
+$ti-icon-clock-hour-8: unicode('f31d');
+$ti-icon-clock-hour-8-filled: unicode('fe5b');
+$ti-icon-clock-hour-9: unicode('f31e');
+$ti-icon-clock-hour-9-filled: unicode('fe5a');
+$ti-icon-clock-minus: unicode('f848');
+$ti-icon-clock-off: unicode('f0cf');
+$ti-icon-clock-pause: unicode('f548');
+$ti-icon-clock-pin: unicode('f849');
+$ti-icon-clock-play: unicode('f549');
+$ti-icon-clock-plus: unicode('f7c5');
+$ti-icon-clock-question: unicode('f7c6');
+$ti-icon-clock-record: unicode('f54a');
+$ti-icon-clock-search: unicode('f7c7');
+$ti-icon-clock-share: unicode('f84a');
+$ti-icon-clock-shield: unicode('f7c8');
+$ti-icon-clock-star: unicode('f7c9');
+$ti-icon-clock-stop: unicode('f54b');
+$ti-icon-clock-up: unicode('f7ca');
+$ti-icon-clock-x: unicode('f7cb');
+$ti-icon-clothes-rack: unicode('f285');
+$ti-icon-clothes-rack-off: unicode('f3d6');
+$ti-icon-cloud: unicode('ea76');
+$ti-icon-cloud-bolt: unicode('f84b');
+$ti-icon-cloud-cancel: unicode('f84c');
+$ti-icon-cloud-check: unicode('f84d');
+$ti-icon-cloud-code: unicode('f84e');
+$ti-icon-cloud-cog: unicode('f84f');
+$ti-icon-cloud-computing: unicode('f1d0');
+$ti-icon-cloud-data-connection: unicode('f1d1');
+$ti-icon-cloud-dollar: unicode('f850');
+$ti-icon-cloud-down: unicode('f851');
+$ti-icon-cloud-download: unicode('ea71');
+$ti-icon-cloud-exclamation: unicode('f852');
+$ti-icon-cloud-filled: unicode('f673');
+$ti-icon-cloud-fog: unicode('ecd9');
+$ti-icon-cloud-heart: unicode('f853');
+$ti-icon-cloud-lock: unicode('efdb');
+$ti-icon-cloud-lock-open: unicode('efda');
+$ti-icon-cloud-minus: unicode('f854');
+$ti-icon-cloud-network: unicode('fc78');
+$ti-icon-cloud-off: unicode('ed3e');
+$ti-icon-cloud-pause: unicode('f855');
+$ti-icon-cloud-pin: unicode('f856');
+$ti-icon-cloud-plus: unicode('f857');
+$ti-icon-cloud-question: unicode('f858');
+$ti-icon-cloud-rain: unicode('ea72');
+$ti-icon-cloud-search: unicode('f859');
+$ti-icon-cloud-share: unicode('f85a');
+$ti-icon-cloud-snow: unicode('ea73');
+$ti-icon-cloud-star: unicode('f85b');
+$ti-icon-cloud-storm: unicode('ea74');
+$ti-icon-cloud-up: unicode('f85c');
+$ti-icon-cloud-upload: unicode('ea75');
+$ti-icon-cloud-x: unicode('f85d');
+$ti-icon-clover: unicode('f1ea');
+$ti-icon-clover-2: unicode('f21e');
+$ti-icon-clubs: unicode('eff4');
+$ti-icon-clubs-filled: unicode('f674');
+$ti-icon-code: unicode('ea77');
+$ti-icon-code-asterisk: unicode('f312');
+$ti-icon-code-circle: unicode('f4ff');
+$ti-icon-code-circle-2: unicode('f4fe');
+$ti-icon-code-circle-2-filled: unicode('fed4');
+$ti-icon-code-circle-filled: unicode('fed3');
+$ti-icon-code-dots: unicode('f61a');
+$ti-icon-code-minus: unicode('ee42');
+$ti-icon-code-off: unicode('f0d0');
+$ti-icon-code-plus: unicode('ee43');
+$ti-icon-coffee: unicode('ef0e');
+$ti-icon-coffee-off: unicode('f106');
+$ti-icon-coffin: unicode('f579');
+$ti-icon-coin: unicode('eb82');
+$ti-icon-coin-bitcoin: unicode('f2be');
+$ti-icon-coin-bitcoin-filled: unicode('fd06');
+$ti-icon-coin-euro: unicode('f2bf');
+$ti-icon-coin-euro-filled: unicode('fd07');
+$ti-icon-coin-filled: unicode('fd08');
+$ti-icon-coin-monero: unicode('f4a0');
+$ti-icon-coin-monero-filled: unicode('fd09');
+$ti-icon-coin-off: unicode('f0d1');
+$ti-icon-coin-pound: unicode('f2c0');
+$ti-icon-coin-pound-filled: unicode('fd0a');
+$ti-icon-coin-rupee: unicode('f2c1');
+$ti-icon-coin-rupee-filled: unicode('fd0b');
+$ti-icon-coin-taka: unicode('fd0d');
+$ti-icon-coin-taka-filled: unicode('fd0c');
+$ti-icon-coin-yen: unicode('f2c2');
+$ti-icon-coin-yen-filled: unicode('fd0e');
+$ti-icon-coin-yuan: unicode('f2c3');
+$ti-icon-coin-yuan-filled: unicode('fd0f');
+$ti-icon-coins: unicode('f65d');
+$ti-icon-color-filter: unicode('f5a8');
+$ti-icon-color-picker: unicode('ebe6');
+$ti-icon-color-picker-off: unicode('f0d2');
+$ti-icon-color-swatch: unicode('eb61');
+$ti-icon-color-swatch-off: unicode('f0d3');
+$ti-icon-column-insert-left: unicode('ee44');
+$ti-icon-column-insert-right: unicode('ee45');
+$ti-icon-column-remove: unicode('faf4');
+$ti-icon-columns: unicode('eb83');
+$ti-icon-columns-1: unicode('f6d4');
+$ti-icon-columns-2: unicode('f6d5');
+$ti-icon-columns-3: unicode('f6d6');
+$ti-icon-columns-off: unicode('f0d4');
+$ti-icon-comet: unicode('ec76');
+$ti-icon-command: unicode('ea78');
+$ti-icon-command-off: unicode('f3d7');
+$ti-icon-compass: unicode('ea79');
+$ti-icon-compass-filled: unicode('fd10');
+$ti-icon-compass-off: unicode('f0d5');
+$ti-icon-components: unicode('efa5');
+$ti-icon-components-off: unicode('f0d6');
+$ti-icon-cone: unicode('efdd');
+$ti-icon-cone-2: unicode('efdc');
+$ti-icon-cone-2-filled: unicode('fe59');
+$ti-icon-cone-filled: unicode('fe58');
+$ti-icon-cone-off: unicode('f3d8');
+$ti-icon-cone-plus: unicode('fa94');
+$ti-icon-confetti: unicode('ee46');
+$ti-icon-confetti-off: unicode('f3d9');
+$ti-icon-confucius: unicode('f58a');
+$ti-icon-container: unicode('ee47');
+$ti-icon-container-off: unicode('f107');
+$ti-icon-contrast: unicode('ec4e');
+$ti-icon-contrast-2: unicode('efc7');
+$ti-icon-contrast-2-filled: unicode('fe57');
+$ti-icon-contrast-2-off: unicode('f3da');
+$ti-icon-contrast-filled: unicode('fe56');
+$ti-icon-contrast-off: unicode('f3db');
+$ti-icon-cooker: unicode('f57a');
+$ti-icon-cookie: unicode('fdb1');
+$ti-icon-cookie-filled: unicode('fe54');
+$ti-icon-cookie-man: unicode('fdb2');
+$ti-icon-cookie-man-filled: unicode('fe55');
+$ti-icon-cookie-off: unicode('f0d7');
+$ti-icon-copy: unicode('ea7a');
+$ti-icon-copy-check: unicode('fdb0');
+$ti-icon-copy-check-filled: unicode('fe53');
+$ti-icon-copy-minus: unicode('fdaf');
+$ti-icon-copy-minus-filled: unicode('fe52');
+$ti-icon-copy-off: unicode('f0d8');
+$ti-icon-copy-plus: unicode('fdae');
+$ti-icon-copy-plus-filled: unicode('fe51');
+$ti-icon-copy-x: unicode('fdad');
+$ti-icon-copy-x-filled: unicode('fe50');
+$ti-icon-copyleft: unicode('ec3d');
+$ti-icon-copyleft-filled: unicode('f73b');
+$ti-icon-copyleft-off: unicode('f0d9');
+$ti-icon-copyright: unicode('ea7b');
+$ti-icon-copyright-filled: unicode('f73c');
+$ti-icon-copyright-off: unicode('f0da');
+$ti-icon-corner-down-left: unicode('ea7c');
+$ti-icon-corner-down-left-double: unicode('ee48');
+$ti-icon-corner-down-right: unicode('ea7d');
+$ti-icon-corner-down-right-double: unicode('ee49');
+$ti-icon-corner-left-down: unicode('ea7e');
+$ti-icon-corner-left-down-double: unicode('ee4a');
+$ti-icon-corner-left-up: unicode('ea7f');
+$ti-icon-corner-left-up-double: unicode('ee4b');
+$ti-icon-corner-right-down: unicode('ea80');
+$ti-icon-corner-right-down-double: unicode('ee4c');
+$ti-icon-corner-right-up: unicode('ea81');
+$ti-icon-corner-right-up-double: unicode('ee4d');
+$ti-icon-corner-up-left: unicode('ea82');
+$ti-icon-corner-up-left-double: unicode('ee4e');
+$ti-icon-corner-up-right: unicode('ea83');
+$ti-icon-corner-up-right-double: unicode('ee4f');
+$ti-icon-cpu: unicode('ef8e');
+$ti-icon-cpu-2: unicode('f075');
+$ti-icon-cpu-off: unicode('f108');
+$ti-icon-crane: unicode('ef27');
+$ti-icon-crane-off: unicode('f109');
+$ti-icon-creative-commons: unicode('efb3');
+$ti-icon-creative-commons-by: unicode('f21f');
+$ti-icon-creative-commons-nc: unicode('f220');
+$ti-icon-creative-commons-nd: unicode('f221');
+$ti-icon-creative-commons-off: unicode('f10a');
+$ti-icon-creative-commons-sa: unicode('f222');
+$ti-icon-creative-commons-zero: unicode('f223');
+$ti-icon-credit-card: unicode('ea84');
+$ti-icon-credit-card-filled: unicode('fd11');
+$ti-icon-credit-card-off: unicode('ed11');
+$ti-icon-credit-card-pay: unicode('fd32');
+$ti-icon-credit-card-refund: unicode('fd33');
+$ti-icon-cricket: unicode('f09a');
+$ti-icon-crop: unicode('ea85');
+$ti-icon-crop-1-1: unicode('fd50');
+$ti-icon-crop-1-1-filled: unicode('fe4f');
+$ti-icon-crop-16-9: unicode('fd51');
+$ti-icon-crop-16-9-filled: unicode('fe4e');
+$ti-icon-crop-3-2: unicode('fd52');
+$ti-icon-crop-3-2-filled: unicode('fe4d');
+$ti-icon-crop-5-4: unicode('fd53');
+$ti-icon-crop-5-4-filled: unicode('fe4c');
+$ti-icon-crop-7-5: unicode('fd54');
+$ti-icon-crop-7-5-filled: unicode('fe4b');
+$ti-icon-crop-landscape: unicode('fd55');
+$ti-icon-crop-landscape-filled: unicode('fe4a');
+$ti-icon-crop-portrait: unicode('fd56');
+$ti-icon-crop-portrait-filled: unicode('fe49');
+$ti-icon-cross: unicode('ef8f');
+$ti-icon-cross-filled: unicode('f675');
+$ti-icon-cross-off: unicode('f10b');
+$ti-icon-crosshair: unicode('ec3e');
+$ti-icon-crown: unicode('ed12');
+$ti-icon-crown-off: unicode('ee50');
+$ti-icon-crutches: unicode('ef5b');
+$ti-icon-crutches-off: unicode('f10c');
+$ti-icon-crystal-ball: unicode('f57b');
+$ti-icon-csv: unicode('f791');
+$ti-icon-cube: unicode('fa97');
+$ti-icon-cube-3d-sphere: unicode('ecd7');
+$ti-icon-cube-3d-sphere-off: unicode('f3b5');
+$ti-icon-cube-off: unicode('fa95');
+$ti-icon-cube-plus: unicode('fa96');
+$ti-icon-cube-send: unicode('f61b');
+$ti-icon-cube-unfolded: unicode('f61c');
+$ti-icon-cup: unicode('ef28');
+$ti-icon-cup-off: unicode('f10d');
+$ti-icon-curling: unicode('efc8');
+$ti-icon-curly-loop: unicode('ecda');
+$ti-icon-currency: unicode('efa6');
+$ti-icon-currency-afghani: unicode('f65e');
+$ti-icon-currency-bahraini: unicode('ee51');
+$ti-icon-currency-baht: unicode('f08a');
+$ti-icon-currency-bitcoin: unicode('ebab');
+$ti-icon-currency-cent: unicode('ee53');
+$ti-icon-currency-dinar: unicode('ee54');
+$ti-icon-currency-dirham: unicode('ee55');
+$ti-icon-currency-dogecoin: unicode('ef4b');
+$ti-icon-currency-dollar: unicode('eb84');
+$ti-icon-currency-dollar-australian: unicode('ee56');
+$ti-icon-currency-dollar-brunei: unicode('f36c');
+$ti-icon-currency-dollar-canadian: unicode('ee57');
+$ti-icon-currency-dollar-guyanese: unicode('f36d');
+$ti-icon-currency-dollar-off: unicode('f3dc');
+$ti-icon-currency-dollar-singapore: unicode('ee58');
+$ti-icon-currency-dollar-zimbabwean: unicode('f36e');
+$ti-icon-currency-dong: unicode('f36f');
+$ti-icon-currency-dram: unicode('f370');
+$ti-icon-currency-ethereum: unicode('ee59');
+$ti-icon-currency-euro: unicode('eb85');
+$ti-icon-currency-euro-off: unicode('f3dd');
+$ti-icon-currency-florin: unicode('faf5');
+$ti-icon-currency-forint: unicode('ee5a');
+$ti-icon-currency-frank: unicode('ee5b');
+$ti-icon-currency-guarani: unicode('f371');
+$ti-icon-currency-hryvnia: unicode('f372');
+$ti-icon-currency-iranian-rial: unicode('fa58');
+$ti-icon-currency-kip: unicode('f373');
+$ti-icon-currency-krone-czech: unicode('ee5c');
+$ti-icon-currency-krone-danish: unicode('ee5d');
+$ti-icon-currency-krone-swedish: unicode('ee5e');
+$ti-icon-currency-lari: unicode('f374');
+$ti-icon-currency-leu: unicode('ee5f');
+$ti-icon-currency-lira: unicode('ee60');
+$ti-icon-currency-litecoin: unicode('ee61');
+$ti-icon-currency-lyd: unicode('f375');
+$ti-icon-currency-manat: unicode('f376');
+$ti-icon-currency-monero: unicode('f377');
+$ti-icon-currency-naira: unicode('ee62');
+$ti-icon-currency-nano: unicode('f7a6');
+$ti-icon-currency-off: unicode('f3de');
+$ti-icon-currency-paanga: unicode('f378');
+$ti-icon-currency-peso: unicode('f65f');
+$ti-icon-currency-pound: unicode('ebac');
+$ti-icon-currency-pound-off: unicode('f3df');
+$ti-icon-currency-quetzal: unicode('f379');
+$ti-icon-currency-real: unicode('ee63');
+$ti-icon-currency-renminbi: unicode('ee64');
+$ti-icon-currency-ripple: unicode('ee65');
+$ti-icon-currency-riyal: unicode('ee66');
+$ti-icon-currency-rubel: unicode('ee67');
+$ti-icon-currency-rufiyaa: unicode('f37a');
+$ti-icon-currency-rupee: unicode('ebad');
+$ti-icon-currency-rupee-nepalese: unicode('f37b');
+$ti-icon-currency-shekel: unicode('ee68');
+$ti-icon-currency-solana: unicode('f4a1');
+$ti-icon-currency-som: unicode('f37c');
+$ti-icon-currency-taka: unicode('ee69');
+$ti-icon-currency-tenge: unicode('f37d');
+$ti-icon-currency-tugrik: unicode('ee6a');
+$ti-icon-currency-won: unicode('ee6b');
+$ti-icon-currency-xrp: unicode('fd34');
+$ti-icon-currency-yen: unicode('ebae');
+$ti-icon-currency-yen-off: unicode('f3e0');
+$ti-icon-currency-yuan: unicode('f29a');
+$ti-icon-currency-zloty: unicode('ee6c');
+$ti-icon-current-location: unicode('ecef');
+$ti-icon-current-location-off: unicode('f10e');
+$ti-icon-cursor-off: unicode('f10f');
+$ti-icon-cursor-text: unicode('ee6d');
+$ti-icon-cut: unicode('ea86');
+$ti-icon-cylinder: unicode('f54c');
+$ti-icon-cylinder-off: unicode('fa98');
+$ti-icon-cylinder-plus: unicode('fa99');
+$ti-icon-dashboard: unicode('ea87');
+$ti-icon-dashboard-off: unicode('f3e1');
+$ti-icon-database: unicode('ea88');
+$ti-icon-database-cog: unicode('fa10');
+$ti-icon-database-dollar: unicode('fa11');
+$ti-icon-database-edit: unicode('fa12');
+$ti-icon-database-exclamation: unicode('fa13');
+$ti-icon-database-export: unicode('ee6e');
+$ti-icon-database-heart: unicode('fa14');
+$ti-icon-database-import: unicode('ee6f');
+$ti-icon-database-leak: unicode('fa15');
+$ti-icon-database-minus: unicode('fa16');
+$ti-icon-database-off: unicode('ee70');
+$ti-icon-database-plus: unicode('fa17');
+$ti-icon-database-search: unicode('fa18');
+$ti-icon-database-share: unicode('fa19');
+$ti-icon-database-smile: unicode('fd9b');
+$ti-icon-database-star: unicode('fa1a');
+$ti-icon-database-x: unicode('fa1b');
+$ti-icon-decimal: unicode('fa26');
+$ti-icon-deer: unicode('f4c5');
+$ti-icon-delta: unicode('f53c');
+$ti-icon-dental: unicode('f025');
+$ti-icon-dental-broken: unicode('f286');
+$ti-icon-dental-off: unicode('f110');
+$ti-icon-deselect: unicode('f9f3');
+$ti-icon-desk: unicode('fd35');
+$ti-icon-details: unicode('ee71');
+$ti-icon-details-off: unicode('f3e2');
+$ti-icon-device-airpods: unicode('f5a9');
+$ti-icon-device-airpods-case: unicode('f646');
+$ti-icon-device-airtag: unicode('fae6');
+$ti-icon-device-analytics: unicode('ee72');
+$ti-icon-device-audio-tape: unicode('ee73');
+$ti-icon-device-camera-phone: unicode('f233');
+$ti-icon-device-cctv: unicode('ee74');
+$ti-icon-device-cctv-off: unicode('f3e3');
+$ti-icon-device-computer-camera: unicode('ee76');
+$ti-icon-device-computer-camera-off: unicode('ee75');
+$ti-icon-device-desktop: unicode('ea89');
+$ti-icon-device-desktop-analytics: unicode('ee77');
+$ti-icon-device-desktop-bolt: unicode('f85e');
+$ti-icon-device-desktop-cancel: unicode('f85f');
+$ti-icon-device-desktop-check: unicode('f860');
+$ti-icon-device-desktop-code: unicode('f861');
+$ti-icon-device-desktop-cog: unicode('f862');
+$ti-icon-device-desktop-dollar: unicode('f863');
+$ti-icon-device-desktop-down: unicode('f864');
+$ti-icon-device-desktop-exclamation: unicode('f865');
+$ti-icon-device-desktop-heart: unicode('f866');
+$ti-icon-device-desktop-minus: unicode('f867');
+$ti-icon-device-desktop-off: unicode('ee78');
+$ti-icon-device-desktop-pause: unicode('f868');
+$ti-icon-device-desktop-pin: unicode('f869');
+$ti-icon-device-desktop-plus: unicode('f86a');
+$ti-icon-device-desktop-question: unicode('f86b');
+$ti-icon-device-desktop-search: unicode('f86c');
+$ti-icon-device-desktop-share: unicode('f86d');
+$ti-icon-device-desktop-star: unicode('f86e');
+$ti-icon-device-desktop-up: unicode('f86f');
+$ti-icon-device-desktop-x: unicode('f870');
+$ti-icon-device-floppy: unicode('eb62');
+$ti-icon-device-gamepad: unicode('eb63');
+$ti-icon-device-gamepad-2: unicode('f1d2');
+$ti-icon-device-gamepad-3: unicode('fc58');
+$ti-icon-device-heart-monitor: unicode('f060');
+$ti-icon-device-heart-monitor-filled: unicode('fa38');
+$ti-icon-device-imac: unicode('f7a7');
+$ti-icon-device-imac-bolt: unicode('f871');
+$ti-icon-device-imac-cancel: unicode('f872');
+$ti-icon-device-imac-check: unicode('f873');
+$ti-icon-device-imac-code: unicode('f874');
+$ti-icon-device-imac-cog: unicode('f875');
+$ti-icon-device-imac-dollar: unicode('f876');
+$ti-icon-device-imac-down: unicode('f877');
+$ti-icon-device-imac-exclamation: unicode('f878');
+$ti-icon-device-imac-heart: unicode('f879');
+$ti-icon-device-imac-minus: unicode('f87a');
+$ti-icon-device-imac-off: unicode('f87b');
+$ti-icon-device-imac-pause: unicode('f87c');
+$ti-icon-device-imac-pin: unicode('f87d');
+$ti-icon-device-imac-plus: unicode('f87e');
+$ti-icon-device-imac-question: unicode('f87f');
+$ti-icon-device-imac-search: unicode('f880');
+$ti-icon-device-imac-share: unicode('f881');
+$ti-icon-device-imac-star: unicode('f882');
+$ti-icon-device-imac-up: unicode('f883');
+$ti-icon-device-imac-x: unicode('f884');
+$ti-icon-device-ipad: unicode('f648');
+$ti-icon-device-ipad-bolt: unicode('f885');
+$ti-icon-device-ipad-cancel: unicode('f886');
+$ti-icon-device-ipad-check: unicode('f887');
+$ti-icon-device-ipad-code: unicode('f888');
+$ti-icon-device-ipad-cog: unicode('f889');
+$ti-icon-device-ipad-dollar: unicode('f88a');
+$ti-icon-device-ipad-down: unicode('f88b');
+$ti-icon-device-ipad-exclamation: unicode('f88c');
+$ti-icon-device-ipad-heart: unicode('f88d');
+$ti-icon-device-ipad-horizontal: unicode('f647');
+$ti-icon-device-ipad-horizontal-bolt: unicode('f88e');
+$ti-icon-device-ipad-horizontal-cancel: unicode('f88f');
+$ti-icon-device-ipad-horizontal-check: unicode('f890');
+$ti-icon-device-ipad-horizontal-code: unicode('f891');
+$ti-icon-device-ipad-horizontal-cog: unicode('f892');
+$ti-icon-device-ipad-horizontal-dollar: unicode('f893');
+$ti-icon-device-ipad-horizontal-down: unicode('f894');
+$ti-icon-device-ipad-horizontal-exclamation: unicode('f895');
+$ti-icon-device-ipad-horizontal-heart: unicode('f896');
+$ti-icon-device-ipad-horizontal-minus: unicode('f897');
+$ti-icon-device-ipad-horizontal-off: unicode('f898');
+$ti-icon-device-ipad-horizontal-pause: unicode('f899');
+$ti-icon-device-ipad-horizontal-pin: unicode('f89a');
+$ti-icon-device-ipad-horizontal-plus: unicode('f89b');
+$ti-icon-device-ipad-horizontal-question: unicode('f89c');
+$ti-icon-device-ipad-horizontal-search: unicode('f89d');
+$ti-icon-device-ipad-horizontal-share: unicode('f89e');
+$ti-icon-device-ipad-horizontal-star: unicode('f89f');
+$ti-icon-device-ipad-horizontal-up: unicode('f8a0');
+$ti-icon-device-ipad-horizontal-x: unicode('f8a1');
+$ti-icon-device-ipad-minus: unicode('f8a2');
+$ti-icon-device-ipad-off: unicode('f8a3');
+$ti-icon-device-ipad-pause: unicode('f8a4');
+$ti-icon-device-ipad-pin: unicode('f8a5');
+$ti-icon-device-ipad-plus: unicode('f8a6');
+$ti-icon-device-ipad-question: unicode('f8a7');
+$ti-icon-device-ipad-search: unicode('f8a8');
+$ti-icon-device-ipad-share: unicode('f8a9');
+$ti-icon-device-ipad-star: unicode('f8aa');
+$ti-icon-device-ipad-up: unicode('f8ab');
+$ti-icon-device-ipad-x: unicode('f8ac');
+$ti-icon-device-landline-phone: unicode('f649');
+$ti-icon-device-laptop: unicode('eb64');
+$ti-icon-device-laptop-off: unicode('f061');
+$ti-icon-device-mobile: unicode('ea8a');
+$ti-icon-device-mobile-bolt: unicode('f8ad');
+$ti-icon-device-mobile-cancel: unicode('f8ae');
+$ti-icon-device-mobile-charging: unicode('f224');
+$ti-icon-device-mobile-check: unicode('f8af');
+$ti-icon-device-mobile-code: unicode('f8b0');
+$ti-icon-device-mobile-cog: unicode('f8b1');
+$ti-icon-device-mobile-dollar: unicode('f8b2');
+$ti-icon-device-mobile-down: unicode('f8b3');
+$ti-icon-device-mobile-exclamation: unicode('f8b4');
+$ti-icon-device-mobile-filled: unicode('fa39');
+$ti-icon-device-mobile-heart: unicode('f8b5');
+$ti-icon-device-mobile-message: unicode('ee79');
+$ti-icon-device-mobile-minus: unicode('f8b6');
+$ti-icon-device-mobile-off: unicode('f062');
+$ti-icon-device-mobile-pause: unicode('f8b7');
+$ti-icon-device-mobile-pin: unicode('f8b8');
+$ti-icon-device-mobile-plus: unicode('f8b9');
+$ti-icon-device-mobile-question: unicode('f8ba');
+$ti-icon-device-mobile-rotated: unicode('ecdb');
+$ti-icon-device-mobile-search: unicode('f8bb');
+$ti-icon-device-mobile-share: unicode('f8bc');
+$ti-icon-device-mobile-star: unicode('f8bd');
+$ti-icon-device-mobile-up: unicode('f8be');
+$ti-icon-device-mobile-vibration: unicode('eb86');
+$ti-icon-device-mobile-x: unicode('f8bf');
+$ti-icon-device-nintendo: unicode('f026');
+$ti-icon-device-nintendo-off: unicode('f111');
+$ti-icon-device-projector: unicode('fc11');
+$ti-icon-device-remote: unicode('f792');
+$ti-icon-device-sd-card: unicode('f384');
+$ti-icon-device-sim: unicode('f4b2');
+$ti-icon-device-sim-1: unicode('f4af');
+$ti-icon-device-sim-2: unicode('f4b0');
+$ti-icon-device-sim-3: unicode('f4b1');
+$ti-icon-device-speaker: unicode('ea8b');
+$ti-icon-device-speaker-off: unicode('f112');
+$ti-icon-device-tablet: unicode('ea8c');
+$ti-icon-device-tablet-bolt: unicode('f8c0');
+$ti-icon-device-tablet-cancel: unicode('f8c1');
+$ti-icon-device-tablet-check: unicode('f8c2');
+$ti-icon-device-tablet-code: unicode('f8c3');
+$ti-icon-device-tablet-cog: unicode('f8c4');
+$ti-icon-device-tablet-dollar: unicode('f8c5');
+$ti-icon-device-tablet-down: unicode('f8c6');
+$ti-icon-device-tablet-exclamation: unicode('f8c7');
+$ti-icon-device-tablet-filled: unicode('fa3a');
+$ti-icon-device-tablet-heart: unicode('f8c8');
+$ti-icon-device-tablet-minus: unicode('f8c9');
+$ti-icon-device-tablet-off: unicode('f063');
+$ti-icon-device-tablet-pause: unicode('f8ca');
+$ti-icon-device-tablet-pin: unicode('f8cb');
+$ti-icon-device-tablet-plus: unicode('f8cc');
+$ti-icon-device-tablet-question: unicode('f8cd');
+$ti-icon-device-tablet-search: unicode('f8ce');
+$ti-icon-device-tablet-share: unicode('f8cf');
+$ti-icon-device-tablet-star: unicode('f8d0');
+$ti-icon-device-tablet-up: unicode('f8d1');
+$ti-icon-device-tablet-x: unicode('f8d2');
+$ti-icon-device-tv: unicode('ea8d');
+$ti-icon-device-tv-off: unicode('f064');
+$ti-icon-device-tv-old: unicode('f1d3');
+$ti-icon-device-usb: unicode('fc59');
+$ti-icon-device-vision-pro: unicode('fae7');
+$ti-icon-device-watch: unicode('ebf9');
+$ti-icon-device-watch-bolt: unicode('f8d3');
+$ti-icon-device-watch-cancel: unicode('f8d4');
+$ti-icon-device-watch-check: unicode('f8d5');
+$ti-icon-device-watch-code: unicode('f8d6');
+$ti-icon-device-watch-cog: unicode('f8d7');
+$ti-icon-device-watch-dollar: unicode('f8d8');
+$ti-icon-device-watch-down: unicode('f8d9');
+$ti-icon-device-watch-exclamation: unicode('f8da');
+$ti-icon-device-watch-heart: unicode('f8db');
+$ti-icon-device-watch-minus: unicode('f8dc');
+$ti-icon-device-watch-off: unicode('f065');
+$ti-icon-device-watch-pause: unicode('f8dd');
+$ti-icon-device-watch-pin: unicode('f8de');
+$ti-icon-device-watch-plus: unicode('f8df');
+$ti-icon-device-watch-question: unicode('f8e0');
+$ti-icon-device-watch-search: unicode('f8e1');
+$ti-icon-device-watch-share: unicode('f8e2');
+$ti-icon-device-watch-star: unicode('f8e3');
+$ti-icon-device-watch-stats: unicode('ef7d');
+$ti-icon-device-watch-stats-2: unicode('ef7c');
+$ti-icon-device-watch-up: unicode('f8e4');
+$ti-icon-device-watch-x: unicode('f8e5');
+$ti-icon-devices: unicode('eb87');
+$ti-icon-devices-2: unicode('ed29');
+$ti-icon-devices-bolt: unicode('f8e6');
+$ti-icon-devices-cancel: unicode('f8e7');
+$ti-icon-devices-check: unicode('f8e8');
+$ti-icon-devices-code: unicode('f8e9');
+$ti-icon-devices-cog: unicode('f8ea');
+$ti-icon-devices-dollar: unicode('f8eb');
+$ti-icon-devices-down: unicode('f8ec');
+$ti-icon-devices-exclamation: unicode('f8ed');
+$ti-icon-devices-heart: unicode('f8ee');
+$ti-icon-devices-minus: unicode('f8ef');
+$ti-icon-devices-off: unicode('f3e4');
+$ti-icon-devices-pause: unicode('f8f0');
+$ti-icon-devices-pc: unicode('ee7a');
+$ti-icon-devices-pc-off: unicode('f113');
+$ti-icon-devices-pin: unicode('f8f1');
+$ti-icon-devices-plus: unicode('f8f2');
+$ti-icon-devices-question: unicode('f8f3');
+$ti-icon-devices-search: unicode('f8f4');
+$ti-icon-devices-share: unicode('f8f5');
+$ti-icon-devices-star: unicode('f8f6');
+$ti-icon-devices-up: unicode('f8f7');
+$ti-icon-devices-x: unicode('f8f8');
+$ti-icon-diabolo: unicode('fa9c');
+$ti-icon-diabolo-off: unicode('fa9a');
+$ti-icon-diabolo-plus: unicode('fa9b');
+$ti-icon-dialpad: unicode('f067');
+$ti-icon-dialpad-filled: unicode('fa3b');
+$ti-icon-dialpad-off: unicode('f114');
+$ti-icon-diamond: unicode('eb65');
+$ti-icon-diamond-filled: unicode('f73d');
+$ti-icon-diamond-off: unicode('f115');
+$ti-icon-diamonds: unicode('eff5');
+$ti-icon-diamonds-filled: unicode('f676');
+$ti-icon-dice: unicode('eb66');
+$ti-icon-dice-1: unicode('f08b');
+$ti-icon-dice-1-filled: unicode('f73e');
+$ti-icon-dice-2: unicode('f08c');
+$ti-icon-dice-2-filled: unicode('f73f');
+$ti-icon-dice-3: unicode('f08d');
+$ti-icon-dice-3-filled: unicode('f740');
+$ti-icon-dice-4: unicode('f08e');
+$ti-icon-dice-4-filled: unicode('f741');
+$ti-icon-dice-5: unicode('f08f');
+$ti-icon-dice-5-filled: unicode('f742');
+$ti-icon-dice-6: unicode('f090');
+$ti-icon-dice-6-filled: unicode('f743');
+$ti-icon-dice-filled: unicode('f744');
+$ti-icon-dimensions: unicode('ee7b');
+$ti-icon-direction: unicode('ebfb');
+$ti-icon-direction-arrows: unicode('fd36');
+$ti-icon-direction-horizontal: unicode('ebfa');
+$ti-icon-direction-sign: unicode('f1f7');
+$ti-icon-direction-sign-filled: unicode('f745');
+$ti-icon-direction-sign-off: unicode('f3e5');
+$ti-icon-directions: unicode('ea8e');
+$ti-icon-directions-off: unicode('f116');
+$ti-icon-disabled: unicode('ea8f');
+$ti-icon-disabled-2: unicode('ebaf');
+$ti-icon-disabled-off: unicode('f117');
+$ti-icon-disc: unicode('ea90');
+$ti-icon-disc-golf: unicode('f385');
+$ti-icon-disc-off: unicode('f118');
+$ti-icon-discount: unicode('ebbd');
+$ti-icon-discount-off: unicode('f3e7');
+$ti-icon-divide: unicode('ed5c');
+$ti-icon-dna: unicode('ee7d');
+$ti-icon-dna-2: unicode('ef5c');
+$ti-icon-dna-2-off: unicode('f119');
+$ti-icon-dna-off: unicode('f11a');
+$ti-icon-dog: unicode('f660');
+$ti-icon-dog-bowl: unicode('ef29');
+$ti-icon-door: unicode('ef4e');
+$ti-icon-door-enter: unicode('ef4c');
+$ti-icon-door-exit: unicode('ef4d');
+$ti-icon-door-off: unicode('f11b');
+$ti-icon-dots: unicode('ea95');
+$ti-icon-dots-circle-horizontal: unicode('ea91');
+$ti-icon-dots-diagonal: unicode('ea93');
+$ti-icon-dots-diagonal-2: unicode('ea92');
+$ti-icon-dots-vertical: unicode('ea94');
+$ti-icon-download: unicode('ea96');
+$ti-icon-download-off: unicode('f11c');
+$ti-icon-drag-drop: unicode('eb89');
+$ti-icon-drag-drop-2: unicode('eb88');
+$ti-icon-drone: unicode('ed79');
+$ti-icon-drone-off: unicode('ee7e');
+$ti-icon-drop-circle: unicode('efde');
+$ti-icon-droplet: unicode('ea97');
+$ti-icon-droplet-bolt: unicode('f8f9');
+$ti-icon-droplet-cancel: unicode('f8fa');
+$ti-icon-droplet-check: unicode('f8fb');
+$ti-icon-droplet-code: unicode('f8fc');
+$ti-icon-droplet-cog: unicode('f8fd');
+$ti-icon-droplet-dollar: unicode('f8fe');
+$ti-icon-droplet-down: unicode('f8ff');
+$ti-icon-droplet-exclamation: unicode('f900');
+$ti-icon-droplet-filled: unicode('ee80');
+$ti-icon-droplet-half: unicode('ee82');
+$ti-icon-droplet-half-2: unicode('ee81');
+$ti-icon-droplet-half-2-filled: unicode('fb6c');
+$ti-icon-droplet-half-filled: unicode('f6c5');
+$ti-icon-droplet-heart: unicode('f901');
+$ti-icon-droplet-minus: unicode('f902');
+$ti-icon-droplet-off: unicode('ee83');
+$ti-icon-droplet-pause: unicode('f903');
+$ti-icon-droplet-pin: unicode('f904');
+$ti-icon-droplet-plus: unicode('f905');
+$ti-icon-droplet-question: unicode('f906');
+$ti-icon-droplet-search: unicode('f907');
+$ti-icon-droplet-share: unicode('f908');
+$ti-icon-droplet-star: unicode('f909');
+$ti-icon-droplet-up: unicode('f90a');
+$ti-icon-droplet-x: unicode('f90b');
+$ti-icon-droplets: unicode('fc12');
+$ti-icon-dual-screen: unicode('fa59');
+$ti-icon-dumpling: unicode('feb5');
+$ti-icon-e-passport: unicode('f4df');
+$ti-icon-ear: unicode('ebce');
+$ti-icon-ear-off: unicode('ee84');
+$ti-icon-ear-scan: unicode('fd57');
+$ti-icon-ease-in: unicode('f573');
+$ti-icon-ease-in-control-point: unicode('f570');
+$ti-icon-ease-in-out: unicode('f572');
+$ti-icon-ease-in-out-control-points: unicode('f571');
+$ti-icon-ease-out: unicode('f575');
+$ti-icon-ease-out-control-point: unicode('f574');
+$ti-icon-edit: unicode('ea98');
+$ti-icon-edit-circle: unicode('ee85');
+$ti-icon-edit-circle-off: unicode('f11d');
+$ti-icon-edit-off: unicode('f11e');
+$ti-icon-egg: unicode('eb8a');
+$ti-icon-egg-cracked: unicode('f2d6');
+$ti-icon-egg-filled: unicode('f678');
+$ti-icon-egg-fried: unicode('f386');
+$ti-icon-egg-off: unicode('f11f');
+$ti-icon-eggs: unicode('f500');
+$ti-icon-elevator: unicode('efdf');
+$ti-icon-elevator-off: unicode('f3e8');
+$ti-icon-emergency-bed: unicode('ef5d');
+$ti-icon-empathize: unicode('f29b');
+$ti-icon-empathize-off: unicode('f3e9');
+$ti-icon-emphasis: unicode('ebcf');
+$ti-icon-engine: unicode('ef7e');
+$ti-icon-engine-off: unicode('f120');
+$ti-icon-equal: unicode('ee87');
+$ti-icon-equal-double: unicode('f4e1');
+$ti-icon-equal-not: unicode('ee86');
+$ti-icon-eraser: unicode('eb8b');
+$ti-icon-eraser-off: unicode('f121');
+$ti-icon-error-404: unicode('f027');
+$ti-icon-error-404-off: unicode('f122');
+$ti-icon-escalator: unicode('fb06');
+$ti-icon-escalator-down: unicode('fb04');
+$ti-icon-escalator-up: unicode('fb05');
+$ti-icon-exchange: unicode('ebe7');
+$ti-icon-exchange-off: unicode('f123');
+$ti-icon-exclamation-circle: unicode('f634');
+$ti-icon-exclamation-mark: unicode('efb4');
+$ti-icon-exclamation-mark-off: unicode('f124');
+$ti-icon-explicit: unicode('f256');
+$ti-icon-explicit-off: unicode('f3ea');
+$ti-icon-exposure: unicode('eb8c');
+$ti-icon-exposure-0: unicode('f29c');
+$ti-icon-exposure-minus-1: unicode('f29d');
+$ti-icon-exposure-minus-2: unicode('f29e');
+$ti-icon-exposure-off: unicode('f3eb');
+$ti-icon-exposure-plus-1: unicode('f29f');
+$ti-icon-exposure-plus-2: unicode('f2a0');
+$ti-icon-external-link: unicode('ea99');
+$ti-icon-external-link-off: unicode('f125');
+$ti-icon-eye: unicode('ea9a');
+$ti-icon-eye-bolt: unicode('fb6d');
+$ti-icon-eye-cancel: unicode('fb6e');
+$ti-icon-eye-check: unicode('ee88');
+$ti-icon-eye-closed: unicode('f7ec');
+$ti-icon-eye-code: unicode('fb6f');
+$ti-icon-eye-cog: unicode('f7ed');
+$ti-icon-eye-discount: unicode('fb70');
+$ti-icon-eye-dollar: unicode('fb71');
+$ti-icon-eye-dotted: unicode('fead');
+$ti-icon-eye-down: unicode('fb72');
+$ti-icon-eye-edit: unicode('f7ee');
+$ti-icon-eye-exclamation: unicode('f7ef');
+$ti-icon-eye-filled: unicode('f679');
+$ti-icon-eye-heart: unicode('f7f0');
+$ti-icon-eye-minus: unicode('fb73');
+$ti-icon-eye-off: unicode('ecf0');
+$ti-icon-eye-pause: unicode('fb74');
+$ti-icon-eye-pin: unicode('fb75');
+$ti-icon-eye-plus: unicode('fb76');
+$ti-icon-eye-question: unicode('fb77');
+$ti-icon-eye-search: unicode('fb78');
+$ti-icon-eye-share: unicode('fb79');
+$ti-icon-eye-star: unicode('fb7a');
+$ti-icon-eye-table: unicode('ef5e');
+$ti-icon-eye-up: unicode('fb7b');
+$ti-icon-eye-x: unicode('f7f1');
+$ti-icon-eyeglass: unicode('ee8a');
+$ti-icon-eyeglass-2: unicode('ee89');
+$ti-icon-eyeglass-off: unicode('f126');
+$ti-icon-face-id: unicode('ea9b');
+$ti-icon-face-id-error: unicode('efa7');
+$ti-icon-face-mask: unicode('efb5');
+$ti-icon-face-mask-off: unicode('f127');
+$ti-icon-fall: unicode('ecb9');
+$ti-icon-favicon: unicode('fd65');
+$ti-icon-feather: unicode('ee8b');
+$ti-icon-feather-off: unicode('f128');
+$ti-icon-fence: unicode('ef2a');
+$ti-icon-fence-off: unicode('f129');
+$ti-icon-fidget-spinner: unicode('f068');
+$ti-icon-file: unicode('eaa4');
+$ti-icon-file-3d: unicode('f032');
+$ti-icon-file-alert: unicode('ede6');
+$ti-icon-file-analytics: unicode('ede7');
+$ti-icon-file-arrow-left: unicode('f033');
+$ti-icon-file-arrow-right: unicode('f034');
+$ti-icon-file-barcode: unicode('f035');
+$ti-icon-file-broken: unicode('f501');
+$ti-icon-file-certificate: unicode('ed4d');
+$ti-icon-file-chart: unicode('f036');
+$ti-icon-file-check: unicode('ea9c');
+$ti-icon-file-code: unicode('ebd0');
+$ti-icon-file-code-2: unicode('ede8');
+$ti-icon-file-cv: unicode('fa5a');
+$ti-icon-file-database: unicode('f037');
+$ti-icon-file-delta: unicode('f53d');
+$ti-icon-file-description: unicode('f028');
+$ti-icon-file-diff: unicode('ecf1');
+$ti-icon-file-digit: unicode('efa8');
+$ti-icon-file-dislike: unicode('ed2a');
+$ti-icon-file-dollar: unicode('efe0');
+$ti-icon-file-dots: unicode('f038');
+$ti-icon-file-download: unicode('ea9d');
+$ti-icon-file-euro: unicode('efe1');
+$ti-icon-file-export: unicode('ede9');
+$ti-icon-file-filled: unicode('f747');
+$ti-icon-file-function: unicode('f53e');
+$ti-icon-file-horizontal: unicode('ebb0');
+$ti-icon-file-import: unicode('edea');
+$ti-icon-file-infinity: unicode('f502');
+$ti-icon-file-info: unicode('edec');
+$ti-icon-file-invoice: unicode('eb67');
+$ti-icon-file-isr: unicode('feac');
+$ti-icon-file-lambda: unicode('f53f');
+$ti-icon-file-like: unicode('ed2b');
+$ti-icon-file-minus: unicode('ea9e');
+$ti-icon-file-music: unicode('ea9f');
+$ti-icon-file-neutral: unicode('fd22');
+$ti-icon-file-off: unicode('ecf2');
+$ti-icon-file-orientation: unicode('f2a1');
+$ti-icon-file-pencil: unicode('f039');
+$ti-icon-file-percent: unicode('f540');
+$ti-icon-file-phone: unicode('ecdc');
+$ti-icon-file-plus: unicode('eaa0');
+$ti-icon-file-power: unicode('f03a');
+$ti-icon-file-report: unicode('eded');
+$ti-icon-file-rss: unicode('f03b');
+$ti-icon-file-sad: unicode('fd23');
+$ti-icon-file-scissors: unicode('f03c');
+$ti-icon-file-search: unicode('ed5d');
+$ti-icon-file-settings: unicode('f029');
+$ti-icon-file-shredder: unicode('eaa1');
+$ti-icon-file-signal: unicode('f03d');
+$ti-icon-file-smile: unicode('fd24');
+$ti-icon-file-spreadsheet: unicode('f03e');
+$ti-icon-file-stack: unicode('f503');
+$ti-icon-file-star: unicode('f03f');
+$ti-icon-file-symlink: unicode('ed53');
+$ti-icon-file-text: unicode('eaa2');
+$ti-icon-file-text-ai: unicode('fa27');
+$ti-icon-file-time: unicode('f040');
+$ti-icon-file-type-bmp: unicode('fb07');
+$ti-icon-file-type-css: unicode('fb08');
+$ti-icon-file-type-csv: unicode('fb09');
+$ti-icon-file-type-doc: unicode('fb0a');
+$ti-icon-file-type-docx: unicode('fb0b');
+$ti-icon-file-type-html: unicode('fb0c');
+$ti-icon-file-type-jpg: unicode('fb0d');
+$ti-icon-file-type-js: unicode('fb0e');
+$ti-icon-file-type-jsx: unicode('fb0f');
+$ti-icon-file-type-pdf: unicode('fb10');
+$ti-icon-file-type-php: unicode('fb11');
+$ti-icon-file-type-png: unicode('fb12');
+$ti-icon-file-type-ppt: unicode('fb13');
+$ti-icon-file-type-rs: unicode('fb14');
+$ti-icon-file-type-sql: unicode('fb15');
+$ti-icon-file-type-svg: unicode('fb16');
+$ti-icon-file-type-ts: unicode('fb17');
+$ti-icon-file-type-tsx: unicode('fb18');
+$ti-icon-file-type-txt: unicode('fb19');
+$ti-icon-file-type-vue: unicode('fb1a');
+$ti-icon-file-type-xls: unicode('fb1b');
+$ti-icon-file-type-xml: unicode('fb1c');
+$ti-icon-file-type-zip: unicode('fb1d');
+$ti-icon-file-typography: unicode('f041');
+$ti-icon-file-unknown: unicode('f042');
+$ti-icon-file-upload: unicode('ec91');
+$ti-icon-file-vector: unicode('f043');
+$ti-icon-file-x: unicode('eaa3');
+$ti-icon-file-x-filled: unicode('f748');
+$ti-icon-file-zip: unicode('ed4e');
+$ti-icon-files: unicode('edef');
+$ti-icon-files-off: unicode('edee');
+$ti-icon-filter: unicode('eaa5');
+$ti-icon-filter-bolt: unicode('fb7c');
+$ti-icon-filter-cancel: unicode('fb7d');
+$ti-icon-filter-check: unicode('fb7e');
+$ti-icon-filter-code: unicode('fb7f');
+$ti-icon-filter-cog: unicode('f9fe');
+$ti-icon-filter-discount: unicode('fb80');
+$ti-icon-filter-dollar: unicode('f9ff');
+$ti-icon-filter-down: unicode('fb81');
+$ti-icon-filter-edit: unicode('fa00');
+$ti-icon-filter-exclamation: unicode('fb82');
+$ti-icon-filter-filled: unicode('fc27');
+$ti-icon-filter-heart: unicode('fb83');
+$ti-icon-filter-minus: unicode('fa01');
+$ti-icon-filter-off: unicode('ed2c');
+$ti-icon-filter-pause: unicode('fb84');
+$ti-icon-filter-pin: unicode('fb85');
+$ti-icon-filter-plus: unicode('fa02');
+$ti-icon-filter-question: unicode('fb86');
+$ti-icon-filter-search: unicode('fb87');
+$ti-icon-filter-share: unicode('fb88');
+$ti-icon-filter-star: unicode('fa03');
+$ti-icon-filter-up: unicode('fb89');
+$ti-icon-filter-x: unicode('fa04');
+$ti-icon-filters: unicode('f793');
+$ti-icon-fingerprint: unicode('ebd1');
+$ti-icon-fingerprint-off: unicode('f12a');
+$ti-icon-fingerprint-scan: unicode('fcb5');
+$ti-icon-fire-extinguisher: unicode('faf6');
+$ti-icon-fire-hydrant: unicode('f3a9');
+$ti-icon-fire-hydrant-off: unicode('f3ec');
+$ti-icon-firetruck: unicode('ebe8');
+$ti-icon-first-aid-kit: unicode('ef5f');
+$ti-icon-first-aid-kit-off: unicode('f3ed');
+$ti-icon-fish: unicode('ef2b');
+$ti-icon-fish-bone: unicode('f287');
+$ti-icon-fish-christianity: unicode('f58b');
+$ti-icon-fish-hook: unicode('f1f9');
+$ti-icon-fish-hook-off: unicode('f3ee');
+$ti-icon-fish-off: unicode('f12b');
+$ti-icon-flag: unicode('eaa6');
+$ti-icon-flag-2: unicode('ee8c');
+$ti-icon-flag-2-filled: unicode('f707');
+$ti-icon-flag-2-off: unicode('f12c');
+$ti-icon-flag-3: unicode('ee8d');
+$ti-icon-flag-3-filled: unicode('f708');
+$ti-icon-flag-bolt: unicode('fb8a');
+$ti-icon-flag-cancel: unicode('fb8b');
+$ti-icon-flag-check: unicode('fb8c');
+$ti-icon-flag-code: unicode('fb8d');
+$ti-icon-flag-cog: unicode('fb8e');
+$ti-icon-flag-discount: unicode('fb8f');
+$ti-icon-flag-dollar: unicode('fb90');
+$ti-icon-flag-down: unicode('fb91');
+$ti-icon-flag-exclamation: unicode('fb92');
+$ti-icon-flag-filled: unicode('f67a');
+$ti-icon-flag-heart: unicode('fb93');
+$ti-icon-flag-minus: unicode('fb94');
+$ti-icon-flag-off: unicode('f12d');
+$ti-icon-flag-pause: unicode('fb95');
+$ti-icon-flag-pin: unicode('fb96');
+$ti-icon-flag-plus: unicode('fb97');
+$ti-icon-flag-question: unicode('fb98');
+$ti-icon-flag-search: unicode('fb99');
+$ti-icon-flag-share: unicode('fb9a');
+$ti-icon-flag-star: unicode('fb9b');
+$ti-icon-flag-up: unicode('fb9c');
+$ti-icon-flag-x: unicode('fb9d');
+$ti-icon-flame: unicode('ec2c');
+$ti-icon-flame-off: unicode('f12e');
+$ti-icon-flare: unicode('ee8e');
+$ti-icon-flask: unicode('ebd2');
+$ti-icon-flask-2: unicode('ef60');
+$ti-icon-flask-2-filled: unicode('fd12');
+$ti-icon-flask-2-off: unicode('f12f');
+$ti-icon-flask-filled: unicode('fd13');
+$ti-icon-flask-off: unicode('f130');
+$ti-icon-flip-flops: unicode('f564');
+$ti-icon-flip-horizontal: unicode('eaa7');
+$ti-icon-flip-vertical: unicode('eaa8');
+$ti-icon-float-center: unicode('ebb1');
+$ti-icon-float-left: unicode('ebb2');
+$ti-icon-float-none: unicode('ed13');
+$ti-icon-float-right: unicode('ebb3');
+$ti-icon-flower: unicode('eff6');
+$ti-icon-flower-off: unicode('f131');
+$ti-icon-focus: unicode('eb8d');
+$ti-icon-focus-2: unicode('ebd3');
+$ti-icon-focus-auto: unicode('fa62');
+$ti-icon-focus-centered: unicode('f02a');
+$ti-icon-fold: unicode('ed56');
+$ti-icon-fold-down: unicode('ed54');
+$ti-icon-fold-up: unicode('ed55');
+$ti-icon-folder: unicode('eaad');
+$ti-icon-folder-bolt: unicode('f90c');
+$ti-icon-folder-cancel: unicode('f90d');
+$ti-icon-folder-check: unicode('f90e');
+$ti-icon-folder-code: unicode('f90f');
+$ti-icon-folder-cog: unicode('f910');
+$ti-icon-folder-dollar: unicode('f911');
+$ti-icon-folder-down: unicode('f912');
+$ti-icon-folder-exclamation: unicode('f913');
+$ti-icon-folder-filled: unicode('f749');
+$ti-icon-folder-heart: unicode('f914');
+$ti-icon-folder-minus: unicode('eaaa');
+$ti-icon-folder-off: unicode('ed14');
+$ti-icon-folder-open: unicode('faf7');
+$ti-icon-folder-pause: unicode('f915');
+$ti-icon-folder-pin: unicode('f916');
+$ti-icon-folder-plus: unicode('eaab');
+$ti-icon-folder-question: unicode('f917');
+$ti-icon-folder-root: unicode('fd43');
+$ti-icon-folder-search: unicode('f918');
+$ti-icon-folder-share: unicode('f919');
+$ti-icon-folder-star: unicode('f91a');
+$ti-icon-folder-symlink: unicode('f91b');
+$ti-icon-folder-up: unicode('f91c');
+$ti-icon-folder-x: unicode('eaac');
+$ti-icon-folders: unicode('eaae');
+$ti-icon-folders-off: unicode('f133');
+$ti-icon-forbid: unicode('ebd5');
+$ti-icon-forbid-2: unicode('ebd4');
+$ti-icon-forbid-2-filled: unicode('fc28');
+$ti-icon-forbid-filled: unicode('fc29');
+$ti-icon-forklift: unicode('ebe9');
+$ti-icon-forms: unicode('ee8f');
+$ti-icon-fountain: unicode('f09b');
+$ti-icon-fountain-filled: unicode('fc2a');
+$ti-icon-fountain-off: unicode('f134');
+$ti-icon-frame: unicode('eaaf');
+$ti-icon-frame-off: unicode('f135');
+$ti-icon-free-rights: unicode('efb6');
+$ti-icon-freeze-column: unicode('fa63');
+$ti-icon-freeze-row: unicode('fa65');
+$ti-icon-freeze-row-column: unicode('fa64');
+$ti-icon-fridge: unicode('f1fa');
+$ti-icon-fridge-off: unicode('f3ef');
+$ti-icon-friends: unicode('eab0');
+$ti-icon-friends-off: unicode('f136');
+$ti-icon-frustum: unicode('fa9f');
+$ti-icon-frustum-off: unicode('fa9d');
+$ti-icon-frustum-plus: unicode('fa9e');
+$ti-icon-function: unicode('f225');
+$ti-icon-function-filled: unicode('fc2b');
+$ti-icon-function-off: unicode('f3f0');
+$ti-icon-galaxy: unicode('fcb6');
+$ti-icon-garden-cart: unicode('f23e');
+$ti-icon-garden-cart-off: unicode('f3f1');
+$ti-icon-gas-station: unicode('ec7d');
+$ti-icon-gas-station-off: unicode('f137');
+$ti-icon-gauge: unicode('eab1');
+$ti-icon-gauge-filled: unicode('fc2c');
+$ti-icon-gauge-off: unicode('f138');
+$ti-icon-gavel: unicode('ef90');
+$ti-icon-gender-agender: unicode('f0e1');
+$ti-icon-gender-androgyne: unicode('f0e2');
+$ti-icon-gender-bigender: unicode('f0e3');
+$ti-icon-gender-demiboy: unicode('f0e4');
+$ti-icon-gender-demigirl: unicode('f0e5');
+$ti-icon-gender-epicene: unicode('f0e6');
+$ti-icon-gender-female: unicode('f0e7');
+$ti-icon-gender-femme: unicode('f0e8');
+$ti-icon-gender-genderfluid: unicode('f0e9');
+$ti-icon-gender-genderless: unicode('f0ea');
+$ti-icon-gender-genderqueer: unicode('f0eb');
+$ti-icon-gender-hermaphrodite: unicode('f0ec');
+$ti-icon-gender-intergender: unicode('f0ed');
+$ti-icon-gender-male: unicode('f0ee');
+$ti-icon-gender-neutrois: unicode('f0ef');
+$ti-icon-gender-third: unicode('f0f0');
+$ti-icon-gender-transgender: unicode('f0f1');
+$ti-icon-gender-trasvesti: unicode('f0f2');
+$ti-icon-geometry: unicode('ee90');
+$ti-icon-ghost: unicode('eb8e');
+$ti-icon-ghost-2: unicode('f57c');
+$ti-icon-ghost-2-filled: unicode('f74a');
+$ti-icon-ghost-3: unicode('fc13');
+$ti-icon-ghost-filled: unicode('f74b');
+$ti-icon-ghost-off: unicode('f3f2');
+$ti-icon-gif: unicode('f257');
+$ti-icon-gift: unicode('eb68');
+$ti-icon-gift-card: unicode('f3aa');
+$ti-icon-gift-card-filled: unicode('fc2d');
+$ti-icon-gift-filled: unicode('fd14');
+$ti-icon-gift-off: unicode('f3f3');
+$ti-icon-git-branch: unicode('eab2');
+$ti-icon-git-branch-deleted: unicode('f57d');
+$ti-icon-git-cherry-pick: unicode('f57e');
+$ti-icon-git-commit: unicode('eab3');
+$ti-icon-git-compare: unicode('eab4');
+$ti-icon-git-fork: unicode('eb8f');
+$ti-icon-git-merge: unicode('eab5');
+$ti-icon-git-pull-request: unicode('eab6');
+$ti-icon-git-pull-request-closed: unicode('ef7f');
+$ti-icon-git-pull-request-draft: unicode('efb7');
+$ti-icon-gizmo: unicode('f02b');
+$ti-icon-glass: unicode('eab8');
+$ti-icon-glass-champagne: unicode('fd9c');
+$ti-icon-glass-cocktail: unicode('fd9d');
+$ti-icon-glass-full: unicode('eab7');
+$ti-icon-glass-full-filled: unicode('fc2e');
+$ti-icon-glass-gin: unicode('fd9e');
+$ti-icon-glass-off: unicode('ee91');
+$ti-icon-globe: unicode('eab9');
+$ti-icon-globe-filled: unicode('fc2f');
+$ti-icon-globe-off: unicode('f139');
+$ti-icon-go-game: unicode('f512');
+$ti-icon-golf: unicode('ed8c');
+$ti-icon-golf-off: unicode('f13a');
+$ti-icon-gps: unicode('ed7a');
+$ti-icon-gps-filled: unicode('fe48');
+$ti-icon-gradienter: unicode('f3ab');
+$ti-icon-grain: unicode('ee92');
+$ti-icon-graph: unicode('f288');
+$ti-icon-graph-filled: unicode('fd15');
+$ti-icon-graph-off: unicode('f3f4');
+$ti-icon-grave: unicode('f580');
+$ti-icon-grave-2: unicode('f57f');
+$ti-icon-grid-3x3: unicode('fca4');
+$ti-icon-grid-4x4: unicode('fca5');
+$ti-icon-grid-dots: unicode('eaba');
+$ti-icon-grid-goldenratio: unicode('fca6');
+$ti-icon-grid-pattern: unicode('efc9');
+$ti-icon-grid-scan: unicode('fca7');
+$ti-icon-grill: unicode('efa9');
+$ti-icon-grill-fork: unicode('f35b');
+$ti-icon-grill-off: unicode('f3f5');
+$ti-icon-grill-spatula: unicode('f35c');
+$ti-icon-grip-horizontal: unicode('ec00');
+$ti-icon-grip-vertical: unicode('ec01');
+$ti-icon-growth: unicode('ee93');
+$ti-icon-guitar-pick: unicode('f4c6');
+$ti-icon-guitar-pick-filled: unicode('f67b');
+$ti-icon-gymnastics: unicode('fd44');
+$ti-icon-h-1: unicode('ec94');
+$ti-icon-h-2: unicode('ec95');
+$ti-icon-h-3: unicode('ec96');
+$ti-icon-h-4: unicode('ec97');
+$ti-icon-h-5: unicode('ec98');
+$ti-icon-h-6: unicode('ec99');
+$ti-icon-hammer: unicode('ef91');
+$ti-icon-hammer-off: unicode('f13c');
+$ti-icon-hand-click: unicode('ef4f');
+$ti-icon-hand-finger: unicode('ee94');
+$ti-icon-hand-finger-off: unicode('f13d');
+$ti-icon-hand-grab: unicode('f091');
+$ti-icon-hand-little-finger: unicode('ee95');
+$ti-icon-hand-love-you: unicode('ee97');
+$ti-icon-hand-middle-finger: unicode('ec2d');
+$ti-icon-hand-move: unicode('ef50');
+$ti-icon-hand-off: unicode('ed15');
+$ti-icon-hand-ring-finger: unicode('ee96');
+$ti-icon-hand-sanitizer: unicode('f5f4');
+$ti-icon-hand-stop: unicode('ec2e');
+$ti-icon-hand-three-fingers: unicode('ee98');
+$ti-icon-hand-two-fingers: unicode('ee99');
+$ti-icon-hanger: unicode('ee9a');
+$ti-icon-hanger-2: unicode('f09c');
+$ti-icon-hanger-off: unicode('f13e');
+$ti-icon-hash: unicode('eabc');
+$ti-icon-haze: unicode('efaa');
+$ti-icon-haze-moon: unicode('faf8');
+$ti-icon-hdr: unicode('fa7b');
+$ti-icon-heading: unicode('ee9b');
+$ti-icon-heading-off: unicode('f13f');
+$ti-icon-headphones: unicode('eabd');
+$ti-icon-headphones-filled: unicode('fa3c');
+$ti-icon-headphones-off: unicode('ed1d');
+$ti-icon-headset: unicode('eb90');
+$ti-icon-headset-off: unicode('f3f6');
+$ti-icon-health-recognition: unicode('f1fb');
+$ti-icon-heart: unicode('eabe');
+$ti-icon-heart-bolt: unicode('fb9e');
+$ti-icon-heart-broken: unicode('ecba');
+$ti-icon-heart-cancel: unicode('fb9f');
+$ti-icon-heart-check: unicode('fba0');
+$ti-icon-heart-code: unicode('fba1');
+$ti-icon-heart-cog: unicode('fba2');
+$ti-icon-heart-discount: unicode('fba3');
+$ti-icon-heart-dollar: unicode('fba4');
+$ti-icon-heart-down: unicode('fba5');
+$ti-icon-heart-exclamation: unicode('fba6');
+$ti-icon-heart-filled: unicode('f67c');
+$ti-icon-heart-handshake: unicode('f0f3');
+$ti-icon-heart-minus: unicode('f140');
+$ti-icon-heart-off: unicode('f141');
+$ti-icon-heart-pause: unicode('fba7');
+$ti-icon-heart-pin: unicode('fba8');
+$ti-icon-heart-plus: unicode('f142');
+$ti-icon-heart-question: unicode('fba9');
+$ti-icon-heart-rate-monitor: unicode('ef61');
+$ti-icon-heart-search: unicode('fbaa');
+$ti-icon-heart-share: unicode('fbab');
+$ti-icon-heart-star: unicode('fbac');
+$ti-icon-heart-up: unicode('fbad');
+$ti-icon-heart-x: unicode('fbae');
+$ti-icon-heartbeat: unicode('ef92');
+$ti-icon-hearts: unicode('f387');
+$ti-icon-hearts-off: unicode('f3f7');
+$ti-icon-helicopter: unicode('ed8e');
+$ti-icon-helicopter-landing: unicode('ed8d');
+$ti-icon-helmet: unicode('efca');
+$ti-icon-helmet-off: unicode('f143');
+$ti-icon-help: unicode('eabf');
+$ti-icon-help-circle: unicode('f91d');
+$ti-icon-help-circle-filled: unicode('fa3d');
+$ti-icon-help-hexagon: unicode('f7a8');
+$ti-icon-help-hexagon-filled: unicode('fa3e');
+$ti-icon-help-octagon: unicode('f7a9');
+$ti-icon-help-octagon-filled: unicode('fa3f');
+$ti-icon-help-off: unicode('f3f8');
+$ti-icon-help-small: unicode('f91e');
+$ti-icon-help-square: unicode('f920');
+$ti-icon-help-square-filled: unicode('fa40');
+$ti-icon-help-square-rounded: unicode('f91f');
+$ti-icon-help-square-rounded-filled: unicode('fa41');
+$ti-icon-help-triangle: unicode('f921');
+$ti-icon-help-triangle-filled: unicode('fa42');
+$ti-icon-hemisphere: unicode('faa2');
+$ti-icon-hemisphere-off: unicode('faa0');
+$ti-icon-hemisphere-plus: unicode('faa1');
+$ti-icon-hexagon: unicode('ec02');
+$ti-icon-hexagon-3d: unicode('f4c7');
+$ti-icon-hexagon-filled: unicode('f67d');
+$ti-icon-hexagon-letter-a: unicode('f463');
+$ti-icon-hexagon-letter-a-filled: unicode('fe47');
+$ti-icon-hexagon-letter-b: unicode('f464');
+$ti-icon-hexagon-letter-b-filled: unicode('fe46');
+$ti-icon-hexagon-letter-c: unicode('f465');
+$ti-icon-hexagon-letter-c-filled: unicode('fe45');
+$ti-icon-hexagon-letter-d: unicode('f466');
+$ti-icon-hexagon-letter-d-filled: unicode('fe44');
+$ti-icon-hexagon-letter-e: unicode('f467');
+$ti-icon-hexagon-letter-e-filled: unicode('fe43');
+$ti-icon-hexagon-letter-f: unicode('f468');
+$ti-icon-hexagon-letter-f-filled: unicode('fe42');
+$ti-icon-hexagon-letter-g: unicode('f469');
+$ti-icon-hexagon-letter-g-filled: unicode('fe41');
+$ti-icon-hexagon-letter-h: unicode('f46a');
+$ti-icon-hexagon-letter-h-filled: unicode('fe40');
+$ti-icon-hexagon-letter-i: unicode('f46b');
+$ti-icon-hexagon-letter-i-filled: unicode('fe3f');
+$ti-icon-hexagon-letter-j: unicode('f46c');
+$ti-icon-hexagon-letter-j-filled: unicode('fe3e');
+$ti-icon-hexagon-letter-k: unicode('f46d');
+$ti-icon-hexagon-letter-k-filled: unicode('fe3d');
+$ti-icon-hexagon-letter-l: unicode('f46e');
+$ti-icon-hexagon-letter-l-filled: unicode('fe3c');
+$ti-icon-hexagon-letter-m: unicode('f46f');
+$ti-icon-hexagon-letter-m-filled: unicode('fe3b');
+$ti-icon-hexagon-letter-n: unicode('f470');
+$ti-icon-hexagon-letter-n-filled: unicode('fe3a');
+$ti-icon-hexagon-letter-o: unicode('f471');
+$ti-icon-hexagon-letter-o-filled: unicode('fe39');
+$ti-icon-hexagon-letter-p: unicode('f472');
+$ti-icon-hexagon-letter-p-filled: unicode('fe38');
+$ti-icon-hexagon-letter-q: unicode('f473');
+$ti-icon-hexagon-letter-q-filled: unicode('fe37');
+$ti-icon-hexagon-letter-r: unicode('f474');
+$ti-icon-hexagon-letter-r-filled: unicode('fe36');
+$ti-icon-hexagon-letter-s: unicode('f475');
+$ti-icon-hexagon-letter-s-filled: unicode('fe35');
+$ti-icon-hexagon-letter-t: unicode('f476');
+$ti-icon-hexagon-letter-t-filled: unicode('fe34');
+$ti-icon-hexagon-letter-u: unicode('f477');
+$ti-icon-hexagon-letter-u-filled: unicode('fe33');
+$ti-icon-hexagon-letter-v: unicode('f4b3');
+$ti-icon-hexagon-letter-v-filled: unicode('fe32');
+$ti-icon-hexagon-letter-w: unicode('f478');
+$ti-icon-hexagon-letter-w-filled: unicode('fe31');
+$ti-icon-hexagon-letter-x: unicode('f479');
+$ti-icon-hexagon-letter-x-filled: unicode('fe30');
+$ti-icon-hexagon-letter-y: unicode('f47a');
+$ti-icon-hexagon-letter-y-filled: unicode('fe2f');
+$ti-icon-hexagon-letter-z: unicode('f47b');
+$ti-icon-hexagon-letter-z-filled: unicode('fe2e');
+$ti-icon-hexagon-minus: unicode('fc8f');
+$ti-icon-hexagon-minus-2: unicode('fc8e');
+$ti-icon-hexagon-minus-filled: unicode('fe2d');
+$ti-icon-hexagon-number-0: unicode('f459');
+$ti-icon-hexagon-number-0-filled: unicode('f74c');
+$ti-icon-hexagon-number-1: unicode('f45a');
+$ti-icon-hexagon-number-1-filled: unicode('f74d');
+$ti-icon-hexagon-number-2: unicode('f45b');
+$ti-icon-hexagon-number-2-filled: unicode('f74e');
+$ti-icon-hexagon-number-3: unicode('f45c');
+$ti-icon-hexagon-number-3-filled: unicode('f74f');
+$ti-icon-hexagon-number-4: unicode('f45d');
+$ti-icon-hexagon-number-4-filled: unicode('f750');
+$ti-icon-hexagon-number-5: unicode('f45e');
+$ti-icon-hexagon-number-5-filled: unicode('f751');
+$ti-icon-hexagon-number-6: unicode('f45f');
+$ti-icon-hexagon-number-6-filled: unicode('f752');
+$ti-icon-hexagon-number-7: unicode('f460');
+$ti-icon-hexagon-number-7-filled: unicode('f753');
+$ti-icon-hexagon-number-8: unicode('f461');
+$ti-icon-hexagon-number-8-filled: unicode('f754');
+$ti-icon-hexagon-number-9: unicode('f462');
+$ti-icon-hexagon-number-9-filled: unicode('f755');
+$ti-icon-hexagon-off: unicode('ee9c');
+$ti-icon-hexagon-plus: unicode('fc45');
+$ti-icon-hexagon-plus-2: unicode('fc90');
+$ti-icon-hexagon-plus-filled: unicode('fe2c');
+$ti-icon-hexagonal-prism: unicode('faa5');
+$ti-icon-hexagonal-prism-off: unicode('faa3');
+$ti-icon-hexagonal-prism-plus: unicode('faa4');
+$ti-icon-hexagonal-pyramid: unicode('faa8');
+$ti-icon-hexagonal-pyramid-off: unicode('faa6');
+$ti-icon-hexagonal-pyramid-plus: unicode('faa7');
+$ti-icon-hexagons: unicode('f09d');
+$ti-icon-hexagons-off: unicode('f3f9');
+$ti-icon-hierarchy: unicode('ee9e');
+$ti-icon-hierarchy-2: unicode('ee9d');
+$ti-icon-hierarchy-3: unicode('f289');
+$ti-icon-hierarchy-off: unicode('f3fa');
+$ti-icon-highlight: unicode('ef3f');
+$ti-icon-highlight-off: unicode('f144');
+$ti-icon-history: unicode('ebea');
+$ti-icon-history-off: unicode('f3fb');
+$ti-icon-history-toggle: unicode('f1fc');
+$ti-icon-home: unicode('eac1');
+$ti-icon-home-2: unicode('eac0');
+$ti-icon-home-bolt: unicode('f336');
+$ti-icon-home-cancel: unicode('f350');
+$ti-icon-home-check: unicode('f337');
+$ti-icon-home-cog: unicode('f338');
+$ti-icon-home-dollar: unicode('f339');
+$ti-icon-home-dot: unicode('f33a');
+$ti-icon-home-down: unicode('f33b');
+$ti-icon-home-eco: unicode('f351');
+$ti-icon-home-edit: unicode('f352');
+$ti-icon-home-exclamation: unicode('f33c');
+$ti-icon-home-filled: unicode('fe2b');
+$ti-icon-home-hand: unicode('f504');
+$ti-icon-home-heart: unicode('f353');
+$ti-icon-home-infinity: unicode('f505');
+$ti-icon-home-link: unicode('f354');
+$ti-icon-home-minus: unicode('f33d');
+$ti-icon-home-move: unicode('f33e');
+$ti-icon-home-off: unicode('f145');
+$ti-icon-home-plus: unicode('f33f');
+$ti-icon-home-question: unicode('f340');
+$ti-icon-home-ribbon: unicode('f355');
+$ti-icon-home-search: unicode('f341');
+$ti-icon-home-share: unicode('f342');
+$ti-icon-home-shield: unicode('f343');
+$ti-icon-home-signal: unicode('f356');
+$ti-icon-home-star: unicode('f344');
+$ti-icon-home-stats: unicode('f345');
+$ti-icon-home-up: unicode('f346');
+$ti-icon-home-x: unicode('f347');
+$ti-icon-horse: unicode('fc46');
+$ti-icon-horse-toy: unicode('f28a');
+$ti-icon-horseshoe: unicode('fcb7');
+$ti-icon-hospital: unicode('fd59');
+$ti-icon-hospital-circle: unicode('fd58');
+$ti-icon-hospital-circle-filled: unicode('fed2');
+$ti-icon-hotel-service: unicode('ef80');
+$ti-icon-hourglass: unicode('ef93');
+$ti-icon-hourglass-empty: unicode('f146');
+$ti-icon-hourglass-filled: unicode('f756');
+$ti-icon-hourglass-high: unicode('f092');
+$ti-icon-hourglass-low: unicode('f093');
+$ti-icon-hourglass-off: unicode('f147');
+$ti-icon-hours-12: unicode('fc53');
+$ti-icon-hours-24: unicode('f5e7');
+$ti-icon-html: unicode('f7b1');
+$ti-icon-http-connect: unicode('fa28');
+$ti-icon-http-delete: unicode('fa29');
+$ti-icon-http-get: unicode('fa2a');
+$ti-icon-http-head: unicode('fa2b');
+$ti-icon-http-options: unicode('fa2c');
+$ti-icon-http-patch: unicode('fa2d');
+$ti-icon-http-post: unicode('fa2e');
+$ti-icon-http-put: unicode('fa2f');
+$ti-icon-http-que: unicode('fa5b');
+$ti-icon-http-trace: unicode('fa30');
+$ti-icon-ice-cream: unicode('eac2');
+$ti-icon-ice-cream-2: unicode('ee9f');
+$ti-icon-ice-cream-off: unicode('f148');
+$ti-icon-ice-skating: unicode('efcb');
+$ti-icon-icons: unicode('f1d4');
+$ti-icon-icons-off: unicode('f3fc');
+$ti-icon-id: unicode('eac3');
+$ti-icon-id-badge: unicode('eff7');
+$ti-icon-id-badge-2: unicode('f076');
+$ti-icon-id-badge-off: unicode('f3fd');
+$ti-icon-id-off: unicode('f149');
+$ti-icon-ikosaedr: unicode('fec6');
+$ti-icon-image-in-picture: unicode('fd9f');
+$ti-icon-inbox: unicode('eac4');
+$ti-icon-inbox-off: unicode('f14a');
+$ti-icon-indent-decrease: unicode('eb91');
+$ti-icon-indent-increase: unicode('eb92');
+$ti-icon-infinity: unicode('eb69');
+$ti-icon-infinity-off: unicode('f3fe');
+$ti-icon-info-circle: unicode('eac5');
+$ti-icon-info-circle-filled: unicode('f6d8');
+$ti-icon-info-hexagon: unicode('f7aa');
+$ti-icon-info-hexagon-filled: unicode('fa43');
+$ti-icon-info-octagon: unicode('f7ab');
+$ti-icon-info-octagon-filled: unicode('fa44');
+$ti-icon-info-small: unicode('f922');
+$ti-icon-info-square: unicode('eac6');
+$ti-icon-info-square-filled: unicode('fa45');
+$ti-icon-info-square-rounded: unicode('f635');
+$ti-icon-info-square-rounded-filled: unicode('f6d9');
+$ti-icon-info-triangle: unicode('f923');
+$ti-icon-info-triangle-filled: unicode('fa46');
+$ti-icon-inner-shadow-bottom: unicode('f520');
+$ti-icon-inner-shadow-bottom-filled: unicode('f757');
+$ti-icon-inner-shadow-bottom-left: unicode('f51e');
+$ti-icon-inner-shadow-bottom-left-filled: unicode('f758');
+$ti-icon-inner-shadow-bottom-right: unicode('f51f');
+$ti-icon-inner-shadow-bottom-right-filled: unicode('f759');
+$ti-icon-inner-shadow-left: unicode('f521');
+$ti-icon-inner-shadow-left-filled: unicode('f75a');
+$ti-icon-inner-shadow-right: unicode('f522');
+$ti-icon-inner-shadow-right-filled: unicode('f75b');
+$ti-icon-inner-shadow-top: unicode('f525');
+$ti-icon-inner-shadow-top-filled: unicode('f75c');
+$ti-icon-inner-shadow-top-left: unicode('f523');
+$ti-icon-inner-shadow-top-left-filled: unicode('f75d');
+$ti-icon-inner-shadow-top-right: unicode('f524');
+$ti-icon-inner-shadow-top-right-filled: unicode('f75e');
+$ti-icon-input-ai: unicode('fc5a');
+$ti-icon-input-check: unicode('fc5b');
+$ti-icon-input-search: unicode('f2a2');
+$ti-icon-input-x: unicode('fc5c');
+$ti-icon-invoice: unicode('feab');
+$ti-icon-ironing: unicode('fa7c');
+$ti-icon-ironing-1: unicode('f2f4');
+$ti-icon-ironing-2: unicode('f2f5');
+$ti-icon-ironing-3: unicode('f2f6');
+$ti-icon-ironing-filled: unicode('fe2a');
+$ti-icon-ironing-off: unicode('f2f7');
+$ti-icon-ironing-steam: unicode('f2f9');
+$ti-icon-ironing-steam-off: unicode('f2f8');
+$ti-icon-irregular-polyhedron: unicode('faab');
+$ti-icon-irregular-polyhedron-off: unicode('faa9');
+$ti-icon-irregular-polyhedron-plus: unicode('faaa');
+$ti-icon-italic: unicode('eb93');
+$ti-icon-jacket: unicode('f661');
+$ti-icon-jetpack: unicode('f581');
+$ti-icon-jetpack-filled: unicode('fe29');
+$ti-icon-jewish-star: unicode('f3ff');
+$ti-icon-jewish-star-filled: unicode('f67e');
+$ti-icon-jpg: unicode('f3ac');
+$ti-icon-json: unicode('f7b2');
+$ti-icon-jump-rope: unicode('ed8f');
+$ti-icon-karate: unicode('ed32');
+$ti-icon-kayak: unicode('f1d6');
+$ti-icon-kerning: unicode('efb8');
+$ti-icon-key: unicode('eac7');
+$ti-icon-key-filled: unicode('fe28');
+$ti-icon-key-off: unicode('f14b');
+$ti-icon-keyboard: unicode('ebd6');
+$ti-icon-keyboard-hide: unicode('ec7e');
+$ti-icon-keyboard-off: unicode('eea0');
+$ti-icon-keyboard-show: unicode('ec7f');
+$ti-icon-keyframe: unicode('f576');
+$ti-icon-keyframe-align-center: unicode('f582');
+$ti-icon-keyframe-align-center-filled: unicode('fc30');
+$ti-icon-keyframe-align-horizontal: unicode('f583');
+$ti-icon-keyframe-align-horizontal-filled: unicode('fc31');
+$ti-icon-keyframe-align-vertical: unicode('f584');
+$ti-icon-keyframe-align-vertical-filled: unicode('fc32');
+$ti-icon-keyframe-filled: unicode('fc33');
+$ti-icon-keyframes: unicode('f585');
+$ti-icon-keyframes-filled: unicode('fc34');
+$ti-icon-ladder: unicode('efe2');
+$ti-icon-ladder-off: unicode('f14c');
+$ti-icon-ladle: unicode('fc14');
+$ti-icon-lambda: unicode('f541');
+$ti-icon-lamp: unicode('efab');
+$ti-icon-lamp-2: unicode('f09e');
+$ti-icon-lamp-off: unicode('f14d');
+$ti-icon-lane: unicode('faf9');
+$ti-icon-language: unicode('ebbe');
+$ti-icon-language-hiragana: unicode('ef77');
+$ti-icon-language-katakana: unicode('ef78');
+$ti-icon-language-off: unicode('f14e');
+$ti-icon-lasso: unicode('efac');
+$ti-icon-lasso-off: unicode('f14f');
+$ti-icon-lasso-polygon: unicode('f388');
+$ti-icon-layers-difference: unicode('eac8');
+$ti-icon-layers-intersect: unicode('eac9');
+$ti-icon-layers-intersect-2: unicode('eff8');
+$ti-icon-layers-linked: unicode('eea1');
+$ti-icon-layers-off: unicode('f150');
+$ti-icon-layers-selected: unicode('fea9');
+$ti-icon-layers-selected-bottom: unicode('feaa');
+$ti-icon-layers-subtract: unicode('eaca');
+$ti-icon-layers-union: unicode('eacb');
+$ti-icon-layout: unicode('eadb');
+$ti-icon-layout-2: unicode('eacc');
+$ti-icon-layout-2-filled: unicode('fe27');
+$ti-icon-layout-align-bottom: unicode('eacd');
+$ti-icon-layout-align-bottom-filled: unicode('fe26');
+$ti-icon-layout-align-center: unicode('eace');
+$ti-icon-layout-align-center-filled: unicode('fe25');
+$ti-icon-layout-align-left: unicode('eacf');
+$ti-icon-layout-align-left-filled: unicode('fe24');
+$ti-icon-layout-align-middle: unicode('ead0');
+$ti-icon-layout-align-middle-filled: unicode('fe23');
+$ti-icon-layout-align-right: unicode('ead1');
+$ti-icon-layout-align-right-filled: unicode('fe22');
+$ti-icon-layout-align-top: unicode('ead2');
+$ti-icon-layout-align-top-filled: unicode('fe21');
+$ti-icon-layout-board: unicode('ef95');
+$ti-icon-layout-board-split: unicode('ef94');
+$ti-icon-layout-bottombar: unicode('ead3');
+$ti-icon-layout-bottombar-collapse: unicode('f28b');
+$ti-icon-layout-bottombar-collapse-filled: unicode('fc35');
+$ti-icon-layout-bottombar-expand: unicode('f28c');
+$ti-icon-layout-bottombar-expand-filled: unicode('fc36');
+$ti-icon-layout-bottombar-filled: unicode('fc37');
+$ti-icon-layout-bottombar-inactive: unicode('fd45');
+$ti-icon-layout-cards: unicode('ec13');
+$ti-icon-layout-cards-filled: unicode('fe20');
+$ti-icon-layout-collage: unicode('f389');
+$ti-icon-layout-columns: unicode('ead4');
+$ti-icon-layout-dashboard: unicode('f02c');
+$ti-icon-layout-dashboard-filled: unicode('fe1f');
+$ti-icon-layout-distribute-horizontal: unicode('ead5');
+$ti-icon-layout-distribute-horizontal-filled: unicode('fe1e');
+$ti-icon-layout-distribute-vertical: unicode('ead6');
+$ti-icon-layout-distribute-vertical-filled: unicode('fe1d');
+$ti-icon-layout-filled: unicode('fe17');
+$ti-icon-layout-grid: unicode('edba');
+$ti-icon-layout-grid-add: unicode('edb9');
+$ti-icon-layout-grid-filled: unicode('fe1c');
+$ti-icon-layout-grid-remove: unicode('fa7d');
+$ti-icon-layout-kanban: unicode('ec3f');
+$ti-icon-layout-kanban-filled: unicode('fe1b');
+$ti-icon-layout-list: unicode('ec14');
+$ti-icon-layout-list-filled: unicode('fe1a');
+$ti-icon-layout-navbar: unicode('ead7');
+$ti-icon-layout-navbar-collapse: unicode('f28d');
+$ti-icon-layout-navbar-collapse-filled: unicode('fc38');
+$ti-icon-layout-navbar-expand: unicode('f28e');
+$ti-icon-layout-navbar-expand-filled: unicode('fc39');
+$ti-icon-layout-navbar-filled: unicode('fc3a');
+$ti-icon-layout-navbar-inactive: unicode('fd46');
+$ti-icon-layout-off: unicode('f151');
+$ti-icon-layout-rows: unicode('ead8');
+$ti-icon-layout-sidebar: unicode('eada');
+$ti-icon-layout-sidebar-filled: unicode('fe18');
+$ti-icon-layout-sidebar-inactive: unicode('fd47');
+$ti-icon-layout-sidebar-left-collapse: unicode('f004');
+$ti-icon-layout-sidebar-left-collapse-filled: unicode('fc3b');
+$ti-icon-layout-sidebar-left-expand: unicode('f005');
+$ti-icon-layout-sidebar-left-expand-filled: unicode('fc3c');
+$ti-icon-layout-sidebar-right: unicode('ead9');
+$ti-icon-layout-sidebar-right-collapse: unicode('f006');
+$ti-icon-layout-sidebar-right-collapse-filled: unicode('fc3d');
+$ti-icon-layout-sidebar-right-expand: unicode('f007');
+$ti-icon-layout-sidebar-right-expand-filled: unicode('fc3e');
+$ti-icon-layout-sidebar-right-filled: unicode('fe19');
+$ti-icon-layout-sidebar-right-inactive: unicode('fd48');
+$ti-icon-leaf: unicode('ed4f');
+$ti-icon-leaf-off: unicode('f400');
+$ti-icon-lego: unicode('eadc');
+$ti-icon-lego-filled: unicode('fe16');
+$ti-icon-lego-off: unicode('f401');
+$ti-icon-lemon: unicode('ef10');
+$ti-icon-lemon-2: unicode('ef81');
+$ti-icon-letter-a: unicode('ec50');
+$ti-icon-letter-a-small: unicode('fcc7');
+$ti-icon-letter-b: unicode('ec51');
+$ti-icon-letter-b-small: unicode('fcc8');
+$ti-icon-letter-c: unicode('ec52');
+$ti-icon-letter-c-small: unicode('fcc9');
+$ti-icon-letter-case: unicode('eea5');
+$ti-icon-letter-case-lower: unicode('eea2');
+$ti-icon-letter-case-toggle: unicode('eea3');
+$ti-icon-letter-case-upper: unicode('eea4');
+$ti-icon-letter-d: unicode('ec53');
+$ti-icon-letter-d-small: unicode('fcca');
+$ti-icon-letter-e: unicode('ec54');
+$ti-icon-letter-e-small: unicode('fccb');
+$ti-icon-letter-f: unicode('ec55');
+$ti-icon-letter-f-small: unicode('fccc');
+$ti-icon-letter-g: unicode('ec56');
+$ti-icon-letter-g-small: unicode('fccd');
+$ti-icon-letter-h: unicode('ec57');
+$ti-icon-letter-h-small: unicode('fcce');
+$ti-icon-letter-i: unicode('ec58');
+$ti-icon-letter-i-small: unicode('fccf');
+$ti-icon-letter-j: unicode('ec59');
+$ti-icon-letter-j-small: unicode('fcd0');
+$ti-icon-letter-k: unicode('ec5a');
+$ti-icon-letter-k-small: unicode('fcd1');
+$ti-icon-letter-l: unicode('ec5b');
+$ti-icon-letter-l-small: unicode('fcd2');
+$ti-icon-letter-m: unicode('ec5c');
+$ti-icon-letter-m-small: unicode('fcd3');
+$ti-icon-letter-n: unicode('ec5d');
+$ti-icon-letter-n-small: unicode('fcd4');
+$ti-icon-letter-o: unicode('ec5e');
+$ti-icon-letter-o-small: unicode('fcd5');
+$ti-icon-letter-p: unicode('ec5f');
+$ti-icon-letter-p-small: unicode('fcd6');
+$ti-icon-letter-q: unicode('ec60');
+$ti-icon-letter-q-small: unicode('fcd7');
+$ti-icon-letter-r: unicode('ec61');
+$ti-icon-letter-r-small: unicode('fcd8');
+$ti-icon-letter-s: unicode('ec62');
+$ti-icon-letter-s-small: unicode('fcd9');
+$ti-icon-letter-spacing: unicode('eea6');
+$ti-icon-letter-t: unicode('ec63');
+$ti-icon-letter-t-small: unicode('fcda');
+$ti-icon-letter-u: unicode('ec64');
+$ti-icon-letter-u-small: unicode('fcdb');
+$ti-icon-letter-v: unicode('ec65');
+$ti-icon-letter-v-small: unicode('fcdc');
+$ti-icon-letter-w: unicode('ec66');
+$ti-icon-letter-w-small: unicode('fcdd');
+$ti-icon-letter-x: unicode('ec67');
+$ti-icon-letter-x-small: unicode('fcde');
+$ti-icon-letter-y: unicode('ec68');
+$ti-icon-letter-y-small: unicode('fcdf');
+$ti-icon-letter-z: unicode('ec69');
+$ti-icon-letter-z-small: unicode('fce0');
+$ti-icon-library: unicode('fd4c');
+$ti-icon-library-minus: unicode('fd49');
+$ti-icon-library-photo: unicode('fd4a');
+$ti-icon-library-plus: unicode('fd4b');
+$ti-icon-license: unicode('ebc0');
+$ti-icon-license-off: unicode('f153');
+$ti-icon-lifebuoy: unicode('eadd');
+$ti-icon-lifebuoy-off: unicode('f154');
+$ti-icon-lighter: unicode('f794');
+$ti-icon-line: unicode('ec40');
+$ti-icon-line-dashed: unicode('eea7');
+$ti-icon-line-dotted: unicode('eea8');
+$ti-icon-line-height: unicode('eb94');
+$ti-icon-line-scan: unicode('fcb8');
+$ti-icon-link: unicode('eade');
+$ti-icon-link-minus: unicode('fd16');
+$ti-icon-link-off: unicode('f402');
+$ti-icon-link-plus: unicode('fd17');
+$ti-icon-list: unicode('eb6b');
+$ti-icon-list-check: unicode('eb6a');
+$ti-icon-list-details: unicode('ef40');
+$ti-icon-list-letters: unicode('fc47');
+$ti-icon-list-numbers: unicode('ef11');
+$ti-icon-list-search: unicode('eea9');
+$ti-icon-list-tree: unicode('fafa');
+$ti-icon-live-photo: unicode('eadf');
+$ti-icon-live-photo-filled: unicode('fed1');
+$ti-icon-live-photo-off: unicode('f403');
+$ti-icon-live-view: unicode('ec6b');
+$ti-icon-load-balancer: unicode('fa5c');
+$ti-icon-loader: unicode('eca3');
+$ti-icon-loader-2: unicode('f226');
+$ti-icon-loader-3: unicode('f513');
+$ti-icon-loader-quarter: unicode('eca2');
+$ti-icon-location: unicode('eae0');
+$ti-icon-location-bolt: unicode('fbaf');
+$ti-icon-location-broken: unicode('f2c4');
+$ti-icon-location-cancel: unicode('fbb0');
+$ti-icon-location-check: unicode('fbb1');
+$ti-icon-location-code: unicode('fbb2');
+$ti-icon-location-cog: unicode('fbb3');
+$ti-icon-location-discount: unicode('fbb4');
+$ti-icon-location-dollar: unicode('fbb5');
+$ti-icon-location-down: unicode('fbb6');
+$ti-icon-location-exclamation: unicode('fbb7');
+$ti-icon-location-filled: unicode('f67f');
+$ti-icon-location-heart: unicode('fbb8');
+$ti-icon-location-minus: unicode('fbb9');
+$ti-icon-location-off: unicode('f155');
+$ti-icon-location-pause: unicode('fbba');
+$ti-icon-location-pin: unicode('fbbb');
+$ti-icon-location-plus: unicode('fbbc');
+$ti-icon-location-question: unicode('fbbd');
+$ti-icon-location-search: unicode('fbbe');
+$ti-icon-location-share: unicode('fbbf');
+$ti-icon-location-star: unicode('fbc0');
+$ti-icon-location-up: unicode('fbc1');
+$ti-icon-location-x: unicode('fbc2');
+$ti-icon-lock: unicode('eae2');
+$ti-icon-lock-access: unicode('eeaa');
+$ti-icon-lock-access-off: unicode('f404');
+$ti-icon-lock-bolt: unicode('f924');
+$ti-icon-lock-cancel: unicode('f925');
+$ti-icon-lock-check: unicode('f926');
+$ti-icon-lock-code: unicode('f927');
+$ti-icon-lock-cog: unicode('f928');
+$ti-icon-lock-dollar: unicode('f929');
+$ti-icon-lock-down: unicode('f92a');
+$ti-icon-lock-exclamation: unicode('f92b');
+$ti-icon-lock-filled: unicode('fe15');
+$ti-icon-lock-heart: unicode('f92c');
+$ti-icon-lock-minus: unicode('f92d');
+$ti-icon-lock-off: unicode('ed1e');
+$ti-icon-lock-open: unicode('eae1');
+$ti-icon-lock-open-2: unicode('fea8');
+$ti-icon-lock-open-off: unicode('f156');
+$ti-icon-lock-pause: unicode('f92e');
+$ti-icon-lock-pin: unicode('f92f');
+$ti-icon-lock-plus: unicode('f930');
+$ti-icon-lock-question: unicode('f931');
+$ti-icon-lock-search: unicode('f932');
+$ti-icon-lock-share: unicode('f933');
+$ti-icon-lock-square: unicode('ef51');
+$ti-icon-lock-square-rounded: unicode('f636');
+$ti-icon-lock-square-rounded-filled: unicode('f6da');
+$ti-icon-lock-star: unicode('f934');
+$ti-icon-lock-up: unicode('f935');
+$ti-icon-lock-x: unicode('f936');
+$ti-icon-logic-and: unicode('f240');
+$ti-icon-logic-buffer: unicode('f241');
+$ti-icon-logic-nand: unicode('f242');
+$ti-icon-logic-nor: unicode('f243');
+$ti-icon-logic-not: unicode('f244');
+$ti-icon-logic-or: unicode('f245');
+$ti-icon-logic-xnor: unicode('f246');
+$ti-icon-logic-xor: unicode('f247');
+$ti-icon-login: unicode('eba7');
+$ti-icon-login-2: unicode('fc76');
+$ti-icon-logout: unicode('eba8');
+$ti-icon-logout-2: unicode('fa7e');
+$ti-icon-logs: unicode('fea7');
+$ti-icon-lollipop: unicode('efcc');
+$ti-icon-lollipop-off: unicode('f157');
+$ti-icon-luggage: unicode('efad');
+$ti-icon-luggage-off: unicode('f158');
+$ti-icon-lungs: unicode('ef62');
+$ti-icon-lungs-filled: unicode('fe14');
+$ti-icon-lungs-off: unicode('f405');
+$ti-icon-macro: unicode('eeab');
+$ti-icon-macro-filled: unicode('fe13');
+$ti-icon-macro-off: unicode('f406');
+$ti-icon-magnet: unicode('eae3');
+$ti-icon-magnet-filled: unicode('fe12');
+$ti-icon-magnet-off: unicode('f159');
+$ti-icon-magnetic: unicode('fcb9');
+$ti-icon-mail: unicode('eae5');
+$ti-icon-mail-ai: unicode('fa31');
+$ti-icon-mail-bolt: unicode('f937');
+$ti-icon-mail-cancel: unicode('f938');
+$ti-icon-mail-check: unicode('f939');
+$ti-icon-mail-code: unicode('f93a');
+$ti-icon-mail-cog: unicode('f93b');
+$ti-icon-mail-dollar: unicode('f93c');
+$ti-icon-mail-down: unicode('f93d');
+$ti-icon-mail-exclamation: unicode('f93e');
+$ti-icon-mail-fast: unicode('f069');
+$ti-icon-mail-filled: unicode('fa47');
+$ti-icon-mail-forward: unicode('eeac');
+$ti-icon-mail-heart: unicode('f93f');
+$ti-icon-mail-minus: unicode('f940');
+$ti-icon-mail-off: unicode('f15a');
+$ti-icon-mail-opened: unicode('eae4');
+$ti-icon-mail-opened-filled: unicode('fa48');
+$ti-icon-mail-pause: unicode('f941');
+$ti-icon-mail-pin: unicode('f942');
+$ti-icon-mail-plus: unicode('f943');
+$ti-icon-mail-question: unicode('f944');
+$ti-icon-mail-search: unicode('f945');
+$ti-icon-mail-share: unicode('f946');
+$ti-icon-mail-star: unicode('f947');
+$ti-icon-mail-up: unicode('f948');
+$ti-icon-mail-x: unicode('f949');
+$ti-icon-mailbox: unicode('eead');
+$ti-icon-mailbox-off: unicode('f15b');
+$ti-icon-man: unicode('eae6');
+$ti-icon-man-filled: unicode('fe11');
+$ti-icon-manual-gearbox: unicode('ed7b');
+$ti-icon-manual-gearbox-filled: unicode('fe10');
+$ti-icon-map: unicode('eae9');
+$ti-icon-map-2: unicode('eae7');
+$ti-icon-map-bolt: unicode('fbc3');
+$ti-icon-map-cancel: unicode('fbc4');
+$ti-icon-map-check: unicode('fbc5');
+$ti-icon-map-code: unicode('fbc6');
+$ti-icon-map-cog: unicode('fbc7');
+$ti-icon-map-discount: unicode('fbc8');
+$ti-icon-map-dollar: unicode('fbc9');
+$ti-icon-map-down: unicode('fbca');
+$ti-icon-map-east: unicode('fc5d');
+$ti-icon-map-exclamation: unicode('fbcb');
+$ti-icon-map-heart: unicode('fbcc');
+$ti-icon-map-minus: unicode('fbcd');
+$ti-icon-map-north: unicode('fc5e');
+$ti-icon-map-off: unicode('f15c');
+$ti-icon-map-pause: unicode('fbce');
+$ti-icon-map-pin: unicode('eae8');
+$ti-icon-map-pin-2: unicode('fc48');
+$ti-icon-map-pin-bolt: unicode('f94a');
+$ti-icon-map-pin-cancel: unicode('f94b');
+$ti-icon-map-pin-check: unicode('f94c');
+$ti-icon-map-pin-code: unicode('f94d');
+$ti-icon-map-pin-cog: unicode('f94e');
+$ti-icon-map-pin-dollar: unicode('f94f');
+$ti-icon-map-pin-down: unicode('f950');
+$ti-icon-map-pin-exclamation: unicode('f951');
+$ti-icon-map-pin-filled: unicode('f680');
+$ti-icon-map-pin-heart: unicode('f952');
+$ti-icon-map-pin-minus: unicode('f953');
+$ti-icon-map-pin-off: unicode('ecf3');
+$ti-icon-map-pin-pause: unicode('f954');
+$ti-icon-map-pin-pin: unicode('f955');
+$ti-icon-map-pin-plus: unicode('f956');
+$ti-icon-map-pin-question: unicode('f957');
+$ti-icon-map-pin-search: unicode('f958');
+$ti-icon-map-pin-share: unicode('f795');
+$ti-icon-map-pin-star: unicode('f959');
+$ti-icon-map-pin-up: unicode('f95a');
+$ti-icon-map-pin-x: unicode('f95b');
+$ti-icon-map-pins: unicode('ed5e');
+$ti-icon-map-plus: unicode('fbcf');
+$ti-icon-map-question: unicode('fbd0');
+$ti-icon-map-route: unicode('fc79');
+$ti-icon-map-search: unicode('ef82');
+$ti-icon-map-share: unicode('fbd1');
+$ti-icon-map-south: unicode('fc5f');
+$ti-icon-map-star: unicode('fbd2');
+$ti-icon-map-up: unicode('fbd3');
+$ti-icon-map-west: unicode('fc60');
+$ti-icon-map-x: unicode('fbd4');
+$ti-icon-markdown: unicode('ec41');
+$ti-icon-markdown-off: unicode('f407');
+$ti-icon-marquee: unicode('ec77');
+$ti-icon-marquee-2: unicode('eeae');
+$ti-icon-marquee-off: unicode('f15d');
+$ti-icon-mars: unicode('ec80');
+$ti-icon-mask: unicode('eeb0');
+$ti-icon-mask-off: unicode('eeaf');
+$ti-icon-masks-theater: unicode('f263');
+$ti-icon-masks-theater-off: unicode('f408');
+$ti-icon-massage: unicode('eeb1');
+$ti-icon-matchstick: unicode('f577');
+$ti-icon-math: unicode('ebeb');
+$ti-icon-math-1-divide-2: unicode('f4e2');
+$ti-icon-math-1-divide-3: unicode('f4e3');
+$ti-icon-math-avg: unicode('f0f4');
+$ti-icon-math-equal-greater: unicode('f4e4');
+$ti-icon-math-equal-lower: unicode('f4e5');
+$ti-icon-math-function: unicode('eeb2');
+$ti-icon-math-function-off: unicode('f15e');
+$ti-icon-math-function-y: unicode('f4e6');
+$ti-icon-math-greater: unicode('f4e7');
+$ti-icon-math-integral: unicode('f4e9');
+$ti-icon-math-integral-x: unicode('f4e8');
+$ti-icon-math-integrals: unicode('f4ea');
+$ti-icon-math-lower: unicode('f4eb');
+$ti-icon-math-max: unicode('f0f5');
+$ti-icon-math-max-min: unicode('fda0');
+$ti-icon-math-min: unicode('f0f6');
+$ti-icon-math-not: unicode('f4ec');
+$ti-icon-math-off: unicode('f409');
+$ti-icon-math-pi: unicode('f4ee');
+$ti-icon-math-pi-divide-2: unicode('f4ed');
+$ti-icon-math-symbols: unicode('eeb3');
+$ti-icon-math-x-divide-2: unicode('f4ef');
+$ti-icon-math-x-divide-y: unicode('f4f1');
+$ti-icon-math-x-divide-y-2: unicode('f4f0');
+$ti-icon-math-x-minus-x: unicode('f4f2');
+$ti-icon-math-x-minus-y: unicode('f4f3');
+$ti-icon-math-x-plus-x: unicode('f4f4');
+$ti-icon-math-x-plus-y: unicode('f4f5');
+$ti-icon-math-xy: unicode('f4f6');
+$ti-icon-math-y-minus-y: unicode('f4f7');
+$ti-icon-math-y-plus-y: unicode('f4f8');
+$ti-icon-maximize: unicode('eaea');
+$ti-icon-maximize-off: unicode('f15f');
+$ti-icon-meat: unicode('ef12');
+$ti-icon-meat-off: unicode('f40a');
+$ti-icon-medal: unicode('ec78');
+$ti-icon-medal-2: unicode('efcd');
+$ti-icon-medical-cross: unicode('ec2f');
+$ti-icon-medical-cross-circle: unicode('fae8');
+$ti-icon-medical-cross-filled: unicode('f681');
+$ti-icon-medical-cross-off: unicode('f160');
+$ti-icon-medicine-syrup: unicode('ef63');
+$ti-icon-meeple: unicode('f514');
+$ti-icon-melon: unicode('fc7a');
+$ti-icon-menorah: unicode('f58c');
+$ti-icon-menu: unicode('eaeb');
+$ti-icon-menu-2: unicode('ec42');
+$ti-icon-menu-deep: unicode('fafb');
+$ti-icon-menu-order: unicode('f5f5');
+$ti-icon-message: unicode('eaef');
+$ti-icon-message-2: unicode('eaec');
+$ti-icon-message-2-bolt: unicode('f95c');
+$ti-icon-message-2-cancel: unicode('f95d');
+$ti-icon-message-2-check: unicode('f95e');
+$ti-icon-message-2-code: unicode('f012');
+$ti-icon-message-2-cog: unicode('f95f');
+$ti-icon-message-2-dollar: unicode('f960');
+$ti-icon-message-2-down: unicode('f961');
+$ti-icon-message-2-exclamation: unicode('f962');
+$ti-icon-message-2-heart: unicode('f963');
+$ti-icon-message-2-minus: unicode('f964');
+$ti-icon-message-2-off: unicode('f40b');
+$ti-icon-message-2-pause: unicode('f965');
+$ti-icon-message-2-pin: unicode('f966');
+$ti-icon-message-2-plus: unicode('f967');
+$ti-icon-message-2-question: unicode('f968');
+$ti-icon-message-2-search: unicode('f969');
+$ti-icon-message-2-share: unicode('f077');
+$ti-icon-message-2-star: unicode('f96a');
+$ti-icon-message-2-up: unicode('f96b');
+$ti-icon-message-2-x: unicode('f96c');
+$ti-icon-message-bolt: unicode('f96d');
+$ti-icon-message-cancel: unicode('f96e');
+$ti-icon-message-chatbot: unicode('f38a');
+$ti-icon-message-chatbot-filled: unicode('fed0');
+$ti-icon-message-check: unicode('f96f');
+$ti-icon-message-circle: unicode('eaed');
+$ti-icon-message-circle-bolt: unicode('f970');
+$ti-icon-message-circle-cancel: unicode('f971');
+$ti-icon-message-circle-check: unicode('f972');
+$ti-icon-message-circle-code: unicode('f973');
+$ti-icon-message-circle-cog: unicode('f974');
+$ti-icon-message-circle-dollar: unicode('f975');
+$ti-icon-message-circle-down: unicode('f976');
+$ti-icon-message-circle-exclamation: unicode('f977');
+$ti-icon-message-circle-filled: unicode('fecf');
+$ti-icon-message-circle-heart: unicode('f978');
+$ti-icon-message-circle-minus: unicode('f979');
+$ti-icon-message-circle-off: unicode('ed40');
+$ti-icon-message-circle-pause: unicode('f97a');
+$ti-icon-message-circle-pin: unicode('f97b');
+$ti-icon-message-circle-plus: unicode('f97c');
+$ti-icon-message-circle-question: unicode('f97d');
+$ti-icon-message-circle-search: unicode('f97e');
+$ti-icon-message-circle-share: unicode('f97f');
+$ti-icon-message-circle-star: unicode('f980');
+$ti-icon-message-circle-up: unicode('f981');
+$ti-icon-message-circle-user: unicode('fec5');
+$ti-icon-message-circle-x: unicode('f982');
+$ti-icon-message-code: unicode('f013');
+$ti-icon-message-cog: unicode('f983');
+$ti-icon-message-dollar: unicode('f984');
+$ti-icon-message-dots: unicode('eaee');
+$ti-icon-message-down: unicode('f985');
+$ti-icon-message-exclamation: unicode('f986');
+$ti-icon-message-filled: unicode('fecd');
+$ti-icon-message-forward: unicode('f28f');
+$ti-icon-message-heart: unicode('f987');
+$ti-icon-message-language: unicode('efae');
+$ti-icon-message-minus: unicode('f988');
+$ti-icon-message-off: unicode('ed41');
+$ti-icon-message-pause: unicode('f989');
+$ti-icon-message-pin: unicode('f98a');
+$ti-icon-message-plus: unicode('ec9a');
+$ti-icon-message-question: unicode('f98b');
+$ti-icon-message-reply: unicode('fd4d');
+$ti-icon-message-report: unicode('ec9b');
+$ti-icon-message-report-filled: unicode('fece');
+$ti-icon-message-search: unicode('f98c');
+$ti-icon-message-share: unicode('f078');
+$ti-icon-message-star: unicode('f98d');
+$ti-icon-message-up: unicode('f98e');
+$ti-icon-message-user: unicode('fec4');
+$ti-icon-message-x: unicode('f98f');
+$ti-icon-messages: unicode('eb6c');
+$ti-icon-messages-off: unicode('ed42');
+$ti-icon-meteor: unicode('f1fd');
+$ti-icon-meteor-off: unicode('f40c');
+$ti-icon-meter-cube: unicode('fd7c');
+$ti-icon-meter-square: unicode('fd7d');
+$ti-icon-metronome: unicode('fd25');
+$ti-icon-michelin-bib-gourmand: unicode('fae9');
+$ti-icon-michelin-star: unicode('faeb');
+$ti-icon-michelin-star-green: unicode('faea');
+$ti-icon-mickey: unicode('f2a3');
+$ti-icon-mickey-filled: unicode('f683');
+$ti-icon-microphone: unicode('eaf0');
+$ti-icon-microphone-2: unicode('ef2c');
+$ti-icon-microphone-2-off: unicode('f40d');
+$ti-icon-microphone-filled: unicode('fe0f');
+$ti-icon-microphone-off: unicode('ed16');
+$ti-icon-microscope: unicode('ef64');
+$ti-icon-microscope-off: unicode('f40e');
+$ti-icon-microwave: unicode('f248');
+$ti-icon-microwave-filled: unicode('fe0e');
+$ti-icon-microwave-off: unicode('f264');
+$ti-icon-military-award: unicode('f079');
+$ti-icon-military-rank: unicode('efcf');
+$ti-icon-milk: unicode('ef13');
+$ti-icon-milk-off: unicode('f40f');
+$ti-icon-milkshake: unicode('f4c8');
+$ti-icon-minimize: unicode('eaf1');
+$ti-icon-minus: unicode('eaf2');
+$ti-icon-minus-vertical: unicode('eeb4');
+$ti-icon-mist: unicode('ec30');
+$ti-icon-mist-off: unicode('f410');
+$ti-icon-mobiledata: unicode('f9f5');
+$ti-icon-mobiledata-off: unicode('f9f4');
+$ti-icon-moneybag: unicode('f506');
+$ti-icon-monkeybar: unicode('feb4');
+$ti-icon-mood-angry: unicode('f2de');
+$ti-icon-mood-annoyed: unicode('f2e0');
+$ti-icon-mood-annoyed-2: unicode('f2df');
+$ti-icon-mood-boy: unicode('ed2d');
+$ti-icon-mood-check: unicode('f7b3');
+$ti-icon-mood-cog: unicode('f7b4');
+$ti-icon-mood-confuzed: unicode('eaf3');
+$ti-icon-mood-confuzed-filled: unicode('f7f2');
+$ti-icon-mood-crazy-happy: unicode('ed90');
+$ti-icon-mood-cry: unicode('ecbb');
+$ti-icon-mood-dollar: unicode('f7b5');
+$ti-icon-mood-edit: unicode('fa05');
+$ti-icon-mood-empty: unicode('eeb5');
+$ti-icon-mood-empty-filled: unicode('f7f3');
+$ti-icon-mood-happy: unicode('eaf4');
+$ti-icon-mood-happy-filled: unicode('f7f4');
+$ti-icon-mood-heart: unicode('f7b6');
+$ti-icon-mood-kid: unicode('ec03');
+$ti-icon-mood-kid-filled: unicode('f7f5');
+$ti-icon-mood-look-down: unicode('fd37');
+$ti-icon-mood-look-left: unicode('f2c5');
+$ti-icon-mood-look-right: unicode('f2c6');
+$ti-icon-mood-look-up: unicode('fd38');
+$ti-icon-mood-minus: unicode('f7b7');
+$ti-icon-mood-nerd: unicode('f2e1');
+$ti-icon-mood-nervous: unicode('ef96');
+$ti-icon-mood-neutral: unicode('eaf5');
+$ti-icon-mood-neutral-filled: unicode('f7f6');
+$ti-icon-mood-off: unicode('f161');
+$ti-icon-mood-pin: unicode('f7b8');
+$ti-icon-mood-plus: unicode('f7b9');
+$ti-icon-mood-puzzled: unicode('fd39');
+$ti-icon-mood-sad: unicode('eaf6');
+$ti-icon-mood-sad-2: unicode('f2e2');
+$ti-icon-mood-sad-dizzy: unicode('f2e3');
+$ti-icon-mood-sad-filled: unicode('f7f7');
+$ti-icon-mood-sad-squint: unicode('f2e4');
+$ti-icon-mood-search: unicode('f7ba');
+$ti-icon-mood-share: unicode('fa06');
+$ti-icon-mood-sick: unicode('f2e5');
+$ti-icon-mood-silence: unicode('f2e6');
+$ti-icon-mood-sing: unicode('f2c7');
+$ti-icon-mood-smile: unicode('eaf7');
+$ti-icon-mood-smile-beam: unicode('f2e7');
+$ti-icon-mood-smile-dizzy: unicode('f2e8');
+$ti-icon-mood-smile-filled: unicode('f7f8');
+$ti-icon-mood-suprised: unicode('ec04');
+$ti-icon-mood-tongue: unicode('eb95');
+$ti-icon-mood-tongue-wink: unicode('f2ea');
+$ti-icon-mood-tongue-wink-2: unicode('f2e9');
+$ti-icon-mood-unamused: unicode('f2eb');
+$ti-icon-mood-up: unicode('f7bb');
+$ti-icon-mood-wink: unicode('f2ed');
+$ti-icon-mood-wink-2: unicode('f2ec');
+$ti-icon-mood-wrrr: unicode('f2ee');
+$ti-icon-mood-x: unicode('f7bc');
+$ti-icon-mood-xd: unicode('f2ef');
+$ti-icon-moon: unicode('eaf8');
+$ti-icon-moon-2: unicode('ece6');
+$ti-icon-moon-filled: unicode('f684');
+$ti-icon-moon-off: unicode('f162');
+$ti-icon-moon-stars: unicode('ece7');
+$ti-icon-moped: unicode('ecbc');
+$ti-icon-motorbike: unicode('eeb6');
+$ti-icon-mountain: unicode('ef97');
+$ti-icon-mountain-off: unicode('f411');
+$ti-icon-mouse: unicode('eaf9');
+$ti-icon-mouse-2: unicode('f1d7');
+$ti-icon-mouse-filled: unicode('fb2f');
+$ti-icon-mouse-off: unicode('f163');
+$ti-icon-moustache: unicode('f4c9');
+$ti-icon-movie: unicode('eafa');
+$ti-icon-movie-off: unicode('f164');
+$ti-icon-mug: unicode('eafb');
+$ti-icon-mug-off: unicode('f165');
+$ti-icon-multiplier-0-5x: unicode('ef41');
+$ti-icon-multiplier-1-5x: unicode('ef42');
+$ti-icon-multiplier-1x: unicode('ef43');
+$ti-icon-multiplier-2x: unicode('ef44');
+$ti-icon-mushroom: unicode('ef14');
+$ti-icon-mushroom-filled: unicode('f7f9');
+$ti-icon-mushroom-off: unicode('f412');
+$ti-icon-music: unicode('eafc');
+$ti-icon-music-bolt: unicode('fbd5');
+$ti-icon-music-cancel: unicode('fbd6');
+$ti-icon-music-check: unicode('fbd7');
+$ti-icon-music-code: unicode('fbd8');
+$ti-icon-music-cog: unicode('fbd9');
+$ti-icon-music-discount: unicode('fbda');
+$ti-icon-music-dollar: unicode('fbdb');
+$ti-icon-music-down: unicode('fbdc');
+$ti-icon-music-exclamation: unicode('fbdd');
+$ti-icon-music-heart: unicode('fbde');
+$ti-icon-music-minus: unicode('fbdf');
+$ti-icon-music-off: unicode('f166');
+$ti-icon-music-pause: unicode('fbe0');
+$ti-icon-music-pin: unicode('fbe1');
+$ti-icon-music-plus: unicode('fbe2');
+$ti-icon-music-question: unicode('fbe3');
+$ti-icon-music-search: unicode('fbe4');
+$ti-icon-music-share: unicode('fbe5');
+$ti-icon-music-star: unicode('fbe6');
+$ti-icon-music-up: unicode('fbe7');
+$ti-icon-music-x: unicode('fbe8');
+$ti-icon-navigation: unicode('f2c8');
+$ti-icon-navigation-bolt: unicode('fbe9');
+$ti-icon-navigation-cancel: unicode('fbea');
+$ti-icon-navigation-check: unicode('fbeb');
+$ti-icon-navigation-code: unicode('fbec');
+$ti-icon-navigation-cog: unicode('fbed');
+$ti-icon-navigation-discount: unicode('fbee');
+$ti-icon-navigation-dollar: unicode('fbef');
+$ti-icon-navigation-down: unicode('fbf0');
+$ti-icon-navigation-east: unicode('fcba');
+$ti-icon-navigation-exclamation: unicode('fbf1');
+$ti-icon-navigation-filled: unicode('f685');
+$ti-icon-navigation-heart: unicode('fbf2');
+$ti-icon-navigation-minus: unicode('fbf3');
+$ti-icon-navigation-north: unicode('fcbb');
+$ti-icon-navigation-off: unicode('f413');
+$ti-icon-navigation-pause: unicode('fbf4');
+$ti-icon-navigation-pin: unicode('fbf5');
+$ti-icon-navigation-plus: unicode('fbf6');
+$ti-icon-navigation-question: unicode('fbf7');
+$ti-icon-navigation-search: unicode('fbf8');
+$ti-icon-navigation-share: unicode('fbf9');
+$ti-icon-navigation-south: unicode('fcbc');
+$ti-icon-navigation-star: unicode('fbfa');
+$ti-icon-navigation-top: unicode('faec');
+$ti-icon-navigation-up: unicode('fbfb');
+$ti-icon-navigation-west: unicode('fcbd');
+$ti-icon-navigation-x: unicode('fbfc');
+$ti-icon-needle: unicode('f508');
+$ti-icon-needle-thread: unicode('f507');
+$ti-icon-network: unicode('f09f');
+$ti-icon-network-off: unicode('f414');
+$ti-icon-new-section: unicode('ebc1');
+$ti-icon-news: unicode('eafd');
+$ti-icon-news-off: unicode('f167');
+$ti-icon-nfc: unicode('eeb7');
+$ti-icon-nfc-off: unicode('f168');
+$ti-icon-no-copyright: unicode('efb9');
+$ti-icon-no-creative-commons: unicode('efba');
+$ti-icon-no-derivatives: unicode('efbb');
+$ti-icon-north-star: unicode('f014');
+$ti-icon-note: unicode('eb6d');
+$ti-icon-note-off: unicode('f169');
+$ti-icon-notebook: unicode('eb96');
+$ti-icon-notebook-off: unicode('f415');
+$ti-icon-notes: unicode('eb6e');
+$ti-icon-notes-off: unicode('f16a');
+$ti-icon-notification: unicode('eafe');
+$ti-icon-notification-off: unicode('f16b');
+$ti-icon-number: unicode('f1fe');
+$ti-icon-number-0: unicode('edf0');
+$ti-icon-number-0-small: unicode('fce1');
+$ti-icon-number-1: unicode('edf1');
+$ti-icon-number-1-small: unicode('fce2');
+$ti-icon-number-10-small: unicode('fce3');
+$ti-icon-number-11-small: unicode('fce4');
+$ti-icon-number-12-small: unicode('fce5');
+$ti-icon-number-123: unicode('f554');
+$ti-icon-number-13-small: unicode('fce6');
+$ti-icon-number-14-small: unicode('fce7');
+$ti-icon-number-15-small: unicode('fce8');
+$ti-icon-number-16-small: unicode('fce9');
+$ti-icon-number-17-small: unicode('fcea');
+$ti-icon-number-18-small: unicode('fceb');
+$ti-icon-number-19-small: unicode('fcec');
+$ti-icon-number-2: unicode('edf2');
+$ti-icon-number-2-small: unicode('fced');
+$ti-icon-number-20-small: unicode('fcee');
+$ti-icon-number-21-small: unicode('fcef');
+$ti-icon-number-22-small: unicode('fcf0');
+$ti-icon-number-23-small: unicode('fcf1');
+$ti-icon-number-24-small: unicode('fcf2');
+$ti-icon-number-25-small: unicode('fcf3');
+$ti-icon-number-26-small: unicode('fcf4');
+$ti-icon-number-27-small: unicode('fcf5');
+$ti-icon-number-28-small: unicode('fcf6');
+$ti-icon-number-29-small: unicode('fcf7');
+$ti-icon-number-3: unicode('edf3');
+$ti-icon-number-3-small: unicode('fcf8');
+$ti-icon-number-4: unicode('edf4');
+$ti-icon-number-4-small: unicode('fcf9');
+$ti-icon-number-5: unicode('edf5');
+$ti-icon-number-5-small: unicode('fcfa');
+$ti-icon-number-6: unicode('edf6');
+$ti-icon-number-6-small: unicode('fcfb');
+$ti-icon-number-7: unicode('edf7');
+$ti-icon-number-7-small: unicode('fcfc');
+$ti-icon-number-8: unicode('edf8');
+$ti-icon-number-8-small: unicode('fcfd');
+$ti-icon-number-9: unicode('edf9');
+$ti-icon-number-9-small: unicode('fcfe');
+$ti-icon-numbers: unicode('f015');
+$ti-icon-nurse: unicode('ef65');
+$ti-icon-nut: unicode('fc61');
+$ti-icon-octagon: unicode('ecbd');
+$ti-icon-octagon-filled: unicode('f686');
+$ti-icon-octagon-minus: unicode('fc92');
+$ti-icon-octagon-minus-2: unicode('fc91');
+$ti-icon-octagon-off: unicode('eeb8');
+$ti-icon-octagon-plus: unicode('fc94');
+$ti-icon-octagon-plus-2: unicode('fc93');
+$ti-icon-octahedron: unicode('faae');
+$ti-icon-octahedron-off: unicode('faac');
+$ti-icon-octahedron-plus: unicode('faad');
+$ti-icon-old: unicode('eeb9');
+$ti-icon-olympics: unicode('eeba');
+$ti-icon-olympics-off: unicode('f416');
+$ti-icon-om: unicode('f58d');
+$ti-icon-omega: unicode('eb97');
+$ti-icon-outbound: unicode('f249');
+$ti-icon-outlet: unicode('ebd7');
+$ti-icon-oval: unicode('f02e');
+$ti-icon-oval-filled: unicode('f687');
+$ti-icon-oval-vertical: unicode('f02d');
+$ti-icon-oval-vertical-filled: unicode('f688');
+$ti-icon-overline: unicode('eebb');
+$ti-icon-package: unicode('eaff');
+$ti-icon-package-export: unicode('f07a');
+$ti-icon-package-import: unicode('f07b');
+$ti-icon-package-off: unicode('f16c');
+$ti-icon-packages: unicode('f2c9');
+$ti-icon-pacman: unicode('eebc');
+$ti-icon-page-break: unicode('ec81');
+$ti-icon-paint: unicode('eb00');
+$ti-icon-paint-filled: unicode('f75f');
+$ti-icon-paint-off: unicode('f16d');
+$ti-icon-palette: unicode('eb01');
+$ti-icon-palette-off: unicode('f16e');
+$ti-icon-panorama-horizontal: unicode('ed33');
+$ti-icon-panorama-horizontal-filled: unicode('fecc');
+$ti-icon-panorama-horizontal-off: unicode('f417');
+$ti-icon-panorama-vertical: unicode('ed34');
+$ti-icon-panorama-vertical-filled: unicode('fecb');
+$ti-icon-panorama-vertical-off: unicode('f418');
+$ti-icon-paper-bag: unicode('f02f');
+$ti-icon-paper-bag-off: unicode('f16f');
+$ti-icon-paperclip: unicode('eb02');
+$ti-icon-parachute: unicode('ed7c');
+$ti-icon-parachute-off: unicode('f170');
+$ti-icon-parentheses: unicode('ebd8');
+$ti-icon-parentheses-off: unicode('f171');
+$ti-icon-parking: unicode('eb03');
+$ti-icon-parking-circle: unicode('fd5a');
+$ti-icon-parking-circle-filled: unicode('feca');
+$ti-icon-parking-off: unicode('f172');
+$ti-icon-password: unicode('f4ca');
+$ti-icon-password-fingerprint: unicode('fc7b');
+$ti-icon-password-mobile-phone: unicode('fc7c');
+$ti-icon-password-user: unicode('fc7d');
+$ti-icon-paw: unicode('eff9');
+$ti-icon-paw-filled: unicode('f689');
+$ti-icon-paw-off: unicode('f419');
+$ti-icon-paywall: unicode('fd7e');
+$ti-icon-pdf: unicode('f7ac');
+$ti-icon-peace: unicode('ecbe');
+$ti-icon-pencil: unicode('eb04');
+$ti-icon-pencil-bolt: unicode('fbfd');
+$ti-icon-pencil-cancel: unicode('fbfe');
+$ti-icon-pencil-check: unicode('fbff');
+$ti-icon-pencil-code: unicode('fc00');
+$ti-icon-pencil-cog: unicode('fc01');
+$ti-icon-pencil-discount: unicode('fc02');
+$ti-icon-pencil-dollar: unicode('fc03');
+$ti-icon-pencil-down: unicode('fc04');
+$ti-icon-pencil-exclamation: unicode('fc05');
+$ti-icon-pencil-heart: unicode('fc06');
+$ti-icon-pencil-minus: unicode('f1eb');
+$ti-icon-pencil-off: unicode('f173');
+$ti-icon-pencil-pause: unicode('fc07');
+$ti-icon-pencil-pin: unicode('fc08');
+$ti-icon-pencil-plus: unicode('f1ec');
+$ti-icon-pencil-question: unicode('fc09');
+$ti-icon-pencil-search: unicode('fc0a');
+$ti-icon-pencil-share: unicode('fc0b');
+$ti-icon-pencil-star: unicode('fc0c');
+$ti-icon-pencil-up: unicode('fc0d');
+$ti-icon-pencil-x: unicode('fc0e');
+$ti-icon-pennant: unicode('ed7d');
+$ti-icon-pennant-2: unicode('f06a');
+$ti-icon-pennant-2-filled: unicode('f68a');
+$ti-icon-pennant-filled: unicode('f68b');
+$ti-icon-pennant-off: unicode('f174');
+$ti-icon-pentagon: unicode('efe3');
+$ti-icon-pentagon-filled: unicode('f68c');
+$ti-icon-pentagon-minus: unicode('feb3');
+$ti-icon-pentagon-number-0: unicode('fc7e');
+$ti-icon-pentagon-number-1: unicode('fc7f');
+$ti-icon-pentagon-number-2: unicode('fc80');
+$ti-icon-pentagon-number-3: unicode('fc81');
+$ti-icon-pentagon-number-4: unicode('fc82');
+$ti-icon-pentagon-number-5: unicode('fc83');
+$ti-icon-pentagon-number-6: unicode('fc84');
+$ti-icon-pentagon-number-7: unicode('fc85');
+$ti-icon-pentagon-number-8: unicode('fc86');
+$ti-icon-pentagon-number-9: unicode('fc87');
+$ti-icon-pentagon-off: unicode('f41a');
+$ti-icon-pentagon-plus: unicode('fc49');
+$ti-icon-pentagon-x: unicode('fc88');
+$ti-icon-pentagram: unicode('f586');
+$ti-icon-pepper: unicode('ef15');
+$ti-icon-pepper-off: unicode('f175');
+$ti-icon-percentage: unicode('ecf4');
+$ti-icon-percentage-0: unicode('fee5');
+$ti-icon-percentage-10: unicode('fee4');
+$ti-icon-percentage-100: unicode('fee3');
+$ti-icon-percentage-20: unicode('fee2');
+$ti-icon-percentage-25: unicode('fee1');
+$ti-icon-percentage-30: unicode('fee0');
+$ti-icon-percentage-33: unicode('fedf');
+$ti-icon-percentage-40: unicode('fede');
+$ti-icon-percentage-50: unicode('fedd');
+$ti-icon-percentage-60: unicode('fedc');
+$ti-icon-percentage-66: unicode('fedb');
+$ti-icon-percentage-70: unicode('feda');
+$ti-icon-percentage-75: unicode('fed9');
+$ti-icon-percentage-80: unicode('fed8');
+$ti-icon-percentage-90: unicode('fed7');
+$ti-icon-perfume: unicode('f509');
+$ti-icon-perspective: unicode('eebd');
+$ti-icon-perspective-off: unicode('f176');
+$ti-icon-phone: unicode('eb09');
+$ti-icon-phone-call: unicode('eb05');
+$ti-icon-phone-calling: unicode('ec43');
+$ti-icon-phone-check: unicode('ec05');
+$ti-icon-phone-filled: unicode('fa49');
+$ti-icon-phone-incoming: unicode('eb06');
+$ti-icon-phone-off: unicode('ecf5');
+$ti-icon-phone-outgoing: unicode('eb07');
+$ti-icon-phone-pause: unicode('eb08');
+$ti-icon-phone-plus: unicode('ec06');
+$ti-icon-phone-x: unicode('ec07');
+$ti-icon-photo: unicode('eb0a');
+$ti-icon-photo-ai: unicode('fa32');
+$ti-icon-photo-bolt: unicode('f990');
+$ti-icon-photo-cancel: unicode('f35d');
+$ti-icon-photo-check: unicode('f35e');
+$ti-icon-photo-circle: unicode('fc4a');
+$ti-icon-photo-circle-minus: unicode('fc62');
+$ti-icon-photo-circle-plus: unicode('fc63');
+$ti-icon-photo-code: unicode('f991');
+$ti-icon-photo-cog: unicode('f992');
+$ti-icon-photo-dollar: unicode('f993');
+$ti-icon-photo-down: unicode('f35f');
+$ti-icon-photo-edit: unicode('f360');
+$ti-icon-photo-exclamation: unicode('f994');
+$ti-icon-photo-filled: unicode('fa4a');
+$ti-icon-photo-heart: unicode('f361');
+$ti-icon-photo-hexagon: unicode('fc4b');
+$ti-icon-photo-minus: unicode('f362');
+$ti-icon-photo-off: unicode('ecf6');
+$ti-icon-photo-pause: unicode('f995');
+$ti-icon-photo-pentagon: unicode('fc4c');
+$ti-icon-photo-pin: unicode('f996');
+$ti-icon-photo-plus: unicode('f363');
+$ti-icon-photo-question: unicode('f997');
+$ti-icon-photo-scan: unicode('fca8');
+$ti-icon-photo-search: unicode('f364');
+$ti-icon-photo-sensor: unicode('f798');
+$ti-icon-photo-sensor-2: unicode('f796');
+$ti-icon-photo-sensor-3: unicode('f797');
+$ti-icon-photo-share: unicode('f998');
+$ti-icon-photo-shield: unicode('f365');
+$ti-icon-photo-square-rounded: unicode('fc4d');
+$ti-icon-photo-star: unicode('f366');
+$ti-icon-photo-up: unicode('f38b');
+$ti-icon-photo-video: unicode('fc95');
+$ti-icon-photo-x: unicode('f367');
+$ti-icon-physotherapist: unicode('eebe');
+$ti-icon-piano: unicode('fad3');
+$ti-icon-pick: unicode('fafc');
+$ti-icon-picnic-table: unicode('fed6');
+$ti-icon-picture-in-picture: unicode('ed35');
+$ti-icon-picture-in-picture-filled: unicode('fec1');
+$ti-icon-picture-in-picture-off: unicode('ed43');
+$ti-icon-picture-in-picture-on: unicode('ed44');
+$ti-icon-picture-in-picture-top: unicode('efe4');
+$ti-icon-picture-in-picture-top-filled: unicode('fec2');
+$ti-icon-pig: unicode('ef52');
+$ti-icon-pig-money: unicode('f38c');
+$ti-icon-pig-off: unicode('f177');
+$ti-icon-pilcrow: unicode('f5f6');
+$ti-icon-pilcrow-left: unicode('fd7f');
+$ti-icon-pilcrow-right: unicode('fd80');
+$ti-icon-pill: unicode('ec44');
+$ti-icon-pill-off: unicode('f178');
+$ti-icon-pills: unicode('ef66');
+$ti-icon-pin: unicode('ec9c');
+$ti-icon-pin-end: unicode('fd5b');
+$ti-icon-pin-filled: unicode('f68d');
+$ti-icon-pin-invoke: unicode('fd5c');
+$ti-icon-ping-pong: unicode('f38d');
+$ti-icon-pinned: unicode('ed60');
+$ti-icon-pinned-filled: unicode('f68e');
+$ti-icon-pinned-off: unicode('ed5f');
+$ti-icon-pizza: unicode('edbb');
+$ti-icon-pizza-off: unicode('f179');
+$ti-icon-placeholder: unicode('f626');
+$ti-icon-plane: unicode('eb6f');
+$ti-icon-plane-arrival: unicode('eb99');
+$ti-icon-plane-departure: unicode('eb9a');
+$ti-icon-plane-inflight: unicode('ef98');
+$ti-icon-plane-off: unicode('f17a');
+$ti-icon-plane-tilt: unicode('f1ed');
+$ti-icon-planet: unicode('ec08');
+$ti-icon-planet-off: unicode('f17b');
+$ti-icon-plant: unicode('ed50');
+$ti-icon-plant-2: unicode('ed7e');
+$ti-icon-plant-2-off: unicode('f17c');
+$ti-icon-plant-off: unicode('f17d');
+$ti-icon-play-basketball: unicode('fa66');
+$ti-icon-play-card: unicode('eebf');
+$ti-icon-play-card-off: unicode('f17e');
+$ti-icon-play-football: unicode('fa67');
+$ti-icon-play-handball: unicode('fa68');
+$ti-icon-play-volleyball: unicode('fa69');
+$ti-icon-player-eject: unicode('efbc');
+$ti-icon-player-eject-filled: unicode('f68f');
+$ti-icon-player-pause: unicode('ed45');
+$ti-icon-player-pause-filled: unicode('f690');
+$ti-icon-player-play: unicode('ed46');
+$ti-icon-player-play-filled: unicode('f691');
+$ti-icon-player-record: unicode('ed47');
+$ti-icon-player-record-filled: unicode('f692');
+$ti-icon-player-skip-back: unicode('ed48');
+$ti-icon-player-skip-back-filled: unicode('f693');
+$ti-icon-player-skip-forward: unicode('ed49');
+$ti-icon-player-skip-forward-filled: unicode('f694');
+$ti-icon-player-stop: unicode('ed4a');
+$ti-icon-player-stop-filled: unicode('f695');
+$ti-icon-player-track-next: unicode('ed4b');
+$ti-icon-player-track-next-filled: unicode('f696');
+$ti-icon-player-track-prev: unicode('ed4c');
+$ti-icon-player-track-prev-filled: unicode('f697');
+$ti-icon-playlist: unicode('eec0');
+$ti-icon-playlist-add: unicode('f008');
+$ti-icon-playlist-off: unicode('f17f');
+$ti-icon-playlist-x: unicode('f009');
+$ti-icon-playstation-circle: unicode('f2ad');
+$ti-icon-playstation-square: unicode('f2ae');
+$ti-icon-playstation-triangle: unicode('f2af');
+$ti-icon-playstation-x: unicode('f2b0');
+$ti-icon-plug: unicode('ebd9');
+$ti-icon-plug-connected: unicode('f00a');
+$ti-icon-plug-connected-x: unicode('f0a0');
+$ti-icon-plug-off: unicode('f180');
+$ti-icon-plug-x: unicode('f0a1');
+$ti-icon-plus: unicode('eb0b');
+$ti-icon-plus-equal: unicode('f7ad');
+$ti-icon-plus-minus: unicode('f7ae');
+$ti-icon-png: unicode('f3ad');
+$ti-icon-podium: unicode('f1d8');
+$ti-icon-podium-off: unicode('f41b');
+$ti-icon-point: unicode('eb0c');
+$ti-icon-point-filled: unicode('f698');
+$ti-icon-point-off: unicode('f181');
+$ti-icon-pointer: unicode('f265');
+$ti-icon-pointer-bolt: unicode('f999');
+$ti-icon-pointer-cancel: unicode('f99a');
+$ti-icon-pointer-check: unicode('f99b');
+$ti-icon-pointer-code: unicode('f99c');
+$ti-icon-pointer-cog: unicode('f99d');
+$ti-icon-pointer-dollar: unicode('f99e');
+$ti-icon-pointer-down: unicode('f99f');
+$ti-icon-pointer-exclamation: unicode('f9a0');
+$ti-icon-pointer-filled: unicode('fb30');
+$ti-icon-pointer-heart: unicode('f9a1');
+$ti-icon-pointer-minus: unicode('f9a2');
+$ti-icon-pointer-off: unicode('f9a3');
+$ti-icon-pointer-pause: unicode('f9a4');
+$ti-icon-pointer-pin: unicode('f9a5');
+$ti-icon-pointer-plus: unicode('f9a6');
+$ti-icon-pointer-question: unicode('f9a7');
+$ti-icon-pointer-search: unicode('f9a8');
+$ti-icon-pointer-share: unicode('f9a9');
+$ti-icon-pointer-star: unicode('f9aa');
+$ti-icon-pointer-up: unicode('f9ab');
+$ti-icon-pointer-x: unicode('f9ac');
+$ti-icon-pokeball: unicode('eec1');
+$ti-icon-pokeball-off: unicode('f41c');
+$ti-icon-poker-chip: unicode('f515');
+$ti-icon-polaroid: unicode('eec2');
+$ti-icon-polaroid-filled: unicode('fa4b');
+$ti-icon-polygon: unicode('efd0');
+$ti-icon-polygon-off: unicode('f182');
+$ti-icon-poo: unicode('f258');
+$ti-icon-poo-filled: unicode('fec9');
+$ti-icon-pool: unicode('ed91');
+$ti-icon-pool-off: unicode('f41d');
+$ti-icon-power: unicode('eb0d');
+$ti-icon-pray: unicode('ecbf');
+$ti-icon-premium-rights: unicode('efbd');
+$ti-icon-prescription: unicode('ef99');
+$ti-icon-presentation: unicode('eb70');
+$ti-icon-presentation-analytics: unicode('eec3');
+$ti-icon-presentation-off: unicode('f183');
+$ti-icon-printer: unicode('eb0e');
+$ti-icon-printer-off: unicode('f184');
+$ti-icon-prism: unicode('fab1');
+$ti-icon-prism-light: unicode('fea6');
+$ti-icon-prism-off: unicode('faaf');
+$ti-icon-prism-plus: unicode('fab0');
+$ti-icon-prison: unicode('ef79');
+$ti-icon-progress: unicode('fa0d');
+$ti-icon-progress-alert: unicode('fa07');
+$ti-icon-progress-bolt: unicode('fa08');
+$ti-icon-progress-check: unicode('fa09');
+$ti-icon-progress-down: unicode('fa0a');
+$ti-icon-progress-help: unicode('fa0b');
+$ti-icon-progress-x: unicode('fa0c');
+$ti-icon-prompt: unicode('eb0f');
+$ti-icon-prong: unicode('fda1');
+$ti-icon-propeller: unicode('eec4');
+$ti-icon-propeller-off: unicode('f185');
+$ti-icon-protocol: unicode('fd81');
+$ti-icon-pumpkin-scary: unicode('f587');
+$ti-icon-puzzle: unicode('eb10');
+$ti-icon-puzzle-2: unicode('ef83');
+$ti-icon-puzzle-filled: unicode('f699');
+$ti-icon-puzzle-off: unicode('f186');
+$ti-icon-pyramid: unicode('eec5');
+$ti-icon-pyramid-off: unicode('f187');
+$ti-icon-pyramid-plus: unicode('fab2');
+$ti-icon-qrcode: unicode('eb11');
+$ti-icon-qrcode-off: unicode('f41e');
+$ti-icon-question-mark: unicode('ec9d');
+$ti-icon-quote: unicode('efbe');
+$ti-icon-quote-off: unicode('f188');
+$ti-icon-quotes: unicode('fb1e');
+$ti-icon-radar: unicode('f017');
+$ti-icon-radar-2: unicode('f016');
+$ti-icon-radar-filled: unicode('fe0d');
+$ti-icon-radar-off: unicode('f41f');
+$ti-icon-radio: unicode('ef2d');
+$ti-icon-radio-off: unicode('f420');
+$ti-icon-radioactive: unicode('ecc0');
+$ti-icon-radioactive-filled: unicode('f760');
+$ti-icon-radioactive-off: unicode('f189');
+$ti-icon-radius-bottom-left: unicode('eec6');
+$ti-icon-radius-bottom-right: unicode('eec7');
+$ti-icon-radius-top-left: unicode('eec8');
+$ti-icon-radius-top-right: unicode('eec9');
+$ti-icon-rainbow: unicode('edbc');
+$ti-icon-rainbow-off: unicode('f18a');
+$ti-icon-rating-12-plus: unicode('f266');
+$ti-icon-rating-14-plus: unicode('f267');
+$ti-icon-rating-16-plus: unicode('f268');
+$ti-icon-rating-18-plus: unicode('f269');
+$ti-icon-rating-21-plus: unicode('f26a');
+$ti-icon-razor: unicode('f4b5');
+$ti-icon-razor-electric: unicode('f4b4');
+$ti-icon-receipt: unicode('edfd');
+$ti-icon-receipt-2: unicode('edfa');
+$ti-icon-receipt-bitcoin: unicode('fd66');
+$ti-icon-receipt-dollar: unicode('fd67');
+$ti-icon-receipt-euro: unicode('fd68');
+$ti-icon-receipt-off: unicode('edfb');
+$ti-icon-receipt-pound: unicode('fd69');
+$ti-icon-receipt-refund: unicode('edfc');
+$ti-icon-receipt-rupee: unicode('fd82');
+$ti-icon-receipt-tax: unicode('edbd');
+$ti-icon-receipt-yen: unicode('fd6a');
+$ti-icon-receipt-yuan: unicode('fd6b');
+$ti-icon-recharging: unicode('eeca');
+$ti-icon-record-mail: unicode('eb12');
+$ti-icon-record-mail-off: unicode('f18b');
+$ti-icon-rectangle: unicode('ed37');
+$ti-icon-rectangle-filled: unicode('f69a');
+$ti-icon-rectangle-rounded-bottom: unicode('faed');
+$ti-icon-rectangle-rounded-top: unicode('faee');
+$ti-icon-rectangle-vertical: unicode('ed36');
+$ti-icon-rectangle-vertical-filled: unicode('f69b');
+$ti-icon-rectangular-prism: unicode('fab5');
+$ti-icon-rectangular-prism-off: unicode('fab3');
+$ti-icon-rectangular-prism-plus: unicode('fab4');
+$ti-icon-recycle: unicode('eb9b');
+$ti-icon-recycle-off: unicode('f18c');
+$ti-icon-refresh: unicode('eb13');
+$ti-icon-refresh-alert: unicode('ed57');
+$ti-icon-refresh-dot: unicode('efbf');
+$ti-icon-refresh-off: unicode('f18d');
+$ti-icon-regex: unicode('f31f');
+$ti-icon-regex-off: unicode('f421');
+$ti-icon-registered: unicode('eb14');
+$ti-icon-relation-many-to-many: unicode('ed7f');
+$ti-icon-relation-many-to-many-filled: unicode('fe0c');
+$ti-icon-relation-one-to-many: unicode('ed80');
+$ti-icon-relation-one-to-many-filled: unicode('fe0b');
+$ti-icon-relation-one-to-one: unicode('ed81');
+$ti-icon-relation-one-to-one-filled: unicode('fe0a');
+$ti-icon-reload: unicode('f3ae');
+$ti-icon-reorder: unicode('fc15');
+$ti-icon-repeat: unicode('eb72');
+$ti-icon-repeat-off: unicode('f18e');
+$ti-icon-repeat-once: unicode('eb71');
+$ti-icon-replace: unicode('ebc7');
+$ti-icon-replace-filled: unicode('f69c');
+$ti-icon-replace-off: unicode('f422');
+$ti-icon-report: unicode('eece');
+$ti-icon-report-analytics: unicode('eecb');
+$ti-icon-report-medical: unicode('eecc');
+$ti-icon-report-money: unicode('eecd');
+$ti-icon-report-off: unicode('f18f');
+$ti-icon-report-search: unicode('ef84');
+$ti-icon-reserved-line: unicode('f9f6');
+$ti-icon-resize: unicode('eecf');
+$ti-icon-restore: unicode('fafd');
+$ti-icon-rewind-backward-10: unicode('faba');
+$ti-icon-rewind-backward-15: unicode('fabb');
+$ti-icon-rewind-backward-20: unicode('fabc');
+$ti-icon-rewind-backward-30: unicode('fabd');
+$ti-icon-rewind-backward-40: unicode('fabe');
+$ti-icon-rewind-backward-5: unicode('fabf');
+$ti-icon-rewind-backward-50: unicode('fac0');
+$ti-icon-rewind-backward-60: unicode('fac1');
+$ti-icon-rewind-forward-10: unicode('fac2');
+$ti-icon-rewind-forward-15: unicode('fac3');
+$ti-icon-rewind-forward-20: unicode('fac4');
+$ti-icon-rewind-forward-30: unicode('fac5');
+$ti-icon-rewind-forward-40: unicode('fac6');
+$ti-icon-rewind-forward-5: unicode('fac7');
+$ti-icon-rewind-forward-50: unicode('fac8');
+$ti-icon-rewind-forward-60: unicode('fac9');
+$ti-icon-ribbon-health: unicode('f58e');
+$ti-icon-rings: unicode('fa6a');
+$ti-icon-ripple: unicode('ed82');
+$ti-icon-ripple-off: unicode('f190');
+$ti-icon-road: unicode('f018');
+$ti-icon-road-off: unicode('f191');
+$ti-icon-road-sign: unicode('ecdd');
+$ti-icon-robot: unicode('f00b');
+$ti-icon-robot-face: unicode('fcbe');
+$ti-icon-robot-off: unicode('f192');
+$ti-icon-rocket: unicode('ec45');
+$ti-icon-rocket-off: unicode('f193');
+$ti-icon-roller-skating: unicode('efd1');
+$ti-icon-rollercoaster: unicode('f0a2');
+$ti-icon-rollercoaster-off: unicode('f423');
+$ti-icon-rosette: unicode('f599');
+$ti-icon-rosette-discount: unicode('ee7c');
+$ti-icon-rosette-discount-check: unicode('f1f8');
+$ti-icon-rosette-discount-check-filled: unicode('f746');
+$ti-icon-rosette-discount-off: unicode('f3e6');
+$ti-icon-rosette-filled: unicode('f69d');
+$ti-icon-rosette-number-0: unicode('f58f');
+$ti-icon-rosette-number-1: unicode('f590');
+$ti-icon-rosette-number-2: unicode('f591');
+$ti-icon-rosette-number-3: unicode('f592');
+$ti-icon-rosette-number-4: unicode('f593');
+$ti-icon-rosette-number-5: unicode('f594');
+$ti-icon-rosette-number-6: unicode('f595');
+$ti-icon-rosette-number-7: unicode('f596');
+$ti-icon-rosette-number-8: unicode('f597');
+$ti-icon-rosette-number-9: unicode('f598');
+$ti-icon-rotate: unicode('eb16');
+$ti-icon-rotate-2: unicode('ebb4');
+$ti-icon-rotate-360: unicode('ef85');
+$ti-icon-rotate-3d: unicode('f020');
+$ti-icon-rotate-clockwise: unicode('eb15');
+$ti-icon-rotate-clockwise-2: unicode('ebb5');
+$ti-icon-rotate-dot: unicode('efe5');
+$ti-icon-rotate-rectangle: unicode('ec15');
+$ti-icon-route: unicode('eb17');
+$ti-icon-route-2: unicode('f4b6');
+$ti-icon-route-alt-left: unicode('fca9');
+$ti-icon-route-alt-right: unicode('fcaa');
+$ti-icon-route-off: unicode('f194');
+$ti-icon-route-scan: unicode('fcbf');
+$ti-icon-route-square: unicode('fcac');
+$ti-icon-route-square-2: unicode('fcab');
+$ti-icon-route-x: unicode('fcae');
+$ti-icon-route-x-2: unicode('fcad');
+$ti-icon-router: unicode('eb18');
+$ti-icon-router-off: unicode('f424');
+$ti-icon-row-insert-bottom: unicode('eed0');
+$ti-icon-row-insert-top: unicode('eed1');
+$ti-icon-row-remove: unicode('fafe');
+$ti-icon-rss: unicode('eb19');
+$ti-icon-rubber-stamp: unicode('f5ab');
+$ti-icon-rubber-stamp-off: unicode('f5aa');
+$ti-icon-ruler: unicode('eb1a');
+$ti-icon-ruler-2: unicode('eed2');
+$ti-icon-ruler-2-off: unicode('f195');
+$ti-icon-ruler-3: unicode('f290');
+$ti-icon-ruler-measure: unicode('f291');
+$ti-icon-ruler-off: unicode('f196');
+$ti-icon-run: unicode('ec82');
+$ti-icon-rv-truck: unicode('fcc0');
+$ti-icon-s-turn-down: unicode('f516');
+$ti-icon-s-turn-left: unicode('f517');
+$ti-icon-s-turn-right: unicode('f518');
+$ti-icon-s-turn-up: unicode('f519');
+$ti-icon-sailboat: unicode('ec83');
+$ti-icon-sailboat-2: unicode('f5f7');
+$ti-icon-sailboat-off: unicode('f425');
+$ti-icon-salad: unicode('f50a');
+$ti-icon-salt: unicode('ef16');
+$ti-icon-sandbox: unicode('fd6c');
+$ti-icon-satellite: unicode('eed3');
+$ti-icon-satellite-off: unicode('f197');
+$ti-icon-sausage: unicode('ef17');
+$ti-icon-scale: unicode('ebc2');
+$ti-icon-scale-off: unicode('f198');
+$ti-icon-scale-outline: unicode('ef53');
+$ti-icon-scale-outline-off: unicode('f199');
+$ti-icon-scan: unicode('ebc8');
+$ti-icon-scan-eye: unicode('f1ff');
+$ti-icon-scan-position: unicode('fdac');
+$ti-icon-schema: unicode('f200');
+$ti-icon-schema-off: unicode('f426');
+$ti-icon-school: unicode('ecf7');
+$ti-icon-school-bell: unicode('f64a');
+$ti-icon-school-off: unicode('f19a');
+$ti-icon-scissors: unicode('eb1b');
+$ti-icon-scissors-off: unicode('f19b');
+$ti-icon-scooter: unicode('ec6c');
+$ti-icon-scooter-electric: unicode('ecc1');
+$ti-icon-scoreboard: unicode('fa6b');
+$ti-icon-screen-share: unicode('ed18');
+$ti-icon-screen-share-off: unicode('ed17');
+$ti-icon-screenshot: unicode('f201');
+$ti-icon-scribble: unicode('f0a3');
+$ti-icon-scribble-off: unicode('f427');
+$ti-icon-script: unicode('f2da');
+$ti-icon-script-minus: unicode('f2d7');
+$ti-icon-script-plus: unicode('f2d8');
+$ti-icon-script-x: unicode('f2d9');
+$ti-icon-scuba-diving: unicode('fd4e');
+$ti-icon-scuba-mask: unicode('eed4');
+$ti-icon-scuba-mask-off: unicode('f428');
+$ti-icon-sdk: unicode('f3af');
+$ti-icon-search: unicode('eb1c');
+$ti-icon-search-off: unicode('f19c');
+$ti-icon-section: unicode('eed5');
+$ti-icon-section-filled: unicode('fe09');
+$ti-icon-section-sign: unicode('f019');
+$ti-icon-seeding: unicode('ed51');
+$ti-icon-seeding-off: unicode('f19d');
+$ti-icon-select: unicode('ec9e');
+$ti-icon-select-all: unicode('f9f7');
+$ti-icon-selector: unicode('eb1d');
+$ti-icon-send: unicode('eb1e');
+$ti-icon-send-2: unicode('fd5d');
+$ti-icon-send-off: unicode('f429');
+$ti-icon-seo: unicode('f26b');
+$ti-icon-separator: unicode('ebda');
+$ti-icon-separator-horizontal: unicode('ec79');
+$ti-icon-separator-vertical: unicode('ec7a');
+$ti-icon-server: unicode('eb1f');
+$ti-icon-server-2: unicode('f07c');
+$ti-icon-server-bolt: unicode('f320');
+$ti-icon-server-cog: unicode('f321');
+$ti-icon-server-off: unicode('f19e');
+$ti-icon-servicemark: unicode('ec09');
+$ti-icon-settings: unicode('eb20');
+$ti-icon-settings-2: unicode('f5ac');
+$ti-icon-settings-automation: unicode('eed6');
+$ti-icon-settings-bolt: unicode('f9ad');
+$ti-icon-settings-cancel: unicode('f9ae');
+$ti-icon-settings-check: unicode('f9af');
+$ti-icon-settings-code: unicode('f9b0');
+$ti-icon-settings-cog: unicode('f9b1');
+$ti-icon-settings-dollar: unicode('f9b2');
+$ti-icon-settings-down: unicode('f9b3');
+$ti-icon-settings-exclamation: unicode('f9b4');
+$ti-icon-settings-filled: unicode('f69e');
+$ti-icon-settings-heart: unicode('f9b5');
+$ti-icon-settings-minus: unicode('f9b6');
+$ti-icon-settings-off: unicode('f19f');
+$ti-icon-settings-pause: unicode('f9b7');
+$ti-icon-settings-pin: unicode('f9b8');
+$ti-icon-settings-plus: unicode('f9b9');
+$ti-icon-settings-question: unicode('f9ba');
+$ti-icon-settings-search: unicode('f9bb');
+$ti-icon-settings-share: unicode('f9bc');
+$ti-icon-settings-star: unicode('f9bd');
+$ti-icon-settings-up: unicode('f9be');
+$ti-icon-settings-x: unicode('f9bf');
+$ti-icon-shadow: unicode('eed8');
+$ti-icon-shadow-off: unicode('eed7');
+$ti-icon-shape: unicode('eb9c');
+$ti-icon-shape-2: unicode('eed9');
+$ti-icon-shape-3: unicode('eeda');
+$ti-icon-shape-off: unicode('f1a0');
+$ti-icon-share: unicode('eb21');
+$ti-icon-share-2: unicode('f799');
+$ti-icon-share-3: unicode('f7bd');
+$ti-icon-share-off: unicode('f1a1');
+$ti-icon-shareplay: unicode('fea5');
+$ti-icon-shield: unicode('eb24');
+$ti-icon-shield-bolt: unicode('f9c0');
+$ti-icon-shield-cancel: unicode('f9c1');
+$ti-icon-shield-check: unicode('eb22');
+$ti-icon-shield-check-filled: unicode('f761');
+$ti-icon-shield-checkered: unicode('ef9a');
+$ti-icon-shield-checkered-filled: unicode('f762');
+$ti-icon-shield-chevron: unicode('ef9b');
+$ti-icon-shield-code: unicode('f9c2');
+$ti-icon-shield-cog: unicode('f9c3');
+$ti-icon-shield-dollar: unicode('f9c4');
+$ti-icon-shield-down: unicode('f9c5');
+$ti-icon-shield-exclamation: unicode('f9c6');
+$ti-icon-shield-filled: unicode('f69f');
+$ti-icon-shield-half: unicode('f358');
+$ti-icon-shield-half-filled: unicode('f357');
+$ti-icon-shield-heart: unicode('f9c7');
+$ti-icon-shield-lock: unicode('ed58');
+$ti-icon-shield-lock-filled: unicode('f763');
+$ti-icon-shield-minus: unicode('f9c8');
+$ti-icon-shield-off: unicode('ecf8');
+$ti-icon-shield-pause: unicode('f9c9');
+$ti-icon-shield-pin: unicode('f9ca');
+$ti-icon-shield-plus: unicode('f9cb');
+$ti-icon-shield-question: unicode('f9cc');
+$ti-icon-shield-search: unicode('f9cd');
+$ti-icon-shield-share: unicode('f9ce');
+$ti-icon-shield-star: unicode('f9cf');
+$ti-icon-shield-up: unicode('f9d0');
+$ti-icon-shield-x: unicode('eb23');
+$ti-icon-ship: unicode('ec84');
+$ti-icon-ship-off: unicode('f42a');
+$ti-icon-shirt: unicode('ec0a');
+$ti-icon-shirt-filled: unicode('f6a0');
+$ti-icon-shirt-off: unicode('f1a2');
+$ti-icon-shirt-sport: unicode('f26c');
+$ti-icon-shoe: unicode('efd2');
+$ti-icon-shoe-off: unicode('f1a4');
+$ti-icon-shopping-bag: unicode('f5f8');
+$ti-icon-shopping-bag-check: unicode('fc16');
+$ti-icon-shopping-bag-discount: unicode('fc17');
+$ti-icon-shopping-bag-edit: unicode('fc18');
+$ti-icon-shopping-bag-exclamation: unicode('fc19');
+$ti-icon-shopping-bag-heart: unicode('fda2');
+$ti-icon-shopping-bag-minus: unicode('fc1a');
+$ti-icon-shopping-bag-plus: unicode('fc1b');
+$ti-icon-shopping-bag-search: unicode('fc1c');
+$ti-icon-shopping-bag-x: unicode('fc1d');
+$ti-icon-shopping-cart: unicode('eb25');
+$ti-icon-shopping-cart-bolt: unicode('fb57');
+$ti-icon-shopping-cart-cancel: unicode('fb58');
+$ti-icon-shopping-cart-check: unicode('fb59');
+$ti-icon-shopping-cart-code: unicode('fb5a');
+$ti-icon-shopping-cart-cog: unicode('fb5b');
+$ti-icon-shopping-cart-copy: unicode('fb5c');
+$ti-icon-shopping-cart-discount: unicode('fb5d');
+$ti-icon-shopping-cart-dollar: unicode('fb5e');
+$ti-icon-shopping-cart-down: unicode('fb5f');
+$ti-icon-shopping-cart-exclamation: unicode('fb60');
+$ti-icon-shopping-cart-filled: unicode('fc3f');
+$ti-icon-shopping-cart-heart: unicode('fb61');
+$ti-icon-shopping-cart-minus: unicode('fb62');
+$ti-icon-shopping-cart-off: unicode('eedc');
+$ti-icon-shopping-cart-pause: unicode('fb63');
+$ti-icon-shopping-cart-pin: unicode('fb64');
+$ti-icon-shopping-cart-plus: unicode('fb65');
+$ti-icon-shopping-cart-question: unicode('fb66');
+$ti-icon-shopping-cart-search: unicode('fb67');
+$ti-icon-shopping-cart-share: unicode('fb68');
+$ti-icon-shopping-cart-star: unicode('fb69');
+$ti-icon-shopping-cart-up: unicode('fb6a');
+$ti-icon-shopping-cart-x: unicode('fb6b');
+$ti-icon-shovel: unicode('f1d9');
+$ti-icon-shovel-pitchforks: unicode('fd3a');
+$ti-icon-shredder: unicode('eedf');
+$ti-icon-sign-left: unicode('f06b');
+$ti-icon-sign-left-filled: unicode('f6a1');
+$ti-icon-sign-right: unicode('f06c');
+$ti-icon-sign-right-filled: unicode('f6a2');
+$ti-icon-signal-2g: unicode('f79a');
+$ti-icon-signal-3g: unicode('f1ee');
+$ti-icon-signal-4g: unicode('f1ef');
+$ti-icon-signal-4g-plus: unicode('f259');
+$ti-icon-signal-5g: unicode('f1f0');
+$ti-icon-signal-6g: unicode('f9f8');
+$ti-icon-signal-e: unicode('f9f9');
+$ti-icon-signal-g: unicode('f9fa');
+$ti-icon-signal-h: unicode('f9fc');
+$ti-icon-signal-h-plus: unicode('f9fb');
+$ti-icon-signal-lte: unicode('f9fd');
+$ti-icon-signature: unicode('eee0');
+$ti-icon-signature-off: unicode('f1a5');
+$ti-icon-sitemap: unicode('eb9d');
+$ti-icon-sitemap-off: unicode('f1a6');
+$ti-icon-skateboard: unicode('ecc2');
+$ti-icon-skateboard-off: unicode('f42b');
+$ti-icon-skateboarding: unicode('faca');
+$ti-icon-skew-x: unicode('fd3b');
+$ti-icon-skew-y: unicode('fd3c');
+$ti-icon-ski-jumping: unicode('fa6c');
+$ti-icon-skull: unicode('f292');
+$ti-icon-slash: unicode('f4f9');
+$ti-icon-slashes: unicode('f588');
+$ti-icon-sleigh: unicode('ef9c');
+$ti-icon-slice: unicode('ebdb');
+$ti-icon-slideshow: unicode('ebc9');
+$ti-icon-smart-home: unicode('ecde');
+$ti-icon-smart-home-off: unicode('f1a7');
+$ti-icon-smoking: unicode('ecc4');
+$ti-icon-smoking-no: unicode('ecc3');
+$ti-icon-snowboarding: unicode('fd4f');
+$ti-icon-snowflake: unicode('ec0b');
+$ti-icon-snowflake-off: unicode('f1a8');
+$ti-icon-snowman: unicode('f26d');
+$ti-icon-soccer-field: unicode('ed92');
+$ti-icon-social: unicode('ebec');
+$ti-icon-social-off: unicode('f1a9');
+$ti-icon-sock: unicode('eee1');
+$ti-icon-sofa: unicode('efaf');
+$ti-icon-sofa-off: unicode('f42c');
+$ti-icon-solar-electricity: unicode('fcc1');
+$ti-icon-solar-panel: unicode('f7bf');
+$ti-icon-solar-panel-2: unicode('f7be');
+$ti-icon-sort-0-9: unicode('f54d');
+$ti-icon-sort-9-0: unicode('f54e');
+$ti-icon-sort-a-z: unicode('f54f');
+$ti-icon-sort-ascending: unicode('eb26');
+$ti-icon-sort-ascending-2: unicode('eee2');
+$ti-icon-sort-ascending-letters: unicode('ef18');
+$ti-icon-sort-ascending-numbers: unicode('ef19');
+$ti-icon-sort-ascending-shapes: unicode('fd94');
+$ti-icon-sort-ascending-small-big: unicode('fd95');
+$ti-icon-sort-descending: unicode('eb27');
+$ti-icon-sort-descending-2: unicode('eee3');
+$ti-icon-sort-descending-letters: unicode('ef1a');
+$ti-icon-sort-descending-numbers: unicode('ef1b');
+$ti-icon-sort-descending-shapes: unicode('fd97');
+$ti-icon-sort-descending-small-big: unicode('fd96');
+$ti-icon-sort-z-a: unicode('f550');
+$ti-icon-sos: unicode('f24a');
+$ti-icon-soup: unicode('ef2e');
+$ti-icon-soup-filled: unicode('fe08');
+$ti-icon-soup-off: unicode('f42d');
+$ti-icon-source-code: unicode('f4a2');
+$ti-icon-space: unicode('ec0c');
+$ti-icon-space-off: unicode('f1aa');
+$ti-icon-spaces: unicode('fea4');
+$ti-icon-spacing-horizontal: unicode('ef54');
+$ti-icon-spacing-vertical: unicode('ef55');
+$ti-icon-spade: unicode('effa');
+$ti-icon-spade-filled: unicode('f6a3');
+$ti-icon-sparkles: unicode('f6d7');
+$ti-icon-speakerphone: unicode('ed61');
+$ti-icon-speedboat: unicode('ed93');
+$ti-icon-sphere: unicode('fab8');
+$ti-icon-sphere-off: unicode('fab6');
+$ti-icon-sphere-plus: unicode('fab7');
+$ti-icon-spider: unicode('f293');
+$ti-icon-spiral: unicode('f294');
+$ti-icon-spiral-off: unicode('f42e');
+$ti-icon-sport-billard: unicode('eee4');
+$ti-icon-spray: unicode('f50b');
+$ti-icon-spy: unicode('f227');
+$ti-icon-spy-off: unicode('f42f');
+$ti-icon-sql: unicode('f7c0');
+$ti-icon-square: unicode('eb2c');
+$ti-icon-square-arrow-down: unicode('f4b7');
+$ti-icon-square-arrow-down-filled: unicode('fb31');
+$ti-icon-square-arrow-left: unicode('f4b8');
+$ti-icon-square-arrow-left-filled: unicode('fb32');
+$ti-icon-square-arrow-right: unicode('f4b9');
+$ti-icon-square-arrow-right-filled: unicode('fb33');
+$ti-icon-square-arrow-up: unicode('f4ba');
+$ti-icon-square-arrow-up-filled: unicode('fb34');
+$ti-icon-square-asterisk: unicode('f01a');
+$ti-icon-square-asterisk-filled: unicode('fb35');
+$ti-icon-square-check: unicode('eb28');
+$ti-icon-square-check-filled: unicode('f76d');
+$ti-icon-square-chevron-down: unicode('f627');
+$ti-icon-square-chevron-down-filled: unicode('fb36');
+$ti-icon-square-chevron-left: unicode('f628');
+$ti-icon-square-chevron-left-filled: unicode('fb37');
+$ti-icon-square-chevron-right: unicode('f629');
+$ti-icon-square-chevron-right-filled: unicode('fb38');
+$ti-icon-square-chevron-up: unicode('f62a');
+$ti-icon-square-chevron-up-filled: unicode('fb39');
+$ti-icon-square-chevrons-down: unicode('f64b');
+$ti-icon-square-chevrons-down-filled: unicode('fb3a');
+$ti-icon-square-chevrons-left: unicode('f64c');
+$ti-icon-square-chevrons-left-filled: unicode('fb3b');
+$ti-icon-square-chevrons-right: unicode('f64d');
+$ti-icon-square-chevrons-right-filled: unicode('fb3c');
+$ti-icon-square-chevrons-up: unicode('f64e');
+$ti-icon-square-chevrons-up-filled: unicode('fb3d');
+$ti-icon-square-dot: unicode('ed59');
+$ti-icon-square-dot-filled: unicode('fb3e');
+$ti-icon-square-f0: unicode('f526');
+$ti-icon-square-f0-filled: unicode('f76e');
+$ti-icon-square-f1: unicode('f527');
+$ti-icon-square-f1-filled: unicode('f76f');
+$ti-icon-square-f2: unicode('f528');
+$ti-icon-square-f2-filled: unicode('f770');
+$ti-icon-square-f3: unicode('f529');
+$ti-icon-square-f3-filled: unicode('f771');
+$ti-icon-square-f4: unicode('f52a');
+$ti-icon-square-f4-filled: unicode('f772');
+$ti-icon-square-f5: unicode('f52b');
+$ti-icon-square-f5-filled: unicode('f773');
+$ti-icon-square-f6: unicode('f52c');
+$ti-icon-square-f6-filled: unicode('f774');
+$ti-icon-square-f7: unicode('f52d');
+$ti-icon-square-f7-filled: unicode('f775');
+$ti-icon-square-f8: unicode('f52e');
+$ti-icon-square-f8-filled: unicode('f776');
+$ti-icon-square-f9: unicode('f52f');
+$ti-icon-square-f9-filled: unicode('f777');
+$ti-icon-square-filled: unicode('fc40');
+$ti-icon-square-forbid: unicode('ed5b');
+$ti-icon-square-forbid-2: unicode('ed5a');
+$ti-icon-square-half: unicode('effb');
+$ti-icon-square-key: unicode('f638');
+$ti-icon-square-letter-a: unicode('f47c');
+$ti-icon-square-letter-a-filled: unicode('fe07');
+$ti-icon-square-letter-b: unicode('f47d');
+$ti-icon-square-letter-b-filled: unicode('fe06');
+$ti-icon-square-letter-c: unicode('f47e');
+$ti-icon-square-letter-c-filled: unicode('fe05');
+$ti-icon-square-letter-d: unicode('f47f');
+$ti-icon-square-letter-d-filled: unicode('fe04');
+$ti-icon-square-letter-e: unicode('f480');
+$ti-icon-square-letter-e-filled: unicode('fe03');
+$ti-icon-square-letter-f: unicode('f481');
+$ti-icon-square-letter-f-filled: unicode('fe02');
+$ti-icon-square-letter-g: unicode('f482');
+$ti-icon-square-letter-g-filled: unicode('fe01');
+$ti-icon-square-letter-h: unicode('f483');
+$ti-icon-square-letter-h-filled: unicode('fe00');
+$ti-icon-square-letter-i: unicode('f484');
+$ti-icon-square-letter-i-filled: unicode('fdff');
+$ti-icon-square-letter-j: unicode('f485');
+$ti-icon-square-letter-j-filled: unicode('fdfe');
+$ti-icon-square-letter-k: unicode('f486');
+$ti-icon-square-letter-k-filled: unicode('fdfd');
+$ti-icon-square-letter-l: unicode('f487');
+$ti-icon-square-letter-l-filled: unicode('fdfc');
+$ti-icon-square-letter-m: unicode('f488');
+$ti-icon-square-letter-m-filled: unicode('fdfb');
+$ti-icon-square-letter-n: unicode('f489');
+$ti-icon-square-letter-n-filled: unicode('fdfa');
+$ti-icon-square-letter-o: unicode('f48a');
+$ti-icon-square-letter-o-filled: unicode('fdf9');
+$ti-icon-square-letter-p: unicode('f48b');
+$ti-icon-square-letter-p-filled: unicode('fdf8');
+$ti-icon-square-letter-q: unicode('f48c');
+$ti-icon-square-letter-q-filled: unicode('fdf7');
+$ti-icon-square-letter-r: unicode('f48d');
+$ti-icon-square-letter-r-filled: unicode('fdf6');
+$ti-icon-square-letter-s: unicode('f48e');
+$ti-icon-square-letter-s-filled: unicode('fdf5');
+$ti-icon-square-letter-t: unicode('f48f');
+$ti-icon-square-letter-t-filled: unicode('fdf4');
+$ti-icon-square-letter-u: unicode('f490');
+$ti-icon-square-letter-u-filled: unicode('fdf3');
+$ti-icon-square-letter-v: unicode('f4bb');
+$ti-icon-square-letter-v-filled: unicode('fdf2');
+$ti-icon-square-letter-w: unicode('f491');
+$ti-icon-square-letter-w-filled: unicode('fdf1');
+$ti-icon-square-letter-x: unicode('f4bc');
+$ti-icon-square-letter-x-filled: unicode('fdf0');
+$ti-icon-square-letter-y: unicode('f492');
+$ti-icon-square-letter-y-filled: unicode('fdef');
+$ti-icon-square-letter-z: unicode('f493');
+$ti-icon-square-letter-z-filled: unicode('fdee');
+$ti-icon-square-minus: unicode('eb29');
+$ti-icon-square-minus-filled: unicode('fb3f');
+$ti-icon-square-number-0: unicode('eee5');
+$ti-icon-square-number-0-filled: unicode('f764');
+$ti-icon-square-number-1: unicode('eee6');
+$ti-icon-square-number-1-filled: unicode('f765');
+$ti-icon-square-number-2: unicode('eee7');
+$ti-icon-square-number-2-filled: unicode('f7fa');
+$ti-icon-square-number-3: unicode('eee8');
+$ti-icon-square-number-3-filled: unicode('f766');
+$ti-icon-square-number-4: unicode('eee9');
+$ti-icon-square-number-4-filled: unicode('f767');
+$ti-icon-square-number-5: unicode('eeea');
+$ti-icon-square-number-5-filled: unicode('f768');
+$ti-icon-square-number-6: unicode('eeeb');
+$ti-icon-square-number-6-filled: unicode('f769');
+$ti-icon-square-number-7: unicode('eeec');
+$ti-icon-square-number-7-filled: unicode('f76a');
+$ti-icon-square-number-8: unicode('eeed');
+$ti-icon-square-number-8-filled: unicode('f76b');
+$ti-icon-square-number-9: unicode('eeee');
+$ti-icon-square-number-9-filled: unicode('f76c');
+$ti-icon-square-off: unicode('eeef');
+$ti-icon-square-percentage: unicode('fd83');
+$ti-icon-square-plus: unicode('eb2a');
+$ti-icon-square-plus-2: unicode('fc96');
+$ti-icon-square-root: unicode('eef1');
+$ti-icon-square-root-2: unicode('eef0');
+$ti-icon-square-rotated: unicode('ecdf');
+$ti-icon-square-rotated-filled: unicode('f6a4');
+$ti-icon-square-rotated-forbid: unicode('f01c');
+$ti-icon-square-rotated-forbid-2: unicode('f01b');
+$ti-icon-square-rotated-off: unicode('eef2');
+$ti-icon-square-rounded: unicode('f59a');
+$ti-icon-square-rounded-arrow-down: unicode('f639');
+$ti-icon-square-rounded-arrow-down-filled: unicode('f6db');
+$ti-icon-square-rounded-arrow-left: unicode('f63a');
+$ti-icon-square-rounded-arrow-left-filled: unicode('f6dc');
+$ti-icon-square-rounded-arrow-right: unicode('f63b');
+$ti-icon-square-rounded-arrow-right-filled: unicode('f6dd');
+$ti-icon-square-rounded-arrow-up: unicode('f63c');
+$ti-icon-square-rounded-arrow-up-filled: unicode('f6de');
+$ti-icon-square-rounded-check: unicode('f63d');
+$ti-icon-square-rounded-check-filled: unicode('f6df');
+$ti-icon-square-rounded-chevron-down: unicode('f62b');
+$ti-icon-square-rounded-chevron-down-filled: unicode('f6e0');
+$ti-icon-square-rounded-chevron-left: unicode('f62c');
+$ti-icon-square-rounded-chevron-left-filled: unicode('f6e1');
+$ti-icon-square-rounded-chevron-right: unicode('f62d');
+$ti-icon-square-rounded-chevron-right-filled: unicode('f6e2');
+$ti-icon-square-rounded-chevron-up: unicode('f62e');
+$ti-icon-square-rounded-chevron-up-filled: unicode('f6e3');
+$ti-icon-square-rounded-chevrons-down: unicode('f64f');
+$ti-icon-square-rounded-chevrons-down-filled: unicode('f6e4');
+$ti-icon-square-rounded-chevrons-left: unicode('f650');
+$ti-icon-square-rounded-chevrons-left-filled: unicode('f6e5');
+$ti-icon-square-rounded-chevrons-right: unicode('f651');
+$ti-icon-square-rounded-chevrons-right-filled: unicode('f6e6');
+$ti-icon-square-rounded-chevrons-up: unicode('f652');
+$ti-icon-square-rounded-chevrons-up-filled: unicode('f6e7');
+$ti-icon-square-rounded-filled: unicode('f6a5');
+$ti-icon-square-rounded-letter-a: unicode('f5ae');
+$ti-icon-square-rounded-letter-a-filled: unicode('fded');
+$ti-icon-square-rounded-letter-b: unicode('f5af');
+$ti-icon-square-rounded-letter-b-filled: unicode('fdec');
+$ti-icon-square-rounded-letter-c: unicode('f5b0');
+$ti-icon-square-rounded-letter-c-filled: unicode('fdeb');
+$ti-icon-square-rounded-letter-d: unicode('f5b1');
+$ti-icon-square-rounded-letter-d-filled: unicode('fdea');
+$ti-icon-square-rounded-letter-e: unicode('f5b2');
+$ti-icon-square-rounded-letter-e-filled: unicode('fde9');
+$ti-icon-square-rounded-letter-f: unicode('f5b3');
+$ti-icon-square-rounded-letter-f-filled: unicode('fde8');
+$ti-icon-square-rounded-letter-g: unicode('f5b4');
+$ti-icon-square-rounded-letter-g-filled: unicode('fde7');
+$ti-icon-square-rounded-letter-h: unicode('f5b5');
+$ti-icon-square-rounded-letter-h-filled: unicode('fde6');
+$ti-icon-square-rounded-letter-i: unicode('f5b6');
+$ti-icon-square-rounded-letter-i-filled: unicode('fde5');
+$ti-icon-square-rounded-letter-j: unicode('f5b7');
+$ti-icon-square-rounded-letter-j-filled: unicode('fde4');
+$ti-icon-square-rounded-letter-k: unicode('f5b8');
+$ti-icon-square-rounded-letter-k-filled: unicode('fde3');
+$ti-icon-square-rounded-letter-l: unicode('f5b9');
+$ti-icon-square-rounded-letter-l-filled: unicode('fde2');
+$ti-icon-square-rounded-letter-m: unicode('f5ba');
+$ti-icon-square-rounded-letter-m-filled: unicode('fde1');
+$ti-icon-square-rounded-letter-n: unicode('f5bb');
+$ti-icon-square-rounded-letter-n-filled: unicode('fde0');
+$ti-icon-square-rounded-letter-o: unicode('f5bc');
+$ti-icon-square-rounded-letter-o-filled: unicode('fddf');
+$ti-icon-square-rounded-letter-p: unicode('f5bd');
+$ti-icon-square-rounded-letter-p-filled: unicode('fdde');
+$ti-icon-square-rounded-letter-q: unicode('f5be');
+$ti-icon-square-rounded-letter-q-filled: unicode('fddd');
+$ti-icon-square-rounded-letter-r: unicode('f5bf');
+$ti-icon-square-rounded-letter-r-filled: unicode('fddc');
+$ti-icon-square-rounded-letter-s: unicode('f5c0');
+$ti-icon-square-rounded-letter-s-filled: unicode('fddb');
+$ti-icon-square-rounded-letter-t: unicode('f5c1');
+$ti-icon-square-rounded-letter-t-filled: unicode('fdda');
+$ti-icon-square-rounded-letter-u: unicode('f5c2');
+$ti-icon-square-rounded-letter-u-filled: unicode('fdd9');
+$ti-icon-square-rounded-letter-v: unicode('f5c3');
+$ti-icon-square-rounded-letter-v-filled: unicode('fdd8');
+$ti-icon-square-rounded-letter-w: unicode('f5c4');
+$ti-icon-square-rounded-letter-w-filled: unicode('fdd7');
+$ti-icon-square-rounded-letter-x: unicode('f5c5');
+$ti-icon-square-rounded-letter-x-filled: unicode('fdd6');
+$ti-icon-square-rounded-letter-y: unicode('f5c6');
+$ti-icon-square-rounded-letter-y-filled: unicode('fdd5');
+$ti-icon-square-rounded-letter-z: unicode('f5c7');
+$ti-icon-square-rounded-letter-z-filled: unicode('fdd4');
+$ti-icon-square-rounded-minus: unicode('f63e');
+$ti-icon-square-rounded-minus-2: unicode('fc97');
+$ti-icon-square-rounded-minus-filled: unicode('fb40');
+$ti-icon-square-rounded-number-0: unicode('f5c8');
+$ti-icon-square-rounded-number-0-filled: unicode('f778');
+$ti-icon-square-rounded-number-1: unicode('f5c9');
+$ti-icon-square-rounded-number-1-filled: unicode('f779');
+$ti-icon-square-rounded-number-2: unicode('f5ca');
+$ti-icon-square-rounded-number-2-filled: unicode('f77a');
+$ti-icon-square-rounded-number-3: unicode('f5cb');
+$ti-icon-square-rounded-number-3-filled: unicode('f77b');
+$ti-icon-square-rounded-number-4: unicode('f5cc');
+$ti-icon-square-rounded-number-4-filled: unicode('f77c');
+$ti-icon-square-rounded-number-5: unicode('f5cd');
+$ti-icon-square-rounded-number-5-filled: unicode('f77d');
+$ti-icon-square-rounded-number-6: unicode('f5ce');
+$ti-icon-square-rounded-number-6-filled: unicode('f77e');
+$ti-icon-square-rounded-number-7: unicode('f5cf');
+$ti-icon-square-rounded-number-7-filled: unicode('f77f');
+$ti-icon-square-rounded-number-8: unicode('f5d0');
+$ti-icon-square-rounded-number-8-filled: unicode('f780');
+$ti-icon-square-rounded-number-9: unicode('f5d1');
+$ti-icon-square-rounded-number-9-filled: unicode('f781');
+$ti-icon-square-rounded-percentage: unicode('fd84');
+$ti-icon-square-rounded-plus: unicode('f63f');
+$ti-icon-square-rounded-plus-2: unicode('fc98');
+$ti-icon-square-rounded-plus-filled: unicode('f6e8');
+$ti-icon-square-rounded-x: unicode('f640');
+$ti-icon-square-rounded-x-filled: unicode('f6e9');
+$ti-icon-square-toggle: unicode('eef4');
+$ti-icon-square-toggle-horizontal: unicode('eef3');
+$ti-icon-square-x: unicode('eb2b');
+$ti-icon-square-x-filled: unicode('fb41');
+$ti-icon-squares: unicode('eef6');
+$ti-icon-squares-diagonal: unicode('eef5');
+$ti-icon-squares-filled: unicode('fe9f');
+$ti-icon-squares-selected: unicode('fea3');
+$ti-icon-stack: unicode('eb2d');
+$ti-icon-stack-2: unicode('eef7');
+$ti-icon-stack-2-filled: unicode('fdd3');
+$ti-icon-stack-3: unicode('ef9d');
+$ti-icon-stack-3-filled: unicode('fdd2');
+$ti-icon-stack-back: unicode('fd26');
+$ti-icon-stack-backward: unicode('fd27');
+$ti-icon-stack-filled: unicode('fdd1');
+$ti-icon-stack-forward: unicode('fd28');
+$ti-icon-stack-front: unicode('fd29');
+$ti-icon-stack-middle: unicode('fd2a');
+$ti-icon-stack-pop: unicode('f234');
+$ti-icon-stack-push: unicode('f235');
+$ti-icon-stairs: unicode('eca6');
+$ti-icon-stairs-down: unicode('eca4');
+$ti-icon-stairs-up: unicode('eca5');
+$ti-icon-star: unicode('eb2e');
+$ti-icon-star-filled: unicode('f6a6');
+$ti-icon-star-half: unicode('ed19');
+$ti-icon-star-half-filled: unicode('f6a7');
+$ti-icon-star-off: unicode('ed62');
+$ti-icon-stars: unicode('ed38');
+$ti-icon-stars-filled: unicode('f6a8');
+$ti-icon-stars-off: unicode('f430');
+$ti-icon-status-change: unicode('f3b0');
+$ti-icon-steam: unicode('f24b');
+$ti-icon-steering-wheel: unicode('ec7b');
+$ti-icon-steering-wheel-off: unicode('f431');
+$ti-icon-step-into: unicode('ece0');
+$ti-icon-step-out: unicode('ece1');
+$ti-icon-stereo-glasses: unicode('f4cb');
+$ti-icon-stethoscope: unicode('edbe');
+$ti-icon-stethoscope-off: unicode('f432');
+$ti-icon-sticker: unicode('eb2f');
+$ti-icon-sticker-2: unicode('fd3d');
+$ti-icon-storm: unicode('f24c');
+$ti-icon-storm-off: unicode('f433');
+$ti-icon-stretching: unicode('f2db');
+$ti-icon-stretching-2: unicode('fa6d');
+$ti-icon-strikethrough: unicode('eb9e');
+$ti-icon-submarine: unicode('ed94');
+$ti-icon-subscript: unicode('eb9f');
+$ti-icon-subtask: unicode('ec9f');
+$ti-icon-sum: unicode('eb73');
+$ti-icon-sum-off: unicode('f1ab');
+$ti-icon-sun: unicode('eb30');
+$ti-icon-sun-electricity: unicode('fcc2');
+$ti-icon-sun-filled: unicode('f6a9');
+$ti-icon-sun-high: unicode('f236');
+$ti-icon-sun-low: unicode('f237');
+$ti-icon-sun-moon: unicode('f4a3');
+$ti-icon-sun-off: unicode('ed63');
+$ti-icon-sun-wind: unicode('f238');
+$ti-icon-sunglasses: unicode('f239');
+$ti-icon-sunglasses-filled: unicode('fec8');
+$ti-icon-sunrise: unicode('ef1c');
+$ti-icon-sunset: unicode('ec31');
+$ti-icon-sunset-2: unicode('f23a');
+$ti-icon-superscript: unicode('eba0');
+$ti-icon-svg: unicode('f25a');
+$ti-icon-swimming: unicode('ec92');
+$ti-icon-swipe: unicode('f551');
+$ti-icon-swipe-down: unicode('fd5e');
+$ti-icon-swipe-left: unicode('fd5f');
+$ti-icon-swipe-right: unicode('fd60');
+$ti-icon-swipe-up: unicode('fd61');
+$ti-icon-switch: unicode('eb33');
+$ti-icon-switch-2: unicode('edbf');
+$ti-icon-switch-3: unicode('edc0');
+$ti-icon-switch-horizontal: unicode('eb31');
+$ti-icon-switch-vertical: unicode('eb32');
+$ti-icon-sword: unicode('f030');
+$ti-icon-sword-off: unicode('f434');
+$ti-icon-swords: unicode('f132');
+$ti-icon-table: unicode('eba1');
+$ti-icon-table-alias: unicode('f25b');
+$ti-icon-table-column: unicode('faff');
+$ti-icon-table-down: unicode('fa1c');
+$ti-icon-table-export: unicode('eef8');
+$ti-icon-table-filled: unicode('f782');
+$ti-icon-table-heart: unicode('fa1d');
+$ti-icon-table-import: unicode('eef9');
+$ti-icon-table-minus: unicode('fa1e');
+$ti-icon-table-off: unicode('eefa');
+$ti-icon-table-options: unicode('f25c');
+$ti-icon-table-plus: unicode('fa1f');
+$ti-icon-table-row: unicode('fb00');
+$ti-icon-table-share: unicode('fa20');
+$ti-icon-table-shortcut: unicode('f25d');
+$ti-icon-tag: unicode('eb34');
+$ti-icon-tag-off: unicode('efc0');
+$ti-icon-tag-starred: unicode('fc99');
+$ti-icon-tags: unicode('ef86');
+$ti-icon-tags-off: unicode('efc1');
+$ti-icon-tallymark-1: unicode('ec46');
+$ti-icon-tallymark-2: unicode('ec47');
+$ti-icon-tallymark-3: unicode('ec48');
+$ti-icon-tallymark-4: unicode('ec49');
+$ti-icon-tallymarks: unicode('ec4a');
+$ti-icon-tank: unicode('ed95');
+$ti-icon-target: unicode('eb35');
+$ti-icon-target-arrow: unicode('f51a');
+$ti-icon-target-off: unicode('f1ad');
+$ti-icon-teapot: unicode('f552');
+$ti-icon-telescope: unicode('f07d');
+$ti-icon-telescope-off: unicode('f1ae');
+$ti-icon-temperature: unicode('eb38');
+$ti-icon-temperature-celsius: unicode('eb36');
+$ti-icon-temperature-fahrenheit: unicode('eb37');
+$ti-icon-temperature-minus: unicode('ebed');
+$ti-icon-temperature-off: unicode('f1af');
+$ti-icon-temperature-plus: unicode('ebee');
+$ti-icon-temperature-snow: unicode('fda3');
+$ti-icon-temperature-sun: unicode('fda4');
+$ti-icon-template: unicode('eb39');
+$ti-icon-template-off: unicode('f1b0');
+$ti-icon-tent: unicode('eefb');
+$ti-icon-tent-off: unicode('f435');
+$ti-icon-terminal: unicode('ebdc');
+$ti-icon-terminal-2: unicode('ebef');
+$ti-icon-test-pipe: unicode('eb3a');
+$ti-icon-test-pipe-2: unicode('f0a4');
+$ti-icon-test-pipe-off: unicode('f1b1');
+$ti-icon-tex: unicode('f4e0');
+$ti-icon-text-caption: unicode('f4a4');
+$ti-icon-text-color: unicode('f2dc');
+$ti-icon-text-decrease: unicode('f202');
+$ti-icon-text-direction-ltr: unicode('eefc');
+$ti-icon-text-direction-rtl: unicode('eefd');
+$ti-icon-text-grammar: unicode('fd6d');
+$ti-icon-text-increase: unicode('f203');
+$ti-icon-text-orientation: unicode('f2a4');
+$ti-icon-text-plus: unicode('f2a5');
+$ti-icon-text-recognition: unicode('f204');
+$ti-icon-text-resize: unicode('ef87');
+$ti-icon-text-scan-2: unicode('fcc3');
+$ti-icon-text-size: unicode('f2b1');
+$ti-icon-text-spellcheck: unicode('f2a6');
+$ti-icon-text-wrap: unicode('ebdd');
+$ti-icon-text-wrap-column: unicode('feb2');
+$ti-icon-text-wrap-disabled: unicode('eca7');
+$ti-icon-texture: unicode('f51b');
+$ti-icon-theater: unicode('f79b');
+$ti-icon-thermometer: unicode('ef67');
+$ti-icon-thumb-down: unicode('eb3b');
+$ti-icon-thumb-down-filled: unicode('f6aa');
+$ti-icon-thumb-down-off: unicode('f436');
+$ti-icon-thumb-up: unicode('eb3c');
+$ti-icon-thumb-up-filled: unicode('f6ab');
+$ti-icon-thumb-up-off: unicode('f437');
+$ti-icon-tic-tac: unicode('f51c');
+$ti-icon-ticket: unicode('eb3d');
+$ti-icon-ticket-off: unicode('f1b2');
+$ti-icon-tie: unicode('f07e');
+$ti-icon-tilde: unicode('f4a5');
+$ti-icon-tilt-shift: unicode('eefe');
+$ti-icon-tilt-shift-filled: unicode('fec7');
+$ti-icon-tilt-shift-off: unicode('f1b3');
+$ti-icon-time-duration-0: unicode('fad4');
+$ti-icon-time-duration-10: unicode('fad5');
+$ti-icon-time-duration-15: unicode('fad6');
+$ti-icon-time-duration-30: unicode('fad7');
+$ti-icon-time-duration-45: unicode('fad8');
+$ti-icon-time-duration-5: unicode('fad9');
+$ti-icon-time-duration-60: unicode('fada');
+$ti-icon-time-duration-90: unicode('fadb');
+$ti-icon-time-duration-off: unicode('fadc');
+$ti-icon-timeline: unicode('f031');
+$ti-icon-timeline-event: unicode('f553');
+$ti-icon-timeline-event-exclamation: unicode('f662');
+$ti-icon-timeline-event-filled: unicode('fd18');
+$ti-icon-timeline-event-minus: unicode('f663');
+$ti-icon-timeline-event-plus: unicode('f664');
+$ti-icon-timeline-event-text: unicode('f665');
+$ti-icon-timeline-event-x: unicode('f666');
+$ti-icon-tir: unicode('ebf0');
+$ti-icon-toggle-left: unicode('eb3e');
+$ti-icon-toggle-left-filled: unicode('fec0');
+$ti-icon-toggle-right: unicode('eb3f');
+$ti-icon-toggle-right-filled: unicode('febf');
+$ti-icon-toilet-paper: unicode('efd3');
+$ti-icon-toilet-paper-off: unicode('f1b4');
+$ti-icon-toml: unicode('fa5d');
+$ti-icon-tool: unicode('eb40');
+$ti-icon-tools: unicode('ebca');
+$ti-icon-tools-kitchen: unicode('ed64');
+$ti-icon-tools-kitchen-2: unicode('eeff');
+$ti-icon-tools-kitchen-2-off: unicode('f1b5');
+$ti-icon-tools-kitchen-3: unicode('fd2b');
+$ti-icon-tools-kitchen-off: unicode('f1b6');
+$ti-icon-tools-off: unicode('f1b7');
+$ti-icon-tooltip: unicode('f2dd');
+$ti-icon-topology-bus: unicode('f5d9');
+$ti-icon-topology-complex: unicode('f5da');
+$ti-icon-topology-full: unicode('f5dc');
+$ti-icon-topology-full-hierarchy: unicode('f5db');
+$ti-icon-topology-ring: unicode('f5df');
+$ti-icon-topology-ring-2: unicode('f5dd');
+$ti-icon-topology-ring-3: unicode('f5de');
+$ti-icon-topology-star: unicode('f5e5');
+$ti-icon-topology-star-2: unicode('f5e0');
+$ti-icon-topology-star-3: unicode('f5e1');
+$ti-icon-topology-star-ring: unicode('f5e4');
+$ti-icon-topology-star-ring-2: unicode('f5e2');
+$ti-icon-topology-star-ring-3: unicode('f5e3');
+$ti-icon-torii: unicode('f59b');
+$ti-icon-tornado: unicode('ece2');
+$ti-icon-tournament: unicode('ecd0');
+$ti-icon-tower: unicode('f2cb');
+$ti-icon-tower-off: unicode('f2ca');
+$ti-icon-track: unicode('ef00');
+$ti-icon-tractor: unicode('ec0d');
+$ti-icon-trademark: unicode('ec0e');
+$ti-icon-traffic-cone: unicode('ec0f');
+$ti-icon-traffic-cone-off: unicode('f1b8');
+$ti-icon-traffic-lights: unicode('ed39');
+$ti-icon-traffic-lights-off: unicode('f1b9');
+$ti-icon-train: unicode('ed96');
+$ti-icon-transaction-bitcoin: unicode('fd6e');
+$ti-icon-transaction-dollar: unicode('fd6f');
+$ti-icon-transaction-euro: unicode('fd70');
+$ti-icon-transaction-pound: unicode('fd71');
+$ti-icon-transaction-rupee: unicode('fd85');
+$ti-icon-transaction-yen: unicode('fd72');
+$ti-icon-transaction-yuan: unicode('fd73');
+$ti-icon-transfer: unicode('fc1f');
+$ti-icon-transfer-in: unicode('ef2f');
+$ti-icon-transfer-out: unicode('ef30');
+$ti-icon-transfer-vertical: unicode('fc1e');
+$ti-icon-transform: unicode('f38e');
+$ti-icon-transform-filled: unicode('f6ac');
+$ti-icon-transform-point: unicode('fda9');
+$ti-icon-transform-point-bottom-left: unicode('fda5');
+$ti-icon-transform-point-bottom-right: unicode('fda6');
+$ti-icon-transform-point-top-left: unicode('fda7');
+$ti-icon-transform-point-top-right: unicode('fda8');
+$ti-icon-transition-bottom: unicode('f2b2');
+$ti-icon-transition-bottom-filled: unicode('fdd0');
+$ti-icon-transition-left: unicode('f2b3');
+$ti-icon-transition-left-filled: unicode('fdcf');
+$ti-icon-transition-right: unicode('f2b4');
+$ti-icon-transition-right-filled: unicode('fdce');
+$ti-icon-transition-top: unicode('f2b5');
+$ti-icon-transition-top-filled: unicode('fdcd');
+$ti-icon-trash: unicode('eb41');
+$ti-icon-trash-filled: unicode('f783');
+$ti-icon-trash-off: unicode('ed65');
+$ti-icon-trash-x: unicode('ef88');
+$ti-icon-trash-x-filled: unicode('f784');
+$ti-icon-treadmill: unicode('fa6e');
+$ti-icon-tree: unicode('ef01');
+$ti-icon-trees: unicode('ec10');
+$ti-icon-trekking: unicode('f5ad');
+$ti-icon-trending-down: unicode('eb42');
+$ti-icon-trending-down-2: unicode('edc1');
+$ti-icon-trending-down-3: unicode('edc2');
+$ti-icon-trending-up: unicode('eb43');
+$ti-icon-trending-up-2: unicode('edc3');
+$ti-icon-trending-up-3: unicode('edc4');
+$ti-icon-triangle: unicode('eb44');
+$ti-icon-triangle-filled: unicode('f6ad');
+$ti-icon-triangle-inverted: unicode('f01d');
+$ti-icon-triangle-inverted-filled: unicode('f6ae');
+$ti-icon-triangle-minus: unicode('fc9b');
+$ti-icon-triangle-minus-2: unicode('fc9a');
+$ti-icon-triangle-off: unicode('ef02');
+$ti-icon-triangle-plus: unicode('fc9d');
+$ti-icon-triangle-plus-2: unicode('fc9c');
+$ti-icon-triangle-square-circle: unicode('ece8');
+$ti-icon-triangle-square-circle-filled: unicode('fb42');
+$ti-icon-triangles: unicode('f0a5');
+$ti-icon-trident: unicode('ecc5');
+$ti-icon-trolley: unicode('f4cc');
+$ti-icon-trophy: unicode('eb45');
+$ti-icon-trophy-filled: unicode('f6af');
+$ti-icon-trophy-off: unicode('f438');
+$ti-icon-trowel: unicode('f368');
+$ti-icon-truck: unicode('ebc4');
+$ti-icon-truck-delivery: unicode('ec4b');
+$ti-icon-truck-loading: unicode('f1da');
+$ti-icon-truck-off: unicode('ef03');
+$ti-icon-truck-return: unicode('ec4c');
+$ti-icon-txt: unicode('f3b1');
+$ti-icon-typeface: unicode('fdab');
+$ti-icon-typography: unicode('ebc5');
+$ti-icon-typography-off: unicode('f1ba');
+$ti-icon-u-turn-left: unicode('fea2');
+$ti-icon-u-turn-right: unicode('fea1');
+$ti-icon-ufo: unicode('f26f');
+$ti-icon-ufo-off: unicode('f26e');
+$ti-icon-umbrella: unicode('ebf1');
+$ti-icon-umbrella-filled: unicode('f6b0');
+$ti-icon-umbrella-off: unicode('f1bb');
+$ti-icon-underline: unicode('eba2');
+$ti-icon-universe: unicode('fcc4');
+$ti-icon-unlink: unicode('eb46');
+$ti-icon-upload: unicode('eb47');
+$ti-icon-urgent: unicode('eb48');
+$ti-icon-usb: unicode('f00c');
+$ti-icon-user: unicode('eb4d');
+$ti-icon-user-bolt: unicode('f9d1');
+$ti-icon-user-cancel: unicode('f9d2');
+$ti-icon-user-check: unicode('eb49');
+$ti-icon-user-circle: unicode('ef68');
+$ti-icon-user-code: unicode('f9d3');
+$ti-icon-user-cog: unicode('f9d4');
+$ti-icon-user-dollar: unicode('f9d5');
+$ti-icon-user-down: unicode('f9d6');
+$ti-icon-user-edit: unicode('f7cc');
+$ti-icon-user-exclamation: unicode('ec12');
+$ti-icon-user-filled: unicode('fd19');
+$ti-icon-user-heart: unicode('f7cd');
+$ti-icon-user-hexagon: unicode('fc4e');
+$ti-icon-user-minus: unicode('eb4a');
+$ti-icon-user-off: unicode('ecf9');
+$ti-icon-user-pause: unicode('f9d7');
+$ti-icon-user-pentagon: unicode('fc4f');
+$ti-icon-user-pin: unicode('f7ce');
+$ti-icon-user-plus: unicode('eb4b');
+$ti-icon-user-question: unicode('f7cf');
+$ti-icon-user-scan: unicode('fcaf');
+$ti-icon-user-screen: unicode('fea0');
+$ti-icon-user-search: unicode('ef89');
+$ti-icon-user-share: unicode('f9d8');
+$ti-icon-user-shield: unicode('f7d0');
+$ti-icon-user-square: unicode('fc51');
+$ti-icon-user-square-rounded: unicode('fc50');
+$ti-icon-user-star: unicode('f7d1');
+$ti-icon-user-up: unicode('f7d2');
+$ti-icon-user-x: unicode('eb4c');
+$ti-icon-users: unicode('ebf2');
+$ti-icon-users-group: unicode('fa21');
+$ti-icon-users-minus: unicode('fa0e');
+$ti-icon-users-plus: unicode('fa0f');
+$ti-icon-uv-index: unicode('f3b2');
+$ti-icon-ux-circle: unicode('f369');
+$ti-icon-vaccine: unicode('ef04');
+$ti-icon-vaccine-bottle: unicode('ef69');
+$ti-icon-vaccine-bottle-off: unicode('f439');
+$ti-icon-vaccine-off: unicode('f1bc');
+$ti-icon-vacuum-cleaner: unicode('f5e6');
+$ti-icon-variable: unicode('ef05');
+$ti-icon-variable-minus: unicode('f36a');
+$ti-icon-variable-off: unicode('f1bd');
+$ti-icon-variable-plus: unicode('f36b');
+$ti-icon-vector: unicode('eca9');
+$ti-icon-vector-bezier: unicode('ef1d');
+$ti-icon-vector-bezier-2: unicode('f1a3');
+$ti-icon-vector-bezier-arc: unicode('f4cd');
+$ti-icon-vector-bezier-circle: unicode('f4ce');
+$ti-icon-vector-off: unicode('f1be');
+$ti-icon-vector-spline: unicode('f565');
+$ti-icon-vector-triangle: unicode('eca8');
+$ti-icon-vector-triangle-off: unicode('f1bf');
+$ti-icon-venus: unicode('ec86');
+$ti-icon-versions: unicode('ed52');
+$ti-icon-versions-filled: unicode('f6b1');
+$ti-icon-versions-off: unicode('f1c0');
+$ti-icon-video: unicode('ed22');
+$ti-icon-video-minus: unicode('ed1f');
+$ti-icon-video-off: unicode('ed20');
+$ti-icon-video-plus: unicode('ed21');
+$ti-icon-view-360: unicode('ed84');
+$ti-icon-view-360-arrow: unicode('f62f');
+$ti-icon-view-360-number: unicode('f566');
+$ti-icon-view-360-off: unicode('f1c1');
+$ti-icon-viewfinder: unicode('eb4e');
+$ti-icon-viewfinder-off: unicode('f1c2');
+$ti-icon-viewport-narrow: unicode('ebf3');
+$ti-icon-viewport-wide: unicode('ebf4');
+$ti-icon-vinyl: unicode('f00d');
+$ti-icon-vip: unicode('f3b3');
+$ti-icon-vip-off: unicode('f43a');
+$ti-icon-virus: unicode('eb74');
+$ti-icon-virus-off: unicode('ed66');
+$ti-icon-virus-search: unicode('ed67');
+$ti-icon-vocabulary: unicode('ef1e');
+$ti-icon-vocabulary-off: unicode('f43b');
+$ti-icon-volcano: unicode('f79c');
+$ti-icon-volume: unicode('eb51');
+$ti-icon-volume-2: unicode('eb4f');
+$ti-icon-volume-3: unicode('eb50');
+$ti-icon-volume-off: unicode('f1c3');
+$ti-icon-vs: unicode('fc52');
+$ti-icon-walk: unicode('ec87');
+$ti-icon-wall: unicode('ef7a');
+$ti-icon-wall-off: unicode('f43c');
+$ti-icon-wallet: unicode('eb75');
+$ti-icon-wallet-off: unicode('f1c4');
+$ti-icon-wallpaper: unicode('ef56');
+$ti-icon-wallpaper-off: unicode('f1c5');
+$ti-icon-wand: unicode('ebcb');
+$ti-icon-wand-off: unicode('f1c6');
+$ti-icon-wash: unicode('f311');
+$ti-icon-wash-dry: unicode('f304');
+$ti-icon-wash-dry-1: unicode('f2fa');
+$ti-icon-wash-dry-2: unicode('f2fb');
+$ti-icon-wash-dry-3: unicode('f2fc');
+$ti-icon-wash-dry-a: unicode('f2fd');
+$ti-icon-wash-dry-dip: unicode('f2fe');
+$ti-icon-wash-dry-f: unicode('f2ff');
+$ti-icon-wash-dry-flat: unicode('fa7f');
+$ti-icon-wash-dry-hang: unicode('f300');
+$ti-icon-wash-dry-off: unicode('f301');
+$ti-icon-wash-dry-p: unicode('f302');
+$ti-icon-wash-dry-shade: unicode('f303');
+$ti-icon-wash-dry-w: unicode('f322');
+$ti-icon-wash-dryclean: unicode('f305');
+$ti-icon-wash-dryclean-off: unicode('f323');
+$ti-icon-wash-eco: unicode('fa80');
+$ti-icon-wash-gentle: unicode('f306');
+$ti-icon-wash-hand: unicode('fa81');
+$ti-icon-wash-machine: unicode('f25e');
+$ti-icon-wash-off: unicode('f307');
+$ti-icon-wash-press: unicode('f308');
+$ti-icon-wash-temperature-1: unicode('f309');
+$ti-icon-wash-temperature-2: unicode('f30a');
+$ti-icon-wash-temperature-3: unicode('f30b');
+$ti-icon-wash-temperature-4: unicode('f30c');
+$ti-icon-wash-temperature-5: unicode('f30d');
+$ti-icon-wash-temperature-6: unicode('f30e');
+$ti-icon-wash-tumble-dry: unicode('f30f');
+$ti-icon-wash-tumble-off: unicode('f310');
+$ti-icon-waterpolo: unicode('fa6f');
+$ti-icon-wave-saw-tool: unicode('ecd3');
+$ti-icon-wave-sine: unicode('ecd4');
+$ti-icon-wave-square: unicode('ecd5');
+$ti-icon-waves-electricity: unicode('fcc5');
+$ti-icon-webhook: unicode('f01e');
+$ti-icon-webhook-off: unicode('f43d');
+$ti-icon-weight: unicode('f589');
+$ti-icon-wheel: unicode('fc64');
+$ti-icon-wheelchair: unicode('f1db');
+$ti-icon-wheelchair-off: unicode('f43e');
+$ti-icon-whirl: unicode('f51d');
+$ti-icon-wifi: unicode('eb52');
+$ti-icon-wifi-0: unicode('eba3');
+$ti-icon-wifi-1: unicode('eba4');
+$ti-icon-wifi-2: unicode('eba5');
+$ti-icon-wifi-off: unicode('ecfa');
+$ti-icon-wind: unicode('ec34');
+$ti-icon-wind-electricity: unicode('fcc6');
+$ti-icon-wind-off: unicode('f1c7');
+$ti-icon-windmill: unicode('ed85');
+$ti-icon-windmill-filled: unicode('f6b2');
+$ti-icon-windmill-off: unicode('f1c8');
+$ti-icon-window: unicode('ef06');
+$ti-icon-window-maximize: unicode('f1f1');
+$ti-icon-window-minimize: unicode('f1f2');
+$ti-icon-window-off: unicode('f1c9');
+$ti-icon-windsock: unicode('f06d');
+$ti-icon-wiper: unicode('ecab');
+$ti-icon-wiper-wash: unicode('ecaa');
+$ti-icon-woman: unicode('eb53');
+$ti-icon-woman-filled: unicode('fdcc');
+$ti-icon-wood: unicode('f359');
+$ti-icon-world: unicode('eb54');
+$ti-icon-world-bolt: unicode('f9d9');
+$ti-icon-world-cancel: unicode('f9da');
+$ti-icon-world-check: unicode('f9db');
+$ti-icon-world-code: unicode('f9dc');
+$ti-icon-world-cog: unicode('f9dd');
+$ti-icon-world-dollar: unicode('f9de');
+$ti-icon-world-down: unicode('f9df');
+$ti-icon-world-download: unicode('ef8a');
+$ti-icon-world-exclamation: unicode('f9e0');
+$ti-icon-world-heart: unicode('f9e1');
+$ti-icon-world-latitude: unicode('ed2e');
+$ti-icon-world-longitude: unicode('ed2f');
+$ti-icon-world-minus: unicode('f9e2');
+$ti-icon-world-off: unicode('f1ca');
+$ti-icon-world-pause: unicode('f9e3');
+$ti-icon-world-pin: unicode('f9e4');
+$ti-icon-world-plus: unicode('f9e5');
+$ti-icon-world-question: unicode('f9e6');
+$ti-icon-world-search: unicode('f9e7');
+$ti-icon-world-share: unicode('f9e8');
+$ti-icon-world-star: unicode('f9e9');
+$ti-icon-world-up: unicode('f9ea');
+$ti-icon-world-upload: unicode('ef8b');
+$ti-icon-world-www: unicode('f38f');
+$ti-icon-world-x: unicode('f9eb');
+$ti-icon-wrecking-ball: unicode('ed97');
+$ti-icon-writing: unicode('ef08');
+$ti-icon-writing-off: unicode('f1cb');
+$ti-icon-writing-sign: unicode('ef07');
+$ti-icon-writing-sign-off: unicode('f1cc');
+$ti-icon-x: unicode('eb55');
+$ti-icon-xbox-a: unicode('f2b6');
+$ti-icon-xbox-a-filled: unicode('fdcb');
+$ti-icon-xbox-b: unicode('f2b7');
+$ti-icon-xbox-b-filled: unicode('fdca');
+$ti-icon-xbox-x: unicode('f2b8');
+$ti-icon-xbox-x-filled: unicode('fdc9');
+$ti-icon-xbox-y: unicode('f2b9');
+$ti-icon-xbox-y-filled: unicode('fdc8');
+$ti-icon-xd: unicode('fa33');
+$ti-icon-xxx: unicode('fc20');
+$ti-icon-yin-yang: unicode('ec35');
+$ti-icon-yin-yang-filled: unicode('f785');
+$ti-icon-yoga: unicode('f01f');
+$ti-icon-zeppelin: unicode('f270');
+$ti-icon-zeppelin-filled: unicode('fdc7');
+$ti-icon-zeppelin-off: unicode('f43f');
+$ti-icon-zip: unicode('f3b4');
+$ti-icon-zodiac-aquarius: unicode('ecac');
+$ti-icon-zodiac-aries: unicode('ecad');
+$ti-icon-zodiac-cancer: unicode('ecae');
+$ti-icon-zodiac-capricorn: unicode('ecaf');
+$ti-icon-zodiac-gemini: unicode('ecb0');
+$ti-icon-zodiac-leo: unicode('ecb1');
+$ti-icon-zodiac-libra: unicode('ecb2');
+$ti-icon-zodiac-pisces: unicode('ecb3');
+$ti-icon-zodiac-sagittarius: unicode('ecb4');
+$ti-icon-zodiac-scorpio: unicode('ecb5');
+$ti-icon-zodiac-taurus: unicode('ecb6');
+$ti-icon-zodiac-virgo: unicode('ecb7');
+$ti-icon-zoom: unicode('fdaa');
+$ti-icon-zoom-cancel: unicode('ec4d');
+$ti-icon-zoom-cancel-filled: unicode('fdc6');
+$ti-icon-zoom-check: unicode('ef09');
+$ti-icon-zoom-check-filled: unicode('f786');
+$ti-icon-zoom-code: unicode('f07f');
+$ti-icon-zoom-code-filled: unicode('fdc5');
+$ti-icon-zoom-exclamation: unicode('f080');
+$ti-icon-zoom-exclamation-filled: unicode('fdc4');
+$ti-icon-zoom-filled: unicode('f787');
+$ti-icon-zoom-in: unicode('eb56');
+$ti-icon-zoom-in-area: unicode('f1dc');
+$ti-icon-zoom-in-area-filled: unicode('f788');
+$ti-icon-zoom-in-filled: unicode('f789');
+$ti-icon-zoom-money: unicode('ef0a');
+$ti-icon-zoom-money-filled: unicode('fdc3');
+$ti-icon-zoom-out: unicode('eb57');
+$ti-icon-zoom-out-area: unicode('f1dd');
+$ti-icon-zoom-out-area-filled: unicode('fdc2');
+$ti-icon-zoom-out-filled: unicode('f78a');
+$ti-icon-zoom-pan: unicode('f1de');
+$ti-icon-zoom-pan-filled: unicode('fdc1');
+$ti-icon-zoom-question: unicode('edeb');
+$ti-icon-zoom-question-filled: unicode('fdc0');
+$ti-icon-zoom-replace: unicode('f2a7');
+$ti-icon-zoom-reset: unicode('f295');
+$ti-icon-zoom-scan: unicode('fcb0');
+$ti-icon-zoom-scan-filled: unicode('fdbf');
+$ti-icon-zzz: unicode('f228');
+$ti-icon-zzz-off: unicode('f440');
+
+.#{$ti-prefix}-a-b:before {
+ content: $ti-icon-a-b;
+}
+.#{$ti-prefix}-a-b-2:before {
+ content: $ti-icon-a-b-2;
+}
+.#{$ti-prefix}-a-b-off:before {
+ content: $ti-icon-a-b-off;
+}
+.#{$ti-prefix}-abacus:before {
+ content: $ti-icon-abacus;
+}
+.#{$ti-prefix}-abacus-off:before {
+ content: $ti-icon-abacus-off;
+}
+.#{$ti-prefix}-abc:before {
+ content: $ti-icon-abc;
+}
+.#{$ti-prefix}-access-point:before {
+ content: $ti-icon-access-point;
+}
+.#{$ti-prefix}-access-point-off:before {
+ content: $ti-icon-access-point-off;
+}
+.#{$ti-prefix}-accessible:before {
+ content: $ti-icon-accessible;
+}
+.#{$ti-prefix}-accessible-filled:before {
+ content: $ti-icon-accessible-filled;
+}
+.#{$ti-prefix}-accessible-off:before {
+ content: $ti-icon-accessible-off;
+}
+.#{$ti-prefix}-activity:before {
+ content: $ti-icon-activity;
+}
+.#{$ti-prefix}-activity-heartbeat:before {
+ content: $ti-icon-activity-heartbeat;
+}
+.#{$ti-prefix}-ad:before {
+ content: $ti-icon-ad;
+}
+.#{$ti-prefix}-ad-2:before {
+ content: $ti-icon-ad-2;
+}
+.#{$ti-prefix}-ad-circle:before {
+ content: $ti-icon-ad-circle;
+}
+.#{$ti-prefix}-ad-circle-filled:before {
+ content: $ti-icon-ad-circle-filled;
+}
+.#{$ti-prefix}-ad-circle-off:before {
+ content: $ti-icon-ad-circle-off;
+}
+.#{$ti-prefix}-ad-filled:before {
+ content: $ti-icon-ad-filled;
+}
+.#{$ti-prefix}-ad-off:before {
+ content: $ti-icon-ad-off;
+}
+.#{$ti-prefix}-address-book:before {
+ content: $ti-icon-address-book;
+}
+.#{$ti-prefix}-address-book-off:before {
+ content: $ti-icon-address-book-off;
+}
+.#{$ti-prefix}-adjustments:before {
+ content: $ti-icon-adjustments;
+}
+.#{$ti-prefix}-adjustments-alt:before {
+ content: $ti-icon-adjustments-alt;
+}
+.#{$ti-prefix}-adjustments-bolt:before {
+ content: $ti-icon-adjustments-bolt;
+}
+.#{$ti-prefix}-adjustments-cancel:before {
+ content: $ti-icon-adjustments-cancel;
+}
+.#{$ti-prefix}-adjustments-check:before {
+ content: $ti-icon-adjustments-check;
+}
+.#{$ti-prefix}-adjustments-code:before {
+ content: $ti-icon-adjustments-code;
+}
+.#{$ti-prefix}-adjustments-cog:before {
+ content: $ti-icon-adjustments-cog;
+}
+.#{$ti-prefix}-adjustments-dollar:before {
+ content: $ti-icon-adjustments-dollar;
+}
+.#{$ti-prefix}-adjustments-down:before {
+ content: $ti-icon-adjustments-down;
+}
+.#{$ti-prefix}-adjustments-exclamation:before {
+ content: $ti-icon-adjustments-exclamation;
+}
+.#{$ti-prefix}-adjustments-filled:before {
+ content: $ti-icon-adjustments-filled;
+}
+.#{$ti-prefix}-adjustments-heart:before {
+ content: $ti-icon-adjustments-heart;
+}
+.#{$ti-prefix}-adjustments-horizontal:before {
+ content: $ti-icon-adjustments-horizontal;
+}
+.#{$ti-prefix}-adjustments-minus:before {
+ content: $ti-icon-adjustments-minus;
+}
+.#{$ti-prefix}-adjustments-off:before {
+ content: $ti-icon-adjustments-off;
+}
+.#{$ti-prefix}-adjustments-pause:before {
+ content: $ti-icon-adjustments-pause;
+}
+.#{$ti-prefix}-adjustments-pin:before {
+ content: $ti-icon-adjustments-pin;
+}
+.#{$ti-prefix}-adjustments-plus:before {
+ content: $ti-icon-adjustments-plus;
+}
+.#{$ti-prefix}-adjustments-question:before {
+ content: $ti-icon-adjustments-question;
+}
+.#{$ti-prefix}-adjustments-search:before {
+ content: $ti-icon-adjustments-search;
+}
+.#{$ti-prefix}-adjustments-share:before {
+ content: $ti-icon-adjustments-share;
+}
+.#{$ti-prefix}-adjustments-star:before {
+ content: $ti-icon-adjustments-star;
+}
+.#{$ti-prefix}-adjustments-up:before {
+ content: $ti-icon-adjustments-up;
+}
+.#{$ti-prefix}-adjustments-x:before {
+ content: $ti-icon-adjustments-x;
+}
+.#{$ti-prefix}-aerial-lift:before {
+ content: $ti-icon-aerial-lift;
+}
+.#{$ti-prefix}-affiliate:before {
+ content: $ti-icon-affiliate;
+}
+.#{$ti-prefix}-affiliate-filled:before {
+ content: $ti-icon-affiliate-filled;
+}
+.#{$ti-prefix}-ai:before {
+ content: $ti-icon-ai;
+}
+.#{$ti-prefix}-air-balloon:before {
+ content: $ti-icon-air-balloon;
+}
+.#{$ti-prefix}-air-conditioning:before {
+ content: $ti-icon-air-conditioning;
+}
+.#{$ti-prefix}-air-conditioning-disabled:before {
+ content: $ti-icon-air-conditioning-disabled;
+}
+.#{$ti-prefix}-air-traffic-control:before {
+ content: $ti-icon-air-traffic-control;
+}
+.#{$ti-prefix}-alarm:before {
+ content: $ti-icon-alarm;
+}
+.#{$ti-prefix}-alarm-average:before {
+ content: $ti-icon-alarm-average;
+}
+.#{$ti-prefix}-alarm-filled:before {
+ content: $ti-icon-alarm-filled;
+}
+.#{$ti-prefix}-alarm-minus:before {
+ content: $ti-icon-alarm-minus;
+}
+.#{$ti-prefix}-alarm-minus-filled:before {
+ content: $ti-icon-alarm-minus-filled;
+}
+.#{$ti-prefix}-alarm-off:before {
+ content: $ti-icon-alarm-off;
+}
+.#{$ti-prefix}-alarm-plus:before {
+ content: $ti-icon-alarm-plus;
+}
+.#{$ti-prefix}-alarm-plus-filled:before {
+ content: $ti-icon-alarm-plus-filled;
+}
+.#{$ti-prefix}-alarm-snooze:before {
+ content: $ti-icon-alarm-snooze;
+}
+.#{$ti-prefix}-alarm-snooze-filled:before {
+ content: $ti-icon-alarm-snooze-filled;
+}
+.#{$ti-prefix}-album:before {
+ content: $ti-icon-album;
+}
+.#{$ti-prefix}-album-off:before {
+ content: $ti-icon-album-off;
+}
+.#{$ti-prefix}-alert-circle:before {
+ content: $ti-icon-alert-circle;
+}
+.#{$ti-prefix}-alert-circle-filled:before {
+ content: $ti-icon-alert-circle-filled;
+}
+.#{$ti-prefix}-alert-circle-off:before {
+ content: $ti-icon-alert-circle-off;
+}
+.#{$ti-prefix}-alert-hexagon:before {
+ content: $ti-icon-alert-hexagon;
+}
+.#{$ti-prefix}-alert-hexagon-filled:before {
+ content: $ti-icon-alert-hexagon-filled;
+}
+.#{$ti-prefix}-alert-hexagon-off:before {
+ content: $ti-icon-alert-hexagon-off;
+}
+.#{$ti-prefix}-alert-octagon:before {
+ content: $ti-icon-alert-octagon;
+}
+.#{$ti-prefix}-alert-octagon-filled:before {
+ content: $ti-icon-alert-octagon-filled;
+}
+.#{$ti-prefix}-alert-small:before {
+ content: $ti-icon-alert-small;
+}
+.#{$ti-prefix}-alert-small-off:before {
+ content: $ti-icon-alert-small-off;
+}
+.#{$ti-prefix}-alert-square:before {
+ content: $ti-icon-alert-square;
+}
+.#{$ti-prefix}-alert-square-filled:before {
+ content: $ti-icon-alert-square-filled;
+}
+.#{$ti-prefix}-alert-square-rounded:before {
+ content: $ti-icon-alert-square-rounded;
+}
+.#{$ti-prefix}-alert-square-rounded-filled:before {
+ content: $ti-icon-alert-square-rounded-filled;
+}
+.#{$ti-prefix}-alert-square-rounded-off:before {
+ content: $ti-icon-alert-square-rounded-off;
+}
+.#{$ti-prefix}-alert-triangle:before {
+ content: $ti-icon-alert-triangle;
+}
+.#{$ti-prefix}-alert-triangle-filled:before {
+ content: $ti-icon-alert-triangle-filled;
+}
+.#{$ti-prefix}-alert-triangle-off:before {
+ content: $ti-icon-alert-triangle-off;
+}
+.#{$ti-prefix}-alien:before {
+ content: $ti-icon-alien;
+}
+.#{$ti-prefix}-alien-filled:before {
+ content: $ti-icon-alien-filled;
+}
+.#{$ti-prefix}-align-box-bottom-center:before {
+ content: $ti-icon-align-box-bottom-center;
+}
+.#{$ti-prefix}-align-box-bottom-center-filled:before {
+ content: $ti-icon-align-box-bottom-center-filled;
+}
+.#{$ti-prefix}-align-box-bottom-left:before {
+ content: $ti-icon-align-box-bottom-left;
+}
+.#{$ti-prefix}-align-box-bottom-left-filled:before {
+ content: $ti-icon-align-box-bottom-left-filled;
+}
+.#{$ti-prefix}-align-box-bottom-right:before {
+ content: $ti-icon-align-box-bottom-right;
+}
+.#{$ti-prefix}-align-box-bottom-right-filled:before {
+ content: $ti-icon-align-box-bottom-right-filled;
+}
+.#{$ti-prefix}-align-box-center-bottom:before {
+ content: $ti-icon-align-box-center-bottom;
+}
+.#{$ti-prefix}-align-box-center-middle:before {
+ content: $ti-icon-align-box-center-middle;
+}
+.#{$ti-prefix}-align-box-center-middle-filled:before {
+ content: $ti-icon-align-box-center-middle-filled;
+}
+.#{$ti-prefix}-align-box-center-stretch:before {
+ content: $ti-icon-align-box-center-stretch;
+}
+.#{$ti-prefix}-align-box-center-top:before {
+ content: $ti-icon-align-box-center-top;
+}
+.#{$ti-prefix}-align-box-left-bottom:before {
+ content: $ti-icon-align-box-left-bottom;
+}
+.#{$ti-prefix}-align-box-left-bottom-filled:before {
+ content: $ti-icon-align-box-left-bottom-filled;
+}
+.#{$ti-prefix}-align-box-left-middle:before {
+ content: $ti-icon-align-box-left-middle;
+}
+.#{$ti-prefix}-align-box-left-middle-filled:before {
+ content: $ti-icon-align-box-left-middle-filled;
+}
+.#{$ti-prefix}-align-box-left-stretch:before {
+ content: $ti-icon-align-box-left-stretch;
+}
+.#{$ti-prefix}-align-box-left-top:before {
+ content: $ti-icon-align-box-left-top;
+}
+.#{$ti-prefix}-align-box-left-top-filled:before {
+ content: $ti-icon-align-box-left-top-filled;
+}
+.#{$ti-prefix}-align-box-right-bottom:before {
+ content: $ti-icon-align-box-right-bottom;
+}
+.#{$ti-prefix}-align-box-right-bottom-filled:before {
+ content: $ti-icon-align-box-right-bottom-filled;
+}
+.#{$ti-prefix}-align-box-right-middle:before {
+ content: $ti-icon-align-box-right-middle;
+}
+.#{$ti-prefix}-align-box-right-middle-filled:before {
+ content: $ti-icon-align-box-right-middle-filled;
+}
+.#{$ti-prefix}-align-box-right-stretch:before {
+ content: $ti-icon-align-box-right-stretch;
+}
+.#{$ti-prefix}-align-box-right-top:before {
+ content: $ti-icon-align-box-right-top;
+}
+.#{$ti-prefix}-align-box-right-top-filled:before {
+ content: $ti-icon-align-box-right-top-filled;
+}
+.#{$ti-prefix}-align-box-top-center:before {
+ content: $ti-icon-align-box-top-center;
+}
+.#{$ti-prefix}-align-box-top-center-filled:before {
+ content: $ti-icon-align-box-top-center-filled;
+}
+.#{$ti-prefix}-align-box-top-left:before {
+ content: $ti-icon-align-box-top-left;
+}
+.#{$ti-prefix}-align-box-top-left-filled:before {
+ content: $ti-icon-align-box-top-left-filled;
+}
+.#{$ti-prefix}-align-box-top-right:before {
+ content: $ti-icon-align-box-top-right;
+}
+.#{$ti-prefix}-align-box-top-right-filled:before {
+ content: $ti-icon-align-box-top-right-filled;
+}
+.#{$ti-prefix}-align-center:before {
+ content: $ti-icon-align-center;
+}
+.#{$ti-prefix}-align-justified:before {
+ content: $ti-icon-align-justified;
+}
+.#{$ti-prefix}-align-left:before {
+ content: $ti-icon-align-left;
+}
+.#{$ti-prefix}-align-right:before {
+ content: $ti-icon-align-right;
+}
+.#{$ti-prefix}-alpha:before {
+ content: $ti-icon-alpha;
+}
+.#{$ti-prefix}-alphabet-cyrillic:before {
+ content: $ti-icon-alphabet-cyrillic;
+}
+.#{$ti-prefix}-alphabet-greek:before {
+ content: $ti-icon-alphabet-greek;
+}
+.#{$ti-prefix}-alphabet-latin:before {
+ content: $ti-icon-alphabet-latin;
+}
+.#{$ti-prefix}-alt:before {
+ content: $ti-icon-alt;
+}
+.#{$ti-prefix}-ambulance:before {
+ content: $ti-icon-ambulance;
+}
+.#{$ti-prefix}-ampersand:before {
+ content: $ti-icon-ampersand;
+}
+.#{$ti-prefix}-analyze:before {
+ content: $ti-icon-analyze;
+}
+.#{$ti-prefix}-analyze-filled:before {
+ content: $ti-icon-analyze-filled;
+}
+.#{$ti-prefix}-analyze-off:before {
+ content: $ti-icon-analyze-off;
+}
+.#{$ti-prefix}-anchor:before {
+ content: $ti-icon-anchor;
+}
+.#{$ti-prefix}-anchor-off:before {
+ content: $ti-icon-anchor-off;
+}
+.#{$ti-prefix}-angle:before {
+ content: $ti-icon-angle;
+}
+.#{$ti-prefix}-ankh:before {
+ content: $ti-icon-ankh;
+}
+.#{$ti-prefix}-antenna:before {
+ content: $ti-icon-antenna;
+}
+.#{$ti-prefix}-antenna-bars-1:before {
+ content: $ti-icon-antenna-bars-1;
+}
+.#{$ti-prefix}-antenna-bars-2:before {
+ content: $ti-icon-antenna-bars-2;
+}
+.#{$ti-prefix}-antenna-bars-3:before {
+ content: $ti-icon-antenna-bars-3;
+}
+.#{$ti-prefix}-antenna-bars-4:before {
+ content: $ti-icon-antenna-bars-4;
+}
+.#{$ti-prefix}-antenna-bars-5:before {
+ content: $ti-icon-antenna-bars-5;
+}
+.#{$ti-prefix}-antenna-bars-off:before {
+ content: $ti-icon-antenna-bars-off;
+}
+.#{$ti-prefix}-antenna-off:before {
+ content: $ti-icon-antenna-off;
+}
+.#{$ti-prefix}-aperture:before {
+ content: $ti-icon-aperture;
+}
+.#{$ti-prefix}-aperture-off:before {
+ content: $ti-icon-aperture-off;
+}
+.#{$ti-prefix}-api:before {
+ content: $ti-icon-api;
+}
+.#{$ti-prefix}-api-app:before {
+ content: $ti-icon-api-app;
+}
+.#{$ti-prefix}-api-app-off:before {
+ content: $ti-icon-api-app-off;
+}
+.#{$ti-prefix}-api-off:before {
+ content: $ti-icon-api-off;
+}
+.#{$ti-prefix}-app-window:before {
+ content: $ti-icon-app-window;
+}
+.#{$ti-prefix}-app-window-filled:before {
+ content: $ti-icon-app-window-filled;
+}
+.#{$ti-prefix}-apple:before {
+ content: $ti-icon-apple;
+}
+.#{$ti-prefix}-apps:before {
+ content: $ti-icon-apps;
+}
+.#{$ti-prefix}-apps-filled:before {
+ content: $ti-icon-apps-filled;
+}
+.#{$ti-prefix}-apps-off:before {
+ content: $ti-icon-apps-off;
+}
+.#{$ti-prefix}-archery-arrow:before {
+ content: $ti-icon-archery-arrow;
+}
+.#{$ti-prefix}-archive:before {
+ content: $ti-icon-archive;
+}
+.#{$ti-prefix}-archive-filled:before {
+ content: $ti-icon-archive-filled;
+}
+.#{$ti-prefix}-archive-off:before {
+ content: $ti-icon-archive-off;
+}
+.#{$ti-prefix}-armchair:before {
+ content: $ti-icon-armchair;
+}
+.#{$ti-prefix}-armchair-2:before {
+ content: $ti-icon-armchair-2;
+}
+.#{$ti-prefix}-armchair-2-off:before {
+ content: $ti-icon-armchair-2-off;
+}
+.#{$ti-prefix}-armchair-off:before {
+ content: $ti-icon-armchair-off;
+}
+.#{$ti-prefix}-arrow-autofit-content:before {
+ content: $ti-icon-arrow-autofit-content;
+}
+.#{$ti-prefix}-arrow-autofit-content-filled:before {
+ content: $ti-icon-arrow-autofit-content-filled;
+}
+.#{$ti-prefix}-arrow-autofit-down:before {
+ content: $ti-icon-arrow-autofit-down;
+}
+.#{$ti-prefix}-arrow-autofit-height:before {
+ content: $ti-icon-arrow-autofit-height;
+}
+.#{$ti-prefix}-arrow-autofit-left:before {
+ content: $ti-icon-arrow-autofit-left;
+}
+.#{$ti-prefix}-arrow-autofit-right:before {
+ content: $ti-icon-arrow-autofit-right;
+}
+.#{$ti-prefix}-arrow-autofit-up:before {
+ content: $ti-icon-arrow-autofit-up;
+}
+.#{$ti-prefix}-arrow-autofit-width:before {
+ content: $ti-icon-arrow-autofit-width;
+}
+.#{$ti-prefix}-arrow-back:before {
+ content: $ti-icon-arrow-back;
+}
+.#{$ti-prefix}-arrow-back-up:before {
+ content: $ti-icon-arrow-back-up;
+}
+.#{$ti-prefix}-arrow-back-up-double:before {
+ content: $ti-icon-arrow-back-up-double;
+}
+.#{$ti-prefix}-arrow-badge-down:before {
+ content: $ti-icon-arrow-badge-down;
+}
+.#{$ti-prefix}-arrow-badge-down-filled:before {
+ content: $ti-icon-arrow-badge-down-filled;
+}
+.#{$ti-prefix}-arrow-badge-left:before {
+ content: $ti-icon-arrow-badge-left;
+}
+.#{$ti-prefix}-arrow-badge-left-filled:before {
+ content: $ti-icon-arrow-badge-left-filled;
+}
+.#{$ti-prefix}-arrow-badge-right:before {
+ content: $ti-icon-arrow-badge-right;
+}
+.#{$ti-prefix}-arrow-badge-right-filled:before {
+ content: $ti-icon-arrow-badge-right-filled;
+}
+.#{$ti-prefix}-arrow-badge-up:before {
+ content: $ti-icon-arrow-badge-up;
+}
+.#{$ti-prefix}-arrow-badge-up-filled:before {
+ content: $ti-icon-arrow-badge-up-filled;
+}
+.#{$ti-prefix}-arrow-bar-both:before {
+ content: $ti-icon-arrow-bar-both;
+}
+.#{$ti-prefix}-arrow-bar-down:before {
+ content: $ti-icon-arrow-bar-down;
+}
+.#{$ti-prefix}-arrow-bar-left:before {
+ content: $ti-icon-arrow-bar-left;
+}
+.#{$ti-prefix}-arrow-bar-right:before {
+ content: $ti-icon-arrow-bar-right;
+}
+.#{$ti-prefix}-arrow-bar-to-down:before {
+ content: $ti-icon-arrow-bar-to-down;
+}
+.#{$ti-prefix}-arrow-bar-to-left:before {
+ content: $ti-icon-arrow-bar-to-left;
+}
+.#{$ti-prefix}-arrow-bar-to-right:before {
+ content: $ti-icon-arrow-bar-to-right;
+}
+.#{$ti-prefix}-arrow-bar-to-up:before {
+ content: $ti-icon-arrow-bar-to-up;
+}
+.#{$ti-prefix}-arrow-bar-up:before {
+ content: $ti-icon-arrow-bar-up;
+}
+.#{$ti-prefix}-arrow-bear-left:before {
+ content: $ti-icon-arrow-bear-left;
+}
+.#{$ti-prefix}-arrow-bear-left-2:before {
+ content: $ti-icon-arrow-bear-left-2;
+}
+.#{$ti-prefix}-arrow-bear-right:before {
+ content: $ti-icon-arrow-bear-right;
+}
+.#{$ti-prefix}-arrow-bear-right-2:before {
+ content: $ti-icon-arrow-bear-right-2;
+}
+.#{$ti-prefix}-arrow-big-down:before {
+ content: $ti-icon-arrow-big-down;
+}
+.#{$ti-prefix}-arrow-big-down-filled:before {
+ content: $ti-icon-arrow-big-down-filled;
+}
+.#{$ti-prefix}-arrow-big-down-line:before {
+ content: $ti-icon-arrow-big-down-line;
+}
+.#{$ti-prefix}-arrow-big-down-line-filled:before {
+ content: $ti-icon-arrow-big-down-line-filled;
+}
+.#{$ti-prefix}-arrow-big-down-lines:before {
+ content: $ti-icon-arrow-big-down-lines;
+}
+.#{$ti-prefix}-arrow-big-down-lines-filled:before {
+ content: $ti-icon-arrow-big-down-lines-filled;
+}
+.#{$ti-prefix}-arrow-big-left:before {
+ content: $ti-icon-arrow-big-left;
+}
+.#{$ti-prefix}-arrow-big-left-filled:before {
+ content: $ti-icon-arrow-big-left-filled;
+}
+.#{$ti-prefix}-arrow-big-left-line:before {
+ content: $ti-icon-arrow-big-left-line;
+}
+.#{$ti-prefix}-arrow-big-left-line-filled:before {
+ content: $ti-icon-arrow-big-left-line-filled;
+}
+.#{$ti-prefix}-arrow-big-left-lines:before {
+ content: $ti-icon-arrow-big-left-lines;
+}
+.#{$ti-prefix}-arrow-big-left-lines-filled:before {
+ content: $ti-icon-arrow-big-left-lines-filled;
+}
+.#{$ti-prefix}-arrow-big-right:before {
+ content: $ti-icon-arrow-big-right;
+}
+.#{$ti-prefix}-arrow-big-right-filled:before {
+ content: $ti-icon-arrow-big-right-filled;
+}
+.#{$ti-prefix}-arrow-big-right-line:before {
+ content: $ti-icon-arrow-big-right-line;
+}
+.#{$ti-prefix}-arrow-big-right-line-filled:before {
+ content: $ti-icon-arrow-big-right-line-filled;
+}
+.#{$ti-prefix}-arrow-big-right-lines:before {
+ content: $ti-icon-arrow-big-right-lines;
+}
+.#{$ti-prefix}-arrow-big-right-lines-filled:before {
+ content: $ti-icon-arrow-big-right-lines-filled;
+}
+.#{$ti-prefix}-arrow-big-up:before {
+ content: $ti-icon-arrow-big-up;
+}
+.#{$ti-prefix}-arrow-big-up-filled:before {
+ content: $ti-icon-arrow-big-up-filled;
+}
+.#{$ti-prefix}-arrow-big-up-line:before {
+ content: $ti-icon-arrow-big-up-line;
+}
+.#{$ti-prefix}-arrow-big-up-line-filled:before {
+ content: $ti-icon-arrow-big-up-line-filled;
+}
+.#{$ti-prefix}-arrow-big-up-lines:before {
+ content: $ti-icon-arrow-big-up-lines;
+}
+.#{$ti-prefix}-arrow-big-up-lines-filled:before {
+ content: $ti-icon-arrow-big-up-lines-filled;
+}
+.#{$ti-prefix}-arrow-bounce:before {
+ content: $ti-icon-arrow-bounce;
+}
+.#{$ti-prefix}-arrow-capsule:before {
+ content: $ti-icon-arrow-capsule;
+}
+.#{$ti-prefix}-arrow-curve-left:before {
+ content: $ti-icon-arrow-curve-left;
+}
+.#{$ti-prefix}-arrow-curve-right:before {
+ content: $ti-icon-arrow-curve-right;
+}
+.#{$ti-prefix}-arrow-down:before {
+ content: $ti-icon-arrow-down;
+}
+.#{$ti-prefix}-arrow-down-bar:before {
+ content: $ti-icon-arrow-down-bar;
+}
+.#{$ti-prefix}-arrow-down-circle:before {
+ content: $ti-icon-arrow-down-circle;
+}
+.#{$ti-prefix}-arrow-down-from-arc:before {
+ content: $ti-icon-arrow-down-from-arc;
+}
+.#{$ti-prefix}-arrow-down-left:before {
+ content: $ti-icon-arrow-down-left;
+}
+.#{$ti-prefix}-arrow-down-left-circle:before {
+ content: $ti-icon-arrow-down-left-circle;
+}
+.#{$ti-prefix}-arrow-down-rhombus:before {
+ content: $ti-icon-arrow-down-rhombus;
+}
+.#{$ti-prefix}-arrow-down-right:before {
+ content: $ti-icon-arrow-down-right;
+}
+.#{$ti-prefix}-arrow-down-right-circle:before {
+ content: $ti-icon-arrow-down-right-circle;
+}
+.#{$ti-prefix}-arrow-down-square:before {
+ content: $ti-icon-arrow-down-square;
+}
+.#{$ti-prefix}-arrow-down-tail:before {
+ content: $ti-icon-arrow-down-tail;
+}
+.#{$ti-prefix}-arrow-down-to-arc:before {
+ content: $ti-icon-arrow-down-to-arc;
+}
+.#{$ti-prefix}-arrow-elbow-left:before {
+ content: $ti-icon-arrow-elbow-left;
+}
+.#{$ti-prefix}-arrow-elbow-right:before {
+ content: $ti-icon-arrow-elbow-right;
+}
+.#{$ti-prefix}-arrow-fork:before {
+ content: $ti-icon-arrow-fork;
+}
+.#{$ti-prefix}-arrow-forward:before {
+ content: $ti-icon-arrow-forward;
+}
+.#{$ti-prefix}-arrow-forward-up:before {
+ content: $ti-icon-arrow-forward-up;
+}
+.#{$ti-prefix}-arrow-forward-up-double:before {
+ content: $ti-icon-arrow-forward-up-double;
+}
+.#{$ti-prefix}-arrow-guide:before {
+ content: $ti-icon-arrow-guide;
+}
+.#{$ti-prefix}-arrow-iteration:before {
+ content: $ti-icon-arrow-iteration;
+}
+.#{$ti-prefix}-arrow-left:before {
+ content: $ti-icon-arrow-left;
+}
+.#{$ti-prefix}-arrow-left-bar:before {
+ content: $ti-icon-arrow-left-bar;
+}
+.#{$ti-prefix}-arrow-left-circle:before {
+ content: $ti-icon-arrow-left-circle;
+}
+.#{$ti-prefix}-arrow-left-from-arc:before {
+ content: $ti-icon-arrow-left-from-arc;
+}
+.#{$ti-prefix}-arrow-left-rhombus:before {
+ content: $ti-icon-arrow-left-rhombus;
+}
+.#{$ti-prefix}-arrow-left-right:before {
+ content: $ti-icon-arrow-left-right;
+}
+.#{$ti-prefix}-arrow-left-square:before {
+ content: $ti-icon-arrow-left-square;
+}
+.#{$ti-prefix}-arrow-left-tail:before {
+ content: $ti-icon-arrow-left-tail;
+}
+.#{$ti-prefix}-arrow-left-to-arc:before {
+ content: $ti-icon-arrow-left-to-arc;
+}
+.#{$ti-prefix}-arrow-loop-left:before {
+ content: $ti-icon-arrow-loop-left;
+}
+.#{$ti-prefix}-arrow-loop-left-2:before {
+ content: $ti-icon-arrow-loop-left-2;
+}
+.#{$ti-prefix}-arrow-loop-right:before {
+ content: $ti-icon-arrow-loop-right;
+}
+.#{$ti-prefix}-arrow-loop-right-2:before {
+ content: $ti-icon-arrow-loop-right-2;
+}
+.#{$ti-prefix}-arrow-merge:before {
+ content: $ti-icon-arrow-merge;
+}
+.#{$ti-prefix}-arrow-merge-alt-left:before {
+ content: $ti-icon-arrow-merge-alt-left;
+}
+.#{$ti-prefix}-arrow-merge-alt-right:before {
+ content: $ti-icon-arrow-merge-alt-right;
+}
+.#{$ti-prefix}-arrow-merge-both:before {
+ content: $ti-icon-arrow-merge-both;
+}
+.#{$ti-prefix}-arrow-merge-left:before {
+ content: $ti-icon-arrow-merge-left;
+}
+.#{$ti-prefix}-arrow-merge-right:before {
+ content: $ti-icon-arrow-merge-right;
+}
+.#{$ti-prefix}-arrow-move-down:before {
+ content: $ti-icon-arrow-move-down;
+}
+.#{$ti-prefix}-arrow-move-left:before {
+ content: $ti-icon-arrow-move-left;
+}
+.#{$ti-prefix}-arrow-move-right:before {
+ content: $ti-icon-arrow-move-right;
+}
+.#{$ti-prefix}-arrow-move-up:before {
+ content: $ti-icon-arrow-move-up;
+}
+.#{$ti-prefix}-arrow-narrow-down:before {
+ content: $ti-icon-arrow-narrow-down;
+}
+.#{$ti-prefix}-arrow-narrow-left:before {
+ content: $ti-icon-arrow-narrow-left;
+}
+.#{$ti-prefix}-arrow-narrow-right:before {
+ content: $ti-icon-arrow-narrow-right;
+}
+.#{$ti-prefix}-arrow-narrow-up:before {
+ content: $ti-icon-arrow-narrow-up;
+}
+.#{$ti-prefix}-arrow-ramp-left:before {
+ content: $ti-icon-arrow-ramp-left;
+}
+.#{$ti-prefix}-arrow-ramp-left-2:before {
+ content: $ti-icon-arrow-ramp-left-2;
+}
+.#{$ti-prefix}-arrow-ramp-left-3:before {
+ content: $ti-icon-arrow-ramp-left-3;
+}
+.#{$ti-prefix}-arrow-ramp-right:before {
+ content: $ti-icon-arrow-ramp-right;
+}
+.#{$ti-prefix}-arrow-ramp-right-2:before {
+ content: $ti-icon-arrow-ramp-right-2;
+}
+.#{$ti-prefix}-arrow-ramp-right-3:before {
+ content: $ti-icon-arrow-ramp-right-3;
+}
+.#{$ti-prefix}-arrow-right:before {
+ content: $ti-icon-arrow-right;
+}
+.#{$ti-prefix}-arrow-right-bar:before {
+ content: $ti-icon-arrow-right-bar;
+}
+.#{$ti-prefix}-arrow-right-circle:before {
+ content: $ti-icon-arrow-right-circle;
+}
+.#{$ti-prefix}-arrow-right-from-arc:before {
+ content: $ti-icon-arrow-right-from-arc;
+}
+.#{$ti-prefix}-arrow-right-rhombus:before {
+ content: $ti-icon-arrow-right-rhombus;
+}
+.#{$ti-prefix}-arrow-right-square:before {
+ content: $ti-icon-arrow-right-square;
+}
+.#{$ti-prefix}-arrow-right-tail:before {
+ content: $ti-icon-arrow-right-tail;
+}
+.#{$ti-prefix}-arrow-right-to-arc:before {
+ content: $ti-icon-arrow-right-to-arc;
+}
+.#{$ti-prefix}-arrow-rotary-first-left:before {
+ content: $ti-icon-arrow-rotary-first-left;
+}
+.#{$ti-prefix}-arrow-rotary-first-right:before {
+ content: $ti-icon-arrow-rotary-first-right;
+}
+.#{$ti-prefix}-arrow-rotary-last-left:before {
+ content: $ti-icon-arrow-rotary-last-left;
+}
+.#{$ti-prefix}-arrow-rotary-last-right:before {
+ content: $ti-icon-arrow-rotary-last-right;
+}
+.#{$ti-prefix}-arrow-rotary-left:before {
+ content: $ti-icon-arrow-rotary-left;
+}
+.#{$ti-prefix}-arrow-rotary-right:before {
+ content: $ti-icon-arrow-rotary-right;
+}
+.#{$ti-prefix}-arrow-rotary-straight:before {
+ content: $ti-icon-arrow-rotary-straight;
+}
+.#{$ti-prefix}-arrow-roundabout-left:before {
+ content: $ti-icon-arrow-roundabout-left;
+}
+.#{$ti-prefix}-arrow-roundabout-right:before {
+ content: $ti-icon-arrow-roundabout-right;
+}
+.#{$ti-prefix}-arrow-sharp-turn-left:before {
+ content: $ti-icon-arrow-sharp-turn-left;
+}
+.#{$ti-prefix}-arrow-sharp-turn-right:before {
+ content: $ti-icon-arrow-sharp-turn-right;
+}
+.#{$ti-prefix}-arrow-up:before {
+ content: $ti-icon-arrow-up;
+}
+.#{$ti-prefix}-arrow-up-bar:before {
+ content: $ti-icon-arrow-up-bar;
+}
+.#{$ti-prefix}-arrow-up-circle:before {
+ content: $ti-icon-arrow-up-circle;
+}
+.#{$ti-prefix}-arrow-up-from-arc:before {
+ content: $ti-icon-arrow-up-from-arc;
+}
+.#{$ti-prefix}-arrow-up-left:before {
+ content: $ti-icon-arrow-up-left;
+}
+.#{$ti-prefix}-arrow-up-left-circle:before {
+ content: $ti-icon-arrow-up-left-circle;
+}
+.#{$ti-prefix}-arrow-up-rhombus:before {
+ content: $ti-icon-arrow-up-rhombus;
+}
+.#{$ti-prefix}-arrow-up-right:before {
+ content: $ti-icon-arrow-up-right;
+}
+.#{$ti-prefix}-arrow-up-right-circle:before {
+ content: $ti-icon-arrow-up-right-circle;
+}
+.#{$ti-prefix}-arrow-up-square:before {
+ content: $ti-icon-arrow-up-square;
+}
+.#{$ti-prefix}-arrow-up-tail:before {
+ content: $ti-icon-arrow-up-tail;
+}
+.#{$ti-prefix}-arrow-up-to-arc:before {
+ content: $ti-icon-arrow-up-to-arc;
+}
+.#{$ti-prefix}-arrow-wave-left-down:before {
+ content: $ti-icon-arrow-wave-left-down;
+}
+.#{$ti-prefix}-arrow-wave-left-up:before {
+ content: $ti-icon-arrow-wave-left-up;
+}
+.#{$ti-prefix}-arrow-wave-right-down:before {
+ content: $ti-icon-arrow-wave-right-down;
+}
+.#{$ti-prefix}-arrow-wave-right-up:before {
+ content: $ti-icon-arrow-wave-right-up;
+}
+.#{$ti-prefix}-arrow-zig-zag:before {
+ content: $ti-icon-arrow-zig-zag;
+}
+.#{$ti-prefix}-arrows-cross:before {
+ content: $ti-icon-arrows-cross;
+}
+.#{$ti-prefix}-arrows-diagonal:before {
+ content: $ti-icon-arrows-diagonal;
+}
+.#{$ti-prefix}-arrows-diagonal-2:before {
+ content: $ti-icon-arrows-diagonal-2;
+}
+.#{$ti-prefix}-arrows-diagonal-minimize:before {
+ content: $ti-icon-arrows-diagonal-minimize;
+}
+.#{$ti-prefix}-arrows-diagonal-minimize-2:before {
+ content: $ti-icon-arrows-diagonal-minimize-2;
+}
+.#{$ti-prefix}-arrows-diff:before {
+ content: $ti-icon-arrows-diff;
+}
+.#{$ti-prefix}-arrows-double-ne-sw:before {
+ content: $ti-icon-arrows-double-ne-sw;
+}
+.#{$ti-prefix}-arrows-double-nw-se:before {
+ content: $ti-icon-arrows-double-nw-se;
+}
+.#{$ti-prefix}-arrows-double-se-nw:before {
+ content: $ti-icon-arrows-double-se-nw;
+}
+.#{$ti-prefix}-arrows-double-sw-ne:before {
+ content: $ti-icon-arrows-double-sw-ne;
+}
+.#{$ti-prefix}-arrows-down:before {
+ content: $ti-icon-arrows-down;
+}
+.#{$ti-prefix}-arrows-down-up:before {
+ content: $ti-icon-arrows-down-up;
+}
+.#{$ti-prefix}-arrows-exchange:before {
+ content: $ti-icon-arrows-exchange;
+}
+.#{$ti-prefix}-arrows-exchange-2:before {
+ content: $ti-icon-arrows-exchange-2;
+}
+.#{$ti-prefix}-arrows-horizontal:before {
+ content: $ti-icon-arrows-horizontal;
+}
+.#{$ti-prefix}-arrows-join:before {
+ content: $ti-icon-arrows-join;
+}
+.#{$ti-prefix}-arrows-join-2:before {
+ content: $ti-icon-arrows-join-2;
+}
+.#{$ti-prefix}-arrows-left:before {
+ content: $ti-icon-arrows-left;
+}
+.#{$ti-prefix}-arrows-left-down:before {
+ content: $ti-icon-arrows-left-down;
+}
+.#{$ti-prefix}-arrows-left-right:before {
+ content: $ti-icon-arrows-left-right;
+}
+.#{$ti-prefix}-arrows-maximize:before {
+ content: $ti-icon-arrows-maximize;
+}
+.#{$ti-prefix}-arrows-minimize:before {
+ content: $ti-icon-arrows-minimize;
+}
+.#{$ti-prefix}-arrows-move:before {
+ content: $ti-icon-arrows-move;
+}
+.#{$ti-prefix}-arrows-move-horizontal:before {
+ content: $ti-icon-arrows-move-horizontal;
+}
+.#{$ti-prefix}-arrows-move-vertical:before {
+ content: $ti-icon-arrows-move-vertical;
+}
+.#{$ti-prefix}-arrows-random:before {
+ content: $ti-icon-arrows-random;
+}
+.#{$ti-prefix}-arrows-right:before {
+ content: $ti-icon-arrows-right;
+}
+.#{$ti-prefix}-arrows-right-down:before {
+ content: $ti-icon-arrows-right-down;
+}
+.#{$ti-prefix}-arrows-right-left:before {
+ content: $ti-icon-arrows-right-left;
+}
+.#{$ti-prefix}-arrows-shuffle:before {
+ content: $ti-icon-arrows-shuffle;
+}
+.#{$ti-prefix}-arrows-shuffle-2:before {
+ content: $ti-icon-arrows-shuffle-2;
+}
+.#{$ti-prefix}-arrows-sort:before {
+ content: $ti-icon-arrows-sort;
+}
+.#{$ti-prefix}-arrows-split:before {
+ content: $ti-icon-arrows-split;
+}
+.#{$ti-prefix}-arrows-split-2:before {
+ content: $ti-icon-arrows-split-2;
+}
+.#{$ti-prefix}-arrows-transfer-down:before {
+ content: $ti-icon-arrows-transfer-down;
+}
+.#{$ti-prefix}-arrows-transfer-up:before {
+ content: $ti-icon-arrows-transfer-up;
+}
+.#{$ti-prefix}-arrows-up:before {
+ content: $ti-icon-arrows-up;
+}
+.#{$ti-prefix}-arrows-up-down:before {
+ content: $ti-icon-arrows-up-down;
+}
+.#{$ti-prefix}-arrows-up-left:before {
+ content: $ti-icon-arrows-up-left;
+}
+.#{$ti-prefix}-arrows-up-right:before {
+ content: $ti-icon-arrows-up-right;
+}
+.#{$ti-prefix}-arrows-vertical:before {
+ content: $ti-icon-arrows-vertical;
+}
+.#{$ti-prefix}-artboard:before {
+ content: $ti-icon-artboard;
+}
+.#{$ti-prefix}-artboard-filled:before {
+ content: $ti-icon-artboard-filled;
+}
+.#{$ti-prefix}-artboard-off:before {
+ content: $ti-icon-artboard-off;
+}
+.#{$ti-prefix}-article:before {
+ content: $ti-icon-article;
+}
+.#{$ti-prefix}-article-filled:before {
+ content: $ti-icon-article-filled;
+}
+.#{$ti-prefix}-article-off:before {
+ content: $ti-icon-article-off;
+}
+.#{$ti-prefix}-aspect-ratio:before {
+ content: $ti-icon-aspect-ratio;
+}
+.#{$ti-prefix}-aspect-ratio-filled:before {
+ content: $ti-icon-aspect-ratio-filled;
+}
+.#{$ti-prefix}-aspect-ratio-off:before {
+ content: $ti-icon-aspect-ratio-off;
+}
+.#{$ti-prefix}-assembly:before {
+ content: $ti-icon-assembly;
+}
+.#{$ti-prefix}-assembly-filled:before {
+ content: $ti-icon-assembly-filled;
+}
+.#{$ti-prefix}-assembly-off:before {
+ content: $ti-icon-assembly-off;
+}
+.#{$ti-prefix}-asset:before {
+ content: $ti-icon-asset;
+}
+.#{$ti-prefix}-asset-filled:before {
+ content: $ti-icon-asset-filled;
+}
+.#{$ti-prefix}-asterisk:before {
+ content: $ti-icon-asterisk;
+}
+.#{$ti-prefix}-asterisk-simple:before {
+ content: $ti-icon-asterisk-simple;
+}
+.#{$ti-prefix}-at:before {
+ content: $ti-icon-at;
+}
+.#{$ti-prefix}-at-off:before {
+ content: $ti-icon-at-off;
+}
+.#{$ti-prefix}-atom:before {
+ content: $ti-icon-atom;
+}
+.#{$ti-prefix}-atom-2:before {
+ content: $ti-icon-atom-2;
+}
+.#{$ti-prefix}-atom-2-filled:before {
+ content: $ti-icon-atom-2-filled;
+}
+.#{$ti-prefix}-atom-off:before {
+ content: $ti-icon-atom-off;
+}
+.#{$ti-prefix}-augmented-reality:before {
+ content: $ti-icon-augmented-reality;
+}
+.#{$ti-prefix}-augmented-reality-2:before {
+ content: $ti-icon-augmented-reality-2;
+}
+.#{$ti-prefix}-augmented-reality-off:before {
+ content: $ti-icon-augmented-reality-off;
+}
+.#{$ti-prefix}-auth-2fa:before {
+ content: $ti-icon-auth-2fa;
+}
+.#{$ti-prefix}-automatic-gearbox:before {
+ content: $ti-icon-automatic-gearbox;
+}
+.#{$ti-prefix}-avocado:before {
+ content: $ti-icon-avocado;
+}
+.#{$ti-prefix}-award:before {
+ content: $ti-icon-award;
+}
+.#{$ti-prefix}-award-filled:before {
+ content: $ti-icon-award-filled;
+}
+.#{$ti-prefix}-award-off:before {
+ content: $ti-icon-award-off;
+}
+.#{$ti-prefix}-axe:before {
+ content: $ti-icon-axe;
+}
+.#{$ti-prefix}-axis-x:before {
+ content: $ti-icon-axis-x;
+}
+.#{$ti-prefix}-axis-y:before {
+ content: $ti-icon-axis-y;
+}
+.#{$ti-prefix}-baby-bottle:before {
+ content: $ti-icon-baby-bottle;
+}
+.#{$ti-prefix}-baby-carriage:before {
+ content: $ti-icon-baby-carriage;
+}
+.#{$ti-prefix}-baby-carriage-filled:before {
+ content: $ti-icon-baby-carriage-filled;
+}
+.#{$ti-prefix}-background:before {
+ content: $ti-icon-background;
+}
+.#{$ti-prefix}-backhoe:before {
+ content: $ti-icon-backhoe;
+}
+.#{$ti-prefix}-backpack:before {
+ content: $ti-icon-backpack;
+}
+.#{$ti-prefix}-backpack-off:before {
+ content: $ti-icon-backpack-off;
+}
+.#{$ti-prefix}-backslash:before {
+ content: $ti-icon-backslash;
+}
+.#{$ti-prefix}-backspace:before {
+ content: $ti-icon-backspace;
+}
+.#{$ti-prefix}-backspace-filled:before {
+ content: $ti-icon-backspace-filled;
+}
+.#{$ti-prefix}-badge:before {
+ content: $ti-icon-badge;
+}
+.#{$ti-prefix}-badge-3d:before {
+ content: $ti-icon-badge-3d;
+}
+.#{$ti-prefix}-badge-3d-filled:before {
+ content: $ti-icon-badge-3d-filled;
+}
+.#{$ti-prefix}-badge-4k:before {
+ content: $ti-icon-badge-4k;
+}
+.#{$ti-prefix}-badge-4k-filled:before {
+ content: $ti-icon-badge-4k-filled;
+}
+.#{$ti-prefix}-badge-8k:before {
+ content: $ti-icon-badge-8k;
+}
+.#{$ti-prefix}-badge-8k-filled:before {
+ content: $ti-icon-badge-8k-filled;
+}
+.#{$ti-prefix}-badge-ad:before {
+ content: $ti-icon-badge-ad;
+}
+.#{$ti-prefix}-badge-ad-filled:before {
+ content: $ti-icon-badge-ad-filled;
+}
+.#{$ti-prefix}-badge-ad-off:before {
+ content: $ti-icon-badge-ad-off;
+}
+.#{$ti-prefix}-badge-ar:before {
+ content: $ti-icon-badge-ar;
+}
+.#{$ti-prefix}-badge-ar-filled:before {
+ content: $ti-icon-badge-ar-filled;
+}
+.#{$ti-prefix}-badge-cc:before {
+ content: $ti-icon-badge-cc;
+}
+.#{$ti-prefix}-badge-cc-filled:before {
+ content: $ti-icon-badge-cc-filled;
+}
+.#{$ti-prefix}-badge-filled:before {
+ content: $ti-icon-badge-filled;
+}
+.#{$ti-prefix}-badge-hd:before {
+ content: $ti-icon-badge-hd;
+}
+.#{$ti-prefix}-badge-hd-filled:before {
+ content: $ti-icon-badge-hd-filled;
+}
+.#{$ti-prefix}-badge-off:before {
+ content: $ti-icon-badge-off;
+}
+.#{$ti-prefix}-badge-sd:before {
+ content: $ti-icon-badge-sd;
+}
+.#{$ti-prefix}-badge-sd-filled:before {
+ content: $ti-icon-badge-sd-filled;
+}
+.#{$ti-prefix}-badge-tm:before {
+ content: $ti-icon-badge-tm;
+}
+.#{$ti-prefix}-badge-tm-filled:before {
+ content: $ti-icon-badge-tm-filled;
+}
+.#{$ti-prefix}-badge-vo:before {
+ content: $ti-icon-badge-vo;
+}
+.#{$ti-prefix}-badge-vo-filled:before {
+ content: $ti-icon-badge-vo-filled;
+}
+.#{$ti-prefix}-badge-vr:before {
+ content: $ti-icon-badge-vr;
+}
+.#{$ti-prefix}-badge-vr-filled:before {
+ content: $ti-icon-badge-vr-filled;
+}
+.#{$ti-prefix}-badge-wc:before {
+ content: $ti-icon-badge-wc;
+}
+.#{$ti-prefix}-badge-wc-filled:before {
+ content: $ti-icon-badge-wc-filled;
+}
+.#{$ti-prefix}-badges:before {
+ content: $ti-icon-badges;
+}
+.#{$ti-prefix}-badges-filled:before {
+ content: $ti-icon-badges-filled;
+}
+.#{$ti-prefix}-badges-off:before {
+ content: $ti-icon-badges-off;
+}
+.#{$ti-prefix}-baguette:before {
+ content: $ti-icon-baguette;
+}
+.#{$ti-prefix}-ball-american-football:before {
+ content: $ti-icon-ball-american-football;
+}
+.#{$ti-prefix}-ball-american-football-off:before {
+ content: $ti-icon-ball-american-football-off;
+}
+.#{$ti-prefix}-ball-baseball:before {
+ content: $ti-icon-ball-baseball;
+}
+.#{$ti-prefix}-ball-basketball:before {
+ content: $ti-icon-ball-basketball;
+}
+.#{$ti-prefix}-ball-bowling:before {
+ content: $ti-icon-ball-bowling;
+}
+.#{$ti-prefix}-ball-football:before {
+ content: $ti-icon-ball-football;
+}
+.#{$ti-prefix}-ball-football-off:before {
+ content: $ti-icon-ball-football-off;
+}
+.#{$ti-prefix}-ball-tennis:before {
+ content: $ti-icon-ball-tennis;
+}
+.#{$ti-prefix}-ball-volleyball:before {
+ content: $ti-icon-ball-volleyball;
+}
+.#{$ti-prefix}-balloon:before {
+ content: $ti-icon-balloon;
+}
+.#{$ti-prefix}-balloon-filled:before {
+ content: $ti-icon-balloon-filled;
+}
+.#{$ti-prefix}-balloon-off:before {
+ content: $ti-icon-balloon-off;
+}
+.#{$ti-prefix}-ballpen:before {
+ content: $ti-icon-ballpen;
+}
+.#{$ti-prefix}-ballpen-filled:before {
+ content: $ti-icon-ballpen-filled;
+}
+.#{$ti-prefix}-ballpen-off:before {
+ content: $ti-icon-ballpen-off;
+}
+.#{$ti-prefix}-ban:before {
+ content: $ti-icon-ban;
+}
+.#{$ti-prefix}-bandage:before {
+ content: $ti-icon-bandage;
+}
+.#{$ti-prefix}-bandage-filled:before {
+ content: $ti-icon-bandage-filled;
+}
+.#{$ti-prefix}-bandage-off:before {
+ content: $ti-icon-bandage-off;
+}
+.#{$ti-prefix}-barbell:before {
+ content: $ti-icon-barbell;
+}
+.#{$ti-prefix}-barbell-filled:before {
+ content: $ti-icon-barbell-filled;
+}
+.#{$ti-prefix}-barbell-off:before {
+ content: $ti-icon-barbell-off;
+}
+.#{$ti-prefix}-barcode:before {
+ content: $ti-icon-barcode;
+}
+.#{$ti-prefix}-barcode-off:before {
+ content: $ti-icon-barcode-off;
+}
+.#{$ti-prefix}-barrel:before {
+ content: $ti-icon-barrel;
+}
+.#{$ti-prefix}-barrel-off:before {
+ content: $ti-icon-barrel-off;
+}
+.#{$ti-prefix}-barrier-block:before {
+ content: $ti-icon-barrier-block;
+}
+.#{$ti-prefix}-barrier-block-filled:before {
+ content: $ti-icon-barrier-block-filled;
+}
+.#{$ti-prefix}-barrier-block-off:before {
+ content: $ti-icon-barrier-block-off;
+}
+.#{$ti-prefix}-baseline:before {
+ content: $ti-icon-baseline;
+}
+.#{$ti-prefix}-baseline-density-large:before {
+ content: $ti-icon-baseline-density-large;
+}
+.#{$ti-prefix}-baseline-density-medium:before {
+ content: $ti-icon-baseline-density-medium;
+}
+.#{$ti-prefix}-baseline-density-small:before {
+ content: $ti-icon-baseline-density-small;
+}
+.#{$ti-prefix}-basket:before {
+ content: $ti-icon-basket;
+}
+.#{$ti-prefix}-basket-bolt:before {
+ content: $ti-icon-basket-bolt;
+}
+.#{$ti-prefix}-basket-cancel:before {
+ content: $ti-icon-basket-cancel;
+}
+.#{$ti-prefix}-basket-check:before {
+ content: $ti-icon-basket-check;
+}
+.#{$ti-prefix}-basket-code:before {
+ content: $ti-icon-basket-code;
+}
+.#{$ti-prefix}-basket-cog:before {
+ content: $ti-icon-basket-cog;
+}
+.#{$ti-prefix}-basket-discount:before {
+ content: $ti-icon-basket-discount;
+}
+.#{$ti-prefix}-basket-dollar:before {
+ content: $ti-icon-basket-dollar;
+}
+.#{$ti-prefix}-basket-down:before {
+ content: $ti-icon-basket-down;
+}
+.#{$ti-prefix}-basket-exclamation:before {
+ content: $ti-icon-basket-exclamation;
+}
+.#{$ti-prefix}-basket-filled:before {
+ content: $ti-icon-basket-filled;
+}
+.#{$ti-prefix}-basket-heart:before {
+ content: $ti-icon-basket-heart;
+}
+.#{$ti-prefix}-basket-minus:before {
+ content: $ti-icon-basket-minus;
+}
+.#{$ti-prefix}-basket-off:before {
+ content: $ti-icon-basket-off;
+}
+.#{$ti-prefix}-basket-pause:before {
+ content: $ti-icon-basket-pause;
+}
+.#{$ti-prefix}-basket-pin:before {
+ content: $ti-icon-basket-pin;
+}
+.#{$ti-prefix}-basket-plus:before {
+ content: $ti-icon-basket-plus;
+}
+.#{$ti-prefix}-basket-question:before {
+ content: $ti-icon-basket-question;
+}
+.#{$ti-prefix}-basket-search:before {
+ content: $ti-icon-basket-search;
+}
+.#{$ti-prefix}-basket-share:before {
+ content: $ti-icon-basket-share;
+}
+.#{$ti-prefix}-basket-star:before {
+ content: $ti-icon-basket-star;
+}
+.#{$ti-prefix}-basket-up:before {
+ content: $ti-icon-basket-up;
+}
+.#{$ti-prefix}-basket-x:before {
+ content: $ti-icon-basket-x;
+}
+.#{$ti-prefix}-bat:before {
+ content: $ti-icon-bat;
+}
+.#{$ti-prefix}-bath:before {
+ content: $ti-icon-bath;
+}
+.#{$ti-prefix}-bath-filled:before {
+ content: $ti-icon-bath-filled;
+}
+.#{$ti-prefix}-bath-off:before {
+ content: $ti-icon-bath-off;
+}
+.#{$ti-prefix}-battery:before {
+ content: $ti-icon-battery;
+}
+.#{$ti-prefix}-battery-1:before {
+ content: $ti-icon-battery-1;
+}
+.#{$ti-prefix}-battery-1-filled:before {
+ content: $ti-icon-battery-1-filled;
+}
+.#{$ti-prefix}-battery-2:before {
+ content: $ti-icon-battery-2;
+}
+.#{$ti-prefix}-battery-2-filled:before {
+ content: $ti-icon-battery-2-filled;
+}
+.#{$ti-prefix}-battery-3:before {
+ content: $ti-icon-battery-3;
+}
+.#{$ti-prefix}-battery-3-filled:before {
+ content: $ti-icon-battery-3-filled;
+}
+.#{$ti-prefix}-battery-4:before {
+ content: $ti-icon-battery-4;
+}
+.#{$ti-prefix}-battery-4-filled:before {
+ content: $ti-icon-battery-4-filled;
+}
+.#{$ti-prefix}-battery-automotive:before {
+ content: $ti-icon-battery-automotive;
+}
+.#{$ti-prefix}-battery-charging:before {
+ content: $ti-icon-battery-charging;
+}
+.#{$ti-prefix}-battery-charging-2:before {
+ content: $ti-icon-battery-charging-2;
+}
+.#{$ti-prefix}-battery-eco:before {
+ content: $ti-icon-battery-eco;
+}
+.#{$ti-prefix}-battery-filled:before {
+ content: $ti-icon-battery-filled;
+}
+.#{$ti-prefix}-battery-off:before {
+ content: $ti-icon-battery-off;
+}
+.#{$ti-prefix}-beach:before {
+ content: $ti-icon-beach;
+}
+.#{$ti-prefix}-beach-off:before {
+ content: $ti-icon-beach-off;
+}
+.#{$ti-prefix}-bed:before {
+ content: $ti-icon-bed;
+}
+.#{$ti-prefix}-bed-filled:before {
+ content: $ti-icon-bed-filled;
+}
+.#{$ti-prefix}-bed-flat:before {
+ content: $ti-icon-bed-flat;
+}
+.#{$ti-prefix}-bed-flat-filled:before {
+ content: $ti-icon-bed-flat-filled;
+}
+.#{$ti-prefix}-bed-off:before {
+ content: $ti-icon-bed-off;
+}
+.#{$ti-prefix}-beer:before {
+ content: $ti-icon-beer;
+}
+.#{$ti-prefix}-beer-filled:before {
+ content: $ti-icon-beer-filled;
+}
+.#{$ti-prefix}-beer-off:before {
+ content: $ti-icon-beer-off;
+}
+.#{$ti-prefix}-bell:before {
+ content: $ti-icon-bell;
+}
+.#{$ti-prefix}-bell-bolt:before {
+ content: $ti-icon-bell-bolt;
+}
+.#{$ti-prefix}-bell-cancel:before {
+ content: $ti-icon-bell-cancel;
+}
+.#{$ti-prefix}-bell-check:before {
+ content: $ti-icon-bell-check;
+}
+.#{$ti-prefix}-bell-code:before {
+ content: $ti-icon-bell-code;
+}
+.#{$ti-prefix}-bell-cog:before {
+ content: $ti-icon-bell-cog;
+}
+.#{$ti-prefix}-bell-dollar:before {
+ content: $ti-icon-bell-dollar;
+}
+.#{$ti-prefix}-bell-down:before {
+ content: $ti-icon-bell-down;
+}
+.#{$ti-prefix}-bell-exclamation:before {
+ content: $ti-icon-bell-exclamation;
+}
+.#{$ti-prefix}-bell-filled:before {
+ content: $ti-icon-bell-filled;
+}
+.#{$ti-prefix}-bell-heart:before {
+ content: $ti-icon-bell-heart;
+}
+.#{$ti-prefix}-bell-minus:before {
+ content: $ti-icon-bell-minus;
+}
+.#{$ti-prefix}-bell-minus-filled:before {
+ content: $ti-icon-bell-minus-filled;
+}
+.#{$ti-prefix}-bell-off:before {
+ content: $ti-icon-bell-off;
+}
+.#{$ti-prefix}-bell-pause:before {
+ content: $ti-icon-bell-pause;
+}
+.#{$ti-prefix}-bell-pin:before {
+ content: $ti-icon-bell-pin;
+}
+.#{$ti-prefix}-bell-plus:before {
+ content: $ti-icon-bell-plus;
+}
+.#{$ti-prefix}-bell-plus-filled:before {
+ content: $ti-icon-bell-plus-filled;
+}
+.#{$ti-prefix}-bell-question:before {
+ content: $ti-icon-bell-question;
+}
+.#{$ti-prefix}-bell-ringing:before {
+ content: $ti-icon-bell-ringing;
+}
+.#{$ti-prefix}-bell-ringing-2:before {
+ content: $ti-icon-bell-ringing-2;
+}
+.#{$ti-prefix}-bell-ringing-2-filled:before {
+ content: $ti-icon-bell-ringing-2-filled;
+}
+.#{$ti-prefix}-bell-ringing-filled:before {
+ content: $ti-icon-bell-ringing-filled;
+}
+.#{$ti-prefix}-bell-school:before {
+ content: $ti-icon-bell-school;
+}
+.#{$ti-prefix}-bell-search:before {
+ content: $ti-icon-bell-search;
+}
+.#{$ti-prefix}-bell-share:before {
+ content: $ti-icon-bell-share;
+}
+.#{$ti-prefix}-bell-star:before {
+ content: $ti-icon-bell-star;
+}
+.#{$ti-prefix}-bell-up:before {
+ content: $ti-icon-bell-up;
+}
+.#{$ti-prefix}-bell-x:before {
+ content: $ti-icon-bell-x;
+}
+.#{$ti-prefix}-bell-x-filled:before {
+ content: $ti-icon-bell-x-filled;
+}
+.#{$ti-prefix}-bell-z:before {
+ content: $ti-icon-bell-z;
+}
+.#{$ti-prefix}-bell-z-filled:before {
+ content: $ti-icon-bell-z-filled;
+}
+.#{$ti-prefix}-beta:before {
+ content: $ti-icon-beta;
+}
+.#{$ti-prefix}-bible:before {
+ content: $ti-icon-bible;
+}
+.#{$ti-prefix}-bike:before {
+ content: $ti-icon-bike;
+}
+.#{$ti-prefix}-bike-off:before {
+ content: $ti-icon-bike-off;
+}
+.#{$ti-prefix}-binary:before {
+ content: $ti-icon-binary;
+}
+.#{$ti-prefix}-binary-off:before {
+ content: $ti-icon-binary-off;
+}
+.#{$ti-prefix}-binary-tree:before {
+ content: $ti-icon-binary-tree;
+}
+.#{$ti-prefix}-binary-tree-2:before {
+ content: $ti-icon-binary-tree-2;
+}
+.#{$ti-prefix}-biohazard:before {
+ content: $ti-icon-biohazard;
+}
+.#{$ti-prefix}-biohazard-filled:before {
+ content: $ti-icon-biohazard-filled;
+}
+.#{$ti-prefix}-biohazard-off:before {
+ content: $ti-icon-biohazard-off;
+}
+.#{$ti-prefix}-blade:before {
+ content: $ti-icon-blade;
+}
+.#{$ti-prefix}-blade-filled:before {
+ content: $ti-icon-blade-filled;
+}
+.#{$ti-prefix}-bleach:before {
+ content: $ti-icon-bleach;
+}
+.#{$ti-prefix}-bleach-chlorine:before {
+ content: $ti-icon-bleach-chlorine;
+}
+.#{$ti-prefix}-bleach-no-chlorine:before {
+ content: $ti-icon-bleach-no-chlorine;
+}
+.#{$ti-prefix}-bleach-off:before {
+ content: $ti-icon-bleach-off;
+}
+.#{$ti-prefix}-blend-mode:before {
+ content: $ti-icon-blend-mode;
+}
+.#{$ti-prefix}-blender:before {
+ content: $ti-icon-blender;
+}
+.#{$ti-prefix}-blob:before {
+ content: $ti-icon-blob;
+}
+.#{$ti-prefix}-blob-filled:before {
+ content: $ti-icon-blob-filled;
+}
+.#{$ti-prefix}-blockquote:before {
+ content: $ti-icon-blockquote;
+}
+.#{$ti-prefix}-bluetooth:before {
+ content: $ti-icon-bluetooth;
+}
+.#{$ti-prefix}-bluetooth-connected:before {
+ content: $ti-icon-bluetooth-connected;
+}
+.#{$ti-prefix}-bluetooth-off:before {
+ content: $ti-icon-bluetooth-off;
+}
+.#{$ti-prefix}-bluetooth-x:before {
+ content: $ti-icon-bluetooth-x;
+}
+.#{$ti-prefix}-blur:before {
+ content: $ti-icon-blur;
+}
+.#{$ti-prefix}-blur-off:before {
+ content: $ti-icon-blur-off;
+}
+.#{$ti-prefix}-bmp:before {
+ content: $ti-icon-bmp;
+}
+.#{$ti-prefix}-body-scan:before {
+ content: $ti-icon-body-scan;
+}
+.#{$ti-prefix}-bold:before {
+ content: $ti-icon-bold;
+}
+.#{$ti-prefix}-bold-off:before {
+ content: $ti-icon-bold-off;
+}
+.#{$ti-prefix}-bolt:before {
+ content: $ti-icon-bolt;
+}
+.#{$ti-prefix}-bolt-off:before {
+ content: $ti-icon-bolt-off;
+}
+.#{$ti-prefix}-bomb:before {
+ content: $ti-icon-bomb;
+}
+.#{$ti-prefix}-bomb-filled:before {
+ content: $ti-icon-bomb-filled;
+}
+.#{$ti-prefix}-bone:before {
+ content: $ti-icon-bone;
+}
+.#{$ti-prefix}-bone-filled:before {
+ content: $ti-icon-bone-filled;
+}
+.#{$ti-prefix}-bone-off:before {
+ content: $ti-icon-bone-off;
+}
+.#{$ti-prefix}-bong:before {
+ content: $ti-icon-bong;
+}
+.#{$ti-prefix}-bong-off:before {
+ content: $ti-icon-bong-off;
+}
+.#{$ti-prefix}-book:before {
+ content: $ti-icon-book;
+}
+.#{$ti-prefix}-book-2:before {
+ content: $ti-icon-book-2;
+}
+.#{$ti-prefix}-book-download:before {
+ content: $ti-icon-book-download;
+}
+.#{$ti-prefix}-book-filled:before {
+ content: $ti-icon-book-filled;
+}
+.#{$ti-prefix}-book-off:before {
+ content: $ti-icon-book-off;
+}
+.#{$ti-prefix}-book-upload:before {
+ content: $ti-icon-book-upload;
+}
+.#{$ti-prefix}-bookmark:before {
+ content: $ti-icon-bookmark;
+}
+.#{$ti-prefix}-bookmark-ai:before {
+ content: $ti-icon-bookmark-ai;
+}
+.#{$ti-prefix}-bookmark-edit:before {
+ content: $ti-icon-bookmark-edit;
+}
+.#{$ti-prefix}-bookmark-filled:before {
+ content: $ti-icon-bookmark-filled;
+}
+.#{$ti-prefix}-bookmark-minus:before {
+ content: $ti-icon-bookmark-minus;
+}
+.#{$ti-prefix}-bookmark-off:before {
+ content: $ti-icon-bookmark-off;
+}
+.#{$ti-prefix}-bookmark-plus:before {
+ content: $ti-icon-bookmark-plus;
+}
+.#{$ti-prefix}-bookmark-question:before {
+ content: $ti-icon-bookmark-question;
+}
+.#{$ti-prefix}-bookmarks:before {
+ content: $ti-icon-bookmarks;
+}
+.#{$ti-prefix}-bookmarks-filled:before {
+ content: $ti-icon-bookmarks-filled;
+}
+.#{$ti-prefix}-bookmarks-off:before {
+ content: $ti-icon-bookmarks-off;
+}
+.#{$ti-prefix}-books:before {
+ content: $ti-icon-books;
+}
+.#{$ti-prefix}-books-off:before {
+ content: $ti-icon-books-off;
+}
+.#{$ti-prefix}-boom:before {
+ content: $ti-icon-boom;
+}
+.#{$ti-prefix}-boom-filled:before {
+ content: $ti-icon-boom-filled;
+}
+.#{$ti-prefix}-border-all:before {
+ content: $ti-icon-border-all;
+}
+.#{$ti-prefix}-border-bottom:before {
+ content: $ti-icon-border-bottom;
+}
+.#{$ti-prefix}-border-bottom-plus:before {
+ content: $ti-icon-border-bottom-plus;
+}
+.#{$ti-prefix}-border-corner-ios:before {
+ content: $ti-icon-border-corner-ios;
+}
+.#{$ti-prefix}-border-corner-pill:before {
+ content: $ti-icon-border-corner-pill;
+}
+.#{$ti-prefix}-border-corner-rounded:before {
+ content: $ti-icon-border-corner-rounded;
+}
+.#{$ti-prefix}-border-corner-square:before {
+ content: $ti-icon-border-corner-square;
+}
+.#{$ti-prefix}-border-corners:before {
+ content: $ti-icon-border-corners;
+}
+.#{$ti-prefix}-border-horizontal:before {
+ content: $ti-icon-border-horizontal;
+}
+.#{$ti-prefix}-border-inner:before {
+ content: $ti-icon-border-inner;
+}
+.#{$ti-prefix}-border-left:before {
+ content: $ti-icon-border-left;
+}
+.#{$ti-prefix}-border-left-plus:before {
+ content: $ti-icon-border-left-plus;
+}
+.#{$ti-prefix}-border-none:before {
+ content: $ti-icon-border-none;
+}
+.#{$ti-prefix}-border-outer:before {
+ content: $ti-icon-border-outer;
+}
+.#{$ti-prefix}-border-radius:before {
+ content: $ti-icon-border-radius;
+}
+.#{$ti-prefix}-border-right:before {
+ content: $ti-icon-border-right;
+}
+.#{$ti-prefix}-border-right-plus:before {
+ content: $ti-icon-border-right-plus;
+}
+.#{$ti-prefix}-border-sides:before {
+ content: $ti-icon-border-sides;
+}
+.#{$ti-prefix}-border-style:before {
+ content: $ti-icon-border-style;
+}
+.#{$ti-prefix}-border-style-2:before {
+ content: $ti-icon-border-style-2;
+}
+.#{$ti-prefix}-border-top:before {
+ content: $ti-icon-border-top;
+}
+.#{$ti-prefix}-border-top-plus:before {
+ content: $ti-icon-border-top-plus;
+}
+.#{$ti-prefix}-border-vertical:before {
+ content: $ti-icon-border-vertical;
+}
+.#{$ti-prefix}-bottle:before {
+ content: $ti-icon-bottle;
+}
+.#{$ti-prefix}-bottle-filled:before {
+ content: $ti-icon-bottle-filled;
+}
+.#{$ti-prefix}-bottle-off:before {
+ content: $ti-icon-bottle-off;
+}
+.#{$ti-prefix}-bounce-left:before {
+ content: $ti-icon-bounce-left;
+}
+.#{$ti-prefix}-bounce-left-filled:before {
+ content: $ti-icon-bounce-left-filled;
+}
+.#{$ti-prefix}-bounce-right:before {
+ content: $ti-icon-bounce-right;
+}
+.#{$ti-prefix}-bounce-right-filled:before {
+ content: $ti-icon-bounce-right-filled;
+}
+.#{$ti-prefix}-bow:before {
+ content: $ti-icon-bow;
+}
+.#{$ti-prefix}-bow-filled:before {
+ content: $ti-icon-bow-filled;
+}
+.#{$ti-prefix}-bowl:before {
+ content: $ti-icon-bowl;
+}
+.#{$ti-prefix}-bowl-chopsticks:before {
+ content: $ti-icon-bowl-chopsticks;
+}
+.#{$ti-prefix}-bowl-chopsticks-filled:before {
+ content: $ti-icon-bowl-chopsticks-filled;
+}
+.#{$ti-prefix}-bowl-filled:before {
+ content: $ti-icon-bowl-filled;
+}
+.#{$ti-prefix}-bowl-spoon:before {
+ content: $ti-icon-bowl-spoon;
+}
+.#{$ti-prefix}-bowl-spoon-filled:before {
+ content: $ti-icon-bowl-spoon-filled;
+}
+.#{$ti-prefix}-box:before {
+ content: $ti-icon-box;
+}
+.#{$ti-prefix}-box-align-bottom:before {
+ content: $ti-icon-box-align-bottom;
+}
+.#{$ti-prefix}-box-align-bottom-filled:before {
+ content: $ti-icon-box-align-bottom-filled;
+}
+.#{$ti-prefix}-box-align-bottom-left:before {
+ content: $ti-icon-box-align-bottom-left;
+}
+.#{$ti-prefix}-box-align-bottom-left-filled:before {
+ content: $ti-icon-box-align-bottom-left-filled;
+}
+.#{$ti-prefix}-box-align-bottom-right:before {
+ content: $ti-icon-box-align-bottom-right;
+}
+.#{$ti-prefix}-box-align-bottom-right-filled:before {
+ content: $ti-icon-box-align-bottom-right-filled;
+}
+.#{$ti-prefix}-box-align-left:before {
+ content: $ti-icon-box-align-left;
+}
+.#{$ti-prefix}-box-align-left-filled:before {
+ content: $ti-icon-box-align-left-filled;
+}
+.#{$ti-prefix}-box-align-right:before {
+ content: $ti-icon-box-align-right;
+}
+.#{$ti-prefix}-box-align-right-filled:before {
+ content: $ti-icon-box-align-right-filled;
+}
+.#{$ti-prefix}-box-align-top:before {
+ content: $ti-icon-box-align-top;
+}
+.#{$ti-prefix}-box-align-top-filled:before {
+ content: $ti-icon-box-align-top-filled;
+}
+.#{$ti-prefix}-box-align-top-left:before {
+ content: $ti-icon-box-align-top-left;
+}
+.#{$ti-prefix}-box-align-top-left-filled:before {
+ content: $ti-icon-box-align-top-left-filled;
+}
+.#{$ti-prefix}-box-align-top-right:before {
+ content: $ti-icon-box-align-top-right;
+}
+.#{$ti-prefix}-box-align-top-right-filled:before {
+ content: $ti-icon-box-align-top-right-filled;
+}
+.#{$ti-prefix}-box-margin:before {
+ content: $ti-icon-box-margin;
+}
+.#{$ti-prefix}-box-model:before {
+ content: $ti-icon-box-model;
+}
+.#{$ti-prefix}-box-model-2:before {
+ content: $ti-icon-box-model-2;
+}
+.#{$ti-prefix}-box-model-2-off:before {
+ content: $ti-icon-box-model-2-off;
+}
+.#{$ti-prefix}-box-model-off:before {
+ content: $ti-icon-box-model-off;
+}
+.#{$ti-prefix}-box-multiple:before {
+ content: $ti-icon-box-multiple;
+}
+.#{$ti-prefix}-box-multiple-0:before {
+ content: $ti-icon-box-multiple-0;
+}
+.#{$ti-prefix}-box-multiple-1:before {
+ content: $ti-icon-box-multiple-1;
+}
+.#{$ti-prefix}-box-multiple-2:before {
+ content: $ti-icon-box-multiple-2;
+}
+.#{$ti-prefix}-box-multiple-3:before {
+ content: $ti-icon-box-multiple-3;
+}
+.#{$ti-prefix}-box-multiple-4:before {
+ content: $ti-icon-box-multiple-4;
+}
+.#{$ti-prefix}-box-multiple-5:before {
+ content: $ti-icon-box-multiple-5;
+}
+.#{$ti-prefix}-box-multiple-6:before {
+ content: $ti-icon-box-multiple-6;
+}
+.#{$ti-prefix}-box-multiple-7:before {
+ content: $ti-icon-box-multiple-7;
+}
+.#{$ti-prefix}-box-multiple-8:before {
+ content: $ti-icon-box-multiple-8;
+}
+.#{$ti-prefix}-box-multiple-9:before {
+ content: $ti-icon-box-multiple-9;
+}
+.#{$ti-prefix}-box-off:before {
+ content: $ti-icon-box-off;
+}
+.#{$ti-prefix}-box-padding:before {
+ content: $ti-icon-box-padding;
+}
+.#{$ti-prefix}-braces:before {
+ content: $ti-icon-braces;
+}
+.#{$ti-prefix}-braces-off:before {
+ content: $ti-icon-braces-off;
+}
+.#{$ti-prefix}-brackets:before {
+ content: $ti-icon-brackets;
+}
+.#{$ti-prefix}-brackets-angle:before {
+ content: $ti-icon-brackets-angle;
+}
+.#{$ti-prefix}-brackets-angle-off:before {
+ content: $ti-icon-brackets-angle-off;
+}
+.#{$ti-prefix}-brackets-contain:before {
+ content: $ti-icon-brackets-contain;
+}
+.#{$ti-prefix}-brackets-contain-end:before {
+ content: $ti-icon-brackets-contain-end;
+}
+.#{$ti-prefix}-brackets-contain-start:before {
+ content: $ti-icon-brackets-contain-start;
+}
+.#{$ti-prefix}-brackets-off:before {
+ content: $ti-icon-brackets-off;
+}
+.#{$ti-prefix}-braille:before {
+ content: $ti-icon-braille;
+}
+.#{$ti-prefix}-brain:before {
+ content: $ti-icon-brain;
+}
+.#{$ti-prefix}-brand-4chan:before {
+ content: $ti-icon-brand-4chan;
+}
+.#{$ti-prefix}-brand-abstract:before {
+ content: $ti-icon-brand-abstract;
+}
+.#{$ti-prefix}-brand-adobe:before {
+ content: $ti-icon-brand-adobe;
+}
+.#{$ti-prefix}-brand-adonis-js:before {
+ content: $ti-icon-brand-adonis-js;
+}
+.#{$ti-prefix}-brand-airbnb:before {
+ content: $ti-icon-brand-airbnb;
+}
+.#{$ti-prefix}-brand-airtable:before {
+ content: $ti-icon-brand-airtable;
+}
+.#{$ti-prefix}-brand-algolia:before {
+ content: $ti-icon-brand-algolia;
+}
+.#{$ti-prefix}-brand-alipay:before {
+ content: $ti-icon-brand-alipay;
+}
+.#{$ti-prefix}-brand-alpine-js:before {
+ content: $ti-icon-brand-alpine-js;
+}
+.#{$ti-prefix}-brand-amazon:before {
+ content: $ti-icon-brand-amazon;
+}
+.#{$ti-prefix}-brand-amd:before {
+ content: $ti-icon-brand-amd;
+}
+.#{$ti-prefix}-brand-amigo:before {
+ content: $ti-icon-brand-amigo;
+}
+.#{$ti-prefix}-brand-among-us:before {
+ content: $ti-icon-brand-among-us;
+}
+.#{$ti-prefix}-brand-android:before {
+ content: $ti-icon-brand-android;
+}
+.#{$ti-prefix}-brand-angular:before {
+ content: $ti-icon-brand-angular;
+}
+.#{$ti-prefix}-brand-ansible:before {
+ content: $ti-icon-brand-ansible;
+}
+.#{$ti-prefix}-brand-ao3:before {
+ content: $ti-icon-brand-ao3;
+}
+.#{$ti-prefix}-brand-appgallery:before {
+ content: $ti-icon-brand-appgallery;
+}
+.#{$ti-prefix}-brand-apple:before {
+ content: $ti-icon-brand-apple;
+}
+.#{$ti-prefix}-brand-apple-arcade:before {
+ content: $ti-icon-brand-apple-arcade;
+}
+.#{$ti-prefix}-brand-apple-filled:before {
+ content: $ti-icon-brand-apple-filled;
+}
+.#{$ti-prefix}-brand-apple-podcast:before {
+ content: $ti-icon-brand-apple-podcast;
+}
+.#{$ti-prefix}-brand-appstore:before {
+ content: $ti-icon-brand-appstore;
+}
+.#{$ti-prefix}-brand-arc:before {
+ content: $ti-icon-brand-arc;
+}
+.#{$ti-prefix}-brand-asana:before {
+ content: $ti-icon-brand-asana;
+}
+.#{$ti-prefix}-brand-astro:before {
+ content: $ti-icon-brand-astro;
+}
+.#{$ti-prefix}-brand-auth0:before {
+ content: $ti-icon-brand-auth0;
+}
+.#{$ti-prefix}-brand-aws:before {
+ content: $ti-icon-brand-aws;
+}
+.#{$ti-prefix}-brand-azure:before {
+ content: $ti-icon-brand-azure;
+}
+.#{$ti-prefix}-brand-backbone:before {
+ content: $ti-icon-brand-backbone;
+}
+.#{$ti-prefix}-brand-badoo:before {
+ content: $ti-icon-brand-badoo;
+}
+.#{$ti-prefix}-brand-baidu:before {
+ content: $ti-icon-brand-baidu;
+}
+.#{$ti-prefix}-brand-bandcamp:before {
+ content: $ti-icon-brand-bandcamp;
+}
+.#{$ti-prefix}-brand-bandlab:before {
+ content: $ti-icon-brand-bandlab;
+}
+.#{$ti-prefix}-brand-beats:before {
+ content: $ti-icon-brand-beats;
+}
+.#{$ti-prefix}-brand-behance:before {
+ content: $ti-icon-brand-behance;
+}
+.#{$ti-prefix}-brand-bilibili:before {
+ content: $ti-icon-brand-bilibili;
+}
+.#{$ti-prefix}-brand-binance:before {
+ content: $ti-icon-brand-binance;
+}
+.#{$ti-prefix}-brand-bing:before {
+ content: $ti-icon-brand-bing;
+}
+.#{$ti-prefix}-brand-bitbucket:before {
+ content: $ti-icon-brand-bitbucket;
+}
+.#{$ti-prefix}-brand-blackberry:before {
+ content: $ti-icon-brand-blackberry;
+}
+.#{$ti-prefix}-brand-blender:before {
+ content: $ti-icon-brand-blender;
+}
+.#{$ti-prefix}-brand-blogger:before {
+ content: $ti-icon-brand-blogger;
+}
+.#{$ti-prefix}-brand-bluesky:before {
+ content: $ti-icon-brand-bluesky;
+}
+.#{$ti-prefix}-brand-booking:before {
+ content: $ti-icon-brand-booking;
+}
+.#{$ti-prefix}-brand-bootstrap:before {
+ content: $ti-icon-brand-bootstrap;
+}
+.#{$ti-prefix}-brand-bulma:before {
+ content: $ti-icon-brand-bulma;
+}
+.#{$ti-prefix}-brand-bumble:before {
+ content: $ti-icon-brand-bumble;
+}
+.#{$ti-prefix}-brand-bunpo:before {
+ content: $ti-icon-brand-bunpo;
+}
+.#{$ti-prefix}-brand-c-sharp:before {
+ content: $ti-icon-brand-c-sharp;
+}
+.#{$ti-prefix}-brand-cake:before {
+ content: $ti-icon-brand-cake;
+}
+.#{$ti-prefix}-brand-cakephp:before {
+ content: $ti-icon-brand-cakephp;
+}
+.#{$ti-prefix}-brand-campaignmonitor:before {
+ content: $ti-icon-brand-campaignmonitor;
+}
+.#{$ti-prefix}-brand-carbon:before {
+ content: $ti-icon-brand-carbon;
+}
+.#{$ti-prefix}-brand-cashapp:before {
+ content: $ti-icon-brand-cashapp;
+}
+.#{$ti-prefix}-brand-chrome:before {
+ content: $ti-icon-brand-chrome;
+}
+.#{$ti-prefix}-brand-cinema-4d:before {
+ content: $ti-icon-brand-cinema-4d;
+}
+.#{$ti-prefix}-brand-citymapper:before {
+ content: $ti-icon-brand-citymapper;
+}
+.#{$ti-prefix}-brand-cloudflare:before {
+ content: $ti-icon-brand-cloudflare;
+}
+.#{$ti-prefix}-brand-codecov:before {
+ content: $ti-icon-brand-codecov;
+}
+.#{$ti-prefix}-brand-codepen:before {
+ content: $ti-icon-brand-codepen;
+}
+.#{$ti-prefix}-brand-codesandbox:before {
+ content: $ti-icon-brand-codesandbox;
+}
+.#{$ti-prefix}-brand-cohost:before {
+ content: $ti-icon-brand-cohost;
+}
+.#{$ti-prefix}-brand-coinbase:before {
+ content: $ti-icon-brand-coinbase;
+}
+.#{$ti-prefix}-brand-comedy-central:before {
+ content: $ti-icon-brand-comedy-central;
+}
+.#{$ti-prefix}-brand-coreos:before {
+ content: $ti-icon-brand-coreos;
+}
+.#{$ti-prefix}-brand-couchdb:before {
+ content: $ti-icon-brand-couchdb;
+}
+.#{$ti-prefix}-brand-couchsurfing:before {
+ content: $ti-icon-brand-couchsurfing;
+}
+.#{$ti-prefix}-brand-cpp:before {
+ content: $ti-icon-brand-cpp;
+}
+.#{$ti-prefix}-brand-craft:before {
+ content: $ti-icon-brand-craft;
+}
+.#{$ti-prefix}-brand-crunchbase:before {
+ content: $ti-icon-brand-crunchbase;
+}
+.#{$ti-prefix}-brand-css3:before {
+ content: $ti-icon-brand-css3;
+}
+.#{$ti-prefix}-brand-ctemplar:before {
+ content: $ti-icon-brand-ctemplar;
+}
+.#{$ti-prefix}-brand-cucumber:before {
+ content: $ti-icon-brand-cucumber;
+}
+.#{$ti-prefix}-brand-cupra:before {
+ content: $ti-icon-brand-cupra;
+}
+.#{$ti-prefix}-brand-cypress:before {
+ content: $ti-icon-brand-cypress;
+}
+.#{$ti-prefix}-brand-d3:before {
+ content: $ti-icon-brand-d3;
+}
+.#{$ti-prefix}-brand-databricks:before {
+ content: $ti-icon-brand-databricks;
+}
+.#{$ti-prefix}-brand-days-counter:before {
+ content: $ti-icon-brand-days-counter;
+}
+.#{$ti-prefix}-brand-dcos:before {
+ content: $ti-icon-brand-dcos;
+}
+.#{$ti-prefix}-brand-debian:before {
+ content: $ti-icon-brand-debian;
+}
+.#{$ti-prefix}-brand-deezer:before {
+ content: $ti-icon-brand-deezer;
+}
+.#{$ti-prefix}-brand-deliveroo:before {
+ content: $ti-icon-brand-deliveroo;
+}
+.#{$ti-prefix}-brand-deno:before {
+ content: $ti-icon-brand-deno;
+}
+.#{$ti-prefix}-brand-denodo:before {
+ content: $ti-icon-brand-denodo;
+}
+.#{$ti-prefix}-brand-deviantart:before {
+ content: $ti-icon-brand-deviantart;
+}
+.#{$ti-prefix}-brand-digg:before {
+ content: $ti-icon-brand-digg;
+}
+.#{$ti-prefix}-brand-dingtalk:before {
+ content: $ti-icon-brand-dingtalk;
+}
+.#{$ti-prefix}-brand-discord:before {
+ content: $ti-icon-brand-discord;
+}
+.#{$ti-prefix}-brand-discord-filled:before {
+ content: $ti-icon-brand-discord-filled;
+}
+.#{$ti-prefix}-brand-disney:before {
+ content: $ti-icon-brand-disney;
+}
+.#{$ti-prefix}-brand-disqus:before {
+ content: $ti-icon-brand-disqus;
+}
+.#{$ti-prefix}-brand-django:before {
+ content: $ti-icon-brand-django;
+}
+.#{$ti-prefix}-brand-docker:before {
+ content: $ti-icon-brand-docker;
+}
+.#{$ti-prefix}-brand-doctrine:before {
+ content: $ti-icon-brand-doctrine;
+}
+.#{$ti-prefix}-brand-dolby-digital:before {
+ content: $ti-icon-brand-dolby-digital;
+}
+.#{$ti-prefix}-brand-douban:before {
+ content: $ti-icon-brand-douban;
+}
+.#{$ti-prefix}-brand-dribbble:before {
+ content: $ti-icon-brand-dribbble;
+}
+.#{$ti-prefix}-brand-dribbble-filled:before {
+ content: $ti-icon-brand-dribbble-filled;
+}
+.#{$ti-prefix}-brand-drops:before {
+ content: $ti-icon-brand-drops;
+}
+.#{$ti-prefix}-brand-drupal:before {
+ content: $ti-icon-brand-drupal;
+}
+.#{$ti-prefix}-brand-edge:before {
+ content: $ti-icon-brand-edge;
+}
+.#{$ti-prefix}-brand-elastic:before {
+ content: $ti-icon-brand-elastic;
+}
+.#{$ti-prefix}-brand-electronic-arts:before {
+ content: $ti-icon-brand-electronic-arts;
+}
+.#{$ti-prefix}-brand-ember:before {
+ content: $ti-icon-brand-ember;
+}
+.#{$ti-prefix}-brand-envato:before {
+ content: $ti-icon-brand-envato;
+}
+.#{$ti-prefix}-brand-etsy:before {
+ content: $ti-icon-brand-etsy;
+}
+.#{$ti-prefix}-brand-evernote:before {
+ content: $ti-icon-brand-evernote;
+}
+.#{$ti-prefix}-brand-facebook:before {
+ content: $ti-icon-brand-facebook;
+}
+.#{$ti-prefix}-brand-facebook-filled:before {
+ content: $ti-icon-brand-facebook-filled;
+}
+.#{$ti-prefix}-brand-feedly:before {
+ content: $ti-icon-brand-feedly;
+}
+.#{$ti-prefix}-brand-figma:before {
+ content: $ti-icon-brand-figma;
+}
+.#{$ti-prefix}-brand-filezilla:before {
+ content: $ti-icon-brand-filezilla;
+}
+.#{$ti-prefix}-brand-finder:before {
+ content: $ti-icon-brand-finder;
+}
+.#{$ti-prefix}-brand-firebase:before {
+ content: $ti-icon-brand-firebase;
+}
+.#{$ti-prefix}-brand-firefox:before {
+ content: $ti-icon-brand-firefox;
+}
+.#{$ti-prefix}-brand-fiverr:before {
+ content: $ti-icon-brand-fiverr;
+}
+.#{$ti-prefix}-brand-flickr:before {
+ content: $ti-icon-brand-flickr;
+}
+.#{$ti-prefix}-brand-flightradar24:before {
+ content: $ti-icon-brand-flightradar24;
+}
+.#{$ti-prefix}-brand-flipboard:before {
+ content: $ti-icon-brand-flipboard;
+}
+.#{$ti-prefix}-brand-flutter:before {
+ content: $ti-icon-brand-flutter;
+}
+.#{$ti-prefix}-brand-fortnite:before {
+ content: $ti-icon-brand-fortnite;
+}
+.#{$ti-prefix}-brand-foursquare:before {
+ content: $ti-icon-brand-foursquare;
+}
+.#{$ti-prefix}-brand-framer:before {
+ content: $ti-icon-brand-framer;
+}
+.#{$ti-prefix}-brand-framer-motion:before {
+ content: $ti-icon-brand-framer-motion;
+}
+.#{$ti-prefix}-brand-funimation:before {
+ content: $ti-icon-brand-funimation;
+}
+.#{$ti-prefix}-brand-gatsby:before {
+ content: $ti-icon-brand-gatsby;
+}
+.#{$ti-prefix}-brand-git:before {
+ content: $ti-icon-brand-git;
+}
+.#{$ti-prefix}-brand-github:before {
+ content: $ti-icon-brand-github;
+}
+.#{$ti-prefix}-brand-github-copilot:before {
+ content: $ti-icon-brand-github-copilot;
+}
+.#{$ti-prefix}-brand-github-filled:before {
+ content: $ti-icon-brand-github-filled;
+}
+.#{$ti-prefix}-brand-gitlab:before {
+ content: $ti-icon-brand-gitlab;
+}
+.#{$ti-prefix}-brand-gmail:before {
+ content: $ti-icon-brand-gmail;
+}
+.#{$ti-prefix}-brand-golang:before {
+ content: $ti-icon-brand-golang;
+}
+.#{$ti-prefix}-brand-google:before {
+ content: $ti-icon-brand-google;
+}
+.#{$ti-prefix}-brand-google-analytics:before {
+ content: $ti-icon-brand-google-analytics;
+}
+.#{$ti-prefix}-brand-google-big-query:before {
+ content: $ti-icon-brand-google-big-query;
+}
+.#{$ti-prefix}-brand-google-drive:before {
+ content: $ti-icon-brand-google-drive;
+}
+.#{$ti-prefix}-brand-google-filled:before {
+ content: $ti-icon-brand-google-filled;
+}
+.#{$ti-prefix}-brand-google-fit:before {
+ content: $ti-icon-brand-google-fit;
+}
+.#{$ti-prefix}-brand-google-home:before {
+ content: $ti-icon-brand-google-home;
+}
+.#{$ti-prefix}-brand-google-maps:before {
+ content: $ti-icon-brand-google-maps;
+}
+.#{$ti-prefix}-brand-google-one:before {
+ content: $ti-icon-brand-google-one;
+}
+.#{$ti-prefix}-brand-google-photos:before {
+ content: $ti-icon-brand-google-photos;
+}
+.#{$ti-prefix}-brand-google-play:before {
+ content: $ti-icon-brand-google-play;
+}
+.#{$ti-prefix}-brand-google-podcasts:before {
+ content: $ti-icon-brand-google-podcasts;
+}
+.#{$ti-prefix}-brand-grammarly:before {
+ content: $ti-icon-brand-grammarly;
+}
+.#{$ti-prefix}-brand-graphql:before {
+ content: $ti-icon-brand-graphql;
+}
+.#{$ti-prefix}-brand-gravatar:before {
+ content: $ti-icon-brand-gravatar;
+}
+.#{$ti-prefix}-brand-grindr:before {
+ content: $ti-icon-brand-grindr;
+}
+.#{$ti-prefix}-brand-guardian:before {
+ content: $ti-icon-brand-guardian;
+}
+.#{$ti-prefix}-brand-gumroad:before {
+ content: $ti-icon-brand-gumroad;
+}
+.#{$ti-prefix}-brand-hbo:before {
+ content: $ti-icon-brand-hbo;
+}
+.#{$ti-prefix}-brand-headlessui:before {
+ content: $ti-icon-brand-headlessui;
+}
+.#{$ti-prefix}-brand-hexo:before {
+ content: $ti-icon-brand-hexo;
+}
+.#{$ti-prefix}-brand-hipchat:before {
+ content: $ti-icon-brand-hipchat;
+}
+.#{$ti-prefix}-brand-html5:before {
+ content: $ti-icon-brand-html5;
+}
+.#{$ti-prefix}-brand-inertia:before {
+ content: $ti-icon-brand-inertia;
+}
+.#{$ti-prefix}-brand-instagram:before {
+ content: $ti-icon-brand-instagram;
+}
+.#{$ti-prefix}-brand-intercom:before {
+ content: $ti-icon-brand-intercom;
+}
+.#{$ti-prefix}-brand-itch:before {
+ content: $ti-icon-brand-itch;
+}
+.#{$ti-prefix}-brand-javascript:before {
+ content: $ti-icon-brand-javascript;
+}
+.#{$ti-prefix}-brand-juejin:before {
+ content: $ti-icon-brand-juejin;
+}
+.#{$ti-prefix}-brand-kako-talk:before {
+ content: $ti-icon-brand-kako-talk;
+}
+.#{$ti-prefix}-brand-kbin:before {
+ content: $ti-icon-brand-kbin;
+}
+.#{$ti-prefix}-brand-kick:before {
+ content: $ti-icon-brand-kick;
+}
+.#{$ti-prefix}-brand-kickstarter:before {
+ content: $ti-icon-brand-kickstarter;
+}
+.#{$ti-prefix}-brand-kotlin:before {
+ content: $ti-icon-brand-kotlin;
+}
+.#{$ti-prefix}-brand-laravel:before {
+ content: $ti-icon-brand-laravel;
+}
+.#{$ti-prefix}-brand-lastfm:before {
+ content: $ti-icon-brand-lastfm;
+}
+.#{$ti-prefix}-brand-leetcode:before {
+ content: $ti-icon-brand-leetcode;
+}
+.#{$ti-prefix}-brand-letterboxd:before {
+ content: $ti-icon-brand-letterboxd;
+}
+.#{$ti-prefix}-brand-line:before {
+ content: $ti-icon-brand-line;
+}
+.#{$ti-prefix}-brand-linkedin:before {
+ content: $ti-icon-brand-linkedin;
+}
+.#{$ti-prefix}-brand-linktree:before {
+ content: $ti-icon-brand-linktree;
+}
+.#{$ti-prefix}-brand-linqpad:before {
+ content: $ti-icon-brand-linqpad;
+}
+.#{$ti-prefix}-brand-livewire:before {
+ content: $ti-icon-brand-livewire;
+}
+.#{$ti-prefix}-brand-loom:before {
+ content: $ti-icon-brand-loom;
+}
+.#{$ti-prefix}-brand-mailgun:before {
+ content: $ti-icon-brand-mailgun;
+}
+.#{$ti-prefix}-brand-mantine:before {
+ content: $ti-icon-brand-mantine;
+}
+.#{$ti-prefix}-brand-mastercard:before {
+ content: $ti-icon-brand-mastercard;
+}
+.#{$ti-prefix}-brand-mastodon:before {
+ content: $ti-icon-brand-mastodon;
+}
+.#{$ti-prefix}-brand-matrix:before {
+ content: $ti-icon-brand-matrix;
+}
+.#{$ti-prefix}-brand-mcdonalds:before {
+ content: $ti-icon-brand-mcdonalds;
+}
+.#{$ti-prefix}-brand-medium:before {
+ content: $ti-icon-brand-medium;
+}
+.#{$ti-prefix}-brand-meetup:before {
+ content: $ti-icon-brand-meetup;
+}
+.#{$ti-prefix}-brand-mercedes:before {
+ content: $ti-icon-brand-mercedes;
+}
+.#{$ti-prefix}-brand-messenger:before {
+ content: $ti-icon-brand-messenger;
+}
+.#{$ti-prefix}-brand-meta:before {
+ content: $ti-icon-brand-meta;
+}
+.#{$ti-prefix}-brand-minecraft:before {
+ content: $ti-icon-brand-minecraft;
+}
+.#{$ti-prefix}-brand-miniprogram:before {
+ content: $ti-icon-brand-miniprogram;
+}
+.#{$ti-prefix}-brand-mixpanel:before {
+ content: $ti-icon-brand-mixpanel;
+}
+.#{$ti-prefix}-brand-monday:before {
+ content: $ti-icon-brand-monday;
+}
+.#{$ti-prefix}-brand-mongodb:before {
+ content: $ti-icon-brand-mongodb;
+}
+.#{$ti-prefix}-brand-my-oppo:before {
+ content: $ti-icon-brand-my-oppo;
+}
+.#{$ti-prefix}-brand-mysql:before {
+ content: $ti-icon-brand-mysql;
+}
+.#{$ti-prefix}-brand-national-geographic:before {
+ content: $ti-icon-brand-national-geographic;
+}
+.#{$ti-prefix}-brand-nem:before {
+ content: $ti-icon-brand-nem;
+}
+.#{$ti-prefix}-brand-netbeans:before {
+ content: $ti-icon-brand-netbeans;
+}
+.#{$ti-prefix}-brand-netease-music:before {
+ content: $ti-icon-brand-netease-music;
+}
+.#{$ti-prefix}-brand-netflix:before {
+ content: $ti-icon-brand-netflix;
+}
+.#{$ti-prefix}-brand-nexo:before {
+ content: $ti-icon-brand-nexo;
+}
+.#{$ti-prefix}-brand-nextcloud:before {
+ content: $ti-icon-brand-nextcloud;
+}
+.#{$ti-prefix}-brand-nextjs:before {
+ content: $ti-icon-brand-nextjs;
+}
+.#{$ti-prefix}-brand-nodejs:before {
+ content: $ti-icon-brand-nodejs;
+}
+.#{$ti-prefix}-brand-nord-vpn:before {
+ content: $ti-icon-brand-nord-vpn;
+}
+.#{$ti-prefix}-brand-notion:before {
+ content: $ti-icon-brand-notion;
+}
+.#{$ti-prefix}-brand-npm:before {
+ content: $ti-icon-brand-npm;
+}
+.#{$ti-prefix}-brand-nuxt:before {
+ content: $ti-icon-brand-nuxt;
+}
+.#{$ti-prefix}-brand-nytimes:before {
+ content: $ti-icon-brand-nytimes;
+}
+.#{$ti-prefix}-brand-oauth:before {
+ content: $ti-icon-brand-oauth;
+}
+.#{$ti-prefix}-brand-office:before {
+ content: $ti-icon-brand-office;
+}
+.#{$ti-prefix}-brand-ok-ru:before {
+ content: $ti-icon-brand-ok-ru;
+}
+.#{$ti-prefix}-brand-onedrive:before {
+ content: $ti-icon-brand-onedrive;
+}
+.#{$ti-prefix}-brand-onlyfans:before {
+ content: $ti-icon-brand-onlyfans;
+}
+.#{$ti-prefix}-brand-open-source:before {
+ content: $ti-icon-brand-open-source;
+}
+.#{$ti-prefix}-brand-openai:before {
+ content: $ti-icon-brand-openai;
+}
+.#{$ti-prefix}-brand-openvpn:before {
+ content: $ti-icon-brand-openvpn;
+}
+.#{$ti-prefix}-brand-opera:before {
+ content: $ti-icon-brand-opera;
+}
+.#{$ti-prefix}-brand-pagekit:before {
+ content: $ti-icon-brand-pagekit;
+}
+.#{$ti-prefix}-brand-parsinta:before {
+ content: $ti-icon-brand-parsinta;
+}
+.#{$ti-prefix}-brand-patreon:before {
+ content: $ti-icon-brand-patreon;
+}
+.#{$ti-prefix}-brand-patreon-filled:before {
+ content: $ti-icon-brand-patreon-filled;
+}
+.#{$ti-prefix}-brand-paypal:before {
+ content: $ti-icon-brand-paypal;
+}
+.#{$ti-prefix}-brand-paypal-filled:before {
+ content: $ti-icon-brand-paypal-filled;
+}
+.#{$ti-prefix}-brand-paypay:before {
+ content: $ti-icon-brand-paypay;
+}
+.#{$ti-prefix}-brand-peanut:before {
+ content: $ti-icon-brand-peanut;
+}
+.#{$ti-prefix}-brand-pepsi:before {
+ content: $ti-icon-brand-pepsi;
+}
+.#{$ti-prefix}-brand-php:before {
+ content: $ti-icon-brand-php;
+}
+.#{$ti-prefix}-brand-picsart:before {
+ content: $ti-icon-brand-picsart;
+}
+.#{$ti-prefix}-brand-pinterest:before {
+ content: $ti-icon-brand-pinterest;
+}
+.#{$ti-prefix}-brand-planetscale:before {
+ content: $ti-icon-brand-planetscale;
+}
+.#{$ti-prefix}-brand-pnpm:before {
+ content: $ti-icon-brand-pnpm;
+}
+.#{$ti-prefix}-brand-pocket:before {
+ content: $ti-icon-brand-pocket;
+}
+.#{$ti-prefix}-brand-polymer:before {
+ content: $ti-icon-brand-polymer;
+}
+.#{$ti-prefix}-brand-powershell:before {
+ content: $ti-icon-brand-powershell;
+}
+.#{$ti-prefix}-brand-printables:before {
+ content: $ti-icon-brand-printables;
+}
+.#{$ti-prefix}-brand-prisma:before {
+ content: $ti-icon-brand-prisma;
+}
+.#{$ti-prefix}-brand-producthunt:before {
+ content: $ti-icon-brand-producthunt;
+}
+.#{$ti-prefix}-brand-pushbullet:before {
+ content: $ti-icon-brand-pushbullet;
+}
+.#{$ti-prefix}-brand-pushover:before {
+ content: $ti-icon-brand-pushover;
+}
+.#{$ti-prefix}-brand-python:before {
+ content: $ti-icon-brand-python;
+}
+.#{$ti-prefix}-brand-qq:before {
+ content: $ti-icon-brand-qq;
+}
+.#{$ti-prefix}-brand-radix-ui:before {
+ content: $ti-icon-brand-radix-ui;
+}
+.#{$ti-prefix}-brand-react:before {
+ content: $ti-icon-brand-react;
+}
+.#{$ti-prefix}-brand-react-native:before {
+ content: $ti-icon-brand-react-native;
+}
+.#{$ti-prefix}-brand-reason:before {
+ content: $ti-icon-brand-reason;
+}
+.#{$ti-prefix}-brand-reddit:before {
+ content: $ti-icon-brand-reddit;
+}
+.#{$ti-prefix}-brand-redhat:before {
+ content: $ti-icon-brand-redhat;
+}
+.#{$ti-prefix}-brand-redux:before {
+ content: $ti-icon-brand-redux;
+}
+.#{$ti-prefix}-brand-revolut:before {
+ content: $ti-icon-brand-revolut;
+}
+.#{$ti-prefix}-brand-rumble:before {
+ content: $ti-icon-brand-rumble;
+}
+.#{$ti-prefix}-brand-rust:before {
+ content: $ti-icon-brand-rust;
+}
+.#{$ti-prefix}-brand-safari:before {
+ content: $ti-icon-brand-safari;
+}
+.#{$ti-prefix}-brand-samsungpass:before {
+ content: $ti-icon-brand-samsungpass;
+}
+.#{$ti-prefix}-brand-sass:before {
+ content: $ti-icon-brand-sass;
+}
+.#{$ti-prefix}-brand-sentry:before {
+ content: $ti-icon-brand-sentry;
+}
+.#{$ti-prefix}-brand-sharik:before {
+ content: $ti-icon-brand-sharik;
+}
+.#{$ti-prefix}-brand-shazam:before {
+ content: $ti-icon-brand-shazam;
+}
+.#{$ti-prefix}-brand-shopee:before {
+ content: $ti-icon-brand-shopee;
+}
+.#{$ti-prefix}-brand-sketch:before {
+ content: $ti-icon-brand-sketch;
+}
+.#{$ti-prefix}-brand-skype:before {
+ content: $ti-icon-brand-skype;
+}
+.#{$ti-prefix}-brand-slack:before {
+ content: $ti-icon-brand-slack;
+}
+.#{$ti-prefix}-brand-snapchat:before {
+ content: $ti-icon-brand-snapchat;
+}
+.#{$ti-prefix}-brand-snapseed:before {
+ content: $ti-icon-brand-snapseed;
+}
+.#{$ti-prefix}-brand-snowflake:before {
+ content: $ti-icon-brand-snowflake;
+}
+.#{$ti-prefix}-brand-socket-io:before {
+ content: $ti-icon-brand-socket-io;
+}
+.#{$ti-prefix}-brand-solidjs:before {
+ content: $ti-icon-brand-solidjs;
+}
+.#{$ti-prefix}-brand-soundcloud:before {
+ content: $ti-icon-brand-soundcloud;
+}
+.#{$ti-prefix}-brand-spacehey:before {
+ content: $ti-icon-brand-spacehey;
+}
+.#{$ti-prefix}-brand-speedtest:before {
+ content: $ti-icon-brand-speedtest;
+}
+.#{$ti-prefix}-brand-spotify:before {
+ content: $ti-icon-brand-spotify;
+}
+.#{$ti-prefix}-brand-spotify-filled:before {
+ content: $ti-icon-brand-spotify-filled;
+}
+.#{$ti-prefix}-brand-stackoverflow:before {
+ content: $ti-icon-brand-stackoverflow;
+}
+.#{$ti-prefix}-brand-stackshare:before {
+ content: $ti-icon-brand-stackshare;
+}
+.#{$ti-prefix}-brand-steam:before {
+ content: $ti-icon-brand-steam;
+}
+.#{$ti-prefix}-brand-stocktwits:before {
+ content: $ti-icon-brand-stocktwits;
+}
+.#{$ti-prefix}-brand-storj:before {
+ content: $ti-icon-brand-storj;
+}
+.#{$ti-prefix}-brand-storybook:before {
+ content: $ti-icon-brand-storybook;
+}
+.#{$ti-prefix}-brand-storytel:before {
+ content: $ti-icon-brand-storytel;
+}
+.#{$ti-prefix}-brand-strava:before {
+ content: $ti-icon-brand-strava;
+}
+.#{$ti-prefix}-brand-stripe:before {
+ content: $ti-icon-brand-stripe;
+}
+.#{$ti-prefix}-brand-sublime-text:before {
+ content: $ti-icon-brand-sublime-text;
+}
+.#{$ti-prefix}-brand-sugarizer:before {
+ content: $ti-icon-brand-sugarizer;
+}
+.#{$ti-prefix}-brand-supabase:before {
+ content: $ti-icon-brand-supabase;
+}
+.#{$ti-prefix}-brand-superhuman:before {
+ content: $ti-icon-brand-superhuman;
+}
+.#{$ti-prefix}-brand-supernova:before {
+ content: $ti-icon-brand-supernova;
+}
+.#{$ti-prefix}-brand-surfshark:before {
+ content: $ti-icon-brand-surfshark;
+}
+.#{$ti-prefix}-brand-svelte:before {
+ content: $ti-icon-brand-svelte;
+}
+.#{$ti-prefix}-brand-swift:before {
+ content: $ti-icon-brand-swift;
+}
+.#{$ti-prefix}-brand-symfony:before {
+ content: $ti-icon-brand-symfony;
+}
+.#{$ti-prefix}-brand-tabler:before {
+ content: $ti-icon-brand-tabler;
+}
+.#{$ti-prefix}-brand-tailwind:before {
+ content: $ti-icon-brand-tailwind;
+}
+.#{$ti-prefix}-brand-taobao:before {
+ content: $ti-icon-brand-taobao;
+}
+.#{$ti-prefix}-brand-teams:before {
+ content: $ti-icon-brand-teams;
+}
+.#{$ti-prefix}-brand-ted:before {
+ content: $ti-icon-brand-ted;
+}
+.#{$ti-prefix}-brand-telegram:before {
+ content: $ti-icon-brand-telegram;
+}
+.#{$ti-prefix}-brand-terraform:before {
+ content: $ti-icon-brand-terraform;
+}
+.#{$ti-prefix}-brand-tether:before {
+ content: $ti-icon-brand-tether;
+}
+.#{$ti-prefix}-brand-thingiverse:before {
+ content: $ti-icon-brand-thingiverse;
+}
+.#{$ti-prefix}-brand-threads:before {
+ content: $ti-icon-brand-threads;
+}
+.#{$ti-prefix}-brand-threejs:before {
+ content: $ti-icon-brand-threejs;
+}
+.#{$ti-prefix}-brand-tidal:before {
+ content: $ti-icon-brand-tidal;
+}
+.#{$ti-prefix}-brand-tiktok:before {
+ content: $ti-icon-brand-tiktok;
+}
+.#{$ti-prefix}-brand-tiktok-filled:before {
+ content: $ti-icon-brand-tiktok-filled;
+}
+.#{$ti-prefix}-brand-tinder:before {
+ content: $ti-icon-brand-tinder;
+}
+.#{$ti-prefix}-brand-topbuzz:before {
+ content: $ti-icon-brand-topbuzz;
+}
+.#{$ti-prefix}-brand-torchain:before {
+ content: $ti-icon-brand-torchain;
+}
+.#{$ti-prefix}-brand-toyota:before {
+ content: $ti-icon-brand-toyota;
+}
+.#{$ti-prefix}-brand-trello:before {
+ content: $ti-icon-brand-trello;
+}
+.#{$ti-prefix}-brand-tripadvisor:before {
+ content: $ti-icon-brand-tripadvisor;
+}
+.#{$ti-prefix}-brand-tumblr:before {
+ content: $ti-icon-brand-tumblr;
+}
+.#{$ti-prefix}-brand-twilio:before {
+ content: $ti-icon-brand-twilio;
+}
+.#{$ti-prefix}-brand-twitch:before {
+ content: $ti-icon-brand-twitch;
+}
+.#{$ti-prefix}-brand-twitter:before {
+ content: $ti-icon-brand-twitter;
+}
+.#{$ti-prefix}-brand-twitter-filled:before {
+ content: $ti-icon-brand-twitter-filled;
+}
+.#{$ti-prefix}-brand-typescript:before {
+ content: $ti-icon-brand-typescript;
+}
+.#{$ti-prefix}-brand-uber:before {
+ content: $ti-icon-brand-uber;
+}
+.#{$ti-prefix}-brand-ubuntu:before {
+ content: $ti-icon-brand-ubuntu;
+}
+.#{$ti-prefix}-brand-unity:before {
+ content: $ti-icon-brand-unity;
+}
+.#{$ti-prefix}-brand-unsplash:before {
+ content: $ti-icon-brand-unsplash;
+}
+.#{$ti-prefix}-brand-upwork:before {
+ content: $ti-icon-brand-upwork;
+}
+.#{$ti-prefix}-brand-valorant:before {
+ content: $ti-icon-brand-valorant;
+}
+.#{$ti-prefix}-brand-vercel:before {
+ content: $ti-icon-brand-vercel;
+}
+.#{$ti-prefix}-brand-vimeo:before {
+ content: $ti-icon-brand-vimeo;
+}
+.#{$ti-prefix}-brand-vinted:before {
+ content: $ti-icon-brand-vinted;
+}
+.#{$ti-prefix}-brand-visa:before {
+ content: $ti-icon-brand-visa;
+}
+.#{$ti-prefix}-brand-visual-studio:before {
+ content: $ti-icon-brand-visual-studio;
+}
+.#{$ti-prefix}-brand-vite:before {
+ content: $ti-icon-brand-vite;
+}
+.#{$ti-prefix}-brand-vivaldi:before {
+ content: $ti-icon-brand-vivaldi;
+}
+.#{$ti-prefix}-brand-vk:before {
+ content: $ti-icon-brand-vk;
+}
+.#{$ti-prefix}-brand-vlc:before {
+ content: $ti-icon-brand-vlc;
+}
+.#{$ti-prefix}-brand-volkswagen:before {
+ content: $ti-icon-brand-volkswagen;
+}
+.#{$ti-prefix}-brand-vsco:before {
+ content: $ti-icon-brand-vsco;
+}
+.#{$ti-prefix}-brand-vscode:before {
+ content: $ti-icon-brand-vscode;
+}
+.#{$ti-prefix}-brand-vue:before {
+ content: $ti-icon-brand-vue;
+}
+.#{$ti-prefix}-brand-walmart:before {
+ content: $ti-icon-brand-walmart;
+}
+.#{$ti-prefix}-brand-waze:before {
+ content: $ti-icon-brand-waze;
+}
+.#{$ti-prefix}-brand-webflow:before {
+ content: $ti-icon-brand-webflow;
+}
+.#{$ti-prefix}-brand-wechat:before {
+ content: $ti-icon-brand-wechat;
+}
+.#{$ti-prefix}-brand-weibo:before {
+ content: $ti-icon-brand-weibo;
+}
+.#{$ti-prefix}-brand-whatsapp:before {
+ content: $ti-icon-brand-whatsapp;
+}
+.#{$ti-prefix}-brand-wikipedia:before {
+ content: $ti-icon-brand-wikipedia;
+}
+.#{$ti-prefix}-brand-windows:before {
+ content: $ti-icon-brand-windows;
+}
+.#{$ti-prefix}-brand-windy:before {
+ content: $ti-icon-brand-windy;
+}
+.#{$ti-prefix}-brand-wish:before {
+ content: $ti-icon-brand-wish;
+}
+.#{$ti-prefix}-brand-wix:before {
+ content: $ti-icon-brand-wix;
+}
+.#{$ti-prefix}-brand-wordpress:before {
+ content: $ti-icon-brand-wordpress;
+}
+.#{$ti-prefix}-brand-x:before {
+ content: $ti-icon-brand-x;
+}
+.#{$ti-prefix}-brand-x-filled:before {
+ content: $ti-icon-brand-x-filled;
+}
+.#{$ti-prefix}-brand-xamarin:before {
+ content: $ti-icon-brand-xamarin;
+}
+.#{$ti-prefix}-brand-xbox:before {
+ content: $ti-icon-brand-xbox;
+}
+.#{$ti-prefix}-brand-xdeep:before {
+ content: $ti-icon-brand-xdeep;
+}
+.#{$ti-prefix}-brand-xing:before {
+ content: $ti-icon-brand-xing;
+}
+.#{$ti-prefix}-brand-yahoo:before {
+ content: $ti-icon-brand-yahoo;
+}
+.#{$ti-prefix}-brand-yandex:before {
+ content: $ti-icon-brand-yandex;
+}
+.#{$ti-prefix}-brand-yarn:before {
+ content: $ti-icon-brand-yarn;
+}
+.#{$ti-prefix}-brand-yatse:before {
+ content: $ti-icon-brand-yatse;
+}
+.#{$ti-prefix}-brand-ycombinator:before {
+ content: $ti-icon-brand-ycombinator;
+}
+.#{$ti-prefix}-brand-youtube:before {
+ content: $ti-icon-brand-youtube;
+}
+.#{$ti-prefix}-brand-youtube-filled:before {
+ content: $ti-icon-brand-youtube-filled;
+}
+.#{$ti-prefix}-brand-youtube-kids:before {
+ content: $ti-icon-brand-youtube-kids;
+}
+.#{$ti-prefix}-brand-zalando:before {
+ content: $ti-icon-brand-zalando;
+}
+.#{$ti-prefix}-brand-zapier:before {
+ content: $ti-icon-brand-zapier;
+}
+.#{$ti-prefix}-brand-zeit:before {
+ content: $ti-icon-brand-zeit;
+}
+.#{$ti-prefix}-brand-zhihu:before {
+ content: $ti-icon-brand-zhihu;
+}
+.#{$ti-prefix}-brand-zoom:before {
+ content: $ti-icon-brand-zoom;
+}
+.#{$ti-prefix}-brand-zulip:before {
+ content: $ti-icon-brand-zulip;
+}
+.#{$ti-prefix}-brand-zwift:before {
+ content: $ti-icon-brand-zwift;
+}
+.#{$ti-prefix}-bread:before {
+ content: $ti-icon-bread;
+}
+.#{$ti-prefix}-bread-filled:before {
+ content: $ti-icon-bread-filled;
+}
+.#{$ti-prefix}-bread-off:before {
+ content: $ti-icon-bread-off;
+}
+.#{$ti-prefix}-briefcase:before {
+ content: $ti-icon-briefcase;
+}
+.#{$ti-prefix}-briefcase-2:before {
+ content: $ti-icon-briefcase-2;
+}
+.#{$ti-prefix}-briefcase-2-filled:before {
+ content: $ti-icon-briefcase-2-filled;
+}
+.#{$ti-prefix}-briefcase-filled:before {
+ content: $ti-icon-briefcase-filled;
+}
+.#{$ti-prefix}-briefcase-off:before {
+ content: $ti-icon-briefcase-off;
+}
+.#{$ti-prefix}-brightness:before {
+ content: $ti-icon-brightness;
+}
+.#{$ti-prefix}-brightness-2:before {
+ content: $ti-icon-brightness-2;
+}
+.#{$ti-prefix}-brightness-auto:before {
+ content: $ti-icon-brightness-auto;
+}
+.#{$ti-prefix}-brightness-auto-filled:before {
+ content: $ti-icon-brightness-auto-filled;
+}
+.#{$ti-prefix}-brightness-down:before {
+ content: $ti-icon-brightness-down;
+}
+.#{$ti-prefix}-brightness-down-filled:before {
+ content: $ti-icon-brightness-down-filled;
+}
+.#{$ti-prefix}-brightness-filled:before {
+ content: $ti-icon-brightness-filled;
+}
+.#{$ti-prefix}-brightness-half:before {
+ content: $ti-icon-brightness-half;
+}
+.#{$ti-prefix}-brightness-off:before {
+ content: $ti-icon-brightness-off;
+}
+.#{$ti-prefix}-brightness-up:before {
+ content: $ti-icon-brightness-up;
+}
+.#{$ti-prefix}-brightness-up-filled:before {
+ content: $ti-icon-brightness-up-filled;
+}
+.#{$ti-prefix}-broadcast:before {
+ content: $ti-icon-broadcast;
+}
+.#{$ti-prefix}-broadcast-off:before {
+ content: $ti-icon-broadcast-off;
+}
+.#{$ti-prefix}-browser:before {
+ content: $ti-icon-browser;
+}
+.#{$ti-prefix}-browser-check:before {
+ content: $ti-icon-browser-check;
+}
+.#{$ti-prefix}-browser-off:before {
+ content: $ti-icon-browser-off;
+}
+.#{$ti-prefix}-browser-plus:before {
+ content: $ti-icon-browser-plus;
+}
+.#{$ti-prefix}-browser-x:before {
+ content: $ti-icon-browser-x;
+}
+.#{$ti-prefix}-brush:before {
+ content: $ti-icon-brush;
+}
+.#{$ti-prefix}-brush-off:before {
+ content: $ti-icon-brush-off;
+}
+.#{$ti-prefix}-bubble:before {
+ content: $ti-icon-bubble;
+}
+.#{$ti-prefix}-bubble-filled:before {
+ content: $ti-icon-bubble-filled;
+}
+.#{$ti-prefix}-bubble-minus:before {
+ content: $ti-icon-bubble-minus;
+}
+.#{$ti-prefix}-bubble-plus:before {
+ content: $ti-icon-bubble-plus;
+}
+.#{$ti-prefix}-bubble-text:before {
+ content: $ti-icon-bubble-text;
+}
+.#{$ti-prefix}-bubble-x:before {
+ content: $ti-icon-bubble-x;
+}
+.#{$ti-prefix}-bucket:before {
+ content: $ti-icon-bucket;
+}
+.#{$ti-prefix}-bucket-droplet:before {
+ content: $ti-icon-bucket-droplet;
+}
+.#{$ti-prefix}-bucket-off:before {
+ content: $ti-icon-bucket-off;
+}
+.#{$ti-prefix}-bug:before {
+ content: $ti-icon-bug;
+}
+.#{$ti-prefix}-bug-filled:before {
+ content: $ti-icon-bug-filled;
+}
+.#{$ti-prefix}-bug-off:before {
+ content: $ti-icon-bug-off;
+}
+.#{$ti-prefix}-building:before {
+ content: $ti-icon-building;
+}
+.#{$ti-prefix}-building-arch:before {
+ content: $ti-icon-building-arch;
+}
+.#{$ti-prefix}-building-bank:before {
+ content: $ti-icon-building-bank;
+}
+.#{$ti-prefix}-building-bridge:before {
+ content: $ti-icon-building-bridge;
+}
+.#{$ti-prefix}-building-bridge-2:before {
+ content: $ti-icon-building-bridge-2;
+}
+.#{$ti-prefix}-building-broadcast-tower:before {
+ content: $ti-icon-building-broadcast-tower;
+}
+.#{$ti-prefix}-building-broadcast-tower-filled:before {
+ content: $ti-icon-building-broadcast-tower-filled;
+}
+.#{$ti-prefix}-building-carousel:before {
+ content: $ti-icon-building-carousel;
+}
+.#{$ti-prefix}-building-castle:before {
+ content: $ti-icon-building-castle;
+}
+.#{$ti-prefix}-building-church:before {
+ content: $ti-icon-building-church;
+}
+.#{$ti-prefix}-building-circus:before {
+ content: $ti-icon-building-circus;
+}
+.#{$ti-prefix}-building-community:before {
+ content: $ti-icon-building-community;
+}
+.#{$ti-prefix}-building-cottage:before {
+ content: $ti-icon-building-cottage;
+}
+.#{$ti-prefix}-building-estate:before {
+ content: $ti-icon-building-estate;
+}
+.#{$ti-prefix}-building-factory:before {
+ content: $ti-icon-building-factory;
+}
+.#{$ti-prefix}-building-factory-2:before {
+ content: $ti-icon-building-factory-2;
+}
+.#{$ti-prefix}-building-fortress:before {
+ content: $ti-icon-building-fortress;
+}
+.#{$ti-prefix}-building-hospital:before {
+ content: $ti-icon-building-hospital;
+}
+.#{$ti-prefix}-building-lighthouse:before {
+ content: $ti-icon-building-lighthouse;
+}
+.#{$ti-prefix}-building-monument:before {
+ content: $ti-icon-building-monument;
+}
+.#{$ti-prefix}-building-mosque:before {
+ content: $ti-icon-building-mosque;
+}
+.#{$ti-prefix}-building-pavilion:before {
+ content: $ti-icon-building-pavilion;
+}
+.#{$ti-prefix}-building-skyscraper:before {
+ content: $ti-icon-building-skyscraper;
+}
+.#{$ti-prefix}-building-stadium:before {
+ content: $ti-icon-building-stadium;
+}
+.#{$ti-prefix}-building-store:before {
+ content: $ti-icon-building-store;
+}
+.#{$ti-prefix}-building-tunnel:before {
+ content: $ti-icon-building-tunnel;
+}
+.#{$ti-prefix}-building-warehouse:before {
+ content: $ti-icon-building-warehouse;
+}
+.#{$ti-prefix}-building-wind-turbine:before {
+ content: $ti-icon-building-wind-turbine;
+}
+.#{$ti-prefix}-bulb:before {
+ content: $ti-icon-bulb;
+}
+.#{$ti-prefix}-bulb-filled:before {
+ content: $ti-icon-bulb-filled;
+}
+.#{$ti-prefix}-bulb-off:before {
+ content: $ti-icon-bulb-off;
+}
+.#{$ti-prefix}-bulldozer:before {
+ content: $ti-icon-bulldozer;
+}
+.#{$ti-prefix}-burger:before {
+ content: $ti-icon-burger;
+}
+.#{$ti-prefix}-bus:before {
+ content: $ti-icon-bus;
+}
+.#{$ti-prefix}-bus-off:before {
+ content: $ti-icon-bus-off;
+}
+.#{$ti-prefix}-bus-stop:before {
+ content: $ti-icon-bus-stop;
+}
+.#{$ti-prefix}-businessplan:before {
+ content: $ti-icon-businessplan;
+}
+.#{$ti-prefix}-butterfly:before {
+ content: $ti-icon-butterfly;
+}
+.#{$ti-prefix}-cactus:before {
+ content: $ti-icon-cactus;
+}
+.#{$ti-prefix}-cactus-filled:before {
+ content: $ti-icon-cactus-filled;
+}
+.#{$ti-prefix}-cactus-off:before {
+ content: $ti-icon-cactus-off;
+}
+.#{$ti-prefix}-cake:before {
+ content: $ti-icon-cake;
+}
+.#{$ti-prefix}-cake-off:before {
+ content: $ti-icon-cake-off;
+}
+.#{$ti-prefix}-calculator:before {
+ content: $ti-icon-calculator;
+}
+.#{$ti-prefix}-calculator-filled:before {
+ content: $ti-icon-calculator-filled;
+}
+.#{$ti-prefix}-calculator-off:before {
+ content: $ti-icon-calculator-off;
+}
+.#{$ti-prefix}-calendar:before {
+ content: $ti-icon-calendar;
+}
+.#{$ti-prefix}-calendar-bolt:before {
+ content: $ti-icon-calendar-bolt;
+}
+.#{$ti-prefix}-calendar-cancel:before {
+ content: $ti-icon-calendar-cancel;
+}
+.#{$ti-prefix}-calendar-check:before {
+ content: $ti-icon-calendar-check;
+}
+.#{$ti-prefix}-calendar-clock:before {
+ content: $ti-icon-calendar-clock;
+}
+.#{$ti-prefix}-calendar-code:before {
+ content: $ti-icon-calendar-code;
+}
+.#{$ti-prefix}-calendar-cog:before {
+ content: $ti-icon-calendar-cog;
+}
+.#{$ti-prefix}-calendar-dollar:before {
+ content: $ti-icon-calendar-dollar;
+}
+.#{$ti-prefix}-calendar-dot:before {
+ content: $ti-icon-calendar-dot;
+}
+.#{$ti-prefix}-calendar-down:before {
+ content: $ti-icon-calendar-down;
+}
+.#{$ti-prefix}-calendar-due:before {
+ content: $ti-icon-calendar-due;
+}
+.#{$ti-prefix}-calendar-event:before {
+ content: $ti-icon-calendar-event;
+}
+.#{$ti-prefix}-calendar-exclamation:before {
+ content: $ti-icon-calendar-exclamation;
+}
+.#{$ti-prefix}-calendar-filled:before {
+ content: $ti-icon-calendar-filled;
+}
+.#{$ti-prefix}-calendar-heart:before {
+ content: $ti-icon-calendar-heart;
+}
+.#{$ti-prefix}-calendar-minus:before {
+ content: $ti-icon-calendar-minus;
+}
+.#{$ti-prefix}-calendar-month:before {
+ content: $ti-icon-calendar-month;
+}
+.#{$ti-prefix}-calendar-off:before {
+ content: $ti-icon-calendar-off;
+}
+.#{$ti-prefix}-calendar-pause:before {
+ content: $ti-icon-calendar-pause;
+}
+.#{$ti-prefix}-calendar-pin:before {
+ content: $ti-icon-calendar-pin;
+}
+.#{$ti-prefix}-calendar-plus:before {
+ content: $ti-icon-calendar-plus;
+}
+.#{$ti-prefix}-calendar-question:before {
+ content: $ti-icon-calendar-question;
+}
+.#{$ti-prefix}-calendar-repeat:before {
+ content: $ti-icon-calendar-repeat;
+}
+.#{$ti-prefix}-calendar-sad:before {
+ content: $ti-icon-calendar-sad;
+}
+.#{$ti-prefix}-calendar-search:before {
+ content: $ti-icon-calendar-search;
+}
+.#{$ti-prefix}-calendar-share:before {
+ content: $ti-icon-calendar-share;
+}
+.#{$ti-prefix}-calendar-smile:before {
+ content: $ti-icon-calendar-smile;
+}
+.#{$ti-prefix}-calendar-star:before {
+ content: $ti-icon-calendar-star;
+}
+.#{$ti-prefix}-calendar-stats:before {
+ content: $ti-icon-calendar-stats;
+}
+.#{$ti-prefix}-calendar-time:before {
+ content: $ti-icon-calendar-time;
+}
+.#{$ti-prefix}-calendar-up:before {
+ content: $ti-icon-calendar-up;
+}
+.#{$ti-prefix}-calendar-user:before {
+ content: $ti-icon-calendar-user;
+}
+.#{$ti-prefix}-calendar-week:before {
+ content: $ti-icon-calendar-week;
+}
+.#{$ti-prefix}-calendar-x:before {
+ content: $ti-icon-calendar-x;
+}
+.#{$ti-prefix}-camera:before {
+ content: $ti-icon-camera;
+}
+.#{$ti-prefix}-camera-bolt:before {
+ content: $ti-icon-camera-bolt;
+}
+.#{$ti-prefix}-camera-cancel:before {
+ content: $ti-icon-camera-cancel;
+}
+.#{$ti-prefix}-camera-check:before {
+ content: $ti-icon-camera-check;
+}
+.#{$ti-prefix}-camera-code:before {
+ content: $ti-icon-camera-code;
+}
+.#{$ti-prefix}-camera-cog:before {
+ content: $ti-icon-camera-cog;
+}
+.#{$ti-prefix}-camera-dollar:before {
+ content: $ti-icon-camera-dollar;
+}
+.#{$ti-prefix}-camera-down:before {
+ content: $ti-icon-camera-down;
+}
+.#{$ti-prefix}-camera-exclamation:before {
+ content: $ti-icon-camera-exclamation;
+}
+.#{$ti-prefix}-camera-filled:before {
+ content: $ti-icon-camera-filled;
+}
+.#{$ti-prefix}-camera-heart:before {
+ content: $ti-icon-camera-heart;
+}
+.#{$ti-prefix}-camera-minus:before {
+ content: $ti-icon-camera-minus;
+}
+.#{$ti-prefix}-camera-off:before {
+ content: $ti-icon-camera-off;
+}
+.#{$ti-prefix}-camera-pause:before {
+ content: $ti-icon-camera-pause;
+}
+.#{$ti-prefix}-camera-pin:before {
+ content: $ti-icon-camera-pin;
+}
+.#{$ti-prefix}-camera-plus:before {
+ content: $ti-icon-camera-plus;
+}
+.#{$ti-prefix}-camera-question:before {
+ content: $ti-icon-camera-question;
+}
+.#{$ti-prefix}-camera-rotate:before {
+ content: $ti-icon-camera-rotate;
+}
+.#{$ti-prefix}-camera-search:before {
+ content: $ti-icon-camera-search;
+}
+.#{$ti-prefix}-camera-selfie:before {
+ content: $ti-icon-camera-selfie;
+}
+.#{$ti-prefix}-camera-share:before {
+ content: $ti-icon-camera-share;
+}
+.#{$ti-prefix}-camera-star:before {
+ content: $ti-icon-camera-star;
+}
+.#{$ti-prefix}-camera-up:before {
+ content: $ti-icon-camera-up;
+}
+.#{$ti-prefix}-camera-x:before {
+ content: $ti-icon-camera-x;
+}
+.#{$ti-prefix}-camper:before {
+ content: $ti-icon-camper;
+}
+.#{$ti-prefix}-campfire:before {
+ content: $ti-icon-campfire;
+}
+.#{$ti-prefix}-campfire-filled:before {
+ content: $ti-icon-campfire-filled;
+}
+.#{$ti-prefix}-candle:before {
+ content: $ti-icon-candle;
+}
+.#{$ti-prefix}-candle-filled:before {
+ content: $ti-icon-candle-filled;
+}
+.#{$ti-prefix}-candy:before {
+ content: $ti-icon-candy;
+}
+.#{$ti-prefix}-candy-off:before {
+ content: $ti-icon-candy-off;
+}
+.#{$ti-prefix}-cane:before {
+ content: $ti-icon-cane;
+}
+.#{$ti-prefix}-cannabis:before {
+ content: $ti-icon-cannabis;
+}
+.#{$ti-prefix}-capsule:before {
+ content: $ti-icon-capsule;
+}
+.#{$ti-prefix}-capsule-filled:before {
+ content: $ti-icon-capsule-filled;
+}
+.#{$ti-prefix}-capsule-horizontal:before {
+ content: $ti-icon-capsule-horizontal;
+}
+.#{$ti-prefix}-capsule-horizontal-filled:before {
+ content: $ti-icon-capsule-horizontal-filled;
+}
+.#{$ti-prefix}-capture:before {
+ content: $ti-icon-capture;
+}
+.#{$ti-prefix}-capture-filled:before {
+ content: $ti-icon-capture-filled;
+}
+.#{$ti-prefix}-capture-off:before {
+ content: $ti-icon-capture-off;
+}
+.#{$ti-prefix}-car:before {
+ content: $ti-icon-car;
+}
+.#{$ti-prefix}-car-4wd:before {
+ content: $ti-icon-car-4wd;
+}
+.#{$ti-prefix}-car-crane:before {
+ content: $ti-icon-car-crane;
+}
+.#{$ti-prefix}-car-crash:before {
+ content: $ti-icon-car-crash;
+}
+.#{$ti-prefix}-car-fan:before {
+ content: $ti-icon-car-fan;
+}
+.#{$ti-prefix}-car-fan-1:before {
+ content: $ti-icon-car-fan-1;
+}
+.#{$ti-prefix}-car-fan-2:before {
+ content: $ti-icon-car-fan-2;
+}
+.#{$ti-prefix}-car-fan-3:before {
+ content: $ti-icon-car-fan-3;
+}
+.#{$ti-prefix}-car-fan-auto:before {
+ content: $ti-icon-car-fan-auto;
+}
+.#{$ti-prefix}-car-garage:before {
+ content: $ti-icon-car-garage;
+}
+.#{$ti-prefix}-car-off:before {
+ content: $ti-icon-car-off;
+}
+.#{$ti-prefix}-car-suv:before {
+ content: $ti-icon-car-suv;
+}
+.#{$ti-prefix}-car-turbine:before {
+ content: $ti-icon-car-turbine;
+}
+.#{$ti-prefix}-carambola:before {
+ content: $ti-icon-carambola;
+}
+.#{$ti-prefix}-caravan:before {
+ content: $ti-icon-caravan;
+}
+.#{$ti-prefix}-cardboards:before {
+ content: $ti-icon-cardboards;
+}
+.#{$ti-prefix}-cardboards-off:before {
+ content: $ti-icon-cardboards-off;
+}
+.#{$ti-prefix}-cards:before {
+ content: $ti-icon-cards;
+}
+.#{$ti-prefix}-cards-filled:before {
+ content: $ti-icon-cards-filled;
+}
+.#{$ti-prefix}-caret-down:before {
+ content: $ti-icon-caret-down;
+}
+.#{$ti-prefix}-caret-down-filled:before {
+ content: $ti-icon-caret-down-filled;
+}
+.#{$ti-prefix}-caret-left:before {
+ content: $ti-icon-caret-left;
+}
+.#{$ti-prefix}-caret-left-filled:before {
+ content: $ti-icon-caret-left-filled;
+}
+.#{$ti-prefix}-caret-left-right:before {
+ content: $ti-icon-caret-left-right;
+}
+.#{$ti-prefix}-caret-left-right-filled:before {
+ content: $ti-icon-caret-left-right-filled;
+}
+.#{$ti-prefix}-caret-right:before {
+ content: $ti-icon-caret-right;
+}
+.#{$ti-prefix}-caret-right-filled:before {
+ content: $ti-icon-caret-right-filled;
+}
+.#{$ti-prefix}-caret-up:before {
+ content: $ti-icon-caret-up;
+}
+.#{$ti-prefix}-caret-up-down:before {
+ content: $ti-icon-caret-up-down;
+}
+.#{$ti-prefix}-caret-up-down-filled:before {
+ content: $ti-icon-caret-up-down-filled;
+}
+.#{$ti-prefix}-caret-up-filled:before {
+ content: $ti-icon-caret-up-filled;
+}
+.#{$ti-prefix}-carousel-horizontal:before {
+ content: $ti-icon-carousel-horizontal;
+}
+.#{$ti-prefix}-carousel-horizontal-filled:before {
+ content: $ti-icon-carousel-horizontal-filled;
+}
+.#{$ti-prefix}-carousel-vertical:before {
+ content: $ti-icon-carousel-vertical;
+}
+.#{$ti-prefix}-carousel-vertical-filled:before {
+ content: $ti-icon-carousel-vertical-filled;
+}
+.#{$ti-prefix}-carrot:before {
+ content: $ti-icon-carrot;
+}
+.#{$ti-prefix}-carrot-off:before {
+ content: $ti-icon-carrot-off;
+}
+.#{$ti-prefix}-cash:before {
+ content: $ti-icon-cash;
+}
+.#{$ti-prefix}-cash-banknote:before {
+ content: $ti-icon-cash-banknote;
+}
+.#{$ti-prefix}-cash-banknote-filled:before {
+ content: $ti-icon-cash-banknote-filled;
+}
+.#{$ti-prefix}-cash-banknote-off:before {
+ content: $ti-icon-cash-banknote-off;
+}
+.#{$ti-prefix}-cash-off:before {
+ content: $ti-icon-cash-off;
+}
+.#{$ti-prefix}-cash-register:before {
+ content: $ti-icon-cash-register;
+}
+.#{$ti-prefix}-cast:before {
+ content: $ti-icon-cast;
+}
+.#{$ti-prefix}-cast-off:before {
+ content: $ti-icon-cast-off;
+}
+.#{$ti-prefix}-cat:before {
+ content: $ti-icon-cat;
+}
+.#{$ti-prefix}-category:before {
+ content: $ti-icon-category;
+}
+.#{$ti-prefix}-category-2:before {
+ content: $ti-icon-category-2;
+}
+.#{$ti-prefix}-category-filled:before {
+ content: $ti-icon-category-filled;
+}
+.#{$ti-prefix}-category-minus:before {
+ content: $ti-icon-category-minus;
+}
+.#{$ti-prefix}-category-plus:before {
+ content: $ti-icon-category-plus;
+}
+.#{$ti-prefix}-ce:before {
+ content: $ti-icon-ce;
+}
+.#{$ti-prefix}-ce-off:before {
+ content: $ti-icon-ce-off;
+}
+.#{$ti-prefix}-cell:before {
+ content: $ti-icon-cell;
+}
+.#{$ti-prefix}-cell-signal-1:before {
+ content: $ti-icon-cell-signal-1;
+}
+.#{$ti-prefix}-cell-signal-2:before {
+ content: $ti-icon-cell-signal-2;
+}
+.#{$ti-prefix}-cell-signal-3:before {
+ content: $ti-icon-cell-signal-3;
+}
+.#{$ti-prefix}-cell-signal-4:before {
+ content: $ti-icon-cell-signal-4;
+}
+.#{$ti-prefix}-cell-signal-5:before {
+ content: $ti-icon-cell-signal-5;
+}
+.#{$ti-prefix}-cell-signal-off:before {
+ content: $ti-icon-cell-signal-off;
+}
+.#{$ti-prefix}-certificate:before {
+ content: $ti-icon-certificate;
+}
+.#{$ti-prefix}-certificate-2:before {
+ content: $ti-icon-certificate-2;
+}
+.#{$ti-prefix}-certificate-2-off:before {
+ content: $ti-icon-certificate-2-off;
+}
+.#{$ti-prefix}-certificate-off:before {
+ content: $ti-icon-certificate-off;
+}
+.#{$ti-prefix}-chair-director:before {
+ content: $ti-icon-chair-director;
+}
+.#{$ti-prefix}-chalkboard:before {
+ content: $ti-icon-chalkboard;
+}
+.#{$ti-prefix}-chalkboard-off:before {
+ content: $ti-icon-chalkboard-off;
+}
+.#{$ti-prefix}-charging-pile:before {
+ content: $ti-icon-charging-pile;
+}
+.#{$ti-prefix}-chart-arcs:before {
+ content: $ti-icon-chart-arcs;
+}
+.#{$ti-prefix}-chart-arcs-3:before {
+ content: $ti-icon-chart-arcs-3;
+}
+.#{$ti-prefix}-chart-area:before {
+ content: $ti-icon-chart-area;
+}
+.#{$ti-prefix}-chart-area-filled:before {
+ content: $ti-icon-chart-area-filled;
+}
+.#{$ti-prefix}-chart-area-line:before {
+ content: $ti-icon-chart-area-line;
+}
+.#{$ti-prefix}-chart-area-line-filled:before {
+ content: $ti-icon-chart-area-line-filled;
+}
+.#{$ti-prefix}-chart-arrows:before {
+ content: $ti-icon-chart-arrows;
+}
+.#{$ti-prefix}-chart-arrows-vertical:before {
+ content: $ti-icon-chart-arrows-vertical;
+}
+.#{$ti-prefix}-chart-bar:before {
+ content: $ti-icon-chart-bar;
+}
+.#{$ti-prefix}-chart-bar-off:before {
+ content: $ti-icon-chart-bar-off;
+}
+.#{$ti-prefix}-chart-bubble:before {
+ content: $ti-icon-chart-bubble;
+}
+.#{$ti-prefix}-chart-bubble-filled:before {
+ content: $ti-icon-chart-bubble-filled;
+}
+.#{$ti-prefix}-chart-candle:before {
+ content: $ti-icon-chart-candle;
+}
+.#{$ti-prefix}-chart-candle-filled:before {
+ content: $ti-icon-chart-candle-filled;
+}
+.#{$ti-prefix}-chart-circles:before {
+ content: $ti-icon-chart-circles;
+}
+.#{$ti-prefix}-chart-donut:before {
+ content: $ti-icon-chart-donut;
+}
+.#{$ti-prefix}-chart-donut-2:before {
+ content: $ti-icon-chart-donut-2;
+}
+.#{$ti-prefix}-chart-donut-3:before {
+ content: $ti-icon-chart-donut-3;
+}
+.#{$ti-prefix}-chart-donut-4:before {
+ content: $ti-icon-chart-donut-4;
+}
+.#{$ti-prefix}-chart-donut-filled:before {
+ content: $ti-icon-chart-donut-filled;
+}
+.#{$ti-prefix}-chart-dots:before {
+ content: $ti-icon-chart-dots;
+}
+.#{$ti-prefix}-chart-dots-2:before {
+ content: $ti-icon-chart-dots-2;
+}
+.#{$ti-prefix}-chart-dots-3:before {
+ content: $ti-icon-chart-dots-3;
+}
+.#{$ti-prefix}-chart-dots-filled:before {
+ content: $ti-icon-chart-dots-filled;
+}
+.#{$ti-prefix}-chart-grid-dots:before {
+ content: $ti-icon-chart-grid-dots;
+}
+.#{$ti-prefix}-chart-grid-dots-filled:before {
+ content: $ti-icon-chart-grid-dots-filled;
+}
+.#{$ti-prefix}-chart-histogram:before {
+ content: $ti-icon-chart-histogram;
+}
+.#{$ti-prefix}-chart-infographic:before {
+ content: $ti-icon-chart-infographic;
+}
+.#{$ti-prefix}-chart-line:before {
+ content: $ti-icon-chart-line;
+}
+.#{$ti-prefix}-chart-pie:before {
+ content: $ti-icon-chart-pie;
+}
+.#{$ti-prefix}-chart-pie-2:before {
+ content: $ti-icon-chart-pie-2;
+}
+.#{$ti-prefix}-chart-pie-3:before {
+ content: $ti-icon-chart-pie-3;
+}
+.#{$ti-prefix}-chart-pie-4:before {
+ content: $ti-icon-chart-pie-4;
+}
+.#{$ti-prefix}-chart-pie-filled:before {
+ content: $ti-icon-chart-pie-filled;
+}
+.#{$ti-prefix}-chart-pie-off:before {
+ content: $ti-icon-chart-pie-off;
+}
+.#{$ti-prefix}-chart-ppf:before {
+ content: $ti-icon-chart-ppf;
+}
+.#{$ti-prefix}-chart-radar:before {
+ content: $ti-icon-chart-radar;
+}
+.#{$ti-prefix}-chart-sankey:before {
+ content: $ti-icon-chart-sankey;
+}
+.#{$ti-prefix}-chart-scatter:before {
+ content: $ti-icon-chart-scatter;
+}
+.#{$ti-prefix}-chart-scatter-3d:before {
+ content: $ti-icon-chart-scatter-3d;
+}
+.#{$ti-prefix}-chart-treemap:before {
+ content: $ti-icon-chart-treemap;
+}
+.#{$ti-prefix}-check:before {
+ content: $ti-icon-check;
+}
+.#{$ti-prefix}-checkbox:before {
+ content: $ti-icon-checkbox;
+}
+.#{$ti-prefix}-checklist:before {
+ content: $ti-icon-checklist;
+}
+.#{$ti-prefix}-checks:before {
+ content: $ti-icon-checks;
+}
+.#{$ti-prefix}-checkup-list:before {
+ content: $ti-icon-checkup-list;
+}
+.#{$ti-prefix}-cheese:before {
+ content: $ti-icon-cheese;
+}
+.#{$ti-prefix}-chef-hat:before {
+ content: $ti-icon-chef-hat;
+}
+.#{$ti-prefix}-chef-hat-off:before {
+ content: $ti-icon-chef-hat-off;
+}
+.#{$ti-prefix}-cherry:before {
+ content: $ti-icon-cherry;
+}
+.#{$ti-prefix}-cherry-filled:before {
+ content: $ti-icon-cherry-filled;
+}
+.#{$ti-prefix}-chess:before {
+ content: $ti-icon-chess;
+}
+.#{$ti-prefix}-chess-bishop:before {
+ content: $ti-icon-chess-bishop;
+}
+.#{$ti-prefix}-chess-bishop-filled:before {
+ content: $ti-icon-chess-bishop-filled;
+}
+.#{$ti-prefix}-chess-filled:before {
+ content: $ti-icon-chess-filled;
+}
+.#{$ti-prefix}-chess-king:before {
+ content: $ti-icon-chess-king;
+}
+.#{$ti-prefix}-chess-king-filled:before {
+ content: $ti-icon-chess-king-filled;
+}
+.#{$ti-prefix}-chess-knight:before {
+ content: $ti-icon-chess-knight;
+}
+.#{$ti-prefix}-chess-knight-filled:before {
+ content: $ti-icon-chess-knight-filled;
+}
+.#{$ti-prefix}-chess-queen:before {
+ content: $ti-icon-chess-queen;
+}
+.#{$ti-prefix}-chess-queen-filled:before {
+ content: $ti-icon-chess-queen-filled;
+}
+.#{$ti-prefix}-chess-rook:before {
+ content: $ti-icon-chess-rook;
+}
+.#{$ti-prefix}-chess-rook-filled:before {
+ content: $ti-icon-chess-rook-filled;
+}
+.#{$ti-prefix}-chevron-compact-down:before {
+ content: $ti-icon-chevron-compact-down;
+}
+.#{$ti-prefix}-chevron-compact-left:before {
+ content: $ti-icon-chevron-compact-left;
+}
+.#{$ti-prefix}-chevron-compact-right:before {
+ content: $ti-icon-chevron-compact-right;
+}
+.#{$ti-prefix}-chevron-compact-up:before {
+ content: $ti-icon-chevron-compact-up;
+}
+.#{$ti-prefix}-chevron-down:before {
+ content: $ti-icon-chevron-down;
+}
+.#{$ti-prefix}-chevron-down-left:before {
+ content: $ti-icon-chevron-down-left;
+}
+.#{$ti-prefix}-chevron-down-right:before {
+ content: $ti-icon-chevron-down-right;
+}
+.#{$ti-prefix}-chevron-left:before {
+ content: $ti-icon-chevron-left;
+}
+.#{$ti-prefix}-chevron-left-pipe:before {
+ content: $ti-icon-chevron-left-pipe;
+}
+.#{$ti-prefix}-chevron-right:before {
+ content: $ti-icon-chevron-right;
+}
+.#{$ti-prefix}-chevron-right-pipe:before {
+ content: $ti-icon-chevron-right-pipe;
+}
+.#{$ti-prefix}-chevron-up:before {
+ content: $ti-icon-chevron-up;
+}
+.#{$ti-prefix}-chevron-up-left:before {
+ content: $ti-icon-chevron-up-left;
+}
+.#{$ti-prefix}-chevron-up-right:before {
+ content: $ti-icon-chevron-up-right;
+}
+.#{$ti-prefix}-chevrons-down:before {
+ content: $ti-icon-chevrons-down;
+}
+.#{$ti-prefix}-chevrons-down-left:before {
+ content: $ti-icon-chevrons-down-left;
+}
+.#{$ti-prefix}-chevrons-down-right:before {
+ content: $ti-icon-chevrons-down-right;
+}
+.#{$ti-prefix}-chevrons-left:before {
+ content: $ti-icon-chevrons-left;
+}
+.#{$ti-prefix}-chevrons-right:before {
+ content: $ti-icon-chevrons-right;
+}
+.#{$ti-prefix}-chevrons-up:before {
+ content: $ti-icon-chevrons-up;
+}
+.#{$ti-prefix}-chevrons-up-left:before {
+ content: $ti-icon-chevrons-up-left;
+}
+.#{$ti-prefix}-chevrons-up-right:before {
+ content: $ti-icon-chevrons-up-right;
+}
+.#{$ti-prefix}-chisel:before {
+ content: $ti-icon-chisel;
+}
+.#{$ti-prefix}-christmas-ball:before {
+ content: $ti-icon-christmas-ball;
+}
+.#{$ti-prefix}-christmas-tree:before {
+ content: $ti-icon-christmas-tree;
+}
+.#{$ti-prefix}-christmas-tree-off:before {
+ content: $ti-icon-christmas-tree-off;
+}
+.#{$ti-prefix}-circle:before {
+ content: $ti-icon-circle;
+}
+.#{$ti-prefix}-circle-arrow-down:before {
+ content: $ti-icon-circle-arrow-down;
+}
+.#{$ti-prefix}-circle-arrow-down-filled:before {
+ content: $ti-icon-circle-arrow-down-filled;
+}
+.#{$ti-prefix}-circle-arrow-down-left:before {
+ content: $ti-icon-circle-arrow-down-left;
+}
+.#{$ti-prefix}-circle-arrow-down-left-filled:before {
+ content: $ti-icon-circle-arrow-down-left-filled;
+}
+.#{$ti-prefix}-circle-arrow-down-right:before {
+ content: $ti-icon-circle-arrow-down-right;
+}
+.#{$ti-prefix}-circle-arrow-down-right-filled:before {
+ content: $ti-icon-circle-arrow-down-right-filled;
+}
+.#{$ti-prefix}-circle-arrow-left:before {
+ content: $ti-icon-circle-arrow-left;
+}
+.#{$ti-prefix}-circle-arrow-left-filled:before {
+ content: $ti-icon-circle-arrow-left-filled;
+}
+.#{$ti-prefix}-circle-arrow-right:before {
+ content: $ti-icon-circle-arrow-right;
+}
+.#{$ti-prefix}-circle-arrow-right-filled:before {
+ content: $ti-icon-circle-arrow-right-filled;
+}
+.#{$ti-prefix}-circle-arrow-up:before {
+ content: $ti-icon-circle-arrow-up;
+}
+.#{$ti-prefix}-circle-arrow-up-filled:before {
+ content: $ti-icon-circle-arrow-up-filled;
+}
+.#{$ti-prefix}-circle-arrow-up-left:before {
+ content: $ti-icon-circle-arrow-up-left;
+}
+.#{$ti-prefix}-circle-arrow-up-left-filled:before {
+ content: $ti-icon-circle-arrow-up-left-filled;
+}
+.#{$ti-prefix}-circle-arrow-up-right:before {
+ content: $ti-icon-circle-arrow-up-right;
+}
+.#{$ti-prefix}-circle-arrow-up-right-filled:before {
+ content: $ti-icon-circle-arrow-up-right-filled;
+}
+.#{$ti-prefix}-circle-caret-down:before {
+ content: $ti-icon-circle-caret-down;
+}
+.#{$ti-prefix}-circle-caret-left:before {
+ content: $ti-icon-circle-caret-left;
+}
+.#{$ti-prefix}-circle-caret-right:before {
+ content: $ti-icon-circle-caret-right;
+}
+.#{$ti-prefix}-circle-caret-up:before {
+ content: $ti-icon-circle-caret-up;
+}
+.#{$ti-prefix}-circle-check:before {
+ content: $ti-icon-circle-check;
+}
+.#{$ti-prefix}-circle-check-filled:before {
+ content: $ti-icon-circle-check-filled;
+}
+.#{$ti-prefix}-circle-chevron-down:before {
+ content: $ti-icon-circle-chevron-down;
+}
+.#{$ti-prefix}-circle-chevron-left:before {
+ content: $ti-icon-circle-chevron-left;
+}
+.#{$ti-prefix}-circle-chevron-right:before {
+ content: $ti-icon-circle-chevron-right;
+}
+.#{$ti-prefix}-circle-chevron-up:before {
+ content: $ti-icon-circle-chevron-up;
+}
+.#{$ti-prefix}-circle-chevrons-down:before {
+ content: $ti-icon-circle-chevrons-down;
+}
+.#{$ti-prefix}-circle-chevrons-left:before {
+ content: $ti-icon-circle-chevrons-left;
+}
+.#{$ti-prefix}-circle-chevrons-right:before {
+ content: $ti-icon-circle-chevrons-right;
+}
+.#{$ti-prefix}-circle-chevrons-up:before {
+ content: $ti-icon-circle-chevrons-up;
+}
+.#{$ti-prefix}-circle-dashed:before {
+ content: $ti-icon-circle-dashed;
+}
+.#{$ti-prefix}-circle-dashed-check:before {
+ content: $ti-icon-circle-dashed-check;
+}
+.#{$ti-prefix}-circle-dashed-minus:before {
+ content: $ti-icon-circle-dashed-minus;
+}
+.#{$ti-prefix}-circle-dashed-number-0:before {
+ content: $ti-icon-circle-dashed-number-0;
+}
+.#{$ti-prefix}-circle-dashed-number-1:before {
+ content: $ti-icon-circle-dashed-number-1;
+}
+.#{$ti-prefix}-circle-dashed-number-2:before {
+ content: $ti-icon-circle-dashed-number-2;
+}
+.#{$ti-prefix}-circle-dashed-number-3:before {
+ content: $ti-icon-circle-dashed-number-3;
+}
+.#{$ti-prefix}-circle-dashed-number-4:before {
+ content: $ti-icon-circle-dashed-number-4;
+}
+.#{$ti-prefix}-circle-dashed-number-5:before {
+ content: $ti-icon-circle-dashed-number-5;
+}
+.#{$ti-prefix}-circle-dashed-number-6:before {
+ content: $ti-icon-circle-dashed-number-6;
+}
+.#{$ti-prefix}-circle-dashed-number-7:before {
+ content: $ti-icon-circle-dashed-number-7;
+}
+.#{$ti-prefix}-circle-dashed-number-8:before {
+ content: $ti-icon-circle-dashed-number-8;
+}
+.#{$ti-prefix}-circle-dashed-number-9:before {
+ content: $ti-icon-circle-dashed-number-9;
+}
+.#{$ti-prefix}-circle-dashed-percentage:before {
+ content: $ti-icon-circle-dashed-percentage;
+}
+.#{$ti-prefix}-circle-dashed-plus:before {
+ content: $ti-icon-circle-dashed-plus;
+}
+.#{$ti-prefix}-circle-dashed-x:before {
+ content: $ti-icon-circle-dashed-x;
+}
+.#{$ti-prefix}-circle-dot:before {
+ content: $ti-icon-circle-dot;
+}
+.#{$ti-prefix}-circle-dot-filled:before {
+ content: $ti-icon-circle-dot-filled;
+}
+.#{$ti-prefix}-circle-dotted:before {
+ content: $ti-icon-circle-dotted;
+}
+.#{$ti-prefix}-circle-filled:before {
+ content: $ti-icon-circle-filled;
+}
+.#{$ti-prefix}-circle-half:before {
+ content: $ti-icon-circle-half;
+}
+.#{$ti-prefix}-circle-half-2:before {
+ content: $ti-icon-circle-half-2;
+}
+.#{$ti-prefix}-circle-half-vertical:before {
+ content: $ti-icon-circle-half-vertical;
+}
+.#{$ti-prefix}-circle-key:before {
+ content: $ti-icon-circle-key;
+}
+.#{$ti-prefix}-circle-key-filled:before {
+ content: $ti-icon-circle-key-filled;
+}
+.#{$ti-prefix}-circle-letter-a:before {
+ content: $ti-icon-circle-letter-a;
+}
+.#{$ti-prefix}-circle-letter-a-filled:before {
+ content: $ti-icon-circle-letter-a-filled;
+}
+.#{$ti-prefix}-circle-letter-b:before {
+ content: $ti-icon-circle-letter-b;
+}
+.#{$ti-prefix}-circle-letter-b-filled:before {
+ content: $ti-icon-circle-letter-b-filled;
+}
+.#{$ti-prefix}-circle-letter-c:before {
+ content: $ti-icon-circle-letter-c;
+}
+.#{$ti-prefix}-circle-letter-c-filled:before {
+ content: $ti-icon-circle-letter-c-filled;
+}
+.#{$ti-prefix}-circle-letter-d:before {
+ content: $ti-icon-circle-letter-d;
+}
+.#{$ti-prefix}-circle-letter-d-filled:before {
+ content: $ti-icon-circle-letter-d-filled;
+}
+.#{$ti-prefix}-circle-letter-e:before {
+ content: $ti-icon-circle-letter-e;
+}
+.#{$ti-prefix}-circle-letter-e-filled:before {
+ content: $ti-icon-circle-letter-e-filled;
+}
+.#{$ti-prefix}-circle-letter-f:before {
+ content: $ti-icon-circle-letter-f;
+}
+.#{$ti-prefix}-circle-letter-f-filled:before {
+ content: $ti-icon-circle-letter-f-filled;
+}
+.#{$ti-prefix}-circle-letter-g:before {
+ content: $ti-icon-circle-letter-g;
+}
+.#{$ti-prefix}-circle-letter-g-filled:before {
+ content: $ti-icon-circle-letter-g-filled;
+}
+.#{$ti-prefix}-circle-letter-h:before {
+ content: $ti-icon-circle-letter-h;
+}
+.#{$ti-prefix}-circle-letter-h-filled:before {
+ content: $ti-icon-circle-letter-h-filled;
+}
+.#{$ti-prefix}-circle-letter-i:before {
+ content: $ti-icon-circle-letter-i;
+}
+.#{$ti-prefix}-circle-letter-i-filled:before {
+ content: $ti-icon-circle-letter-i-filled;
+}
+.#{$ti-prefix}-circle-letter-j:before {
+ content: $ti-icon-circle-letter-j;
+}
+.#{$ti-prefix}-circle-letter-j-filled:before {
+ content: $ti-icon-circle-letter-j-filled;
+}
+.#{$ti-prefix}-circle-letter-k:before {
+ content: $ti-icon-circle-letter-k;
+}
+.#{$ti-prefix}-circle-letter-k-filled:before {
+ content: $ti-icon-circle-letter-k-filled;
+}
+.#{$ti-prefix}-circle-letter-l:before {
+ content: $ti-icon-circle-letter-l;
+}
+.#{$ti-prefix}-circle-letter-l-filled:before {
+ content: $ti-icon-circle-letter-l-filled;
+}
+.#{$ti-prefix}-circle-letter-m:before {
+ content: $ti-icon-circle-letter-m;
+}
+.#{$ti-prefix}-circle-letter-m-filled:before {
+ content: $ti-icon-circle-letter-m-filled;
+}
+.#{$ti-prefix}-circle-letter-n:before {
+ content: $ti-icon-circle-letter-n;
+}
+.#{$ti-prefix}-circle-letter-n-filled:before {
+ content: $ti-icon-circle-letter-n-filled;
+}
+.#{$ti-prefix}-circle-letter-o:before {
+ content: $ti-icon-circle-letter-o;
+}
+.#{$ti-prefix}-circle-letter-o-filled:before {
+ content: $ti-icon-circle-letter-o-filled;
+}
+.#{$ti-prefix}-circle-letter-p:before {
+ content: $ti-icon-circle-letter-p;
+}
+.#{$ti-prefix}-circle-letter-p-filled:before {
+ content: $ti-icon-circle-letter-p-filled;
+}
+.#{$ti-prefix}-circle-letter-q:before {
+ content: $ti-icon-circle-letter-q;
+}
+.#{$ti-prefix}-circle-letter-q-filled:before {
+ content: $ti-icon-circle-letter-q-filled;
+}
+.#{$ti-prefix}-circle-letter-r:before {
+ content: $ti-icon-circle-letter-r;
+}
+.#{$ti-prefix}-circle-letter-r-filled:before {
+ content: $ti-icon-circle-letter-r-filled;
+}
+.#{$ti-prefix}-circle-letter-s:before {
+ content: $ti-icon-circle-letter-s;
+}
+.#{$ti-prefix}-circle-letter-s-filled:before {
+ content: $ti-icon-circle-letter-s-filled;
+}
+.#{$ti-prefix}-circle-letter-t:before {
+ content: $ti-icon-circle-letter-t;
+}
+.#{$ti-prefix}-circle-letter-t-filled:before {
+ content: $ti-icon-circle-letter-t-filled;
+}
+.#{$ti-prefix}-circle-letter-u:before {
+ content: $ti-icon-circle-letter-u;
+}
+.#{$ti-prefix}-circle-letter-u-filled:before {
+ content: $ti-icon-circle-letter-u-filled;
+}
+.#{$ti-prefix}-circle-letter-v:before {
+ content: $ti-icon-circle-letter-v;
+}
+.#{$ti-prefix}-circle-letter-v-filled:before {
+ content: $ti-icon-circle-letter-v-filled;
+}
+.#{$ti-prefix}-circle-letter-w:before {
+ content: $ti-icon-circle-letter-w;
+}
+.#{$ti-prefix}-circle-letter-w-filled:before {
+ content: $ti-icon-circle-letter-w-filled;
+}
+.#{$ti-prefix}-circle-letter-x:before {
+ content: $ti-icon-circle-letter-x;
+}
+.#{$ti-prefix}-circle-letter-x-filled:before {
+ content: $ti-icon-circle-letter-x-filled;
+}
+.#{$ti-prefix}-circle-letter-y:before {
+ content: $ti-icon-circle-letter-y;
+}
+.#{$ti-prefix}-circle-letter-y-filled:before {
+ content: $ti-icon-circle-letter-y-filled;
+}
+.#{$ti-prefix}-circle-letter-z:before {
+ content: $ti-icon-circle-letter-z;
+}
+.#{$ti-prefix}-circle-letter-z-filled:before {
+ content: $ti-icon-circle-letter-z-filled;
+}
+.#{$ti-prefix}-circle-minus:before {
+ content: $ti-icon-circle-minus;
+}
+.#{$ti-prefix}-circle-minus-2:before {
+ content: $ti-icon-circle-minus-2;
+}
+.#{$ti-prefix}-circle-number-0:before {
+ content: $ti-icon-circle-number-0;
+}
+.#{$ti-prefix}-circle-number-0-filled:before {
+ content: $ti-icon-circle-number-0-filled;
+}
+.#{$ti-prefix}-circle-number-1:before {
+ content: $ti-icon-circle-number-1;
+}
+.#{$ti-prefix}-circle-number-1-filled:before {
+ content: $ti-icon-circle-number-1-filled;
+}
+.#{$ti-prefix}-circle-number-2:before {
+ content: $ti-icon-circle-number-2;
+}
+.#{$ti-prefix}-circle-number-2-filled:before {
+ content: $ti-icon-circle-number-2-filled;
+}
+.#{$ti-prefix}-circle-number-3:before {
+ content: $ti-icon-circle-number-3;
+}
+.#{$ti-prefix}-circle-number-3-filled:before {
+ content: $ti-icon-circle-number-3-filled;
+}
+.#{$ti-prefix}-circle-number-4:before {
+ content: $ti-icon-circle-number-4;
+}
+.#{$ti-prefix}-circle-number-4-filled:before {
+ content: $ti-icon-circle-number-4-filled;
+}
+.#{$ti-prefix}-circle-number-5:before {
+ content: $ti-icon-circle-number-5;
+}
+.#{$ti-prefix}-circle-number-5-filled:before {
+ content: $ti-icon-circle-number-5-filled;
+}
+.#{$ti-prefix}-circle-number-6:before {
+ content: $ti-icon-circle-number-6;
+}
+.#{$ti-prefix}-circle-number-6-filled:before {
+ content: $ti-icon-circle-number-6-filled;
+}
+.#{$ti-prefix}-circle-number-7:before {
+ content: $ti-icon-circle-number-7;
+}
+.#{$ti-prefix}-circle-number-7-filled:before {
+ content: $ti-icon-circle-number-7-filled;
+}
+.#{$ti-prefix}-circle-number-8:before {
+ content: $ti-icon-circle-number-8;
+}
+.#{$ti-prefix}-circle-number-8-filled:before {
+ content: $ti-icon-circle-number-8-filled;
+}
+.#{$ti-prefix}-circle-number-9:before {
+ content: $ti-icon-circle-number-9;
+}
+.#{$ti-prefix}-circle-number-9-filled:before {
+ content: $ti-icon-circle-number-9-filled;
+}
+.#{$ti-prefix}-circle-off:before {
+ content: $ti-icon-circle-off;
+}
+.#{$ti-prefix}-circle-percentage:before {
+ content: $ti-icon-circle-percentage;
+}
+.#{$ti-prefix}-circle-percentage-filled:before {
+ content: $ti-icon-circle-percentage-filled;
+}
+.#{$ti-prefix}-circle-plus:before {
+ content: $ti-icon-circle-plus;
+}
+.#{$ti-prefix}-circle-plus-2:before {
+ content: $ti-icon-circle-plus-2;
+}
+.#{$ti-prefix}-circle-rectangle:before {
+ content: $ti-icon-circle-rectangle;
+}
+.#{$ti-prefix}-circle-rectangle-off:before {
+ content: $ti-icon-circle-rectangle-off;
+}
+.#{$ti-prefix}-circle-square:before {
+ content: $ti-icon-circle-square;
+}
+.#{$ti-prefix}-circle-triangle:before {
+ content: $ti-icon-circle-triangle;
+}
+.#{$ti-prefix}-circle-x:before {
+ content: $ti-icon-circle-x;
+}
+.#{$ti-prefix}-circle-x-filled:before {
+ content: $ti-icon-circle-x-filled;
+}
+.#{$ti-prefix}-circles:before {
+ content: $ti-icon-circles;
+}
+.#{$ti-prefix}-circles-filled:before {
+ content: $ti-icon-circles-filled;
+}
+.#{$ti-prefix}-circles-relation:before {
+ content: $ti-icon-circles-relation;
+}
+.#{$ti-prefix}-circuit-ammeter:before {
+ content: $ti-icon-circuit-ammeter;
+}
+.#{$ti-prefix}-circuit-battery:before {
+ content: $ti-icon-circuit-battery;
+}
+.#{$ti-prefix}-circuit-bulb:before {
+ content: $ti-icon-circuit-bulb;
+}
+.#{$ti-prefix}-circuit-capacitor:before {
+ content: $ti-icon-circuit-capacitor;
+}
+.#{$ti-prefix}-circuit-capacitor-polarized:before {
+ content: $ti-icon-circuit-capacitor-polarized;
+}
+.#{$ti-prefix}-circuit-cell:before {
+ content: $ti-icon-circuit-cell;
+}
+.#{$ti-prefix}-circuit-cell-plus:before {
+ content: $ti-icon-circuit-cell-plus;
+}
+.#{$ti-prefix}-circuit-changeover:before {
+ content: $ti-icon-circuit-changeover;
+}
+.#{$ti-prefix}-circuit-diode:before {
+ content: $ti-icon-circuit-diode;
+}
+.#{$ti-prefix}-circuit-diode-zener:before {
+ content: $ti-icon-circuit-diode-zener;
+}
+.#{$ti-prefix}-circuit-ground:before {
+ content: $ti-icon-circuit-ground;
+}
+.#{$ti-prefix}-circuit-ground-digital:before {
+ content: $ti-icon-circuit-ground-digital;
+}
+.#{$ti-prefix}-circuit-inductor:before {
+ content: $ti-icon-circuit-inductor;
+}
+.#{$ti-prefix}-circuit-motor:before {
+ content: $ti-icon-circuit-motor;
+}
+.#{$ti-prefix}-circuit-pushbutton:before {
+ content: $ti-icon-circuit-pushbutton;
+}
+.#{$ti-prefix}-circuit-resistor:before {
+ content: $ti-icon-circuit-resistor;
+}
+.#{$ti-prefix}-circuit-switch-closed:before {
+ content: $ti-icon-circuit-switch-closed;
+}
+.#{$ti-prefix}-circuit-switch-open:before {
+ content: $ti-icon-circuit-switch-open;
+}
+.#{$ti-prefix}-circuit-voltmeter:before {
+ content: $ti-icon-circuit-voltmeter;
+}
+.#{$ti-prefix}-clear-all:before {
+ content: $ti-icon-clear-all;
+}
+.#{$ti-prefix}-clear-formatting:before {
+ content: $ti-icon-clear-formatting;
+}
+.#{$ti-prefix}-click:before {
+ content: $ti-icon-click;
+}
+.#{$ti-prefix}-clipboard:before {
+ content: $ti-icon-clipboard;
+}
+.#{$ti-prefix}-clipboard-check:before {
+ content: $ti-icon-clipboard-check;
+}
+.#{$ti-prefix}-clipboard-copy:before {
+ content: $ti-icon-clipboard-copy;
+}
+.#{$ti-prefix}-clipboard-data:before {
+ content: $ti-icon-clipboard-data;
+}
+.#{$ti-prefix}-clipboard-heart:before {
+ content: $ti-icon-clipboard-heart;
+}
+.#{$ti-prefix}-clipboard-list:before {
+ content: $ti-icon-clipboard-list;
+}
+.#{$ti-prefix}-clipboard-off:before {
+ content: $ti-icon-clipboard-off;
+}
+.#{$ti-prefix}-clipboard-plus:before {
+ content: $ti-icon-clipboard-plus;
+}
+.#{$ti-prefix}-clipboard-smile:before {
+ content: $ti-icon-clipboard-smile;
+}
+.#{$ti-prefix}-clipboard-text:before {
+ content: $ti-icon-clipboard-text;
+}
+.#{$ti-prefix}-clipboard-typography:before {
+ content: $ti-icon-clipboard-typography;
+}
+.#{$ti-prefix}-clipboard-x:before {
+ content: $ti-icon-clipboard-x;
+}
+.#{$ti-prefix}-clock:before {
+ content: $ti-icon-clock;
+}
+.#{$ti-prefix}-clock-12:before {
+ content: $ti-icon-clock-12;
+}
+.#{$ti-prefix}-clock-2:before {
+ content: $ti-icon-clock-2;
+}
+.#{$ti-prefix}-clock-24:before {
+ content: $ti-icon-clock-24;
+}
+.#{$ti-prefix}-clock-bolt:before {
+ content: $ti-icon-clock-bolt;
+}
+.#{$ti-prefix}-clock-cancel:before {
+ content: $ti-icon-clock-cancel;
+}
+.#{$ti-prefix}-clock-check:before {
+ content: $ti-icon-clock-check;
+}
+.#{$ti-prefix}-clock-code:before {
+ content: $ti-icon-clock-code;
+}
+.#{$ti-prefix}-clock-cog:before {
+ content: $ti-icon-clock-cog;
+}
+.#{$ti-prefix}-clock-dollar:before {
+ content: $ti-icon-clock-dollar;
+}
+.#{$ti-prefix}-clock-down:before {
+ content: $ti-icon-clock-down;
+}
+.#{$ti-prefix}-clock-edit:before {
+ content: $ti-icon-clock-edit;
+}
+.#{$ti-prefix}-clock-exclamation:before {
+ content: $ti-icon-clock-exclamation;
+}
+.#{$ti-prefix}-clock-filled:before {
+ content: $ti-icon-clock-filled;
+}
+.#{$ti-prefix}-clock-heart:before {
+ content: $ti-icon-clock-heart;
+}
+.#{$ti-prefix}-clock-hour-1:before {
+ content: $ti-icon-clock-hour-1;
+}
+.#{$ti-prefix}-clock-hour-1-filled:before {
+ content: $ti-icon-clock-hour-1-filled;
+}
+.#{$ti-prefix}-clock-hour-10:before {
+ content: $ti-icon-clock-hour-10;
+}
+.#{$ti-prefix}-clock-hour-10-filled:before {
+ content: $ti-icon-clock-hour-10-filled;
+}
+.#{$ti-prefix}-clock-hour-11:before {
+ content: $ti-icon-clock-hour-11;
+}
+.#{$ti-prefix}-clock-hour-11-filled:before {
+ content: $ti-icon-clock-hour-11-filled;
+}
+.#{$ti-prefix}-clock-hour-12:before {
+ content: $ti-icon-clock-hour-12;
+}
+.#{$ti-prefix}-clock-hour-12-filled:before {
+ content: $ti-icon-clock-hour-12-filled;
+}
+.#{$ti-prefix}-clock-hour-2:before {
+ content: $ti-icon-clock-hour-2;
+}
+.#{$ti-prefix}-clock-hour-2-filled:before {
+ content: $ti-icon-clock-hour-2-filled;
+}
+.#{$ti-prefix}-clock-hour-3:before {
+ content: $ti-icon-clock-hour-3;
+}
+.#{$ti-prefix}-clock-hour-3-filled:before {
+ content: $ti-icon-clock-hour-3-filled;
+}
+.#{$ti-prefix}-clock-hour-4:before {
+ content: $ti-icon-clock-hour-4;
+}
+.#{$ti-prefix}-clock-hour-4-filled:before {
+ content: $ti-icon-clock-hour-4-filled;
+}
+.#{$ti-prefix}-clock-hour-5:before {
+ content: $ti-icon-clock-hour-5;
+}
+.#{$ti-prefix}-clock-hour-5-filled:before {
+ content: $ti-icon-clock-hour-5-filled;
+}
+.#{$ti-prefix}-clock-hour-6:before {
+ content: $ti-icon-clock-hour-6;
+}
+.#{$ti-prefix}-clock-hour-6-filled:before {
+ content: $ti-icon-clock-hour-6-filled;
+}
+.#{$ti-prefix}-clock-hour-7:before {
+ content: $ti-icon-clock-hour-7;
+}
+.#{$ti-prefix}-clock-hour-7-filled:before {
+ content: $ti-icon-clock-hour-7-filled;
+}
+.#{$ti-prefix}-clock-hour-8:before {
+ content: $ti-icon-clock-hour-8;
+}
+.#{$ti-prefix}-clock-hour-8-filled:before {
+ content: $ti-icon-clock-hour-8-filled;
+}
+.#{$ti-prefix}-clock-hour-9:before {
+ content: $ti-icon-clock-hour-9;
+}
+.#{$ti-prefix}-clock-hour-9-filled:before {
+ content: $ti-icon-clock-hour-9-filled;
+}
+.#{$ti-prefix}-clock-minus:before {
+ content: $ti-icon-clock-minus;
+}
+.#{$ti-prefix}-clock-off:before {
+ content: $ti-icon-clock-off;
+}
+.#{$ti-prefix}-clock-pause:before {
+ content: $ti-icon-clock-pause;
+}
+.#{$ti-prefix}-clock-pin:before {
+ content: $ti-icon-clock-pin;
+}
+.#{$ti-prefix}-clock-play:before {
+ content: $ti-icon-clock-play;
+}
+.#{$ti-prefix}-clock-plus:before {
+ content: $ti-icon-clock-plus;
+}
+.#{$ti-prefix}-clock-question:before {
+ content: $ti-icon-clock-question;
+}
+.#{$ti-prefix}-clock-record:before {
+ content: $ti-icon-clock-record;
+}
+.#{$ti-prefix}-clock-search:before {
+ content: $ti-icon-clock-search;
+}
+.#{$ti-prefix}-clock-share:before {
+ content: $ti-icon-clock-share;
+}
+.#{$ti-prefix}-clock-shield:before {
+ content: $ti-icon-clock-shield;
+}
+.#{$ti-prefix}-clock-star:before {
+ content: $ti-icon-clock-star;
+}
+.#{$ti-prefix}-clock-stop:before {
+ content: $ti-icon-clock-stop;
+}
+.#{$ti-prefix}-clock-up:before {
+ content: $ti-icon-clock-up;
+}
+.#{$ti-prefix}-clock-x:before {
+ content: $ti-icon-clock-x;
+}
+.#{$ti-prefix}-clothes-rack:before {
+ content: $ti-icon-clothes-rack;
+}
+.#{$ti-prefix}-clothes-rack-off:before {
+ content: $ti-icon-clothes-rack-off;
+}
+.#{$ti-prefix}-cloud:before {
+ content: $ti-icon-cloud;
+}
+.#{$ti-prefix}-cloud-bolt:before {
+ content: $ti-icon-cloud-bolt;
+}
+.#{$ti-prefix}-cloud-cancel:before {
+ content: $ti-icon-cloud-cancel;
+}
+.#{$ti-prefix}-cloud-check:before {
+ content: $ti-icon-cloud-check;
+}
+.#{$ti-prefix}-cloud-code:before {
+ content: $ti-icon-cloud-code;
+}
+.#{$ti-prefix}-cloud-cog:before {
+ content: $ti-icon-cloud-cog;
+}
+.#{$ti-prefix}-cloud-computing:before {
+ content: $ti-icon-cloud-computing;
+}
+.#{$ti-prefix}-cloud-data-connection:before {
+ content: $ti-icon-cloud-data-connection;
+}
+.#{$ti-prefix}-cloud-dollar:before {
+ content: $ti-icon-cloud-dollar;
+}
+.#{$ti-prefix}-cloud-down:before {
+ content: $ti-icon-cloud-down;
+}
+.#{$ti-prefix}-cloud-download:before {
+ content: $ti-icon-cloud-download;
+}
+.#{$ti-prefix}-cloud-exclamation:before {
+ content: $ti-icon-cloud-exclamation;
+}
+.#{$ti-prefix}-cloud-filled:before {
+ content: $ti-icon-cloud-filled;
+}
+.#{$ti-prefix}-cloud-fog:before {
+ content: $ti-icon-cloud-fog;
+}
+.#{$ti-prefix}-cloud-heart:before {
+ content: $ti-icon-cloud-heart;
+}
+.#{$ti-prefix}-cloud-lock:before {
+ content: $ti-icon-cloud-lock;
+}
+.#{$ti-prefix}-cloud-lock-open:before {
+ content: $ti-icon-cloud-lock-open;
+}
+.#{$ti-prefix}-cloud-minus:before {
+ content: $ti-icon-cloud-minus;
+}
+.#{$ti-prefix}-cloud-network:before {
+ content: $ti-icon-cloud-network;
+}
+.#{$ti-prefix}-cloud-off:before {
+ content: $ti-icon-cloud-off;
+}
+.#{$ti-prefix}-cloud-pause:before {
+ content: $ti-icon-cloud-pause;
+}
+.#{$ti-prefix}-cloud-pin:before {
+ content: $ti-icon-cloud-pin;
+}
+.#{$ti-prefix}-cloud-plus:before {
+ content: $ti-icon-cloud-plus;
+}
+.#{$ti-prefix}-cloud-question:before {
+ content: $ti-icon-cloud-question;
+}
+.#{$ti-prefix}-cloud-rain:before {
+ content: $ti-icon-cloud-rain;
+}
+.#{$ti-prefix}-cloud-search:before {
+ content: $ti-icon-cloud-search;
+}
+.#{$ti-prefix}-cloud-share:before {
+ content: $ti-icon-cloud-share;
+}
+.#{$ti-prefix}-cloud-snow:before {
+ content: $ti-icon-cloud-snow;
+}
+.#{$ti-prefix}-cloud-star:before {
+ content: $ti-icon-cloud-star;
+}
+.#{$ti-prefix}-cloud-storm:before {
+ content: $ti-icon-cloud-storm;
+}
+.#{$ti-prefix}-cloud-up:before {
+ content: $ti-icon-cloud-up;
+}
+.#{$ti-prefix}-cloud-upload:before {
+ content: $ti-icon-cloud-upload;
+}
+.#{$ti-prefix}-cloud-x:before {
+ content: $ti-icon-cloud-x;
+}
+.#{$ti-prefix}-clover:before {
+ content: $ti-icon-clover;
+}
+.#{$ti-prefix}-clover-2:before {
+ content: $ti-icon-clover-2;
+}
+.#{$ti-prefix}-clubs:before {
+ content: $ti-icon-clubs;
+}
+.#{$ti-prefix}-clubs-filled:before {
+ content: $ti-icon-clubs-filled;
+}
+.#{$ti-prefix}-code:before {
+ content: $ti-icon-code;
+}
+.#{$ti-prefix}-code-asterisk:before {
+ content: $ti-icon-code-asterisk;
+}
+.#{$ti-prefix}-code-circle:before {
+ content: $ti-icon-code-circle;
+}
+.#{$ti-prefix}-code-circle-2:before {
+ content: $ti-icon-code-circle-2;
+}
+.#{$ti-prefix}-code-circle-2-filled:before {
+ content: $ti-icon-code-circle-2-filled;
+}
+.#{$ti-prefix}-code-circle-filled:before {
+ content: $ti-icon-code-circle-filled;
+}
+.#{$ti-prefix}-code-dots:before {
+ content: $ti-icon-code-dots;
+}
+.#{$ti-prefix}-code-minus:before {
+ content: $ti-icon-code-minus;
+}
+.#{$ti-prefix}-code-off:before {
+ content: $ti-icon-code-off;
+}
+.#{$ti-prefix}-code-plus:before {
+ content: $ti-icon-code-plus;
+}
+.#{$ti-prefix}-coffee:before {
+ content: $ti-icon-coffee;
+}
+.#{$ti-prefix}-coffee-off:before {
+ content: $ti-icon-coffee-off;
+}
+.#{$ti-prefix}-coffin:before {
+ content: $ti-icon-coffin;
+}
+.#{$ti-prefix}-coin:before {
+ content: $ti-icon-coin;
+}
+.#{$ti-prefix}-coin-bitcoin:before {
+ content: $ti-icon-coin-bitcoin;
+}
+.#{$ti-prefix}-coin-bitcoin-filled:before {
+ content: $ti-icon-coin-bitcoin-filled;
+}
+.#{$ti-prefix}-coin-euro:before {
+ content: $ti-icon-coin-euro;
+}
+.#{$ti-prefix}-coin-euro-filled:before {
+ content: $ti-icon-coin-euro-filled;
+}
+.#{$ti-prefix}-coin-filled:before {
+ content: $ti-icon-coin-filled;
+}
+.#{$ti-prefix}-coin-monero:before {
+ content: $ti-icon-coin-monero;
+}
+.#{$ti-prefix}-coin-monero-filled:before {
+ content: $ti-icon-coin-monero-filled;
+}
+.#{$ti-prefix}-coin-off:before {
+ content: $ti-icon-coin-off;
+}
+.#{$ti-prefix}-coin-pound:before {
+ content: $ti-icon-coin-pound;
+}
+.#{$ti-prefix}-coin-pound-filled:before {
+ content: $ti-icon-coin-pound-filled;
+}
+.#{$ti-prefix}-coin-rupee:before {
+ content: $ti-icon-coin-rupee;
+}
+.#{$ti-prefix}-coin-rupee-filled:before {
+ content: $ti-icon-coin-rupee-filled;
+}
+.#{$ti-prefix}-coin-taka:before {
+ content: $ti-icon-coin-taka;
+}
+.#{$ti-prefix}-coin-taka-filled:before {
+ content: $ti-icon-coin-taka-filled;
+}
+.#{$ti-prefix}-coin-yen:before {
+ content: $ti-icon-coin-yen;
+}
+.#{$ti-prefix}-coin-yen-filled:before {
+ content: $ti-icon-coin-yen-filled;
+}
+.#{$ti-prefix}-coin-yuan:before {
+ content: $ti-icon-coin-yuan;
+}
+.#{$ti-prefix}-coin-yuan-filled:before {
+ content: $ti-icon-coin-yuan-filled;
+}
+.#{$ti-prefix}-coins:before {
+ content: $ti-icon-coins;
+}
+.#{$ti-prefix}-color-filter:before {
+ content: $ti-icon-color-filter;
+}
+.#{$ti-prefix}-color-picker:before {
+ content: $ti-icon-color-picker;
+}
+.#{$ti-prefix}-color-picker-off:before {
+ content: $ti-icon-color-picker-off;
+}
+.#{$ti-prefix}-color-swatch:before {
+ content: $ti-icon-color-swatch;
+}
+.#{$ti-prefix}-color-swatch-off:before {
+ content: $ti-icon-color-swatch-off;
+}
+.#{$ti-prefix}-column-insert-left:before {
+ content: $ti-icon-column-insert-left;
+}
+.#{$ti-prefix}-column-insert-right:before {
+ content: $ti-icon-column-insert-right;
+}
+.#{$ti-prefix}-column-remove:before {
+ content: $ti-icon-column-remove;
+}
+.#{$ti-prefix}-columns:before {
+ content: $ti-icon-columns;
+}
+.#{$ti-prefix}-columns-1:before {
+ content: $ti-icon-columns-1;
+}
+.#{$ti-prefix}-columns-2:before {
+ content: $ti-icon-columns-2;
+}
+.#{$ti-prefix}-columns-3:before {
+ content: $ti-icon-columns-3;
+}
+.#{$ti-prefix}-columns-off:before {
+ content: $ti-icon-columns-off;
+}
+.#{$ti-prefix}-comet:before {
+ content: $ti-icon-comet;
+}
+.#{$ti-prefix}-command:before {
+ content: $ti-icon-command;
+}
+.#{$ti-prefix}-command-off:before {
+ content: $ti-icon-command-off;
+}
+.#{$ti-prefix}-compass:before {
+ content: $ti-icon-compass;
+}
+.#{$ti-prefix}-compass-filled:before {
+ content: $ti-icon-compass-filled;
+}
+.#{$ti-prefix}-compass-off:before {
+ content: $ti-icon-compass-off;
+}
+.#{$ti-prefix}-components:before {
+ content: $ti-icon-components;
+}
+.#{$ti-prefix}-components-off:before {
+ content: $ti-icon-components-off;
+}
+.#{$ti-prefix}-cone:before {
+ content: $ti-icon-cone;
+}
+.#{$ti-prefix}-cone-2:before {
+ content: $ti-icon-cone-2;
+}
+.#{$ti-prefix}-cone-2-filled:before {
+ content: $ti-icon-cone-2-filled;
+}
+.#{$ti-prefix}-cone-filled:before {
+ content: $ti-icon-cone-filled;
+}
+.#{$ti-prefix}-cone-off:before {
+ content: $ti-icon-cone-off;
+}
+.#{$ti-prefix}-cone-plus:before {
+ content: $ti-icon-cone-plus;
+}
+.#{$ti-prefix}-confetti:before {
+ content: $ti-icon-confetti;
+}
+.#{$ti-prefix}-confetti-off:before {
+ content: $ti-icon-confetti-off;
+}
+.#{$ti-prefix}-confucius:before {
+ content: $ti-icon-confucius;
+}
+.#{$ti-prefix}-container:before {
+ content: $ti-icon-container;
+}
+.#{$ti-prefix}-container-off:before {
+ content: $ti-icon-container-off;
+}
+.#{$ti-prefix}-contrast:before {
+ content: $ti-icon-contrast;
+}
+.#{$ti-prefix}-contrast-2:before {
+ content: $ti-icon-contrast-2;
+}
+.#{$ti-prefix}-contrast-2-filled:before {
+ content: $ti-icon-contrast-2-filled;
+}
+.#{$ti-prefix}-contrast-2-off:before {
+ content: $ti-icon-contrast-2-off;
+}
+.#{$ti-prefix}-contrast-filled:before {
+ content: $ti-icon-contrast-filled;
+}
+.#{$ti-prefix}-contrast-off:before {
+ content: $ti-icon-contrast-off;
+}
+.#{$ti-prefix}-cooker:before {
+ content: $ti-icon-cooker;
+}
+.#{$ti-prefix}-cookie:before {
+ content: $ti-icon-cookie;
+}
+.#{$ti-prefix}-cookie-filled:before {
+ content: $ti-icon-cookie-filled;
+}
+.#{$ti-prefix}-cookie-man:before {
+ content: $ti-icon-cookie-man;
+}
+.#{$ti-prefix}-cookie-man-filled:before {
+ content: $ti-icon-cookie-man-filled;
+}
+.#{$ti-prefix}-cookie-off:before {
+ content: $ti-icon-cookie-off;
+}
+.#{$ti-prefix}-copy:before {
+ content: $ti-icon-copy;
+}
+.#{$ti-prefix}-copy-check:before {
+ content: $ti-icon-copy-check;
+}
+.#{$ti-prefix}-copy-check-filled:before {
+ content: $ti-icon-copy-check-filled;
+}
+.#{$ti-prefix}-copy-minus:before {
+ content: $ti-icon-copy-minus;
+}
+.#{$ti-prefix}-copy-minus-filled:before {
+ content: $ti-icon-copy-minus-filled;
+}
+.#{$ti-prefix}-copy-off:before {
+ content: $ti-icon-copy-off;
+}
+.#{$ti-prefix}-copy-plus:before {
+ content: $ti-icon-copy-plus;
+}
+.#{$ti-prefix}-copy-plus-filled:before {
+ content: $ti-icon-copy-plus-filled;
+}
+.#{$ti-prefix}-copy-x:before {
+ content: $ti-icon-copy-x;
+}
+.#{$ti-prefix}-copy-x-filled:before {
+ content: $ti-icon-copy-x-filled;
+}
+.#{$ti-prefix}-copyleft:before {
+ content: $ti-icon-copyleft;
+}
+.#{$ti-prefix}-copyleft-filled:before {
+ content: $ti-icon-copyleft-filled;
+}
+.#{$ti-prefix}-copyleft-off:before {
+ content: $ti-icon-copyleft-off;
+}
+.#{$ti-prefix}-copyright:before {
+ content: $ti-icon-copyright;
+}
+.#{$ti-prefix}-copyright-filled:before {
+ content: $ti-icon-copyright-filled;
+}
+.#{$ti-prefix}-copyright-off:before {
+ content: $ti-icon-copyright-off;
+}
+.#{$ti-prefix}-corner-down-left:before {
+ content: $ti-icon-corner-down-left;
+}
+.#{$ti-prefix}-corner-down-left-double:before {
+ content: $ti-icon-corner-down-left-double;
+}
+.#{$ti-prefix}-corner-down-right:before {
+ content: $ti-icon-corner-down-right;
+}
+.#{$ti-prefix}-corner-down-right-double:before {
+ content: $ti-icon-corner-down-right-double;
+}
+.#{$ti-prefix}-corner-left-down:before {
+ content: $ti-icon-corner-left-down;
+}
+.#{$ti-prefix}-corner-left-down-double:before {
+ content: $ti-icon-corner-left-down-double;
+}
+.#{$ti-prefix}-corner-left-up:before {
+ content: $ti-icon-corner-left-up;
+}
+.#{$ti-prefix}-corner-left-up-double:before {
+ content: $ti-icon-corner-left-up-double;
+}
+.#{$ti-prefix}-corner-right-down:before {
+ content: $ti-icon-corner-right-down;
+}
+.#{$ti-prefix}-corner-right-down-double:before {
+ content: $ti-icon-corner-right-down-double;
+}
+.#{$ti-prefix}-corner-right-up:before {
+ content: $ti-icon-corner-right-up;
+}
+.#{$ti-prefix}-corner-right-up-double:before {
+ content: $ti-icon-corner-right-up-double;
+}
+.#{$ti-prefix}-corner-up-left:before {
+ content: $ti-icon-corner-up-left;
+}
+.#{$ti-prefix}-corner-up-left-double:before {
+ content: $ti-icon-corner-up-left-double;
+}
+.#{$ti-prefix}-corner-up-right:before {
+ content: $ti-icon-corner-up-right;
+}
+.#{$ti-prefix}-corner-up-right-double:before {
+ content: $ti-icon-corner-up-right-double;
+}
+.#{$ti-prefix}-cpu:before {
+ content: $ti-icon-cpu;
+}
+.#{$ti-prefix}-cpu-2:before {
+ content: $ti-icon-cpu-2;
+}
+.#{$ti-prefix}-cpu-off:before {
+ content: $ti-icon-cpu-off;
+}
+.#{$ti-prefix}-crane:before {
+ content: $ti-icon-crane;
+}
+.#{$ti-prefix}-crane-off:before {
+ content: $ti-icon-crane-off;
+}
+.#{$ti-prefix}-creative-commons:before {
+ content: $ti-icon-creative-commons;
+}
+.#{$ti-prefix}-creative-commons-by:before {
+ content: $ti-icon-creative-commons-by;
+}
+.#{$ti-prefix}-creative-commons-nc:before {
+ content: $ti-icon-creative-commons-nc;
+}
+.#{$ti-prefix}-creative-commons-nd:before {
+ content: $ti-icon-creative-commons-nd;
+}
+.#{$ti-prefix}-creative-commons-off:before {
+ content: $ti-icon-creative-commons-off;
+}
+.#{$ti-prefix}-creative-commons-sa:before {
+ content: $ti-icon-creative-commons-sa;
+}
+.#{$ti-prefix}-creative-commons-zero:before {
+ content: $ti-icon-creative-commons-zero;
+}
+.#{$ti-prefix}-credit-card:before {
+ content: $ti-icon-credit-card;
+}
+.#{$ti-prefix}-credit-card-filled:before {
+ content: $ti-icon-credit-card-filled;
+}
+.#{$ti-prefix}-credit-card-off:before {
+ content: $ti-icon-credit-card-off;
+}
+.#{$ti-prefix}-credit-card-pay:before {
+ content: $ti-icon-credit-card-pay;
+}
+.#{$ti-prefix}-credit-card-refund:before {
+ content: $ti-icon-credit-card-refund;
+}
+.#{$ti-prefix}-cricket:before {
+ content: $ti-icon-cricket;
+}
+.#{$ti-prefix}-crop:before {
+ content: $ti-icon-crop;
+}
+.#{$ti-prefix}-crop-1-1:before {
+ content: $ti-icon-crop-1-1;
+}
+.#{$ti-prefix}-crop-1-1-filled:before {
+ content: $ti-icon-crop-1-1-filled;
+}
+.#{$ti-prefix}-crop-16-9:before {
+ content: $ti-icon-crop-16-9;
+}
+.#{$ti-prefix}-crop-16-9-filled:before {
+ content: $ti-icon-crop-16-9-filled;
+}
+.#{$ti-prefix}-crop-3-2:before {
+ content: $ti-icon-crop-3-2;
+}
+.#{$ti-prefix}-crop-3-2-filled:before {
+ content: $ti-icon-crop-3-2-filled;
+}
+.#{$ti-prefix}-crop-5-4:before {
+ content: $ti-icon-crop-5-4;
+}
+.#{$ti-prefix}-crop-5-4-filled:before {
+ content: $ti-icon-crop-5-4-filled;
+}
+.#{$ti-prefix}-crop-7-5:before {
+ content: $ti-icon-crop-7-5;
+}
+.#{$ti-prefix}-crop-7-5-filled:before {
+ content: $ti-icon-crop-7-5-filled;
+}
+.#{$ti-prefix}-crop-landscape:before {
+ content: $ti-icon-crop-landscape;
+}
+.#{$ti-prefix}-crop-landscape-filled:before {
+ content: $ti-icon-crop-landscape-filled;
+}
+.#{$ti-prefix}-crop-portrait:before {
+ content: $ti-icon-crop-portrait;
+}
+.#{$ti-prefix}-crop-portrait-filled:before {
+ content: $ti-icon-crop-portrait-filled;
+}
+.#{$ti-prefix}-cross:before {
+ content: $ti-icon-cross;
+}
+.#{$ti-prefix}-cross-filled:before {
+ content: $ti-icon-cross-filled;
+}
+.#{$ti-prefix}-cross-off:before {
+ content: $ti-icon-cross-off;
+}
+.#{$ti-prefix}-crosshair:before {
+ content: $ti-icon-crosshair;
+}
+.#{$ti-prefix}-crown:before {
+ content: $ti-icon-crown;
+}
+.#{$ti-prefix}-crown-off:before {
+ content: $ti-icon-crown-off;
+}
+.#{$ti-prefix}-crutches:before {
+ content: $ti-icon-crutches;
+}
+.#{$ti-prefix}-crutches-off:before {
+ content: $ti-icon-crutches-off;
+}
+.#{$ti-prefix}-crystal-ball:before {
+ content: $ti-icon-crystal-ball;
+}
+.#{$ti-prefix}-csv:before {
+ content: $ti-icon-csv;
+}
+.#{$ti-prefix}-cube:before {
+ content: $ti-icon-cube;
+}
+.#{$ti-prefix}-cube-3d-sphere:before {
+ content: $ti-icon-cube-3d-sphere;
+}
+.#{$ti-prefix}-cube-3d-sphere-off:before {
+ content: $ti-icon-cube-3d-sphere-off;
+}
+.#{$ti-prefix}-cube-off:before {
+ content: $ti-icon-cube-off;
+}
+.#{$ti-prefix}-cube-plus:before {
+ content: $ti-icon-cube-plus;
+}
+.#{$ti-prefix}-cube-send:before {
+ content: $ti-icon-cube-send;
+}
+.#{$ti-prefix}-cube-unfolded:before {
+ content: $ti-icon-cube-unfolded;
+}
+.#{$ti-prefix}-cup:before {
+ content: $ti-icon-cup;
+}
+.#{$ti-prefix}-cup-off:before {
+ content: $ti-icon-cup-off;
+}
+.#{$ti-prefix}-curling:before {
+ content: $ti-icon-curling;
+}
+.#{$ti-prefix}-curly-loop:before {
+ content: $ti-icon-curly-loop;
+}
+.#{$ti-prefix}-currency:before {
+ content: $ti-icon-currency;
+}
+.#{$ti-prefix}-currency-afghani:before {
+ content: $ti-icon-currency-afghani;
+}
+.#{$ti-prefix}-currency-bahraini:before {
+ content: $ti-icon-currency-bahraini;
+}
+.#{$ti-prefix}-currency-baht:before {
+ content: $ti-icon-currency-baht;
+}
+.#{$ti-prefix}-currency-bitcoin:before {
+ content: $ti-icon-currency-bitcoin;
+}
+.#{$ti-prefix}-currency-cent:before {
+ content: $ti-icon-currency-cent;
+}
+.#{$ti-prefix}-currency-dinar:before {
+ content: $ti-icon-currency-dinar;
+}
+.#{$ti-prefix}-currency-dirham:before {
+ content: $ti-icon-currency-dirham;
+}
+.#{$ti-prefix}-currency-dogecoin:before {
+ content: $ti-icon-currency-dogecoin;
+}
+.#{$ti-prefix}-currency-dollar:before {
+ content: $ti-icon-currency-dollar;
+}
+.#{$ti-prefix}-currency-dollar-australian:before {
+ content: $ti-icon-currency-dollar-australian;
+}
+.#{$ti-prefix}-currency-dollar-brunei:before {
+ content: $ti-icon-currency-dollar-brunei;
+}
+.#{$ti-prefix}-currency-dollar-canadian:before {
+ content: $ti-icon-currency-dollar-canadian;
+}
+.#{$ti-prefix}-currency-dollar-guyanese:before {
+ content: $ti-icon-currency-dollar-guyanese;
+}
+.#{$ti-prefix}-currency-dollar-off:before {
+ content: $ti-icon-currency-dollar-off;
+}
+.#{$ti-prefix}-currency-dollar-singapore:before {
+ content: $ti-icon-currency-dollar-singapore;
+}
+.#{$ti-prefix}-currency-dollar-zimbabwean:before {
+ content: $ti-icon-currency-dollar-zimbabwean;
+}
+.#{$ti-prefix}-currency-dong:before {
+ content: $ti-icon-currency-dong;
+}
+.#{$ti-prefix}-currency-dram:before {
+ content: $ti-icon-currency-dram;
+}
+.#{$ti-prefix}-currency-ethereum:before {
+ content: $ti-icon-currency-ethereum;
+}
+.#{$ti-prefix}-currency-euro:before {
+ content: $ti-icon-currency-euro;
+}
+.#{$ti-prefix}-currency-euro-off:before {
+ content: $ti-icon-currency-euro-off;
+}
+.#{$ti-prefix}-currency-florin:before {
+ content: $ti-icon-currency-florin;
+}
+.#{$ti-prefix}-currency-forint:before {
+ content: $ti-icon-currency-forint;
+}
+.#{$ti-prefix}-currency-frank:before {
+ content: $ti-icon-currency-frank;
+}
+.#{$ti-prefix}-currency-guarani:before {
+ content: $ti-icon-currency-guarani;
+}
+.#{$ti-prefix}-currency-hryvnia:before {
+ content: $ti-icon-currency-hryvnia;
+}
+.#{$ti-prefix}-currency-iranian-rial:before {
+ content: $ti-icon-currency-iranian-rial;
+}
+.#{$ti-prefix}-currency-kip:before {
+ content: $ti-icon-currency-kip;
+}
+.#{$ti-prefix}-currency-krone-czech:before {
+ content: $ti-icon-currency-krone-czech;
+}
+.#{$ti-prefix}-currency-krone-danish:before {
+ content: $ti-icon-currency-krone-danish;
+}
+.#{$ti-prefix}-currency-krone-swedish:before {
+ content: $ti-icon-currency-krone-swedish;
+}
+.#{$ti-prefix}-currency-lari:before {
+ content: $ti-icon-currency-lari;
+}
+.#{$ti-prefix}-currency-leu:before {
+ content: $ti-icon-currency-leu;
+}
+.#{$ti-prefix}-currency-lira:before {
+ content: $ti-icon-currency-lira;
+}
+.#{$ti-prefix}-currency-litecoin:before {
+ content: $ti-icon-currency-litecoin;
+}
+.#{$ti-prefix}-currency-lyd:before {
+ content: $ti-icon-currency-lyd;
+}
+.#{$ti-prefix}-currency-manat:before {
+ content: $ti-icon-currency-manat;
+}
+.#{$ti-prefix}-currency-monero:before {
+ content: $ti-icon-currency-monero;
+}
+.#{$ti-prefix}-currency-naira:before {
+ content: $ti-icon-currency-naira;
+}
+.#{$ti-prefix}-currency-nano:before {
+ content: $ti-icon-currency-nano;
+}
+.#{$ti-prefix}-currency-off:before {
+ content: $ti-icon-currency-off;
+}
+.#{$ti-prefix}-currency-paanga:before {
+ content: $ti-icon-currency-paanga;
+}
+.#{$ti-prefix}-currency-peso:before {
+ content: $ti-icon-currency-peso;
+}
+.#{$ti-prefix}-currency-pound:before {
+ content: $ti-icon-currency-pound;
+}
+.#{$ti-prefix}-currency-pound-off:before {
+ content: $ti-icon-currency-pound-off;
+}
+.#{$ti-prefix}-currency-quetzal:before {
+ content: $ti-icon-currency-quetzal;
+}
+.#{$ti-prefix}-currency-real:before {
+ content: $ti-icon-currency-real;
+}
+.#{$ti-prefix}-currency-renminbi:before {
+ content: $ti-icon-currency-renminbi;
+}
+.#{$ti-prefix}-currency-ripple:before {
+ content: $ti-icon-currency-ripple;
+}
+.#{$ti-prefix}-currency-riyal:before {
+ content: $ti-icon-currency-riyal;
+}
+.#{$ti-prefix}-currency-rubel:before {
+ content: $ti-icon-currency-rubel;
+}
+.#{$ti-prefix}-currency-rufiyaa:before {
+ content: $ti-icon-currency-rufiyaa;
+}
+.#{$ti-prefix}-currency-rupee:before {
+ content: $ti-icon-currency-rupee;
+}
+.#{$ti-prefix}-currency-rupee-nepalese:before {
+ content: $ti-icon-currency-rupee-nepalese;
+}
+.#{$ti-prefix}-currency-shekel:before {
+ content: $ti-icon-currency-shekel;
+}
+.#{$ti-prefix}-currency-solana:before {
+ content: $ti-icon-currency-solana;
+}
+.#{$ti-prefix}-currency-som:before {
+ content: $ti-icon-currency-som;
+}
+.#{$ti-prefix}-currency-taka:before {
+ content: $ti-icon-currency-taka;
+}
+.#{$ti-prefix}-currency-tenge:before {
+ content: $ti-icon-currency-tenge;
+}
+.#{$ti-prefix}-currency-tugrik:before {
+ content: $ti-icon-currency-tugrik;
+}
+.#{$ti-prefix}-currency-won:before {
+ content: $ti-icon-currency-won;
+}
+.#{$ti-prefix}-currency-xrp:before {
+ content: $ti-icon-currency-xrp;
+}
+.#{$ti-prefix}-currency-yen:before {
+ content: $ti-icon-currency-yen;
+}
+.#{$ti-prefix}-currency-yen-off:before {
+ content: $ti-icon-currency-yen-off;
+}
+.#{$ti-prefix}-currency-yuan:before {
+ content: $ti-icon-currency-yuan;
+}
+.#{$ti-prefix}-currency-zloty:before {
+ content: $ti-icon-currency-zloty;
+}
+.#{$ti-prefix}-current-location:before {
+ content: $ti-icon-current-location;
+}
+.#{$ti-prefix}-current-location-off:before {
+ content: $ti-icon-current-location-off;
+}
+.#{$ti-prefix}-cursor-off:before {
+ content: $ti-icon-cursor-off;
+}
+.#{$ti-prefix}-cursor-text:before {
+ content: $ti-icon-cursor-text;
+}
+.#{$ti-prefix}-cut:before {
+ content: $ti-icon-cut;
+}
+.#{$ti-prefix}-cylinder:before {
+ content: $ti-icon-cylinder;
+}
+.#{$ti-prefix}-cylinder-off:before {
+ content: $ti-icon-cylinder-off;
+}
+.#{$ti-prefix}-cylinder-plus:before {
+ content: $ti-icon-cylinder-plus;
+}
+.#{$ti-prefix}-dashboard:before {
+ content: $ti-icon-dashboard;
+}
+.#{$ti-prefix}-dashboard-off:before {
+ content: $ti-icon-dashboard-off;
+}
+.#{$ti-prefix}-database:before {
+ content: $ti-icon-database;
+}
+.#{$ti-prefix}-database-cog:before {
+ content: $ti-icon-database-cog;
+}
+.#{$ti-prefix}-database-dollar:before {
+ content: $ti-icon-database-dollar;
+}
+.#{$ti-prefix}-database-edit:before {
+ content: $ti-icon-database-edit;
+}
+.#{$ti-prefix}-database-exclamation:before {
+ content: $ti-icon-database-exclamation;
+}
+.#{$ti-prefix}-database-export:before {
+ content: $ti-icon-database-export;
+}
+.#{$ti-prefix}-database-heart:before {
+ content: $ti-icon-database-heart;
+}
+.#{$ti-prefix}-database-import:before {
+ content: $ti-icon-database-import;
+}
+.#{$ti-prefix}-database-leak:before {
+ content: $ti-icon-database-leak;
+}
+.#{$ti-prefix}-database-minus:before {
+ content: $ti-icon-database-minus;
+}
+.#{$ti-prefix}-database-off:before {
+ content: $ti-icon-database-off;
+}
+.#{$ti-prefix}-database-plus:before {
+ content: $ti-icon-database-plus;
+}
+.#{$ti-prefix}-database-search:before {
+ content: $ti-icon-database-search;
+}
+.#{$ti-prefix}-database-share:before {
+ content: $ti-icon-database-share;
+}
+.#{$ti-prefix}-database-smile:before {
+ content: $ti-icon-database-smile;
+}
+.#{$ti-prefix}-database-star:before {
+ content: $ti-icon-database-star;
+}
+.#{$ti-prefix}-database-x:before {
+ content: $ti-icon-database-x;
+}
+.#{$ti-prefix}-decimal:before {
+ content: $ti-icon-decimal;
+}
+.#{$ti-prefix}-deer:before {
+ content: $ti-icon-deer;
+}
+.#{$ti-prefix}-delta:before {
+ content: $ti-icon-delta;
+}
+.#{$ti-prefix}-dental:before {
+ content: $ti-icon-dental;
+}
+.#{$ti-prefix}-dental-broken:before {
+ content: $ti-icon-dental-broken;
+}
+.#{$ti-prefix}-dental-off:before {
+ content: $ti-icon-dental-off;
+}
+.#{$ti-prefix}-deselect:before {
+ content: $ti-icon-deselect;
+}
+.#{$ti-prefix}-desk:before {
+ content: $ti-icon-desk;
+}
+.#{$ti-prefix}-details:before {
+ content: $ti-icon-details;
+}
+.#{$ti-prefix}-details-off:before {
+ content: $ti-icon-details-off;
+}
+.#{$ti-prefix}-device-airpods:before {
+ content: $ti-icon-device-airpods;
+}
+.#{$ti-prefix}-device-airpods-case:before {
+ content: $ti-icon-device-airpods-case;
+}
+.#{$ti-prefix}-device-airtag:before {
+ content: $ti-icon-device-airtag;
+}
+.#{$ti-prefix}-device-analytics:before {
+ content: $ti-icon-device-analytics;
+}
+.#{$ti-prefix}-device-audio-tape:before {
+ content: $ti-icon-device-audio-tape;
+}
+.#{$ti-prefix}-device-camera-phone:before {
+ content: $ti-icon-device-camera-phone;
+}
+.#{$ti-prefix}-device-cctv:before {
+ content: $ti-icon-device-cctv;
+}
+.#{$ti-prefix}-device-cctv-off:before {
+ content: $ti-icon-device-cctv-off;
+}
+.#{$ti-prefix}-device-computer-camera:before {
+ content: $ti-icon-device-computer-camera;
+}
+.#{$ti-prefix}-device-computer-camera-off:before {
+ content: $ti-icon-device-computer-camera-off;
+}
+.#{$ti-prefix}-device-desktop:before {
+ content: $ti-icon-device-desktop;
+}
+.#{$ti-prefix}-device-desktop-analytics:before {
+ content: $ti-icon-device-desktop-analytics;
+}
+.#{$ti-prefix}-device-desktop-bolt:before {
+ content: $ti-icon-device-desktop-bolt;
+}
+.#{$ti-prefix}-device-desktop-cancel:before {
+ content: $ti-icon-device-desktop-cancel;
+}
+.#{$ti-prefix}-device-desktop-check:before {
+ content: $ti-icon-device-desktop-check;
+}
+.#{$ti-prefix}-device-desktop-code:before {
+ content: $ti-icon-device-desktop-code;
+}
+.#{$ti-prefix}-device-desktop-cog:before {
+ content: $ti-icon-device-desktop-cog;
+}
+.#{$ti-prefix}-device-desktop-dollar:before {
+ content: $ti-icon-device-desktop-dollar;
+}
+.#{$ti-prefix}-device-desktop-down:before {
+ content: $ti-icon-device-desktop-down;
+}
+.#{$ti-prefix}-device-desktop-exclamation:before {
+ content: $ti-icon-device-desktop-exclamation;
+}
+.#{$ti-prefix}-device-desktop-heart:before {
+ content: $ti-icon-device-desktop-heart;
+}
+.#{$ti-prefix}-device-desktop-minus:before {
+ content: $ti-icon-device-desktop-minus;
+}
+.#{$ti-prefix}-device-desktop-off:before {
+ content: $ti-icon-device-desktop-off;
+}
+.#{$ti-prefix}-device-desktop-pause:before {
+ content: $ti-icon-device-desktop-pause;
+}
+.#{$ti-prefix}-device-desktop-pin:before {
+ content: $ti-icon-device-desktop-pin;
+}
+.#{$ti-prefix}-device-desktop-plus:before {
+ content: $ti-icon-device-desktop-plus;
+}
+.#{$ti-prefix}-device-desktop-question:before {
+ content: $ti-icon-device-desktop-question;
+}
+.#{$ti-prefix}-device-desktop-search:before {
+ content: $ti-icon-device-desktop-search;
+}
+.#{$ti-prefix}-device-desktop-share:before {
+ content: $ti-icon-device-desktop-share;
+}
+.#{$ti-prefix}-device-desktop-star:before {
+ content: $ti-icon-device-desktop-star;
+}
+.#{$ti-prefix}-device-desktop-up:before {
+ content: $ti-icon-device-desktop-up;
+}
+.#{$ti-prefix}-device-desktop-x:before {
+ content: $ti-icon-device-desktop-x;
+}
+.#{$ti-prefix}-device-floppy:before {
+ content: $ti-icon-device-floppy;
+}
+.#{$ti-prefix}-device-gamepad:before {
+ content: $ti-icon-device-gamepad;
+}
+.#{$ti-prefix}-device-gamepad-2:before {
+ content: $ti-icon-device-gamepad-2;
+}
+.#{$ti-prefix}-device-gamepad-3:before {
+ content: $ti-icon-device-gamepad-3;
+}
+.#{$ti-prefix}-device-heart-monitor:before {
+ content: $ti-icon-device-heart-monitor;
+}
+.#{$ti-prefix}-device-heart-monitor-filled:before {
+ content: $ti-icon-device-heart-monitor-filled;
+}
+.#{$ti-prefix}-device-imac:before {
+ content: $ti-icon-device-imac;
+}
+.#{$ti-prefix}-device-imac-bolt:before {
+ content: $ti-icon-device-imac-bolt;
+}
+.#{$ti-prefix}-device-imac-cancel:before {
+ content: $ti-icon-device-imac-cancel;
+}
+.#{$ti-prefix}-device-imac-check:before {
+ content: $ti-icon-device-imac-check;
+}
+.#{$ti-prefix}-device-imac-code:before {
+ content: $ti-icon-device-imac-code;
+}
+.#{$ti-prefix}-device-imac-cog:before {
+ content: $ti-icon-device-imac-cog;
+}
+.#{$ti-prefix}-device-imac-dollar:before {
+ content: $ti-icon-device-imac-dollar;
+}
+.#{$ti-prefix}-device-imac-down:before {
+ content: $ti-icon-device-imac-down;
+}
+.#{$ti-prefix}-device-imac-exclamation:before {
+ content: $ti-icon-device-imac-exclamation;
+}
+.#{$ti-prefix}-device-imac-heart:before {
+ content: $ti-icon-device-imac-heart;
+}
+.#{$ti-prefix}-device-imac-minus:before {
+ content: $ti-icon-device-imac-minus;
+}
+.#{$ti-prefix}-device-imac-off:before {
+ content: $ti-icon-device-imac-off;
+}
+.#{$ti-prefix}-device-imac-pause:before {
+ content: $ti-icon-device-imac-pause;
+}
+.#{$ti-prefix}-device-imac-pin:before {
+ content: $ti-icon-device-imac-pin;
+}
+.#{$ti-prefix}-device-imac-plus:before {
+ content: $ti-icon-device-imac-plus;
+}
+.#{$ti-prefix}-device-imac-question:before {
+ content: $ti-icon-device-imac-question;
+}
+.#{$ti-prefix}-device-imac-search:before {
+ content: $ti-icon-device-imac-search;
+}
+.#{$ti-prefix}-device-imac-share:before {
+ content: $ti-icon-device-imac-share;
+}
+.#{$ti-prefix}-device-imac-star:before {
+ content: $ti-icon-device-imac-star;
+}
+.#{$ti-prefix}-device-imac-up:before {
+ content: $ti-icon-device-imac-up;
+}
+.#{$ti-prefix}-device-imac-x:before {
+ content: $ti-icon-device-imac-x;
+}
+.#{$ti-prefix}-device-ipad:before {
+ content: $ti-icon-device-ipad;
+}
+.#{$ti-prefix}-device-ipad-bolt:before {
+ content: $ti-icon-device-ipad-bolt;
+}
+.#{$ti-prefix}-device-ipad-cancel:before {
+ content: $ti-icon-device-ipad-cancel;
+}
+.#{$ti-prefix}-device-ipad-check:before {
+ content: $ti-icon-device-ipad-check;
+}
+.#{$ti-prefix}-device-ipad-code:before {
+ content: $ti-icon-device-ipad-code;
+}
+.#{$ti-prefix}-device-ipad-cog:before {
+ content: $ti-icon-device-ipad-cog;
+}
+.#{$ti-prefix}-device-ipad-dollar:before {
+ content: $ti-icon-device-ipad-dollar;
+}
+.#{$ti-prefix}-device-ipad-down:before {
+ content: $ti-icon-device-ipad-down;
+}
+.#{$ti-prefix}-device-ipad-exclamation:before {
+ content: $ti-icon-device-ipad-exclamation;
+}
+.#{$ti-prefix}-device-ipad-heart:before {
+ content: $ti-icon-device-ipad-heart;
+}
+.#{$ti-prefix}-device-ipad-horizontal:before {
+ content: $ti-icon-device-ipad-horizontal;
+}
+.#{$ti-prefix}-device-ipad-horizontal-bolt:before {
+ content: $ti-icon-device-ipad-horizontal-bolt;
+}
+.#{$ti-prefix}-device-ipad-horizontal-cancel:before {
+ content: $ti-icon-device-ipad-horizontal-cancel;
+}
+.#{$ti-prefix}-device-ipad-horizontal-check:before {
+ content: $ti-icon-device-ipad-horizontal-check;
+}
+.#{$ti-prefix}-device-ipad-horizontal-code:before {
+ content: $ti-icon-device-ipad-horizontal-code;
+}
+.#{$ti-prefix}-device-ipad-horizontal-cog:before {
+ content: $ti-icon-device-ipad-horizontal-cog;
+}
+.#{$ti-prefix}-device-ipad-horizontal-dollar:before {
+ content: $ti-icon-device-ipad-horizontal-dollar;
+}
+.#{$ti-prefix}-device-ipad-horizontal-down:before {
+ content: $ti-icon-device-ipad-horizontal-down;
+}
+.#{$ti-prefix}-device-ipad-horizontal-exclamation:before {
+ content: $ti-icon-device-ipad-horizontal-exclamation;
+}
+.#{$ti-prefix}-device-ipad-horizontal-heart:before {
+ content: $ti-icon-device-ipad-horizontal-heart;
+}
+.#{$ti-prefix}-device-ipad-horizontal-minus:before {
+ content: $ti-icon-device-ipad-horizontal-minus;
+}
+.#{$ti-prefix}-device-ipad-horizontal-off:before {
+ content: $ti-icon-device-ipad-horizontal-off;
+}
+.#{$ti-prefix}-device-ipad-horizontal-pause:before {
+ content: $ti-icon-device-ipad-horizontal-pause;
+}
+.#{$ti-prefix}-device-ipad-horizontal-pin:before {
+ content: $ti-icon-device-ipad-horizontal-pin;
+}
+.#{$ti-prefix}-device-ipad-horizontal-plus:before {
+ content: $ti-icon-device-ipad-horizontal-plus;
+}
+.#{$ti-prefix}-device-ipad-horizontal-question:before {
+ content: $ti-icon-device-ipad-horizontal-question;
+}
+.#{$ti-prefix}-device-ipad-horizontal-search:before {
+ content: $ti-icon-device-ipad-horizontal-search;
+}
+.#{$ti-prefix}-device-ipad-horizontal-share:before {
+ content: $ti-icon-device-ipad-horizontal-share;
+}
+.#{$ti-prefix}-device-ipad-horizontal-star:before {
+ content: $ti-icon-device-ipad-horizontal-star;
+}
+.#{$ti-prefix}-device-ipad-horizontal-up:before {
+ content: $ti-icon-device-ipad-horizontal-up;
+}
+.#{$ti-prefix}-device-ipad-horizontal-x:before {
+ content: $ti-icon-device-ipad-horizontal-x;
+}
+.#{$ti-prefix}-device-ipad-minus:before {
+ content: $ti-icon-device-ipad-minus;
+}
+.#{$ti-prefix}-device-ipad-off:before {
+ content: $ti-icon-device-ipad-off;
+}
+.#{$ti-prefix}-device-ipad-pause:before {
+ content: $ti-icon-device-ipad-pause;
+}
+.#{$ti-prefix}-device-ipad-pin:before {
+ content: $ti-icon-device-ipad-pin;
+}
+.#{$ti-prefix}-device-ipad-plus:before {
+ content: $ti-icon-device-ipad-plus;
+}
+.#{$ti-prefix}-device-ipad-question:before {
+ content: $ti-icon-device-ipad-question;
+}
+.#{$ti-prefix}-device-ipad-search:before {
+ content: $ti-icon-device-ipad-search;
+}
+.#{$ti-prefix}-device-ipad-share:before {
+ content: $ti-icon-device-ipad-share;
+}
+.#{$ti-prefix}-device-ipad-star:before {
+ content: $ti-icon-device-ipad-star;
+}
+.#{$ti-prefix}-device-ipad-up:before {
+ content: $ti-icon-device-ipad-up;
+}
+.#{$ti-prefix}-device-ipad-x:before {
+ content: $ti-icon-device-ipad-x;
+}
+.#{$ti-prefix}-device-landline-phone:before {
+ content: $ti-icon-device-landline-phone;
+}
+.#{$ti-prefix}-device-laptop:before {
+ content: $ti-icon-device-laptop;
+}
+.#{$ti-prefix}-device-laptop-off:before {
+ content: $ti-icon-device-laptop-off;
+}
+.#{$ti-prefix}-device-mobile:before {
+ content: $ti-icon-device-mobile;
+}
+.#{$ti-prefix}-device-mobile-bolt:before {
+ content: $ti-icon-device-mobile-bolt;
+}
+.#{$ti-prefix}-device-mobile-cancel:before {
+ content: $ti-icon-device-mobile-cancel;
+}
+.#{$ti-prefix}-device-mobile-charging:before {
+ content: $ti-icon-device-mobile-charging;
+}
+.#{$ti-prefix}-device-mobile-check:before {
+ content: $ti-icon-device-mobile-check;
+}
+.#{$ti-prefix}-device-mobile-code:before {
+ content: $ti-icon-device-mobile-code;
+}
+.#{$ti-prefix}-device-mobile-cog:before {
+ content: $ti-icon-device-mobile-cog;
+}
+.#{$ti-prefix}-device-mobile-dollar:before {
+ content: $ti-icon-device-mobile-dollar;
+}
+.#{$ti-prefix}-device-mobile-down:before {
+ content: $ti-icon-device-mobile-down;
+}
+.#{$ti-prefix}-device-mobile-exclamation:before {
+ content: $ti-icon-device-mobile-exclamation;
+}
+.#{$ti-prefix}-device-mobile-filled:before {
+ content: $ti-icon-device-mobile-filled;
+}
+.#{$ti-prefix}-device-mobile-heart:before {
+ content: $ti-icon-device-mobile-heart;
+}
+.#{$ti-prefix}-device-mobile-message:before {
+ content: $ti-icon-device-mobile-message;
+}
+.#{$ti-prefix}-device-mobile-minus:before {
+ content: $ti-icon-device-mobile-minus;
+}
+.#{$ti-prefix}-device-mobile-off:before {
+ content: $ti-icon-device-mobile-off;
+}
+.#{$ti-prefix}-device-mobile-pause:before {
+ content: $ti-icon-device-mobile-pause;
+}
+.#{$ti-prefix}-device-mobile-pin:before {
+ content: $ti-icon-device-mobile-pin;
+}
+.#{$ti-prefix}-device-mobile-plus:before {
+ content: $ti-icon-device-mobile-plus;
+}
+.#{$ti-prefix}-device-mobile-question:before {
+ content: $ti-icon-device-mobile-question;
+}
+.#{$ti-prefix}-device-mobile-rotated:before {
+ content: $ti-icon-device-mobile-rotated;
+}
+.#{$ti-prefix}-device-mobile-search:before {
+ content: $ti-icon-device-mobile-search;
+}
+.#{$ti-prefix}-device-mobile-share:before {
+ content: $ti-icon-device-mobile-share;
+}
+.#{$ti-prefix}-device-mobile-star:before {
+ content: $ti-icon-device-mobile-star;
+}
+.#{$ti-prefix}-device-mobile-up:before {
+ content: $ti-icon-device-mobile-up;
+}
+.#{$ti-prefix}-device-mobile-vibration:before {
+ content: $ti-icon-device-mobile-vibration;
+}
+.#{$ti-prefix}-device-mobile-x:before {
+ content: $ti-icon-device-mobile-x;
+}
+.#{$ti-prefix}-device-nintendo:before {
+ content: $ti-icon-device-nintendo;
+}
+.#{$ti-prefix}-device-nintendo-off:before {
+ content: $ti-icon-device-nintendo-off;
+}
+.#{$ti-prefix}-device-projector:before {
+ content: $ti-icon-device-projector;
+}
+.#{$ti-prefix}-device-remote:before {
+ content: $ti-icon-device-remote;
+}
+.#{$ti-prefix}-device-sd-card:before {
+ content: $ti-icon-device-sd-card;
+}
+.#{$ti-prefix}-device-sim:before {
+ content: $ti-icon-device-sim;
+}
+.#{$ti-prefix}-device-sim-1:before {
+ content: $ti-icon-device-sim-1;
+}
+.#{$ti-prefix}-device-sim-2:before {
+ content: $ti-icon-device-sim-2;
+}
+.#{$ti-prefix}-device-sim-3:before {
+ content: $ti-icon-device-sim-3;
+}
+.#{$ti-prefix}-device-speaker:before {
+ content: $ti-icon-device-speaker;
+}
+.#{$ti-prefix}-device-speaker-off:before {
+ content: $ti-icon-device-speaker-off;
+}
+.#{$ti-prefix}-device-tablet:before {
+ content: $ti-icon-device-tablet;
+}
+.#{$ti-prefix}-device-tablet-bolt:before {
+ content: $ti-icon-device-tablet-bolt;
+}
+.#{$ti-prefix}-device-tablet-cancel:before {
+ content: $ti-icon-device-tablet-cancel;
+}
+.#{$ti-prefix}-device-tablet-check:before {
+ content: $ti-icon-device-tablet-check;
+}
+.#{$ti-prefix}-device-tablet-code:before {
+ content: $ti-icon-device-tablet-code;
+}
+.#{$ti-prefix}-device-tablet-cog:before {
+ content: $ti-icon-device-tablet-cog;
+}
+.#{$ti-prefix}-device-tablet-dollar:before {
+ content: $ti-icon-device-tablet-dollar;
+}
+.#{$ti-prefix}-device-tablet-down:before {
+ content: $ti-icon-device-tablet-down;
+}
+.#{$ti-prefix}-device-tablet-exclamation:before {
+ content: $ti-icon-device-tablet-exclamation;
+}
+.#{$ti-prefix}-device-tablet-filled:before {
+ content: $ti-icon-device-tablet-filled;
+}
+.#{$ti-prefix}-device-tablet-heart:before {
+ content: $ti-icon-device-tablet-heart;
+}
+.#{$ti-prefix}-device-tablet-minus:before {
+ content: $ti-icon-device-tablet-minus;
+}
+.#{$ti-prefix}-device-tablet-off:before {
+ content: $ti-icon-device-tablet-off;
+}
+.#{$ti-prefix}-device-tablet-pause:before {
+ content: $ti-icon-device-tablet-pause;
+}
+.#{$ti-prefix}-device-tablet-pin:before {
+ content: $ti-icon-device-tablet-pin;
+}
+.#{$ti-prefix}-device-tablet-plus:before {
+ content: $ti-icon-device-tablet-plus;
+}
+.#{$ti-prefix}-device-tablet-question:before {
+ content: $ti-icon-device-tablet-question;
+}
+.#{$ti-prefix}-device-tablet-search:before {
+ content: $ti-icon-device-tablet-search;
+}
+.#{$ti-prefix}-device-tablet-share:before {
+ content: $ti-icon-device-tablet-share;
+}
+.#{$ti-prefix}-device-tablet-star:before {
+ content: $ti-icon-device-tablet-star;
+}
+.#{$ti-prefix}-device-tablet-up:before {
+ content: $ti-icon-device-tablet-up;
+}
+.#{$ti-prefix}-device-tablet-x:before {
+ content: $ti-icon-device-tablet-x;
+}
+.#{$ti-prefix}-device-tv:before {
+ content: $ti-icon-device-tv;
+}
+.#{$ti-prefix}-device-tv-off:before {
+ content: $ti-icon-device-tv-off;
+}
+.#{$ti-prefix}-device-tv-old:before {
+ content: $ti-icon-device-tv-old;
+}
+.#{$ti-prefix}-device-usb:before {
+ content: $ti-icon-device-usb;
+}
+.#{$ti-prefix}-device-vision-pro:before {
+ content: $ti-icon-device-vision-pro;
+}
+.#{$ti-prefix}-device-watch:before {
+ content: $ti-icon-device-watch;
+}
+.#{$ti-prefix}-device-watch-bolt:before {
+ content: $ti-icon-device-watch-bolt;
+}
+.#{$ti-prefix}-device-watch-cancel:before {
+ content: $ti-icon-device-watch-cancel;
+}
+.#{$ti-prefix}-device-watch-check:before {
+ content: $ti-icon-device-watch-check;
+}
+.#{$ti-prefix}-device-watch-code:before {
+ content: $ti-icon-device-watch-code;
+}
+.#{$ti-prefix}-device-watch-cog:before {
+ content: $ti-icon-device-watch-cog;
+}
+.#{$ti-prefix}-device-watch-dollar:before {
+ content: $ti-icon-device-watch-dollar;
+}
+.#{$ti-prefix}-device-watch-down:before {
+ content: $ti-icon-device-watch-down;
+}
+.#{$ti-prefix}-device-watch-exclamation:before {
+ content: $ti-icon-device-watch-exclamation;
+}
+.#{$ti-prefix}-device-watch-heart:before {
+ content: $ti-icon-device-watch-heart;
+}
+.#{$ti-prefix}-device-watch-minus:before {
+ content: $ti-icon-device-watch-minus;
+}
+.#{$ti-prefix}-device-watch-off:before {
+ content: $ti-icon-device-watch-off;
+}
+.#{$ti-prefix}-device-watch-pause:before {
+ content: $ti-icon-device-watch-pause;
+}
+.#{$ti-prefix}-device-watch-pin:before {
+ content: $ti-icon-device-watch-pin;
+}
+.#{$ti-prefix}-device-watch-plus:before {
+ content: $ti-icon-device-watch-plus;
+}
+.#{$ti-prefix}-device-watch-question:before {
+ content: $ti-icon-device-watch-question;
+}
+.#{$ti-prefix}-device-watch-search:before {
+ content: $ti-icon-device-watch-search;
+}
+.#{$ti-prefix}-device-watch-share:before {
+ content: $ti-icon-device-watch-share;
+}
+.#{$ti-prefix}-device-watch-star:before {
+ content: $ti-icon-device-watch-star;
+}
+.#{$ti-prefix}-device-watch-stats:before {
+ content: $ti-icon-device-watch-stats;
+}
+.#{$ti-prefix}-device-watch-stats-2:before {
+ content: $ti-icon-device-watch-stats-2;
+}
+.#{$ti-prefix}-device-watch-up:before {
+ content: $ti-icon-device-watch-up;
+}
+.#{$ti-prefix}-device-watch-x:before {
+ content: $ti-icon-device-watch-x;
+}
+.#{$ti-prefix}-devices:before {
+ content: $ti-icon-devices;
+}
+.#{$ti-prefix}-devices-2:before {
+ content: $ti-icon-devices-2;
+}
+.#{$ti-prefix}-devices-bolt:before {
+ content: $ti-icon-devices-bolt;
+}
+.#{$ti-prefix}-devices-cancel:before {
+ content: $ti-icon-devices-cancel;
+}
+.#{$ti-prefix}-devices-check:before {
+ content: $ti-icon-devices-check;
+}
+.#{$ti-prefix}-devices-code:before {
+ content: $ti-icon-devices-code;
+}
+.#{$ti-prefix}-devices-cog:before {
+ content: $ti-icon-devices-cog;
+}
+.#{$ti-prefix}-devices-dollar:before {
+ content: $ti-icon-devices-dollar;
+}
+.#{$ti-prefix}-devices-down:before {
+ content: $ti-icon-devices-down;
+}
+.#{$ti-prefix}-devices-exclamation:before {
+ content: $ti-icon-devices-exclamation;
+}
+.#{$ti-prefix}-devices-heart:before {
+ content: $ti-icon-devices-heart;
+}
+.#{$ti-prefix}-devices-minus:before {
+ content: $ti-icon-devices-minus;
+}
+.#{$ti-prefix}-devices-off:before {
+ content: $ti-icon-devices-off;
+}
+.#{$ti-prefix}-devices-pause:before {
+ content: $ti-icon-devices-pause;
+}
+.#{$ti-prefix}-devices-pc:before {
+ content: $ti-icon-devices-pc;
+}
+.#{$ti-prefix}-devices-pc-off:before {
+ content: $ti-icon-devices-pc-off;
+}
+.#{$ti-prefix}-devices-pin:before {
+ content: $ti-icon-devices-pin;
+}
+.#{$ti-prefix}-devices-plus:before {
+ content: $ti-icon-devices-plus;
+}
+.#{$ti-prefix}-devices-question:before {
+ content: $ti-icon-devices-question;
+}
+.#{$ti-prefix}-devices-search:before {
+ content: $ti-icon-devices-search;
+}
+.#{$ti-prefix}-devices-share:before {
+ content: $ti-icon-devices-share;
+}
+.#{$ti-prefix}-devices-star:before {
+ content: $ti-icon-devices-star;
+}
+.#{$ti-prefix}-devices-up:before {
+ content: $ti-icon-devices-up;
+}
+.#{$ti-prefix}-devices-x:before {
+ content: $ti-icon-devices-x;
+}
+.#{$ti-prefix}-diabolo:before {
+ content: $ti-icon-diabolo;
+}
+.#{$ti-prefix}-diabolo-off:before {
+ content: $ti-icon-diabolo-off;
+}
+.#{$ti-prefix}-diabolo-plus:before {
+ content: $ti-icon-diabolo-plus;
+}
+.#{$ti-prefix}-dialpad:before {
+ content: $ti-icon-dialpad;
+}
+.#{$ti-prefix}-dialpad-filled:before {
+ content: $ti-icon-dialpad-filled;
+}
+.#{$ti-prefix}-dialpad-off:before {
+ content: $ti-icon-dialpad-off;
+}
+.#{$ti-prefix}-diamond:before {
+ content: $ti-icon-diamond;
+}
+.#{$ti-prefix}-diamond-filled:before {
+ content: $ti-icon-diamond-filled;
+}
+.#{$ti-prefix}-diamond-off:before {
+ content: $ti-icon-diamond-off;
+}
+.#{$ti-prefix}-diamonds:before {
+ content: $ti-icon-diamonds;
+}
+.#{$ti-prefix}-diamonds-filled:before {
+ content: $ti-icon-diamonds-filled;
+}
+.#{$ti-prefix}-dice:before {
+ content: $ti-icon-dice;
+}
+.#{$ti-prefix}-dice-1:before {
+ content: $ti-icon-dice-1;
+}
+.#{$ti-prefix}-dice-1-filled:before {
+ content: $ti-icon-dice-1-filled;
+}
+.#{$ti-prefix}-dice-2:before {
+ content: $ti-icon-dice-2;
+}
+.#{$ti-prefix}-dice-2-filled:before {
+ content: $ti-icon-dice-2-filled;
+}
+.#{$ti-prefix}-dice-3:before {
+ content: $ti-icon-dice-3;
+}
+.#{$ti-prefix}-dice-3-filled:before {
+ content: $ti-icon-dice-3-filled;
+}
+.#{$ti-prefix}-dice-4:before {
+ content: $ti-icon-dice-4;
+}
+.#{$ti-prefix}-dice-4-filled:before {
+ content: $ti-icon-dice-4-filled;
+}
+.#{$ti-prefix}-dice-5:before {
+ content: $ti-icon-dice-5;
+}
+.#{$ti-prefix}-dice-5-filled:before {
+ content: $ti-icon-dice-5-filled;
+}
+.#{$ti-prefix}-dice-6:before {
+ content: $ti-icon-dice-6;
+}
+.#{$ti-prefix}-dice-6-filled:before {
+ content: $ti-icon-dice-6-filled;
+}
+.#{$ti-prefix}-dice-filled:before {
+ content: $ti-icon-dice-filled;
+}
+.#{$ti-prefix}-dimensions:before {
+ content: $ti-icon-dimensions;
+}
+.#{$ti-prefix}-direction:before {
+ content: $ti-icon-direction;
+}
+.#{$ti-prefix}-direction-arrows:before {
+ content: $ti-icon-direction-arrows;
+}
+.#{$ti-prefix}-direction-horizontal:before {
+ content: $ti-icon-direction-horizontal;
+}
+.#{$ti-prefix}-direction-sign:before {
+ content: $ti-icon-direction-sign;
+}
+.#{$ti-prefix}-direction-sign-filled:before {
+ content: $ti-icon-direction-sign-filled;
+}
+.#{$ti-prefix}-direction-sign-off:before {
+ content: $ti-icon-direction-sign-off;
+}
+.#{$ti-prefix}-directions:before {
+ content: $ti-icon-directions;
+}
+.#{$ti-prefix}-directions-off:before {
+ content: $ti-icon-directions-off;
+}
+.#{$ti-prefix}-disabled:before {
+ content: $ti-icon-disabled;
+}
+.#{$ti-prefix}-disabled-2:before {
+ content: $ti-icon-disabled-2;
+}
+.#{$ti-prefix}-disabled-off:before {
+ content: $ti-icon-disabled-off;
+}
+.#{$ti-prefix}-disc:before {
+ content: $ti-icon-disc;
+}
+.#{$ti-prefix}-disc-golf:before {
+ content: $ti-icon-disc-golf;
+}
+.#{$ti-prefix}-disc-off:before {
+ content: $ti-icon-disc-off;
+}
+.#{$ti-prefix}-discount:before {
+ content: $ti-icon-discount;
+}
+.#{$ti-prefix}-discount-off:before {
+ content: $ti-icon-discount-off;
+}
+.#{$ti-prefix}-divide:before {
+ content: $ti-icon-divide;
+}
+.#{$ti-prefix}-dna:before {
+ content: $ti-icon-dna;
+}
+.#{$ti-prefix}-dna-2:before {
+ content: $ti-icon-dna-2;
+}
+.#{$ti-prefix}-dna-2-off:before {
+ content: $ti-icon-dna-2-off;
+}
+.#{$ti-prefix}-dna-off:before {
+ content: $ti-icon-dna-off;
+}
+.#{$ti-prefix}-dog:before {
+ content: $ti-icon-dog;
+}
+.#{$ti-prefix}-dog-bowl:before {
+ content: $ti-icon-dog-bowl;
+}
+.#{$ti-prefix}-door:before {
+ content: $ti-icon-door;
+}
+.#{$ti-prefix}-door-enter:before {
+ content: $ti-icon-door-enter;
+}
+.#{$ti-prefix}-door-exit:before {
+ content: $ti-icon-door-exit;
+}
+.#{$ti-prefix}-door-off:before {
+ content: $ti-icon-door-off;
+}
+.#{$ti-prefix}-dots:before {
+ content: $ti-icon-dots;
+}
+.#{$ti-prefix}-dots-circle-horizontal:before {
+ content: $ti-icon-dots-circle-horizontal;
+}
+.#{$ti-prefix}-dots-diagonal:before {
+ content: $ti-icon-dots-diagonal;
+}
+.#{$ti-prefix}-dots-diagonal-2:before {
+ content: $ti-icon-dots-diagonal-2;
+}
+.#{$ti-prefix}-dots-vertical:before {
+ content: $ti-icon-dots-vertical;
+}
+.#{$ti-prefix}-download:before {
+ content: $ti-icon-download;
+}
+.#{$ti-prefix}-download-off:before {
+ content: $ti-icon-download-off;
+}
+.#{$ti-prefix}-drag-drop:before {
+ content: $ti-icon-drag-drop;
+}
+.#{$ti-prefix}-drag-drop-2:before {
+ content: $ti-icon-drag-drop-2;
+}
+.#{$ti-prefix}-drone:before {
+ content: $ti-icon-drone;
+}
+.#{$ti-prefix}-drone-off:before {
+ content: $ti-icon-drone-off;
+}
+.#{$ti-prefix}-drop-circle:before {
+ content: $ti-icon-drop-circle;
+}
+.#{$ti-prefix}-droplet:before {
+ content: $ti-icon-droplet;
+}
+.#{$ti-prefix}-droplet-bolt:before {
+ content: $ti-icon-droplet-bolt;
+}
+.#{$ti-prefix}-droplet-cancel:before {
+ content: $ti-icon-droplet-cancel;
+}
+.#{$ti-prefix}-droplet-check:before {
+ content: $ti-icon-droplet-check;
+}
+.#{$ti-prefix}-droplet-code:before {
+ content: $ti-icon-droplet-code;
+}
+.#{$ti-prefix}-droplet-cog:before {
+ content: $ti-icon-droplet-cog;
+}
+.#{$ti-prefix}-droplet-dollar:before {
+ content: $ti-icon-droplet-dollar;
+}
+.#{$ti-prefix}-droplet-down:before {
+ content: $ti-icon-droplet-down;
+}
+.#{$ti-prefix}-droplet-exclamation:before {
+ content: $ti-icon-droplet-exclamation;
+}
+.#{$ti-prefix}-droplet-filled:before {
+ content: $ti-icon-droplet-filled;
+}
+.#{$ti-prefix}-droplet-half:before {
+ content: $ti-icon-droplet-half;
+}
+.#{$ti-prefix}-droplet-half-2:before {
+ content: $ti-icon-droplet-half-2;
+}
+.#{$ti-prefix}-droplet-half-2-filled:before {
+ content: $ti-icon-droplet-half-2-filled;
+}
+.#{$ti-prefix}-droplet-half-filled:before {
+ content: $ti-icon-droplet-half-filled;
+}
+.#{$ti-prefix}-droplet-heart:before {
+ content: $ti-icon-droplet-heart;
+}
+.#{$ti-prefix}-droplet-minus:before {
+ content: $ti-icon-droplet-minus;
+}
+.#{$ti-prefix}-droplet-off:before {
+ content: $ti-icon-droplet-off;
+}
+.#{$ti-prefix}-droplet-pause:before {
+ content: $ti-icon-droplet-pause;
+}
+.#{$ti-prefix}-droplet-pin:before {
+ content: $ti-icon-droplet-pin;
+}
+.#{$ti-prefix}-droplet-plus:before {
+ content: $ti-icon-droplet-plus;
+}
+.#{$ti-prefix}-droplet-question:before {
+ content: $ti-icon-droplet-question;
+}
+.#{$ti-prefix}-droplet-search:before {
+ content: $ti-icon-droplet-search;
+}
+.#{$ti-prefix}-droplet-share:before {
+ content: $ti-icon-droplet-share;
+}
+.#{$ti-prefix}-droplet-star:before {
+ content: $ti-icon-droplet-star;
+}
+.#{$ti-prefix}-droplet-up:before {
+ content: $ti-icon-droplet-up;
+}
+.#{$ti-prefix}-droplet-x:before {
+ content: $ti-icon-droplet-x;
+}
+.#{$ti-prefix}-droplets:before {
+ content: $ti-icon-droplets;
+}
+.#{$ti-prefix}-dual-screen:before {
+ content: $ti-icon-dual-screen;
+}
+.#{$ti-prefix}-dumpling:before {
+ content: $ti-icon-dumpling;
+}
+.#{$ti-prefix}-e-passport:before {
+ content: $ti-icon-e-passport;
+}
+.#{$ti-prefix}-ear:before {
+ content: $ti-icon-ear;
+}
+.#{$ti-prefix}-ear-off:before {
+ content: $ti-icon-ear-off;
+}
+.#{$ti-prefix}-ear-scan:before {
+ content: $ti-icon-ear-scan;
+}
+.#{$ti-prefix}-ease-in:before {
+ content: $ti-icon-ease-in;
+}
+.#{$ti-prefix}-ease-in-control-point:before {
+ content: $ti-icon-ease-in-control-point;
+}
+.#{$ti-prefix}-ease-in-out:before {
+ content: $ti-icon-ease-in-out;
+}
+.#{$ti-prefix}-ease-in-out-control-points:before {
+ content: $ti-icon-ease-in-out-control-points;
+}
+.#{$ti-prefix}-ease-out:before {
+ content: $ti-icon-ease-out;
+}
+.#{$ti-prefix}-ease-out-control-point:before {
+ content: $ti-icon-ease-out-control-point;
+}
+.#{$ti-prefix}-edit:before {
+ content: $ti-icon-edit;
+}
+.#{$ti-prefix}-edit-circle:before {
+ content: $ti-icon-edit-circle;
+}
+.#{$ti-prefix}-edit-circle-off:before {
+ content: $ti-icon-edit-circle-off;
+}
+.#{$ti-prefix}-edit-off:before {
+ content: $ti-icon-edit-off;
+}
+.#{$ti-prefix}-egg:before {
+ content: $ti-icon-egg;
+}
+.#{$ti-prefix}-egg-cracked:before {
+ content: $ti-icon-egg-cracked;
+}
+.#{$ti-prefix}-egg-filled:before {
+ content: $ti-icon-egg-filled;
+}
+.#{$ti-prefix}-egg-fried:before {
+ content: $ti-icon-egg-fried;
+}
+.#{$ti-prefix}-egg-off:before {
+ content: $ti-icon-egg-off;
+}
+.#{$ti-prefix}-eggs:before {
+ content: $ti-icon-eggs;
+}
+.#{$ti-prefix}-elevator:before {
+ content: $ti-icon-elevator;
+}
+.#{$ti-prefix}-elevator-off:before {
+ content: $ti-icon-elevator-off;
+}
+.#{$ti-prefix}-emergency-bed:before {
+ content: $ti-icon-emergency-bed;
+}
+.#{$ti-prefix}-empathize:before {
+ content: $ti-icon-empathize;
+}
+.#{$ti-prefix}-empathize-off:before {
+ content: $ti-icon-empathize-off;
+}
+.#{$ti-prefix}-emphasis:before {
+ content: $ti-icon-emphasis;
+}
+.#{$ti-prefix}-engine:before {
+ content: $ti-icon-engine;
+}
+.#{$ti-prefix}-engine-off:before {
+ content: $ti-icon-engine-off;
+}
+.#{$ti-prefix}-equal:before {
+ content: $ti-icon-equal;
+}
+.#{$ti-prefix}-equal-double:before {
+ content: $ti-icon-equal-double;
+}
+.#{$ti-prefix}-equal-not:before {
+ content: $ti-icon-equal-not;
+}
+.#{$ti-prefix}-eraser:before {
+ content: $ti-icon-eraser;
+}
+.#{$ti-prefix}-eraser-off:before {
+ content: $ti-icon-eraser-off;
+}
+.#{$ti-prefix}-error-404:before {
+ content: $ti-icon-error-404;
+}
+.#{$ti-prefix}-error-404-off:before {
+ content: $ti-icon-error-404-off;
+}
+.#{$ti-prefix}-escalator:before {
+ content: $ti-icon-escalator;
+}
+.#{$ti-prefix}-escalator-down:before {
+ content: $ti-icon-escalator-down;
+}
+.#{$ti-prefix}-escalator-up:before {
+ content: $ti-icon-escalator-up;
+}
+.#{$ti-prefix}-exchange:before {
+ content: $ti-icon-exchange;
+}
+.#{$ti-prefix}-exchange-off:before {
+ content: $ti-icon-exchange-off;
+}
+.#{$ti-prefix}-exclamation-circle:before {
+ content: $ti-icon-exclamation-circle;
+}
+.#{$ti-prefix}-exclamation-mark:before {
+ content: $ti-icon-exclamation-mark;
+}
+.#{$ti-prefix}-exclamation-mark-off:before {
+ content: $ti-icon-exclamation-mark-off;
+}
+.#{$ti-prefix}-explicit:before {
+ content: $ti-icon-explicit;
+}
+.#{$ti-prefix}-explicit-off:before {
+ content: $ti-icon-explicit-off;
+}
+.#{$ti-prefix}-exposure:before {
+ content: $ti-icon-exposure;
+}
+.#{$ti-prefix}-exposure-0:before {
+ content: $ti-icon-exposure-0;
+}
+.#{$ti-prefix}-exposure-minus-1:before {
+ content: $ti-icon-exposure-minus-1;
+}
+.#{$ti-prefix}-exposure-minus-2:before {
+ content: $ti-icon-exposure-minus-2;
+}
+.#{$ti-prefix}-exposure-off:before {
+ content: $ti-icon-exposure-off;
+}
+.#{$ti-prefix}-exposure-plus-1:before {
+ content: $ti-icon-exposure-plus-1;
+}
+.#{$ti-prefix}-exposure-plus-2:before {
+ content: $ti-icon-exposure-plus-2;
+}
+.#{$ti-prefix}-external-link:before {
+ content: $ti-icon-external-link;
+}
+.#{$ti-prefix}-external-link-off:before {
+ content: $ti-icon-external-link-off;
+}
+.#{$ti-prefix}-eye:before {
+ content: $ti-icon-eye;
+}
+.#{$ti-prefix}-eye-bolt:before {
+ content: $ti-icon-eye-bolt;
+}
+.#{$ti-prefix}-eye-cancel:before {
+ content: $ti-icon-eye-cancel;
+}
+.#{$ti-prefix}-eye-check:before {
+ content: $ti-icon-eye-check;
+}
+.#{$ti-prefix}-eye-closed:before {
+ content: $ti-icon-eye-closed;
+}
+.#{$ti-prefix}-eye-code:before {
+ content: $ti-icon-eye-code;
+}
+.#{$ti-prefix}-eye-cog:before {
+ content: $ti-icon-eye-cog;
+}
+.#{$ti-prefix}-eye-discount:before {
+ content: $ti-icon-eye-discount;
+}
+.#{$ti-prefix}-eye-dollar:before {
+ content: $ti-icon-eye-dollar;
+}
+.#{$ti-prefix}-eye-dotted:before {
+ content: $ti-icon-eye-dotted;
+}
+.#{$ti-prefix}-eye-down:before {
+ content: $ti-icon-eye-down;
+}
+.#{$ti-prefix}-eye-edit:before {
+ content: $ti-icon-eye-edit;
+}
+.#{$ti-prefix}-eye-exclamation:before {
+ content: $ti-icon-eye-exclamation;
+}
+.#{$ti-prefix}-eye-filled:before {
+ content: $ti-icon-eye-filled;
+}
+.#{$ti-prefix}-eye-heart:before {
+ content: $ti-icon-eye-heart;
+}
+.#{$ti-prefix}-eye-minus:before {
+ content: $ti-icon-eye-minus;
+}
+.#{$ti-prefix}-eye-off:before {
+ content: $ti-icon-eye-off;
+}
+.#{$ti-prefix}-eye-pause:before {
+ content: $ti-icon-eye-pause;
+}
+.#{$ti-prefix}-eye-pin:before {
+ content: $ti-icon-eye-pin;
+}
+.#{$ti-prefix}-eye-plus:before {
+ content: $ti-icon-eye-plus;
+}
+.#{$ti-prefix}-eye-question:before {
+ content: $ti-icon-eye-question;
+}
+.#{$ti-prefix}-eye-search:before {
+ content: $ti-icon-eye-search;
+}
+.#{$ti-prefix}-eye-share:before {
+ content: $ti-icon-eye-share;
+}
+.#{$ti-prefix}-eye-star:before {
+ content: $ti-icon-eye-star;
+}
+.#{$ti-prefix}-eye-table:before {
+ content: $ti-icon-eye-table;
+}
+.#{$ti-prefix}-eye-up:before {
+ content: $ti-icon-eye-up;
+}
+.#{$ti-prefix}-eye-x:before {
+ content: $ti-icon-eye-x;
+}
+.#{$ti-prefix}-eyeglass:before {
+ content: $ti-icon-eyeglass;
+}
+.#{$ti-prefix}-eyeglass-2:before {
+ content: $ti-icon-eyeglass-2;
+}
+.#{$ti-prefix}-eyeglass-off:before {
+ content: $ti-icon-eyeglass-off;
+}
+.#{$ti-prefix}-face-id:before {
+ content: $ti-icon-face-id;
+}
+.#{$ti-prefix}-face-id-error:before {
+ content: $ti-icon-face-id-error;
+}
+.#{$ti-prefix}-face-mask:before {
+ content: $ti-icon-face-mask;
+}
+.#{$ti-prefix}-face-mask-off:before {
+ content: $ti-icon-face-mask-off;
+}
+.#{$ti-prefix}-fall:before {
+ content: $ti-icon-fall;
+}
+.#{$ti-prefix}-favicon:before {
+ content: $ti-icon-favicon;
+}
+.#{$ti-prefix}-feather:before {
+ content: $ti-icon-feather;
+}
+.#{$ti-prefix}-feather-off:before {
+ content: $ti-icon-feather-off;
+}
+.#{$ti-prefix}-fence:before {
+ content: $ti-icon-fence;
+}
+.#{$ti-prefix}-fence-off:before {
+ content: $ti-icon-fence-off;
+}
+.#{$ti-prefix}-fidget-spinner:before {
+ content: $ti-icon-fidget-spinner;
+}
+.#{$ti-prefix}-file:before {
+ content: $ti-icon-file;
+}
+.#{$ti-prefix}-file-3d:before {
+ content: $ti-icon-file-3d;
+}
+.#{$ti-prefix}-file-alert:before {
+ content: $ti-icon-file-alert;
+}
+.#{$ti-prefix}-file-analytics:before {
+ content: $ti-icon-file-analytics;
+}
+.#{$ti-prefix}-file-arrow-left:before {
+ content: $ti-icon-file-arrow-left;
+}
+.#{$ti-prefix}-file-arrow-right:before {
+ content: $ti-icon-file-arrow-right;
+}
+.#{$ti-prefix}-file-barcode:before {
+ content: $ti-icon-file-barcode;
+}
+.#{$ti-prefix}-file-broken:before {
+ content: $ti-icon-file-broken;
+}
+.#{$ti-prefix}-file-certificate:before {
+ content: $ti-icon-file-certificate;
+}
+.#{$ti-prefix}-file-chart:before {
+ content: $ti-icon-file-chart;
+}
+.#{$ti-prefix}-file-check:before {
+ content: $ti-icon-file-check;
+}
+.#{$ti-prefix}-file-code:before {
+ content: $ti-icon-file-code;
+}
+.#{$ti-prefix}-file-code-2:before {
+ content: $ti-icon-file-code-2;
+}
+.#{$ti-prefix}-file-cv:before {
+ content: $ti-icon-file-cv;
+}
+.#{$ti-prefix}-file-database:before {
+ content: $ti-icon-file-database;
+}
+.#{$ti-prefix}-file-delta:before {
+ content: $ti-icon-file-delta;
+}
+.#{$ti-prefix}-file-description:before {
+ content: $ti-icon-file-description;
+}
+.#{$ti-prefix}-file-diff:before {
+ content: $ti-icon-file-diff;
+}
+.#{$ti-prefix}-file-digit:before {
+ content: $ti-icon-file-digit;
+}
+.#{$ti-prefix}-file-dislike:before {
+ content: $ti-icon-file-dislike;
+}
+.#{$ti-prefix}-file-dollar:before {
+ content: $ti-icon-file-dollar;
+}
+.#{$ti-prefix}-file-dots:before {
+ content: $ti-icon-file-dots;
+}
+.#{$ti-prefix}-file-download:before {
+ content: $ti-icon-file-download;
+}
+.#{$ti-prefix}-file-euro:before {
+ content: $ti-icon-file-euro;
+}
+.#{$ti-prefix}-file-export:before {
+ content: $ti-icon-file-export;
+}
+.#{$ti-prefix}-file-filled:before {
+ content: $ti-icon-file-filled;
+}
+.#{$ti-prefix}-file-function:before {
+ content: $ti-icon-file-function;
+}
+.#{$ti-prefix}-file-horizontal:before {
+ content: $ti-icon-file-horizontal;
+}
+.#{$ti-prefix}-file-import:before {
+ content: $ti-icon-file-import;
+}
+.#{$ti-prefix}-file-infinity:before {
+ content: $ti-icon-file-infinity;
+}
+.#{$ti-prefix}-file-info:before {
+ content: $ti-icon-file-info;
+}
+.#{$ti-prefix}-file-invoice:before {
+ content: $ti-icon-file-invoice;
+}
+.#{$ti-prefix}-file-isr:before {
+ content: $ti-icon-file-isr;
+}
+.#{$ti-prefix}-file-lambda:before {
+ content: $ti-icon-file-lambda;
+}
+.#{$ti-prefix}-file-like:before {
+ content: $ti-icon-file-like;
+}
+.#{$ti-prefix}-file-minus:before {
+ content: $ti-icon-file-minus;
+}
+.#{$ti-prefix}-file-music:before {
+ content: $ti-icon-file-music;
+}
+.#{$ti-prefix}-file-neutral:before {
+ content: $ti-icon-file-neutral;
+}
+.#{$ti-prefix}-file-off:before {
+ content: $ti-icon-file-off;
+}
+.#{$ti-prefix}-file-orientation:before {
+ content: $ti-icon-file-orientation;
+}
+.#{$ti-prefix}-file-pencil:before {
+ content: $ti-icon-file-pencil;
+}
+.#{$ti-prefix}-file-percent:before {
+ content: $ti-icon-file-percent;
+}
+.#{$ti-prefix}-file-phone:before {
+ content: $ti-icon-file-phone;
+}
+.#{$ti-prefix}-file-plus:before {
+ content: $ti-icon-file-plus;
+}
+.#{$ti-prefix}-file-power:before {
+ content: $ti-icon-file-power;
+}
+.#{$ti-prefix}-file-report:before {
+ content: $ti-icon-file-report;
+}
+.#{$ti-prefix}-file-rss:before {
+ content: $ti-icon-file-rss;
+}
+.#{$ti-prefix}-file-sad:before {
+ content: $ti-icon-file-sad;
+}
+.#{$ti-prefix}-file-scissors:before {
+ content: $ti-icon-file-scissors;
+}
+.#{$ti-prefix}-file-search:before {
+ content: $ti-icon-file-search;
+}
+.#{$ti-prefix}-file-settings:before {
+ content: $ti-icon-file-settings;
+}
+.#{$ti-prefix}-file-shredder:before {
+ content: $ti-icon-file-shredder;
+}
+.#{$ti-prefix}-file-signal:before {
+ content: $ti-icon-file-signal;
+}
+.#{$ti-prefix}-file-smile:before {
+ content: $ti-icon-file-smile;
+}
+.#{$ti-prefix}-file-spreadsheet:before {
+ content: $ti-icon-file-spreadsheet;
+}
+.#{$ti-prefix}-file-stack:before {
+ content: $ti-icon-file-stack;
+}
+.#{$ti-prefix}-file-star:before {
+ content: $ti-icon-file-star;
+}
+.#{$ti-prefix}-file-symlink:before {
+ content: $ti-icon-file-symlink;
+}
+.#{$ti-prefix}-file-text:before {
+ content: $ti-icon-file-text;
+}
+.#{$ti-prefix}-file-text-ai:before {
+ content: $ti-icon-file-text-ai;
+}
+.#{$ti-prefix}-file-time:before {
+ content: $ti-icon-file-time;
+}
+.#{$ti-prefix}-file-type-bmp:before {
+ content: $ti-icon-file-type-bmp;
+}
+.#{$ti-prefix}-file-type-css:before {
+ content: $ti-icon-file-type-css;
+}
+.#{$ti-prefix}-file-type-csv:before {
+ content: $ti-icon-file-type-csv;
+}
+.#{$ti-prefix}-file-type-doc:before {
+ content: $ti-icon-file-type-doc;
+}
+.#{$ti-prefix}-file-type-docx:before {
+ content: $ti-icon-file-type-docx;
+}
+.#{$ti-prefix}-file-type-html:before {
+ content: $ti-icon-file-type-html;
+}
+.#{$ti-prefix}-file-type-jpg:before {
+ content: $ti-icon-file-type-jpg;
+}
+.#{$ti-prefix}-file-type-js:before {
+ content: $ti-icon-file-type-js;
+}
+.#{$ti-prefix}-file-type-jsx:before {
+ content: $ti-icon-file-type-jsx;
+}
+.#{$ti-prefix}-file-type-pdf:before {
+ content: $ti-icon-file-type-pdf;
+}
+.#{$ti-prefix}-file-type-php:before {
+ content: $ti-icon-file-type-php;
+}
+.#{$ti-prefix}-file-type-png:before {
+ content: $ti-icon-file-type-png;
+}
+.#{$ti-prefix}-file-type-ppt:before {
+ content: $ti-icon-file-type-ppt;
+}
+.#{$ti-prefix}-file-type-rs:before {
+ content: $ti-icon-file-type-rs;
+}
+.#{$ti-prefix}-file-type-sql:before {
+ content: $ti-icon-file-type-sql;
+}
+.#{$ti-prefix}-file-type-svg:before {
+ content: $ti-icon-file-type-svg;
+}
+.#{$ti-prefix}-file-type-ts:before {
+ content: $ti-icon-file-type-ts;
+}
+.#{$ti-prefix}-file-type-tsx:before {
+ content: $ti-icon-file-type-tsx;
+}
+.#{$ti-prefix}-file-type-txt:before {
+ content: $ti-icon-file-type-txt;
+}
+.#{$ti-prefix}-file-type-vue:before {
+ content: $ti-icon-file-type-vue;
+}
+.#{$ti-prefix}-file-type-xls:before {
+ content: $ti-icon-file-type-xls;
+}
+.#{$ti-prefix}-file-type-xml:before {
+ content: $ti-icon-file-type-xml;
+}
+.#{$ti-prefix}-file-type-zip:before {
+ content: $ti-icon-file-type-zip;
+}
+.#{$ti-prefix}-file-typography:before {
+ content: $ti-icon-file-typography;
+}
+.#{$ti-prefix}-file-unknown:before {
+ content: $ti-icon-file-unknown;
+}
+.#{$ti-prefix}-file-upload:before {
+ content: $ti-icon-file-upload;
+}
+.#{$ti-prefix}-file-vector:before {
+ content: $ti-icon-file-vector;
+}
+.#{$ti-prefix}-file-x:before {
+ content: $ti-icon-file-x;
+}
+.#{$ti-prefix}-file-x-filled:before {
+ content: $ti-icon-file-x-filled;
+}
+.#{$ti-prefix}-file-zip:before {
+ content: $ti-icon-file-zip;
+}
+.#{$ti-prefix}-files:before {
+ content: $ti-icon-files;
+}
+.#{$ti-prefix}-files-off:before {
+ content: $ti-icon-files-off;
+}
+.#{$ti-prefix}-filter:before {
+ content: $ti-icon-filter;
+}
+.#{$ti-prefix}-filter-bolt:before {
+ content: $ti-icon-filter-bolt;
+}
+.#{$ti-prefix}-filter-cancel:before {
+ content: $ti-icon-filter-cancel;
+}
+.#{$ti-prefix}-filter-check:before {
+ content: $ti-icon-filter-check;
+}
+.#{$ti-prefix}-filter-code:before {
+ content: $ti-icon-filter-code;
+}
+.#{$ti-prefix}-filter-cog:before {
+ content: $ti-icon-filter-cog;
+}
+.#{$ti-prefix}-filter-discount:before {
+ content: $ti-icon-filter-discount;
+}
+.#{$ti-prefix}-filter-dollar:before {
+ content: $ti-icon-filter-dollar;
+}
+.#{$ti-prefix}-filter-down:before {
+ content: $ti-icon-filter-down;
+}
+.#{$ti-prefix}-filter-edit:before {
+ content: $ti-icon-filter-edit;
+}
+.#{$ti-prefix}-filter-exclamation:before {
+ content: $ti-icon-filter-exclamation;
+}
+.#{$ti-prefix}-filter-filled:before {
+ content: $ti-icon-filter-filled;
+}
+.#{$ti-prefix}-filter-heart:before {
+ content: $ti-icon-filter-heart;
+}
+.#{$ti-prefix}-filter-minus:before {
+ content: $ti-icon-filter-minus;
+}
+.#{$ti-prefix}-filter-off:before {
+ content: $ti-icon-filter-off;
+}
+.#{$ti-prefix}-filter-pause:before {
+ content: $ti-icon-filter-pause;
+}
+.#{$ti-prefix}-filter-pin:before {
+ content: $ti-icon-filter-pin;
+}
+.#{$ti-prefix}-filter-plus:before {
+ content: $ti-icon-filter-plus;
+}
+.#{$ti-prefix}-filter-question:before {
+ content: $ti-icon-filter-question;
+}
+.#{$ti-prefix}-filter-search:before {
+ content: $ti-icon-filter-search;
+}
+.#{$ti-prefix}-filter-share:before {
+ content: $ti-icon-filter-share;
+}
+.#{$ti-prefix}-filter-star:before {
+ content: $ti-icon-filter-star;
+}
+.#{$ti-prefix}-filter-up:before {
+ content: $ti-icon-filter-up;
+}
+.#{$ti-prefix}-filter-x:before {
+ content: $ti-icon-filter-x;
+}
+.#{$ti-prefix}-filters:before {
+ content: $ti-icon-filters;
+}
+.#{$ti-prefix}-fingerprint:before {
+ content: $ti-icon-fingerprint;
+}
+.#{$ti-prefix}-fingerprint-off:before {
+ content: $ti-icon-fingerprint-off;
+}
+.#{$ti-prefix}-fingerprint-scan:before {
+ content: $ti-icon-fingerprint-scan;
+}
+.#{$ti-prefix}-fire-extinguisher:before {
+ content: $ti-icon-fire-extinguisher;
+}
+.#{$ti-prefix}-fire-hydrant:before {
+ content: $ti-icon-fire-hydrant;
+}
+.#{$ti-prefix}-fire-hydrant-off:before {
+ content: $ti-icon-fire-hydrant-off;
+}
+.#{$ti-prefix}-firetruck:before {
+ content: $ti-icon-firetruck;
+}
+.#{$ti-prefix}-first-aid-kit:before {
+ content: $ti-icon-first-aid-kit;
+}
+.#{$ti-prefix}-first-aid-kit-off:before {
+ content: $ti-icon-first-aid-kit-off;
+}
+.#{$ti-prefix}-fish:before {
+ content: $ti-icon-fish;
+}
+.#{$ti-prefix}-fish-bone:before {
+ content: $ti-icon-fish-bone;
+}
+.#{$ti-prefix}-fish-christianity:before {
+ content: $ti-icon-fish-christianity;
+}
+.#{$ti-prefix}-fish-hook:before {
+ content: $ti-icon-fish-hook;
+}
+.#{$ti-prefix}-fish-hook-off:before {
+ content: $ti-icon-fish-hook-off;
+}
+.#{$ti-prefix}-fish-off:before {
+ content: $ti-icon-fish-off;
+}
+.#{$ti-prefix}-flag:before {
+ content: $ti-icon-flag;
+}
+.#{$ti-prefix}-flag-2:before {
+ content: $ti-icon-flag-2;
+}
+.#{$ti-prefix}-flag-2-filled:before {
+ content: $ti-icon-flag-2-filled;
+}
+.#{$ti-prefix}-flag-2-off:before {
+ content: $ti-icon-flag-2-off;
+}
+.#{$ti-prefix}-flag-3:before {
+ content: $ti-icon-flag-3;
+}
+.#{$ti-prefix}-flag-3-filled:before {
+ content: $ti-icon-flag-3-filled;
+}
+.#{$ti-prefix}-flag-bolt:before {
+ content: $ti-icon-flag-bolt;
+}
+.#{$ti-prefix}-flag-cancel:before {
+ content: $ti-icon-flag-cancel;
+}
+.#{$ti-prefix}-flag-check:before {
+ content: $ti-icon-flag-check;
+}
+.#{$ti-prefix}-flag-code:before {
+ content: $ti-icon-flag-code;
+}
+.#{$ti-prefix}-flag-cog:before {
+ content: $ti-icon-flag-cog;
+}
+.#{$ti-prefix}-flag-discount:before {
+ content: $ti-icon-flag-discount;
+}
+.#{$ti-prefix}-flag-dollar:before {
+ content: $ti-icon-flag-dollar;
+}
+.#{$ti-prefix}-flag-down:before {
+ content: $ti-icon-flag-down;
+}
+.#{$ti-prefix}-flag-exclamation:before {
+ content: $ti-icon-flag-exclamation;
+}
+.#{$ti-prefix}-flag-filled:before {
+ content: $ti-icon-flag-filled;
+}
+.#{$ti-prefix}-flag-heart:before {
+ content: $ti-icon-flag-heart;
+}
+.#{$ti-prefix}-flag-minus:before {
+ content: $ti-icon-flag-minus;
+}
+.#{$ti-prefix}-flag-off:before {
+ content: $ti-icon-flag-off;
+}
+.#{$ti-prefix}-flag-pause:before {
+ content: $ti-icon-flag-pause;
+}
+.#{$ti-prefix}-flag-pin:before {
+ content: $ti-icon-flag-pin;
+}
+.#{$ti-prefix}-flag-plus:before {
+ content: $ti-icon-flag-plus;
+}
+.#{$ti-prefix}-flag-question:before {
+ content: $ti-icon-flag-question;
+}
+.#{$ti-prefix}-flag-search:before {
+ content: $ti-icon-flag-search;
+}
+.#{$ti-prefix}-flag-share:before {
+ content: $ti-icon-flag-share;
+}
+.#{$ti-prefix}-flag-star:before {
+ content: $ti-icon-flag-star;
+}
+.#{$ti-prefix}-flag-up:before {
+ content: $ti-icon-flag-up;
+}
+.#{$ti-prefix}-flag-x:before {
+ content: $ti-icon-flag-x;
+}
+.#{$ti-prefix}-flame:before {
+ content: $ti-icon-flame;
+}
+.#{$ti-prefix}-flame-off:before {
+ content: $ti-icon-flame-off;
+}
+.#{$ti-prefix}-flare:before {
+ content: $ti-icon-flare;
+}
+.#{$ti-prefix}-flask:before {
+ content: $ti-icon-flask;
+}
+.#{$ti-prefix}-flask-2:before {
+ content: $ti-icon-flask-2;
+}
+.#{$ti-prefix}-flask-2-filled:before {
+ content: $ti-icon-flask-2-filled;
+}
+.#{$ti-prefix}-flask-2-off:before {
+ content: $ti-icon-flask-2-off;
+}
+.#{$ti-prefix}-flask-filled:before {
+ content: $ti-icon-flask-filled;
+}
+.#{$ti-prefix}-flask-off:before {
+ content: $ti-icon-flask-off;
+}
+.#{$ti-prefix}-flip-flops:before {
+ content: $ti-icon-flip-flops;
+}
+.#{$ti-prefix}-flip-horizontal:before {
+ content: $ti-icon-flip-horizontal;
+}
+.#{$ti-prefix}-flip-vertical:before {
+ content: $ti-icon-flip-vertical;
+}
+.#{$ti-prefix}-float-center:before {
+ content: $ti-icon-float-center;
+}
+.#{$ti-prefix}-float-left:before {
+ content: $ti-icon-float-left;
+}
+.#{$ti-prefix}-float-none:before {
+ content: $ti-icon-float-none;
+}
+.#{$ti-prefix}-float-right:before {
+ content: $ti-icon-float-right;
+}
+.#{$ti-prefix}-flower:before {
+ content: $ti-icon-flower;
+}
+.#{$ti-prefix}-flower-off:before {
+ content: $ti-icon-flower-off;
+}
+.#{$ti-prefix}-focus:before {
+ content: $ti-icon-focus;
+}
+.#{$ti-prefix}-focus-2:before {
+ content: $ti-icon-focus-2;
+}
+.#{$ti-prefix}-focus-auto:before {
+ content: $ti-icon-focus-auto;
+}
+.#{$ti-prefix}-focus-centered:before {
+ content: $ti-icon-focus-centered;
+}
+.#{$ti-prefix}-fold:before {
+ content: $ti-icon-fold;
+}
+.#{$ti-prefix}-fold-down:before {
+ content: $ti-icon-fold-down;
+}
+.#{$ti-prefix}-fold-up:before {
+ content: $ti-icon-fold-up;
+}
+.#{$ti-prefix}-folder:before {
+ content: $ti-icon-folder;
+}
+.#{$ti-prefix}-folder-bolt:before {
+ content: $ti-icon-folder-bolt;
+}
+.#{$ti-prefix}-folder-cancel:before {
+ content: $ti-icon-folder-cancel;
+}
+.#{$ti-prefix}-folder-check:before {
+ content: $ti-icon-folder-check;
+}
+.#{$ti-prefix}-folder-code:before {
+ content: $ti-icon-folder-code;
+}
+.#{$ti-prefix}-folder-cog:before {
+ content: $ti-icon-folder-cog;
+}
+.#{$ti-prefix}-folder-dollar:before {
+ content: $ti-icon-folder-dollar;
+}
+.#{$ti-prefix}-folder-down:before {
+ content: $ti-icon-folder-down;
+}
+.#{$ti-prefix}-folder-exclamation:before {
+ content: $ti-icon-folder-exclamation;
+}
+.#{$ti-prefix}-folder-filled:before {
+ content: $ti-icon-folder-filled;
+}
+.#{$ti-prefix}-folder-heart:before {
+ content: $ti-icon-folder-heart;
+}
+.#{$ti-prefix}-folder-minus:before {
+ content: $ti-icon-folder-minus;
+}
+.#{$ti-prefix}-folder-off:before {
+ content: $ti-icon-folder-off;
+}
+.#{$ti-prefix}-folder-open:before {
+ content: $ti-icon-folder-open;
+}
+.#{$ti-prefix}-folder-pause:before {
+ content: $ti-icon-folder-pause;
+}
+.#{$ti-prefix}-folder-pin:before {
+ content: $ti-icon-folder-pin;
+}
+.#{$ti-prefix}-folder-plus:before {
+ content: $ti-icon-folder-plus;
+}
+.#{$ti-prefix}-folder-question:before {
+ content: $ti-icon-folder-question;
+}
+.#{$ti-prefix}-folder-root:before {
+ content: $ti-icon-folder-root;
+}
+.#{$ti-prefix}-folder-search:before {
+ content: $ti-icon-folder-search;
+}
+.#{$ti-prefix}-folder-share:before {
+ content: $ti-icon-folder-share;
+}
+.#{$ti-prefix}-folder-star:before {
+ content: $ti-icon-folder-star;
+}
+.#{$ti-prefix}-folder-symlink:before {
+ content: $ti-icon-folder-symlink;
+}
+.#{$ti-prefix}-folder-up:before {
+ content: $ti-icon-folder-up;
+}
+.#{$ti-prefix}-folder-x:before {
+ content: $ti-icon-folder-x;
+}
+.#{$ti-prefix}-folders:before {
+ content: $ti-icon-folders;
+}
+.#{$ti-prefix}-folders-off:before {
+ content: $ti-icon-folders-off;
+}
+.#{$ti-prefix}-forbid:before {
+ content: $ti-icon-forbid;
+}
+.#{$ti-prefix}-forbid-2:before {
+ content: $ti-icon-forbid-2;
+}
+.#{$ti-prefix}-forbid-2-filled:before {
+ content: $ti-icon-forbid-2-filled;
+}
+.#{$ti-prefix}-forbid-filled:before {
+ content: $ti-icon-forbid-filled;
+}
+.#{$ti-prefix}-forklift:before {
+ content: $ti-icon-forklift;
+}
+.#{$ti-prefix}-forms:before {
+ content: $ti-icon-forms;
+}
+.#{$ti-prefix}-fountain:before {
+ content: $ti-icon-fountain;
+}
+.#{$ti-prefix}-fountain-filled:before {
+ content: $ti-icon-fountain-filled;
+}
+.#{$ti-prefix}-fountain-off:before {
+ content: $ti-icon-fountain-off;
+}
+.#{$ti-prefix}-frame:before {
+ content: $ti-icon-frame;
+}
+.#{$ti-prefix}-frame-off:before {
+ content: $ti-icon-frame-off;
+}
+.#{$ti-prefix}-free-rights:before {
+ content: $ti-icon-free-rights;
+}
+.#{$ti-prefix}-freeze-column:before {
+ content: $ti-icon-freeze-column;
+}
+.#{$ti-prefix}-freeze-row:before {
+ content: $ti-icon-freeze-row;
+}
+.#{$ti-prefix}-freeze-row-column:before {
+ content: $ti-icon-freeze-row-column;
+}
+.#{$ti-prefix}-fridge:before {
+ content: $ti-icon-fridge;
+}
+.#{$ti-prefix}-fridge-off:before {
+ content: $ti-icon-fridge-off;
+}
+.#{$ti-prefix}-friends:before {
+ content: $ti-icon-friends;
+}
+.#{$ti-prefix}-friends-off:before {
+ content: $ti-icon-friends-off;
+}
+.#{$ti-prefix}-frustum:before {
+ content: $ti-icon-frustum;
+}
+.#{$ti-prefix}-frustum-off:before {
+ content: $ti-icon-frustum-off;
+}
+.#{$ti-prefix}-frustum-plus:before {
+ content: $ti-icon-frustum-plus;
+}
+.#{$ti-prefix}-function:before {
+ content: $ti-icon-function;
+}
+.#{$ti-prefix}-function-filled:before {
+ content: $ti-icon-function-filled;
+}
+.#{$ti-prefix}-function-off:before {
+ content: $ti-icon-function-off;
+}
+.#{$ti-prefix}-galaxy:before {
+ content: $ti-icon-galaxy;
+}
+.#{$ti-prefix}-garden-cart:before {
+ content: $ti-icon-garden-cart;
+}
+.#{$ti-prefix}-garden-cart-off:before {
+ content: $ti-icon-garden-cart-off;
+}
+.#{$ti-prefix}-gas-station:before {
+ content: $ti-icon-gas-station;
+}
+.#{$ti-prefix}-gas-station-off:before {
+ content: $ti-icon-gas-station-off;
+}
+.#{$ti-prefix}-gauge:before {
+ content: $ti-icon-gauge;
+}
+.#{$ti-prefix}-gauge-filled:before {
+ content: $ti-icon-gauge-filled;
+}
+.#{$ti-prefix}-gauge-off:before {
+ content: $ti-icon-gauge-off;
+}
+.#{$ti-prefix}-gavel:before {
+ content: $ti-icon-gavel;
+}
+.#{$ti-prefix}-gender-agender:before {
+ content: $ti-icon-gender-agender;
+}
+.#{$ti-prefix}-gender-androgyne:before {
+ content: $ti-icon-gender-androgyne;
+}
+.#{$ti-prefix}-gender-bigender:before {
+ content: $ti-icon-gender-bigender;
+}
+.#{$ti-prefix}-gender-demiboy:before {
+ content: $ti-icon-gender-demiboy;
+}
+.#{$ti-prefix}-gender-demigirl:before {
+ content: $ti-icon-gender-demigirl;
+}
+.#{$ti-prefix}-gender-epicene:before {
+ content: $ti-icon-gender-epicene;
+}
+.#{$ti-prefix}-gender-female:before {
+ content: $ti-icon-gender-female;
+}
+.#{$ti-prefix}-gender-femme:before {
+ content: $ti-icon-gender-femme;
+}
+.#{$ti-prefix}-gender-genderfluid:before {
+ content: $ti-icon-gender-genderfluid;
+}
+.#{$ti-prefix}-gender-genderless:before {
+ content: $ti-icon-gender-genderless;
+}
+.#{$ti-prefix}-gender-genderqueer:before {
+ content: $ti-icon-gender-genderqueer;
+}
+.#{$ti-prefix}-gender-hermaphrodite:before {
+ content: $ti-icon-gender-hermaphrodite;
+}
+.#{$ti-prefix}-gender-intergender:before {
+ content: $ti-icon-gender-intergender;
+}
+.#{$ti-prefix}-gender-male:before {
+ content: $ti-icon-gender-male;
+}
+.#{$ti-prefix}-gender-neutrois:before {
+ content: $ti-icon-gender-neutrois;
+}
+.#{$ti-prefix}-gender-third:before {
+ content: $ti-icon-gender-third;
+}
+.#{$ti-prefix}-gender-transgender:before {
+ content: $ti-icon-gender-transgender;
+}
+.#{$ti-prefix}-gender-trasvesti:before {
+ content: $ti-icon-gender-trasvesti;
+}
+.#{$ti-prefix}-geometry:before {
+ content: $ti-icon-geometry;
+}
+.#{$ti-prefix}-ghost:before {
+ content: $ti-icon-ghost;
+}
+.#{$ti-prefix}-ghost-2:before {
+ content: $ti-icon-ghost-2;
+}
+.#{$ti-prefix}-ghost-2-filled:before {
+ content: $ti-icon-ghost-2-filled;
+}
+.#{$ti-prefix}-ghost-3:before {
+ content: $ti-icon-ghost-3;
+}
+.#{$ti-prefix}-ghost-filled:before {
+ content: $ti-icon-ghost-filled;
+}
+.#{$ti-prefix}-ghost-off:before {
+ content: $ti-icon-ghost-off;
+}
+.#{$ti-prefix}-gif:before {
+ content: $ti-icon-gif;
+}
+.#{$ti-prefix}-gift:before {
+ content: $ti-icon-gift;
+}
+.#{$ti-prefix}-gift-card:before {
+ content: $ti-icon-gift-card;
+}
+.#{$ti-prefix}-gift-card-filled:before {
+ content: $ti-icon-gift-card-filled;
+}
+.#{$ti-prefix}-gift-filled:before {
+ content: $ti-icon-gift-filled;
+}
+.#{$ti-prefix}-gift-off:before {
+ content: $ti-icon-gift-off;
+}
+.#{$ti-prefix}-git-branch:before {
+ content: $ti-icon-git-branch;
+}
+.#{$ti-prefix}-git-branch-deleted:before {
+ content: $ti-icon-git-branch-deleted;
+}
+.#{$ti-prefix}-git-cherry-pick:before {
+ content: $ti-icon-git-cherry-pick;
+}
+.#{$ti-prefix}-git-commit:before {
+ content: $ti-icon-git-commit;
+}
+.#{$ti-prefix}-git-compare:before {
+ content: $ti-icon-git-compare;
+}
+.#{$ti-prefix}-git-fork:before {
+ content: $ti-icon-git-fork;
+}
+.#{$ti-prefix}-git-merge:before {
+ content: $ti-icon-git-merge;
+}
+.#{$ti-prefix}-git-pull-request:before {
+ content: $ti-icon-git-pull-request;
+}
+.#{$ti-prefix}-git-pull-request-closed:before {
+ content: $ti-icon-git-pull-request-closed;
+}
+.#{$ti-prefix}-git-pull-request-draft:before {
+ content: $ti-icon-git-pull-request-draft;
+}
+.#{$ti-prefix}-gizmo:before {
+ content: $ti-icon-gizmo;
+}
+.#{$ti-prefix}-glass:before {
+ content: $ti-icon-glass;
+}
+.#{$ti-prefix}-glass-champagne:before {
+ content: $ti-icon-glass-champagne;
+}
+.#{$ti-prefix}-glass-cocktail:before {
+ content: $ti-icon-glass-cocktail;
+}
+.#{$ti-prefix}-glass-full:before {
+ content: $ti-icon-glass-full;
+}
+.#{$ti-prefix}-glass-full-filled:before {
+ content: $ti-icon-glass-full-filled;
+}
+.#{$ti-prefix}-glass-gin:before {
+ content: $ti-icon-glass-gin;
+}
+.#{$ti-prefix}-glass-off:before {
+ content: $ti-icon-glass-off;
+}
+.#{$ti-prefix}-globe:before {
+ content: $ti-icon-globe;
+}
+.#{$ti-prefix}-globe-filled:before {
+ content: $ti-icon-globe-filled;
+}
+.#{$ti-prefix}-globe-off:before {
+ content: $ti-icon-globe-off;
+}
+.#{$ti-prefix}-go-game:before {
+ content: $ti-icon-go-game;
+}
+.#{$ti-prefix}-golf:before {
+ content: $ti-icon-golf;
+}
+.#{$ti-prefix}-golf-off:before {
+ content: $ti-icon-golf-off;
+}
+.#{$ti-prefix}-gps:before {
+ content: $ti-icon-gps;
+}
+.#{$ti-prefix}-gps-filled:before {
+ content: $ti-icon-gps-filled;
+}
+.#{$ti-prefix}-gradienter:before {
+ content: $ti-icon-gradienter;
+}
+.#{$ti-prefix}-grain:before {
+ content: $ti-icon-grain;
+}
+.#{$ti-prefix}-graph:before {
+ content: $ti-icon-graph;
+}
+.#{$ti-prefix}-graph-filled:before {
+ content: $ti-icon-graph-filled;
+}
+.#{$ti-prefix}-graph-off:before {
+ content: $ti-icon-graph-off;
+}
+.#{$ti-prefix}-grave:before {
+ content: $ti-icon-grave;
+}
+.#{$ti-prefix}-grave-2:before {
+ content: $ti-icon-grave-2;
+}
+.#{$ti-prefix}-grid-3x3:before {
+ content: $ti-icon-grid-3x3;
+}
+.#{$ti-prefix}-grid-4x4:before {
+ content: $ti-icon-grid-4x4;
+}
+.#{$ti-prefix}-grid-dots:before {
+ content: $ti-icon-grid-dots;
+}
+.#{$ti-prefix}-grid-goldenratio:before {
+ content: $ti-icon-grid-goldenratio;
+}
+.#{$ti-prefix}-grid-pattern:before {
+ content: $ti-icon-grid-pattern;
+}
+.#{$ti-prefix}-grid-scan:before {
+ content: $ti-icon-grid-scan;
+}
+.#{$ti-prefix}-grill:before {
+ content: $ti-icon-grill;
+}
+.#{$ti-prefix}-grill-fork:before {
+ content: $ti-icon-grill-fork;
+}
+.#{$ti-prefix}-grill-off:before {
+ content: $ti-icon-grill-off;
+}
+.#{$ti-prefix}-grill-spatula:before {
+ content: $ti-icon-grill-spatula;
+}
+.#{$ti-prefix}-grip-horizontal:before {
+ content: $ti-icon-grip-horizontal;
+}
+.#{$ti-prefix}-grip-vertical:before {
+ content: $ti-icon-grip-vertical;
+}
+.#{$ti-prefix}-growth:before {
+ content: $ti-icon-growth;
+}
+.#{$ti-prefix}-guitar-pick:before {
+ content: $ti-icon-guitar-pick;
+}
+.#{$ti-prefix}-guitar-pick-filled:before {
+ content: $ti-icon-guitar-pick-filled;
+}
+.#{$ti-prefix}-gymnastics:before {
+ content: $ti-icon-gymnastics;
+}
+.#{$ti-prefix}-h-1:before {
+ content: $ti-icon-h-1;
+}
+.#{$ti-prefix}-h-2:before {
+ content: $ti-icon-h-2;
+}
+.#{$ti-prefix}-h-3:before {
+ content: $ti-icon-h-3;
+}
+.#{$ti-prefix}-h-4:before {
+ content: $ti-icon-h-4;
+}
+.#{$ti-prefix}-h-5:before {
+ content: $ti-icon-h-5;
+}
+.#{$ti-prefix}-h-6:before {
+ content: $ti-icon-h-6;
+}
+.#{$ti-prefix}-hammer:before {
+ content: $ti-icon-hammer;
+}
+.#{$ti-prefix}-hammer-off:before {
+ content: $ti-icon-hammer-off;
+}
+.#{$ti-prefix}-hand-click:before {
+ content: $ti-icon-hand-click;
+}
+.#{$ti-prefix}-hand-finger:before {
+ content: $ti-icon-hand-finger;
+}
+.#{$ti-prefix}-hand-finger-off:before {
+ content: $ti-icon-hand-finger-off;
+}
+.#{$ti-prefix}-hand-grab:before {
+ content: $ti-icon-hand-grab;
+}
+.#{$ti-prefix}-hand-little-finger:before {
+ content: $ti-icon-hand-little-finger;
+}
+.#{$ti-prefix}-hand-love-you:before {
+ content: $ti-icon-hand-love-you;
+}
+.#{$ti-prefix}-hand-middle-finger:before {
+ content: $ti-icon-hand-middle-finger;
+}
+.#{$ti-prefix}-hand-move:before {
+ content: $ti-icon-hand-move;
+}
+.#{$ti-prefix}-hand-off:before {
+ content: $ti-icon-hand-off;
+}
+.#{$ti-prefix}-hand-ring-finger:before {
+ content: $ti-icon-hand-ring-finger;
+}
+.#{$ti-prefix}-hand-sanitizer:before {
+ content: $ti-icon-hand-sanitizer;
+}
+.#{$ti-prefix}-hand-stop:before {
+ content: $ti-icon-hand-stop;
+}
+.#{$ti-prefix}-hand-three-fingers:before {
+ content: $ti-icon-hand-three-fingers;
+}
+.#{$ti-prefix}-hand-two-fingers:before {
+ content: $ti-icon-hand-two-fingers;
+}
+.#{$ti-prefix}-hanger:before {
+ content: $ti-icon-hanger;
+}
+.#{$ti-prefix}-hanger-2:before {
+ content: $ti-icon-hanger-2;
+}
+.#{$ti-prefix}-hanger-off:before {
+ content: $ti-icon-hanger-off;
+}
+.#{$ti-prefix}-hash:before {
+ content: $ti-icon-hash;
+}
+.#{$ti-prefix}-haze:before {
+ content: $ti-icon-haze;
+}
+.#{$ti-prefix}-haze-moon:before {
+ content: $ti-icon-haze-moon;
+}
+.#{$ti-prefix}-hdr:before {
+ content: $ti-icon-hdr;
+}
+.#{$ti-prefix}-heading:before {
+ content: $ti-icon-heading;
+}
+.#{$ti-prefix}-heading-off:before {
+ content: $ti-icon-heading-off;
+}
+.#{$ti-prefix}-headphones:before {
+ content: $ti-icon-headphones;
+}
+.#{$ti-prefix}-headphones-filled:before {
+ content: $ti-icon-headphones-filled;
+}
+.#{$ti-prefix}-headphones-off:before {
+ content: $ti-icon-headphones-off;
+}
+.#{$ti-prefix}-headset:before {
+ content: $ti-icon-headset;
+}
+.#{$ti-prefix}-headset-off:before {
+ content: $ti-icon-headset-off;
+}
+.#{$ti-prefix}-health-recognition:before {
+ content: $ti-icon-health-recognition;
+}
+.#{$ti-prefix}-heart:before {
+ content: $ti-icon-heart;
+}
+.#{$ti-prefix}-heart-bolt:before {
+ content: $ti-icon-heart-bolt;
+}
+.#{$ti-prefix}-heart-broken:before {
+ content: $ti-icon-heart-broken;
+}
+.#{$ti-prefix}-heart-cancel:before {
+ content: $ti-icon-heart-cancel;
+}
+.#{$ti-prefix}-heart-check:before {
+ content: $ti-icon-heart-check;
+}
+.#{$ti-prefix}-heart-code:before {
+ content: $ti-icon-heart-code;
+}
+.#{$ti-prefix}-heart-cog:before {
+ content: $ti-icon-heart-cog;
+}
+.#{$ti-prefix}-heart-discount:before {
+ content: $ti-icon-heart-discount;
+}
+.#{$ti-prefix}-heart-dollar:before {
+ content: $ti-icon-heart-dollar;
+}
+.#{$ti-prefix}-heart-down:before {
+ content: $ti-icon-heart-down;
+}
+.#{$ti-prefix}-heart-exclamation:before {
+ content: $ti-icon-heart-exclamation;
+}
+.#{$ti-prefix}-heart-filled:before {
+ content: $ti-icon-heart-filled;
+}
+.#{$ti-prefix}-heart-handshake:before {
+ content: $ti-icon-heart-handshake;
+}
+.#{$ti-prefix}-heart-minus:before {
+ content: $ti-icon-heart-minus;
+}
+.#{$ti-prefix}-heart-off:before {
+ content: $ti-icon-heart-off;
+}
+.#{$ti-prefix}-heart-pause:before {
+ content: $ti-icon-heart-pause;
+}
+.#{$ti-prefix}-heart-pin:before {
+ content: $ti-icon-heart-pin;
+}
+.#{$ti-prefix}-heart-plus:before {
+ content: $ti-icon-heart-plus;
+}
+.#{$ti-prefix}-heart-question:before {
+ content: $ti-icon-heart-question;
+}
+.#{$ti-prefix}-heart-rate-monitor:before {
+ content: $ti-icon-heart-rate-monitor;
+}
+.#{$ti-prefix}-heart-search:before {
+ content: $ti-icon-heart-search;
+}
+.#{$ti-prefix}-heart-share:before {
+ content: $ti-icon-heart-share;
+}
+.#{$ti-prefix}-heart-star:before {
+ content: $ti-icon-heart-star;
+}
+.#{$ti-prefix}-heart-up:before {
+ content: $ti-icon-heart-up;
+}
+.#{$ti-prefix}-heart-x:before {
+ content: $ti-icon-heart-x;
+}
+.#{$ti-prefix}-heartbeat:before {
+ content: $ti-icon-heartbeat;
+}
+.#{$ti-prefix}-hearts:before {
+ content: $ti-icon-hearts;
+}
+.#{$ti-prefix}-hearts-off:before {
+ content: $ti-icon-hearts-off;
+}
+.#{$ti-prefix}-helicopter:before {
+ content: $ti-icon-helicopter;
+}
+.#{$ti-prefix}-helicopter-landing:before {
+ content: $ti-icon-helicopter-landing;
+}
+.#{$ti-prefix}-helmet:before {
+ content: $ti-icon-helmet;
+}
+.#{$ti-prefix}-helmet-off:before {
+ content: $ti-icon-helmet-off;
+}
+.#{$ti-prefix}-help:before {
+ content: $ti-icon-help;
+}
+.#{$ti-prefix}-help-circle:before {
+ content: $ti-icon-help-circle;
+}
+.#{$ti-prefix}-help-circle-filled:before {
+ content: $ti-icon-help-circle-filled;
+}
+.#{$ti-prefix}-help-hexagon:before {
+ content: $ti-icon-help-hexagon;
+}
+.#{$ti-prefix}-help-hexagon-filled:before {
+ content: $ti-icon-help-hexagon-filled;
+}
+.#{$ti-prefix}-help-octagon:before {
+ content: $ti-icon-help-octagon;
+}
+.#{$ti-prefix}-help-octagon-filled:before {
+ content: $ti-icon-help-octagon-filled;
+}
+.#{$ti-prefix}-help-off:before {
+ content: $ti-icon-help-off;
+}
+.#{$ti-prefix}-help-small:before {
+ content: $ti-icon-help-small;
+}
+.#{$ti-prefix}-help-square:before {
+ content: $ti-icon-help-square;
+}
+.#{$ti-prefix}-help-square-filled:before {
+ content: $ti-icon-help-square-filled;
+}
+.#{$ti-prefix}-help-square-rounded:before {
+ content: $ti-icon-help-square-rounded;
+}
+.#{$ti-prefix}-help-square-rounded-filled:before {
+ content: $ti-icon-help-square-rounded-filled;
+}
+.#{$ti-prefix}-help-triangle:before {
+ content: $ti-icon-help-triangle;
+}
+.#{$ti-prefix}-help-triangle-filled:before {
+ content: $ti-icon-help-triangle-filled;
+}
+.#{$ti-prefix}-hemisphere:before {
+ content: $ti-icon-hemisphere;
+}
+.#{$ti-prefix}-hemisphere-off:before {
+ content: $ti-icon-hemisphere-off;
+}
+.#{$ti-prefix}-hemisphere-plus:before {
+ content: $ti-icon-hemisphere-plus;
+}
+.#{$ti-prefix}-hexagon:before {
+ content: $ti-icon-hexagon;
+}
+.#{$ti-prefix}-hexagon-3d:before {
+ content: $ti-icon-hexagon-3d;
+}
+.#{$ti-prefix}-hexagon-filled:before {
+ content: $ti-icon-hexagon-filled;
+}
+.#{$ti-prefix}-hexagon-letter-a:before {
+ content: $ti-icon-hexagon-letter-a;
+}
+.#{$ti-prefix}-hexagon-letter-a-filled:before {
+ content: $ti-icon-hexagon-letter-a-filled;
+}
+.#{$ti-prefix}-hexagon-letter-b:before {
+ content: $ti-icon-hexagon-letter-b;
+}
+.#{$ti-prefix}-hexagon-letter-b-filled:before {
+ content: $ti-icon-hexagon-letter-b-filled;
+}
+.#{$ti-prefix}-hexagon-letter-c:before {
+ content: $ti-icon-hexagon-letter-c;
+}
+.#{$ti-prefix}-hexagon-letter-c-filled:before {
+ content: $ti-icon-hexagon-letter-c-filled;
+}
+.#{$ti-prefix}-hexagon-letter-d:before {
+ content: $ti-icon-hexagon-letter-d;
+}
+.#{$ti-prefix}-hexagon-letter-d-filled:before {
+ content: $ti-icon-hexagon-letter-d-filled;
+}
+.#{$ti-prefix}-hexagon-letter-e:before {
+ content: $ti-icon-hexagon-letter-e;
+}
+.#{$ti-prefix}-hexagon-letter-e-filled:before {
+ content: $ti-icon-hexagon-letter-e-filled;
+}
+.#{$ti-prefix}-hexagon-letter-f:before {
+ content: $ti-icon-hexagon-letter-f;
+}
+.#{$ti-prefix}-hexagon-letter-f-filled:before {
+ content: $ti-icon-hexagon-letter-f-filled;
+}
+.#{$ti-prefix}-hexagon-letter-g:before {
+ content: $ti-icon-hexagon-letter-g;
+}
+.#{$ti-prefix}-hexagon-letter-g-filled:before {
+ content: $ti-icon-hexagon-letter-g-filled;
+}
+.#{$ti-prefix}-hexagon-letter-h:before {
+ content: $ti-icon-hexagon-letter-h;
+}
+.#{$ti-prefix}-hexagon-letter-h-filled:before {
+ content: $ti-icon-hexagon-letter-h-filled;
+}
+.#{$ti-prefix}-hexagon-letter-i:before {
+ content: $ti-icon-hexagon-letter-i;
+}
+.#{$ti-prefix}-hexagon-letter-i-filled:before {
+ content: $ti-icon-hexagon-letter-i-filled;
+}
+.#{$ti-prefix}-hexagon-letter-j:before {
+ content: $ti-icon-hexagon-letter-j;
+}
+.#{$ti-prefix}-hexagon-letter-j-filled:before {
+ content: $ti-icon-hexagon-letter-j-filled;
+}
+.#{$ti-prefix}-hexagon-letter-k:before {
+ content: $ti-icon-hexagon-letter-k;
+}
+.#{$ti-prefix}-hexagon-letter-k-filled:before {
+ content: $ti-icon-hexagon-letter-k-filled;
+}
+.#{$ti-prefix}-hexagon-letter-l:before {
+ content: $ti-icon-hexagon-letter-l;
+}
+.#{$ti-prefix}-hexagon-letter-l-filled:before {
+ content: $ti-icon-hexagon-letter-l-filled;
+}
+.#{$ti-prefix}-hexagon-letter-m:before {
+ content: $ti-icon-hexagon-letter-m;
+}
+.#{$ti-prefix}-hexagon-letter-m-filled:before {
+ content: $ti-icon-hexagon-letter-m-filled;
+}
+.#{$ti-prefix}-hexagon-letter-n:before {
+ content: $ti-icon-hexagon-letter-n;
+}
+.#{$ti-prefix}-hexagon-letter-n-filled:before {
+ content: $ti-icon-hexagon-letter-n-filled;
+}
+.#{$ti-prefix}-hexagon-letter-o:before {
+ content: $ti-icon-hexagon-letter-o;
+}
+.#{$ti-prefix}-hexagon-letter-o-filled:before {
+ content: $ti-icon-hexagon-letter-o-filled;
+}
+.#{$ti-prefix}-hexagon-letter-p:before {
+ content: $ti-icon-hexagon-letter-p;
+}
+.#{$ti-prefix}-hexagon-letter-p-filled:before {
+ content: $ti-icon-hexagon-letter-p-filled;
+}
+.#{$ti-prefix}-hexagon-letter-q:before {
+ content: $ti-icon-hexagon-letter-q;
+}
+.#{$ti-prefix}-hexagon-letter-q-filled:before {
+ content: $ti-icon-hexagon-letter-q-filled;
+}
+.#{$ti-prefix}-hexagon-letter-r:before {
+ content: $ti-icon-hexagon-letter-r;
+}
+.#{$ti-prefix}-hexagon-letter-r-filled:before {
+ content: $ti-icon-hexagon-letter-r-filled;
+}
+.#{$ti-prefix}-hexagon-letter-s:before {
+ content: $ti-icon-hexagon-letter-s;
+}
+.#{$ti-prefix}-hexagon-letter-s-filled:before {
+ content: $ti-icon-hexagon-letter-s-filled;
+}
+.#{$ti-prefix}-hexagon-letter-t:before {
+ content: $ti-icon-hexagon-letter-t;
+}
+.#{$ti-prefix}-hexagon-letter-t-filled:before {
+ content: $ti-icon-hexagon-letter-t-filled;
+}
+.#{$ti-prefix}-hexagon-letter-u:before {
+ content: $ti-icon-hexagon-letter-u;
+}
+.#{$ti-prefix}-hexagon-letter-u-filled:before {
+ content: $ti-icon-hexagon-letter-u-filled;
+}
+.#{$ti-prefix}-hexagon-letter-v:before {
+ content: $ti-icon-hexagon-letter-v;
+}
+.#{$ti-prefix}-hexagon-letter-v-filled:before {
+ content: $ti-icon-hexagon-letter-v-filled;
+}
+.#{$ti-prefix}-hexagon-letter-w:before {
+ content: $ti-icon-hexagon-letter-w;
+}
+.#{$ti-prefix}-hexagon-letter-w-filled:before {
+ content: $ti-icon-hexagon-letter-w-filled;
+}
+.#{$ti-prefix}-hexagon-letter-x:before {
+ content: $ti-icon-hexagon-letter-x;
+}
+.#{$ti-prefix}-hexagon-letter-x-filled:before {
+ content: $ti-icon-hexagon-letter-x-filled;
+}
+.#{$ti-prefix}-hexagon-letter-y:before {
+ content: $ti-icon-hexagon-letter-y;
+}
+.#{$ti-prefix}-hexagon-letter-y-filled:before {
+ content: $ti-icon-hexagon-letter-y-filled;
+}
+.#{$ti-prefix}-hexagon-letter-z:before {
+ content: $ti-icon-hexagon-letter-z;
+}
+.#{$ti-prefix}-hexagon-letter-z-filled:before {
+ content: $ti-icon-hexagon-letter-z-filled;
+}
+.#{$ti-prefix}-hexagon-minus:before {
+ content: $ti-icon-hexagon-minus;
+}
+.#{$ti-prefix}-hexagon-minus-2:before {
+ content: $ti-icon-hexagon-minus-2;
+}
+.#{$ti-prefix}-hexagon-minus-filled:before {
+ content: $ti-icon-hexagon-minus-filled;
+}
+.#{$ti-prefix}-hexagon-number-0:before {
+ content: $ti-icon-hexagon-number-0;
+}
+.#{$ti-prefix}-hexagon-number-0-filled:before {
+ content: $ti-icon-hexagon-number-0-filled;
+}
+.#{$ti-prefix}-hexagon-number-1:before {
+ content: $ti-icon-hexagon-number-1;
+}
+.#{$ti-prefix}-hexagon-number-1-filled:before {
+ content: $ti-icon-hexagon-number-1-filled;
+}
+.#{$ti-prefix}-hexagon-number-2:before {
+ content: $ti-icon-hexagon-number-2;
+}
+.#{$ti-prefix}-hexagon-number-2-filled:before {
+ content: $ti-icon-hexagon-number-2-filled;
+}
+.#{$ti-prefix}-hexagon-number-3:before {
+ content: $ti-icon-hexagon-number-3;
+}
+.#{$ti-prefix}-hexagon-number-3-filled:before {
+ content: $ti-icon-hexagon-number-3-filled;
+}
+.#{$ti-prefix}-hexagon-number-4:before {
+ content: $ti-icon-hexagon-number-4;
+}
+.#{$ti-prefix}-hexagon-number-4-filled:before {
+ content: $ti-icon-hexagon-number-4-filled;
+}
+.#{$ti-prefix}-hexagon-number-5:before {
+ content: $ti-icon-hexagon-number-5;
+}
+.#{$ti-prefix}-hexagon-number-5-filled:before {
+ content: $ti-icon-hexagon-number-5-filled;
+}
+.#{$ti-prefix}-hexagon-number-6:before {
+ content: $ti-icon-hexagon-number-6;
+}
+.#{$ti-prefix}-hexagon-number-6-filled:before {
+ content: $ti-icon-hexagon-number-6-filled;
+}
+.#{$ti-prefix}-hexagon-number-7:before {
+ content: $ti-icon-hexagon-number-7;
+}
+.#{$ti-prefix}-hexagon-number-7-filled:before {
+ content: $ti-icon-hexagon-number-7-filled;
+}
+.#{$ti-prefix}-hexagon-number-8:before {
+ content: $ti-icon-hexagon-number-8;
+}
+.#{$ti-prefix}-hexagon-number-8-filled:before {
+ content: $ti-icon-hexagon-number-8-filled;
+}
+.#{$ti-prefix}-hexagon-number-9:before {
+ content: $ti-icon-hexagon-number-9;
+}
+.#{$ti-prefix}-hexagon-number-9-filled:before {
+ content: $ti-icon-hexagon-number-9-filled;
+}
+.#{$ti-prefix}-hexagon-off:before {
+ content: $ti-icon-hexagon-off;
+}
+.#{$ti-prefix}-hexagon-plus:before {
+ content: $ti-icon-hexagon-plus;
+}
+.#{$ti-prefix}-hexagon-plus-2:before {
+ content: $ti-icon-hexagon-plus-2;
+}
+.#{$ti-prefix}-hexagon-plus-filled:before {
+ content: $ti-icon-hexagon-plus-filled;
+}
+.#{$ti-prefix}-hexagonal-prism:before {
+ content: $ti-icon-hexagonal-prism;
+}
+.#{$ti-prefix}-hexagonal-prism-off:before {
+ content: $ti-icon-hexagonal-prism-off;
+}
+.#{$ti-prefix}-hexagonal-prism-plus:before {
+ content: $ti-icon-hexagonal-prism-plus;
+}
+.#{$ti-prefix}-hexagonal-pyramid:before {
+ content: $ti-icon-hexagonal-pyramid;
+}
+.#{$ti-prefix}-hexagonal-pyramid-off:before {
+ content: $ti-icon-hexagonal-pyramid-off;
+}
+.#{$ti-prefix}-hexagonal-pyramid-plus:before {
+ content: $ti-icon-hexagonal-pyramid-plus;
+}
+.#{$ti-prefix}-hexagons:before {
+ content: $ti-icon-hexagons;
+}
+.#{$ti-prefix}-hexagons-off:before {
+ content: $ti-icon-hexagons-off;
+}
+.#{$ti-prefix}-hierarchy:before {
+ content: $ti-icon-hierarchy;
+}
+.#{$ti-prefix}-hierarchy-2:before {
+ content: $ti-icon-hierarchy-2;
+}
+.#{$ti-prefix}-hierarchy-3:before {
+ content: $ti-icon-hierarchy-3;
+}
+.#{$ti-prefix}-hierarchy-off:before {
+ content: $ti-icon-hierarchy-off;
+}
+.#{$ti-prefix}-highlight:before {
+ content: $ti-icon-highlight;
+}
+.#{$ti-prefix}-highlight-off:before {
+ content: $ti-icon-highlight-off;
+}
+.#{$ti-prefix}-history:before {
+ content: $ti-icon-history;
+}
+.#{$ti-prefix}-history-off:before {
+ content: $ti-icon-history-off;
+}
+.#{$ti-prefix}-history-toggle:before {
+ content: $ti-icon-history-toggle;
+}
+.#{$ti-prefix}-home:before {
+ content: $ti-icon-home;
+}
+.#{$ti-prefix}-home-2:before {
+ content: $ti-icon-home-2;
+}
+.#{$ti-prefix}-home-bolt:before {
+ content: $ti-icon-home-bolt;
+}
+.#{$ti-prefix}-home-cancel:before {
+ content: $ti-icon-home-cancel;
+}
+.#{$ti-prefix}-home-check:before {
+ content: $ti-icon-home-check;
+}
+.#{$ti-prefix}-home-cog:before {
+ content: $ti-icon-home-cog;
+}
+.#{$ti-prefix}-home-dollar:before {
+ content: $ti-icon-home-dollar;
+}
+.#{$ti-prefix}-home-dot:before {
+ content: $ti-icon-home-dot;
+}
+.#{$ti-prefix}-home-down:before {
+ content: $ti-icon-home-down;
+}
+.#{$ti-prefix}-home-eco:before {
+ content: $ti-icon-home-eco;
+}
+.#{$ti-prefix}-home-edit:before {
+ content: $ti-icon-home-edit;
+}
+.#{$ti-prefix}-home-exclamation:before {
+ content: $ti-icon-home-exclamation;
+}
+.#{$ti-prefix}-home-filled:before {
+ content: $ti-icon-home-filled;
+}
+.#{$ti-prefix}-home-hand:before {
+ content: $ti-icon-home-hand;
+}
+.#{$ti-prefix}-home-heart:before {
+ content: $ti-icon-home-heart;
+}
+.#{$ti-prefix}-home-infinity:before {
+ content: $ti-icon-home-infinity;
+}
+.#{$ti-prefix}-home-link:before {
+ content: $ti-icon-home-link;
+}
+.#{$ti-prefix}-home-minus:before {
+ content: $ti-icon-home-minus;
+}
+.#{$ti-prefix}-home-move:before {
+ content: $ti-icon-home-move;
+}
+.#{$ti-prefix}-home-off:before {
+ content: $ti-icon-home-off;
+}
+.#{$ti-prefix}-home-plus:before {
+ content: $ti-icon-home-plus;
+}
+.#{$ti-prefix}-home-question:before {
+ content: $ti-icon-home-question;
+}
+.#{$ti-prefix}-home-ribbon:before {
+ content: $ti-icon-home-ribbon;
+}
+.#{$ti-prefix}-home-search:before {
+ content: $ti-icon-home-search;
+}
+.#{$ti-prefix}-home-share:before {
+ content: $ti-icon-home-share;
+}
+.#{$ti-prefix}-home-shield:before {
+ content: $ti-icon-home-shield;
+}
+.#{$ti-prefix}-home-signal:before {
+ content: $ti-icon-home-signal;
+}
+.#{$ti-prefix}-home-star:before {
+ content: $ti-icon-home-star;
+}
+.#{$ti-prefix}-home-stats:before {
+ content: $ti-icon-home-stats;
+}
+.#{$ti-prefix}-home-up:before {
+ content: $ti-icon-home-up;
+}
+.#{$ti-prefix}-home-x:before {
+ content: $ti-icon-home-x;
+}
+.#{$ti-prefix}-horse:before {
+ content: $ti-icon-horse;
+}
+.#{$ti-prefix}-horse-toy:before {
+ content: $ti-icon-horse-toy;
+}
+.#{$ti-prefix}-horseshoe:before {
+ content: $ti-icon-horseshoe;
+}
+.#{$ti-prefix}-hospital:before {
+ content: $ti-icon-hospital;
+}
+.#{$ti-prefix}-hospital-circle:before {
+ content: $ti-icon-hospital-circle;
+}
+.#{$ti-prefix}-hospital-circle-filled:before {
+ content: $ti-icon-hospital-circle-filled;
+}
+.#{$ti-prefix}-hotel-service:before {
+ content: $ti-icon-hotel-service;
+}
+.#{$ti-prefix}-hourglass:before {
+ content: $ti-icon-hourglass;
+}
+.#{$ti-prefix}-hourglass-empty:before {
+ content: $ti-icon-hourglass-empty;
+}
+.#{$ti-prefix}-hourglass-filled:before {
+ content: $ti-icon-hourglass-filled;
+}
+.#{$ti-prefix}-hourglass-high:before {
+ content: $ti-icon-hourglass-high;
+}
+.#{$ti-prefix}-hourglass-low:before {
+ content: $ti-icon-hourglass-low;
+}
+.#{$ti-prefix}-hourglass-off:before {
+ content: $ti-icon-hourglass-off;
+}
+.#{$ti-prefix}-hours-12:before {
+ content: $ti-icon-hours-12;
+}
+.#{$ti-prefix}-hours-24:before {
+ content: $ti-icon-hours-24;
+}
+.#{$ti-prefix}-html:before {
+ content: $ti-icon-html;
+}
+.#{$ti-prefix}-http-connect:before {
+ content: $ti-icon-http-connect;
+}
+.#{$ti-prefix}-http-delete:before {
+ content: $ti-icon-http-delete;
+}
+.#{$ti-prefix}-http-get:before {
+ content: $ti-icon-http-get;
+}
+.#{$ti-prefix}-http-head:before {
+ content: $ti-icon-http-head;
+}
+.#{$ti-prefix}-http-options:before {
+ content: $ti-icon-http-options;
+}
+.#{$ti-prefix}-http-patch:before {
+ content: $ti-icon-http-patch;
+}
+.#{$ti-prefix}-http-post:before {
+ content: $ti-icon-http-post;
+}
+.#{$ti-prefix}-http-put:before {
+ content: $ti-icon-http-put;
+}
+.#{$ti-prefix}-http-que:before {
+ content: $ti-icon-http-que;
+}
+.#{$ti-prefix}-http-trace:before {
+ content: $ti-icon-http-trace;
+}
+.#{$ti-prefix}-ice-cream:before {
+ content: $ti-icon-ice-cream;
+}
+.#{$ti-prefix}-ice-cream-2:before {
+ content: $ti-icon-ice-cream-2;
+}
+.#{$ti-prefix}-ice-cream-off:before {
+ content: $ti-icon-ice-cream-off;
+}
+.#{$ti-prefix}-ice-skating:before {
+ content: $ti-icon-ice-skating;
+}
+.#{$ti-prefix}-icons:before {
+ content: $ti-icon-icons;
+}
+.#{$ti-prefix}-icons-off:before {
+ content: $ti-icon-icons-off;
+}
+.#{$ti-prefix}-id:before {
+ content: $ti-icon-id;
+}
+.#{$ti-prefix}-id-badge:before {
+ content: $ti-icon-id-badge;
+}
+.#{$ti-prefix}-id-badge-2:before {
+ content: $ti-icon-id-badge-2;
+}
+.#{$ti-prefix}-id-badge-off:before {
+ content: $ti-icon-id-badge-off;
+}
+.#{$ti-prefix}-id-off:before {
+ content: $ti-icon-id-off;
+}
+.#{$ti-prefix}-ikosaedr:before {
+ content: $ti-icon-ikosaedr;
+}
+.#{$ti-prefix}-image-in-picture:before {
+ content: $ti-icon-image-in-picture;
+}
+.#{$ti-prefix}-inbox:before {
+ content: $ti-icon-inbox;
+}
+.#{$ti-prefix}-inbox-off:before {
+ content: $ti-icon-inbox-off;
+}
+.#{$ti-prefix}-indent-decrease:before {
+ content: $ti-icon-indent-decrease;
+}
+.#{$ti-prefix}-indent-increase:before {
+ content: $ti-icon-indent-increase;
+}
+.#{$ti-prefix}-infinity:before {
+ content: $ti-icon-infinity;
+}
+.#{$ti-prefix}-infinity-off:before {
+ content: $ti-icon-infinity-off;
+}
+.#{$ti-prefix}-info-circle:before {
+ content: $ti-icon-info-circle;
+}
+.#{$ti-prefix}-info-circle-filled:before {
+ content: $ti-icon-info-circle-filled;
+}
+.#{$ti-prefix}-info-hexagon:before {
+ content: $ti-icon-info-hexagon;
+}
+.#{$ti-prefix}-info-hexagon-filled:before {
+ content: $ti-icon-info-hexagon-filled;
+}
+.#{$ti-prefix}-info-octagon:before {
+ content: $ti-icon-info-octagon;
+}
+.#{$ti-prefix}-info-octagon-filled:before {
+ content: $ti-icon-info-octagon-filled;
+}
+.#{$ti-prefix}-info-small:before {
+ content: $ti-icon-info-small;
+}
+.#{$ti-prefix}-info-square:before {
+ content: $ti-icon-info-square;
+}
+.#{$ti-prefix}-info-square-filled:before {
+ content: $ti-icon-info-square-filled;
+}
+.#{$ti-prefix}-info-square-rounded:before {
+ content: $ti-icon-info-square-rounded;
+}
+.#{$ti-prefix}-info-square-rounded-filled:before {
+ content: $ti-icon-info-square-rounded-filled;
+}
+.#{$ti-prefix}-info-triangle:before {
+ content: $ti-icon-info-triangle;
+}
+.#{$ti-prefix}-info-triangle-filled:before {
+ content: $ti-icon-info-triangle-filled;
+}
+.#{$ti-prefix}-inner-shadow-bottom:before {
+ content: $ti-icon-inner-shadow-bottom;
+}
+.#{$ti-prefix}-inner-shadow-bottom-filled:before {
+ content: $ti-icon-inner-shadow-bottom-filled;
+}
+.#{$ti-prefix}-inner-shadow-bottom-left:before {
+ content: $ti-icon-inner-shadow-bottom-left;
+}
+.#{$ti-prefix}-inner-shadow-bottom-left-filled:before {
+ content: $ti-icon-inner-shadow-bottom-left-filled;
+}
+.#{$ti-prefix}-inner-shadow-bottom-right:before {
+ content: $ti-icon-inner-shadow-bottom-right;
+}
+.#{$ti-prefix}-inner-shadow-bottom-right-filled:before {
+ content: $ti-icon-inner-shadow-bottom-right-filled;
+}
+.#{$ti-prefix}-inner-shadow-left:before {
+ content: $ti-icon-inner-shadow-left;
+}
+.#{$ti-prefix}-inner-shadow-left-filled:before {
+ content: $ti-icon-inner-shadow-left-filled;
+}
+.#{$ti-prefix}-inner-shadow-right:before {
+ content: $ti-icon-inner-shadow-right;
+}
+.#{$ti-prefix}-inner-shadow-right-filled:before {
+ content: $ti-icon-inner-shadow-right-filled;
+}
+.#{$ti-prefix}-inner-shadow-top:before {
+ content: $ti-icon-inner-shadow-top;
+}
+.#{$ti-prefix}-inner-shadow-top-filled:before {
+ content: $ti-icon-inner-shadow-top-filled;
+}
+.#{$ti-prefix}-inner-shadow-top-left:before {
+ content: $ti-icon-inner-shadow-top-left;
+}
+.#{$ti-prefix}-inner-shadow-top-left-filled:before {
+ content: $ti-icon-inner-shadow-top-left-filled;
+}
+.#{$ti-prefix}-inner-shadow-top-right:before {
+ content: $ti-icon-inner-shadow-top-right;
+}
+.#{$ti-prefix}-inner-shadow-top-right-filled:before {
+ content: $ti-icon-inner-shadow-top-right-filled;
+}
+.#{$ti-prefix}-input-ai:before {
+ content: $ti-icon-input-ai;
+}
+.#{$ti-prefix}-input-check:before {
+ content: $ti-icon-input-check;
+}
+.#{$ti-prefix}-input-search:before {
+ content: $ti-icon-input-search;
+}
+.#{$ti-prefix}-input-x:before {
+ content: $ti-icon-input-x;
+}
+.#{$ti-prefix}-invoice:before {
+ content: $ti-icon-invoice;
+}
+.#{$ti-prefix}-ironing:before {
+ content: $ti-icon-ironing;
+}
+.#{$ti-prefix}-ironing-1:before {
+ content: $ti-icon-ironing-1;
+}
+.#{$ti-prefix}-ironing-2:before {
+ content: $ti-icon-ironing-2;
+}
+.#{$ti-prefix}-ironing-3:before {
+ content: $ti-icon-ironing-3;
+}
+.#{$ti-prefix}-ironing-filled:before {
+ content: $ti-icon-ironing-filled;
+}
+.#{$ti-prefix}-ironing-off:before {
+ content: $ti-icon-ironing-off;
+}
+.#{$ti-prefix}-ironing-steam:before {
+ content: $ti-icon-ironing-steam;
+}
+.#{$ti-prefix}-ironing-steam-off:before {
+ content: $ti-icon-ironing-steam-off;
+}
+.#{$ti-prefix}-irregular-polyhedron:before {
+ content: $ti-icon-irregular-polyhedron;
+}
+.#{$ti-prefix}-irregular-polyhedron-off:before {
+ content: $ti-icon-irregular-polyhedron-off;
+}
+.#{$ti-prefix}-irregular-polyhedron-plus:before {
+ content: $ti-icon-irregular-polyhedron-plus;
+}
+.#{$ti-prefix}-italic:before {
+ content: $ti-icon-italic;
+}
+.#{$ti-prefix}-jacket:before {
+ content: $ti-icon-jacket;
+}
+.#{$ti-prefix}-jetpack:before {
+ content: $ti-icon-jetpack;
+}
+.#{$ti-prefix}-jetpack-filled:before {
+ content: $ti-icon-jetpack-filled;
+}
+.#{$ti-prefix}-jewish-star:before {
+ content: $ti-icon-jewish-star;
+}
+.#{$ti-prefix}-jewish-star-filled:before {
+ content: $ti-icon-jewish-star-filled;
+}
+.#{$ti-prefix}-jpg:before {
+ content: $ti-icon-jpg;
+}
+.#{$ti-prefix}-json:before {
+ content: $ti-icon-json;
+}
+.#{$ti-prefix}-jump-rope:before {
+ content: $ti-icon-jump-rope;
+}
+.#{$ti-prefix}-karate:before {
+ content: $ti-icon-karate;
+}
+.#{$ti-prefix}-kayak:before {
+ content: $ti-icon-kayak;
+}
+.#{$ti-prefix}-kerning:before {
+ content: $ti-icon-kerning;
+}
+.#{$ti-prefix}-key:before {
+ content: $ti-icon-key;
+}
+.#{$ti-prefix}-key-filled:before {
+ content: $ti-icon-key-filled;
+}
+.#{$ti-prefix}-key-off:before {
+ content: $ti-icon-key-off;
+}
+.#{$ti-prefix}-keyboard:before {
+ content: $ti-icon-keyboard;
+}
+.#{$ti-prefix}-keyboard-hide:before {
+ content: $ti-icon-keyboard-hide;
+}
+.#{$ti-prefix}-keyboard-off:before {
+ content: $ti-icon-keyboard-off;
+}
+.#{$ti-prefix}-keyboard-show:before {
+ content: $ti-icon-keyboard-show;
+}
+.#{$ti-prefix}-keyframe:before {
+ content: $ti-icon-keyframe;
+}
+.#{$ti-prefix}-keyframe-align-center:before {
+ content: $ti-icon-keyframe-align-center;
+}
+.#{$ti-prefix}-keyframe-align-center-filled:before {
+ content: $ti-icon-keyframe-align-center-filled;
+}
+.#{$ti-prefix}-keyframe-align-horizontal:before {
+ content: $ti-icon-keyframe-align-horizontal;
+}
+.#{$ti-prefix}-keyframe-align-horizontal-filled:before {
+ content: $ti-icon-keyframe-align-horizontal-filled;
+}
+.#{$ti-prefix}-keyframe-align-vertical:before {
+ content: $ti-icon-keyframe-align-vertical;
+}
+.#{$ti-prefix}-keyframe-align-vertical-filled:before {
+ content: $ti-icon-keyframe-align-vertical-filled;
+}
+.#{$ti-prefix}-keyframe-filled:before {
+ content: $ti-icon-keyframe-filled;
+}
+.#{$ti-prefix}-keyframes:before {
+ content: $ti-icon-keyframes;
+}
+.#{$ti-prefix}-keyframes-filled:before {
+ content: $ti-icon-keyframes-filled;
+}
+.#{$ti-prefix}-ladder:before {
+ content: $ti-icon-ladder;
+}
+.#{$ti-prefix}-ladder-off:before {
+ content: $ti-icon-ladder-off;
+}
+.#{$ti-prefix}-ladle:before {
+ content: $ti-icon-ladle;
+}
+.#{$ti-prefix}-lambda:before {
+ content: $ti-icon-lambda;
+}
+.#{$ti-prefix}-lamp:before {
+ content: $ti-icon-lamp;
+}
+.#{$ti-prefix}-lamp-2:before {
+ content: $ti-icon-lamp-2;
+}
+.#{$ti-prefix}-lamp-off:before {
+ content: $ti-icon-lamp-off;
+}
+.#{$ti-prefix}-lane:before {
+ content: $ti-icon-lane;
+}
+.#{$ti-prefix}-language:before {
+ content: $ti-icon-language;
+}
+.#{$ti-prefix}-language-hiragana:before {
+ content: $ti-icon-language-hiragana;
+}
+.#{$ti-prefix}-language-katakana:before {
+ content: $ti-icon-language-katakana;
+}
+.#{$ti-prefix}-language-off:before {
+ content: $ti-icon-language-off;
+}
+.#{$ti-prefix}-lasso:before {
+ content: $ti-icon-lasso;
+}
+.#{$ti-prefix}-lasso-off:before {
+ content: $ti-icon-lasso-off;
+}
+.#{$ti-prefix}-lasso-polygon:before {
+ content: $ti-icon-lasso-polygon;
+}
+.#{$ti-prefix}-layers-difference:before {
+ content: $ti-icon-layers-difference;
+}
+.#{$ti-prefix}-layers-intersect:before {
+ content: $ti-icon-layers-intersect;
+}
+.#{$ti-prefix}-layers-intersect-2:before {
+ content: $ti-icon-layers-intersect-2;
+}
+.#{$ti-prefix}-layers-linked:before {
+ content: $ti-icon-layers-linked;
+}
+.#{$ti-prefix}-layers-off:before {
+ content: $ti-icon-layers-off;
+}
+.#{$ti-prefix}-layers-selected:before {
+ content: $ti-icon-layers-selected;
+}
+.#{$ti-prefix}-layers-selected-bottom:before {
+ content: $ti-icon-layers-selected-bottom;
+}
+.#{$ti-prefix}-layers-subtract:before {
+ content: $ti-icon-layers-subtract;
+}
+.#{$ti-prefix}-layers-union:before {
+ content: $ti-icon-layers-union;
+}
+.#{$ti-prefix}-layout:before {
+ content: $ti-icon-layout;
+}
+.#{$ti-prefix}-layout-2:before {
+ content: $ti-icon-layout-2;
+}
+.#{$ti-prefix}-layout-2-filled:before {
+ content: $ti-icon-layout-2-filled;
+}
+.#{$ti-prefix}-layout-align-bottom:before {
+ content: $ti-icon-layout-align-bottom;
+}
+.#{$ti-prefix}-layout-align-bottom-filled:before {
+ content: $ti-icon-layout-align-bottom-filled;
+}
+.#{$ti-prefix}-layout-align-center:before {
+ content: $ti-icon-layout-align-center;
+}
+.#{$ti-prefix}-layout-align-center-filled:before {
+ content: $ti-icon-layout-align-center-filled;
+}
+.#{$ti-prefix}-layout-align-left:before {
+ content: $ti-icon-layout-align-left;
+}
+.#{$ti-prefix}-layout-align-left-filled:before {
+ content: $ti-icon-layout-align-left-filled;
+}
+.#{$ti-prefix}-layout-align-middle:before {
+ content: $ti-icon-layout-align-middle;
+}
+.#{$ti-prefix}-layout-align-middle-filled:before {
+ content: $ti-icon-layout-align-middle-filled;
+}
+.#{$ti-prefix}-layout-align-right:before {
+ content: $ti-icon-layout-align-right;
+}
+.#{$ti-prefix}-layout-align-right-filled:before {
+ content: $ti-icon-layout-align-right-filled;
+}
+.#{$ti-prefix}-layout-align-top:before {
+ content: $ti-icon-layout-align-top;
+}
+.#{$ti-prefix}-layout-align-top-filled:before {
+ content: $ti-icon-layout-align-top-filled;
+}
+.#{$ti-prefix}-layout-board:before {
+ content: $ti-icon-layout-board;
+}
+.#{$ti-prefix}-layout-board-split:before {
+ content: $ti-icon-layout-board-split;
+}
+.#{$ti-prefix}-layout-bottombar:before {
+ content: $ti-icon-layout-bottombar;
+}
+.#{$ti-prefix}-layout-bottombar-collapse:before {
+ content: $ti-icon-layout-bottombar-collapse;
+}
+.#{$ti-prefix}-layout-bottombar-collapse-filled:before {
+ content: $ti-icon-layout-bottombar-collapse-filled;
+}
+.#{$ti-prefix}-layout-bottombar-expand:before {
+ content: $ti-icon-layout-bottombar-expand;
+}
+.#{$ti-prefix}-layout-bottombar-expand-filled:before {
+ content: $ti-icon-layout-bottombar-expand-filled;
+}
+.#{$ti-prefix}-layout-bottombar-filled:before {
+ content: $ti-icon-layout-bottombar-filled;
+}
+.#{$ti-prefix}-layout-bottombar-inactive:before {
+ content: $ti-icon-layout-bottombar-inactive;
+}
+.#{$ti-prefix}-layout-cards:before {
+ content: $ti-icon-layout-cards;
+}
+.#{$ti-prefix}-layout-cards-filled:before {
+ content: $ti-icon-layout-cards-filled;
+}
+.#{$ti-prefix}-layout-collage:before {
+ content: $ti-icon-layout-collage;
+}
+.#{$ti-prefix}-layout-columns:before {
+ content: $ti-icon-layout-columns;
+}
+.#{$ti-prefix}-layout-dashboard:before {
+ content: $ti-icon-layout-dashboard;
+}
+.#{$ti-prefix}-layout-dashboard-filled:before {
+ content: $ti-icon-layout-dashboard-filled;
+}
+.#{$ti-prefix}-layout-distribute-horizontal:before {
+ content: $ti-icon-layout-distribute-horizontal;
+}
+.#{$ti-prefix}-layout-distribute-horizontal-filled:before {
+ content: $ti-icon-layout-distribute-horizontal-filled;
+}
+.#{$ti-prefix}-layout-distribute-vertical:before {
+ content: $ti-icon-layout-distribute-vertical;
+}
+.#{$ti-prefix}-layout-distribute-vertical-filled:before {
+ content: $ti-icon-layout-distribute-vertical-filled;
+}
+.#{$ti-prefix}-layout-filled:before {
+ content: $ti-icon-layout-filled;
+}
+.#{$ti-prefix}-layout-grid:before {
+ content: $ti-icon-layout-grid;
+}
+.#{$ti-prefix}-layout-grid-add:before {
+ content: $ti-icon-layout-grid-add;
+}
+.#{$ti-prefix}-layout-grid-filled:before {
+ content: $ti-icon-layout-grid-filled;
+}
+.#{$ti-prefix}-layout-grid-remove:before {
+ content: $ti-icon-layout-grid-remove;
+}
+.#{$ti-prefix}-layout-kanban:before {
+ content: $ti-icon-layout-kanban;
+}
+.#{$ti-prefix}-layout-kanban-filled:before {
+ content: $ti-icon-layout-kanban-filled;
+}
+.#{$ti-prefix}-layout-list:before {
+ content: $ti-icon-layout-list;
+}
+.#{$ti-prefix}-layout-list-filled:before {
+ content: $ti-icon-layout-list-filled;
+}
+.#{$ti-prefix}-layout-navbar:before {
+ content: $ti-icon-layout-navbar;
+}
+.#{$ti-prefix}-layout-navbar-collapse:before {
+ content: $ti-icon-layout-navbar-collapse;
+}
+.#{$ti-prefix}-layout-navbar-collapse-filled:before {
+ content: $ti-icon-layout-navbar-collapse-filled;
+}
+.#{$ti-prefix}-layout-navbar-expand:before {
+ content: $ti-icon-layout-navbar-expand;
+}
+.#{$ti-prefix}-layout-navbar-expand-filled:before {
+ content: $ti-icon-layout-navbar-expand-filled;
+}
+.#{$ti-prefix}-layout-navbar-filled:before {
+ content: $ti-icon-layout-navbar-filled;
+}
+.#{$ti-prefix}-layout-navbar-inactive:before {
+ content: $ti-icon-layout-navbar-inactive;
+}
+.#{$ti-prefix}-layout-off:before {
+ content: $ti-icon-layout-off;
+}
+.#{$ti-prefix}-layout-rows:before {
+ content: $ti-icon-layout-rows;
+}
+.#{$ti-prefix}-layout-sidebar:before {
+ content: $ti-icon-layout-sidebar;
+}
+.#{$ti-prefix}-layout-sidebar-filled:before {
+ content: $ti-icon-layout-sidebar-filled;
+}
+.#{$ti-prefix}-layout-sidebar-inactive:before {
+ content: $ti-icon-layout-sidebar-inactive;
+}
+.#{$ti-prefix}-layout-sidebar-left-collapse:before {
+ content: $ti-icon-layout-sidebar-left-collapse;
+}
+.#{$ti-prefix}-layout-sidebar-left-collapse-filled:before {
+ content: $ti-icon-layout-sidebar-left-collapse-filled;
+}
+.#{$ti-prefix}-layout-sidebar-left-expand:before {
+ content: $ti-icon-layout-sidebar-left-expand;
+}
+.#{$ti-prefix}-layout-sidebar-left-expand-filled:before {
+ content: $ti-icon-layout-sidebar-left-expand-filled;
+}
+.#{$ti-prefix}-layout-sidebar-right:before {
+ content: $ti-icon-layout-sidebar-right;
+}
+.#{$ti-prefix}-layout-sidebar-right-collapse:before {
+ content: $ti-icon-layout-sidebar-right-collapse;
+}
+.#{$ti-prefix}-layout-sidebar-right-collapse-filled:before {
+ content: $ti-icon-layout-sidebar-right-collapse-filled;
+}
+.#{$ti-prefix}-layout-sidebar-right-expand:before {
+ content: $ti-icon-layout-sidebar-right-expand;
+}
+.#{$ti-prefix}-layout-sidebar-right-expand-filled:before {
+ content: $ti-icon-layout-sidebar-right-expand-filled;
+}
+.#{$ti-prefix}-layout-sidebar-right-filled:before {
+ content: $ti-icon-layout-sidebar-right-filled;
+}
+.#{$ti-prefix}-layout-sidebar-right-inactive:before {
+ content: $ti-icon-layout-sidebar-right-inactive;
+}
+.#{$ti-prefix}-leaf:before {
+ content: $ti-icon-leaf;
+}
+.#{$ti-prefix}-leaf-off:before {
+ content: $ti-icon-leaf-off;
+}
+.#{$ti-prefix}-lego:before {
+ content: $ti-icon-lego;
+}
+.#{$ti-prefix}-lego-filled:before {
+ content: $ti-icon-lego-filled;
+}
+.#{$ti-prefix}-lego-off:before {
+ content: $ti-icon-lego-off;
+}
+.#{$ti-prefix}-lemon:before {
+ content: $ti-icon-lemon;
+}
+.#{$ti-prefix}-lemon-2:before {
+ content: $ti-icon-lemon-2;
+}
+.#{$ti-prefix}-letter-a:before {
+ content: $ti-icon-letter-a;
+}
+.#{$ti-prefix}-letter-a-small:before {
+ content: $ti-icon-letter-a-small;
+}
+.#{$ti-prefix}-letter-b:before {
+ content: $ti-icon-letter-b;
+}
+.#{$ti-prefix}-letter-b-small:before {
+ content: $ti-icon-letter-b-small;
+}
+.#{$ti-prefix}-letter-c:before {
+ content: $ti-icon-letter-c;
+}
+.#{$ti-prefix}-letter-c-small:before {
+ content: $ti-icon-letter-c-small;
+}
+.#{$ti-prefix}-letter-case:before {
+ content: $ti-icon-letter-case;
+}
+.#{$ti-prefix}-letter-case-lower:before {
+ content: $ti-icon-letter-case-lower;
+}
+.#{$ti-prefix}-letter-case-toggle:before {
+ content: $ti-icon-letter-case-toggle;
+}
+.#{$ti-prefix}-letter-case-upper:before {
+ content: $ti-icon-letter-case-upper;
+}
+.#{$ti-prefix}-letter-d:before {
+ content: $ti-icon-letter-d;
+}
+.#{$ti-prefix}-letter-d-small:before {
+ content: $ti-icon-letter-d-small;
+}
+.#{$ti-prefix}-letter-e:before {
+ content: $ti-icon-letter-e;
+}
+.#{$ti-prefix}-letter-e-small:before {
+ content: $ti-icon-letter-e-small;
+}
+.#{$ti-prefix}-letter-f:before {
+ content: $ti-icon-letter-f;
+}
+.#{$ti-prefix}-letter-f-small:before {
+ content: $ti-icon-letter-f-small;
+}
+.#{$ti-prefix}-letter-g:before {
+ content: $ti-icon-letter-g;
+}
+.#{$ti-prefix}-letter-g-small:before {
+ content: $ti-icon-letter-g-small;
+}
+.#{$ti-prefix}-letter-h:before {
+ content: $ti-icon-letter-h;
+}
+.#{$ti-prefix}-letter-h-small:before {
+ content: $ti-icon-letter-h-small;
+}
+.#{$ti-prefix}-letter-i:before {
+ content: $ti-icon-letter-i;
+}
+.#{$ti-prefix}-letter-i-small:before {
+ content: $ti-icon-letter-i-small;
+}
+.#{$ti-prefix}-letter-j:before {
+ content: $ti-icon-letter-j;
+}
+.#{$ti-prefix}-letter-j-small:before {
+ content: $ti-icon-letter-j-small;
+}
+.#{$ti-prefix}-letter-k:before {
+ content: $ti-icon-letter-k;
+}
+.#{$ti-prefix}-letter-k-small:before {
+ content: $ti-icon-letter-k-small;
+}
+.#{$ti-prefix}-letter-l:before {
+ content: $ti-icon-letter-l;
+}
+.#{$ti-prefix}-letter-l-small:before {
+ content: $ti-icon-letter-l-small;
+}
+.#{$ti-prefix}-letter-m:before {
+ content: $ti-icon-letter-m;
+}
+.#{$ti-prefix}-letter-m-small:before {
+ content: $ti-icon-letter-m-small;
+}
+.#{$ti-prefix}-letter-n:before {
+ content: $ti-icon-letter-n;
+}
+.#{$ti-prefix}-letter-n-small:before {
+ content: $ti-icon-letter-n-small;
+}
+.#{$ti-prefix}-letter-o:before {
+ content: $ti-icon-letter-o;
+}
+.#{$ti-prefix}-letter-o-small:before {
+ content: $ti-icon-letter-o-small;
+}
+.#{$ti-prefix}-letter-p:before {
+ content: $ti-icon-letter-p;
+}
+.#{$ti-prefix}-letter-p-small:before {
+ content: $ti-icon-letter-p-small;
+}
+.#{$ti-prefix}-letter-q:before {
+ content: $ti-icon-letter-q;
+}
+.#{$ti-prefix}-letter-q-small:before {
+ content: $ti-icon-letter-q-small;
+}
+.#{$ti-prefix}-letter-r:before {
+ content: $ti-icon-letter-r;
+}
+.#{$ti-prefix}-letter-r-small:before {
+ content: $ti-icon-letter-r-small;
+}
+.#{$ti-prefix}-letter-s:before {
+ content: $ti-icon-letter-s;
+}
+.#{$ti-prefix}-letter-s-small:before {
+ content: $ti-icon-letter-s-small;
+}
+.#{$ti-prefix}-letter-spacing:before {
+ content: $ti-icon-letter-spacing;
+}
+.#{$ti-prefix}-letter-t:before {
+ content: $ti-icon-letter-t;
+}
+.#{$ti-prefix}-letter-t-small:before {
+ content: $ti-icon-letter-t-small;
+}
+.#{$ti-prefix}-letter-u:before {
+ content: $ti-icon-letter-u;
+}
+.#{$ti-prefix}-letter-u-small:before {
+ content: $ti-icon-letter-u-small;
+}
+.#{$ti-prefix}-letter-v:before {
+ content: $ti-icon-letter-v;
+}
+.#{$ti-prefix}-letter-v-small:before {
+ content: $ti-icon-letter-v-small;
+}
+.#{$ti-prefix}-letter-w:before {
+ content: $ti-icon-letter-w;
+}
+.#{$ti-prefix}-letter-w-small:before {
+ content: $ti-icon-letter-w-small;
+}
+.#{$ti-prefix}-letter-x:before {
+ content: $ti-icon-letter-x;
+}
+.#{$ti-prefix}-letter-x-small:before {
+ content: $ti-icon-letter-x-small;
+}
+.#{$ti-prefix}-letter-y:before {
+ content: $ti-icon-letter-y;
+}
+.#{$ti-prefix}-letter-y-small:before {
+ content: $ti-icon-letter-y-small;
+}
+.#{$ti-prefix}-letter-z:before {
+ content: $ti-icon-letter-z;
+}
+.#{$ti-prefix}-letter-z-small:before {
+ content: $ti-icon-letter-z-small;
+}
+.#{$ti-prefix}-library:before {
+ content: $ti-icon-library;
+}
+.#{$ti-prefix}-library-minus:before {
+ content: $ti-icon-library-minus;
+}
+.#{$ti-prefix}-library-photo:before {
+ content: $ti-icon-library-photo;
+}
+.#{$ti-prefix}-library-plus:before {
+ content: $ti-icon-library-plus;
+}
+.#{$ti-prefix}-license:before {
+ content: $ti-icon-license;
+}
+.#{$ti-prefix}-license-off:before {
+ content: $ti-icon-license-off;
+}
+.#{$ti-prefix}-lifebuoy:before {
+ content: $ti-icon-lifebuoy;
+}
+.#{$ti-prefix}-lifebuoy-off:before {
+ content: $ti-icon-lifebuoy-off;
+}
+.#{$ti-prefix}-lighter:before {
+ content: $ti-icon-lighter;
+}
+.#{$ti-prefix}-line:before {
+ content: $ti-icon-line;
+}
+.#{$ti-prefix}-line-dashed:before {
+ content: $ti-icon-line-dashed;
+}
+.#{$ti-prefix}-line-dotted:before {
+ content: $ti-icon-line-dotted;
+}
+.#{$ti-prefix}-line-height:before {
+ content: $ti-icon-line-height;
+}
+.#{$ti-prefix}-line-scan:before {
+ content: $ti-icon-line-scan;
+}
+.#{$ti-prefix}-link:before {
+ content: $ti-icon-link;
+}
+.#{$ti-prefix}-link-minus:before {
+ content: $ti-icon-link-minus;
+}
+.#{$ti-prefix}-link-off:before {
+ content: $ti-icon-link-off;
+}
+.#{$ti-prefix}-link-plus:before {
+ content: $ti-icon-link-plus;
+}
+.#{$ti-prefix}-list:before {
+ content: $ti-icon-list;
+}
+.#{$ti-prefix}-list-check:before {
+ content: $ti-icon-list-check;
+}
+.#{$ti-prefix}-list-details:before {
+ content: $ti-icon-list-details;
+}
+.#{$ti-prefix}-list-letters:before {
+ content: $ti-icon-list-letters;
+}
+.#{$ti-prefix}-list-numbers:before {
+ content: $ti-icon-list-numbers;
+}
+.#{$ti-prefix}-list-search:before {
+ content: $ti-icon-list-search;
+}
+.#{$ti-prefix}-list-tree:before {
+ content: $ti-icon-list-tree;
+}
+.#{$ti-prefix}-live-photo:before {
+ content: $ti-icon-live-photo;
+}
+.#{$ti-prefix}-live-photo-filled:before {
+ content: $ti-icon-live-photo-filled;
+}
+.#{$ti-prefix}-live-photo-off:before {
+ content: $ti-icon-live-photo-off;
+}
+.#{$ti-prefix}-live-view:before {
+ content: $ti-icon-live-view;
+}
+.#{$ti-prefix}-load-balancer:before {
+ content: $ti-icon-load-balancer;
+}
+.#{$ti-prefix}-loader:before {
+ content: $ti-icon-loader;
+}
+.#{$ti-prefix}-loader-2:before {
+ content: $ti-icon-loader-2;
+}
+.#{$ti-prefix}-loader-3:before {
+ content: $ti-icon-loader-3;
+}
+.#{$ti-prefix}-loader-quarter:before {
+ content: $ti-icon-loader-quarter;
+}
+.#{$ti-prefix}-location:before {
+ content: $ti-icon-location;
+}
+.#{$ti-prefix}-location-bolt:before {
+ content: $ti-icon-location-bolt;
+}
+.#{$ti-prefix}-location-broken:before {
+ content: $ti-icon-location-broken;
+}
+.#{$ti-prefix}-location-cancel:before {
+ content: $ti-icon-location-cancel;
+}
+.#{$ti-prefix}-location-check:before {
+ content: $ti-icon-location-check;
+}
+.#{$ti-prefix}-location-code:before {
+ content: $ti-icon-location-code;
+}
+.#{$ti-prefix}-location-cog:before {
+ content: $ti-icon-location-cog;
+}
+.#{$ti-prefix}-location-discount:before {
+ content: $ti-icon-location-discount;
+}
+.#{$ti-prefix}-location-dollar:before {
+ content: $ti-icon-location-dollar;
+}
+.#{$ti-prefix}-location-down:before {
+ content: $ti-icon-location-down;
+}
+.#{$ti-prefix}-location-exclamation:before {
+ content: $ti-icon-location-exclamation;
+}
+.#{$ti-prefix}-location-filled:before {
+ content: $ti-icon-location-filled;
+}
+.#{$ti-prefix}-location-heart:before {
+ content: $ti-icon-location-heart;
+}
+.#{$ti-prefix}-location-minus:before {
+ content: $ti-icon-location-minus;
+}
+.#{$ti-prefix}-location-off:before {
+ content: $ti-icon-location-off;
+}
+.#{$ti-prefix}-location-pause:before {
+ content: $ti-icon-location-pause;
+}
+.#{$ti-prefix}-location-pin:before {
+ content: $ti-icon-location-pin;
+}
+.#{$ti-prefix}-location-plus:before {
+ content: $ti-icon-location-plus;
+}
+.#{$ti-prefix}-location-question:before {
+ content: $ti-icon-location-question;
+}
+.#{$ti-prefix}-location-search:before {
+ content: $ti-icon-location-search;
+}
+.#{$ti-prefix}-location-share:before {
+ content: $ti-icon-location-share;
+}
+.#{$ti-prefix}-location-star:before {
+ content: $ti-icon-location-star;
+}
+.#{$ti-prefix}-location-up:before {
+ content: $ti-icon-location-up;
+}
+.#{$ti-prefix}-location-x:before {
+ content: $ti-icon-location-x;
+}
+.#{$ti-prefix}-lock:before {
+ content: $ti-icon-lock;
+}
+.#{$ti-prefix}-lock-access:before {
+ content: $ti-icon-lock-access;
+}
+.#{$ti-prefix}-lock-access-off:before {
+ content: $ti-icon-lock-access-off;
+}
+.#{$ti-prefix}-lock-bolt:before {
+ content: $ti-icon-lock-bolt;
+}
+.#{$ti-prefix}-lock-cancel:before {
+ content: $ti-icon-lock-cancel;
+}
+.#{$ti-prefix}-lock-check:before {
+ content: $ti-icon-lock-check;
+}
+.#{$ti-prefix}-lock-code:before {
+ content: $ti-icon-lock-code;
+}
+.#{$ti-prefix}-lock-cog:before {
+ content: $ti-icon-lock-cog;
+}
+.#{$ti-prefix}-lock-dollar:before {
+ content: $ti-icon-lock-dollar;
+}
+.#{$ti-prefix}-lock-down:before {
+ content: $ti-icon-lock-down;
+}
+.#{$ti-prefix}-lock-exclamation:before {
+ content: $ti-icon-lock-exclamation;
+}
+.#{$ti-prefix}-lock-filled:before {
+ content: $ti-icon-lock-filled;
+}
+.#{$ti-prefix}-lock-heart:before {
+ content: $ti-icon-lock-heart;
+}
+.#{$ti-prefix}-lock-minus:before {
+ content: $ti-icon-lock-minus;
+}
+.#{$ti-prefix}-lock-off:before {
+ content: $ti-icon-lock-off;
+}
+.#{$ti-prefix}-lock-open:before {
+ content: $ti-icon-lock-open;
+}
+.#{$ti-prefix}-lock-open-2:before {
+ content: $ti-icon-lock-open-2;
+}
+.#{$ti-prefix}-lock-open-off:before {
+ content: $ti-icon-lock-open-off;
+}
+.#{$ti-prefix}-lock-pause:before {
+ content: $ti-icon-lock-pause;
+}
+.#{$ti-prefix}-lock-pin:before {
+ content: $ti-icon-lock-pin;
+}
+.#{$ti-prefix}-lock-plus:before {
+ content: $ti-icon-lock-plus;
+}
+.#{$ti-prefix}-lock-question:before {
+ content: $ti-icon-lock-question;
+}
+.#{$ti-prefix}-lock-search:before {
+ content: $ti-icon-lock-search;
+}
+.#{$ti-prefix}-lock-share:before {
+ content: $ti-icon-lock-share;
+}
+.#{$ti-prefix}-lock-square:before {
+ content: $ti-icon-lock-square;
+}
+.#{$ti-prefix}-lock-square-rounded:before {
+ content: $ti-icon-lock-square-rounded;
+}
+.#{$ti-prefix}-lock-square-rounded-filled:before {
+ content: $ti-icon-lock-square-rounded-filled;
+}
+.#{$ti-prefix}-lock-star:before {
+ content: $ti-icon-lock-star;
+}
+.#{$ti-prefix}-lock-up:before {
+ content: $ti-icon-lock-up;
+}
+.#{$ti-prefix}-lock-x:before {
+ content: $ti-icon-lock-x;
+}
+.#{$ti-prefix}-logic-and:before {
+ content: $ti-icon-logic-and;
+}
+.#{$ti-prefix}-logic-buffer:before {
+ content: $ti-icon-logic-buffer;
+}
+.#{$ti-prefix}-logic-nand:before {
+ content: $ti-icon-logic-nand;
+}
+.#{$ti-prefix}-logic-nor:before {
+ content: $ti-icon-logic-nor;
+}
+.#{$ti-prefix}-logic-not:before {
+ content: $ti-icon-logic-not;
+}
+.#{$ti-prefix}-logic-or:before {
+ content: $ti-icon-logic-or;
+}
+.#{$ti-prefix}-logic-xnor:before {
+ content: $ti-icon-logic-xnor;
+}
+.#{$ti-prefix}-logic-xor:before {
+ content: $ti-icon-logic-xor;
+}
+.#{$ti-prefix}-login:before {
+ content: $ti-icon-login;
+}
+.#{$ti-prefix}-login-2:before {
+ content: $ti-icon-login-2;
+}
+.#{$ti-prefix}-logout:before {
+ content: $ti-icon-logout;
+}
+.#{$ti-prefix}-logout-2:before {
+ content: $ti-icon-logout-2;
+}
+.#{$ti-prefix}-logs:before {
+ content: $ti-icon-logs;
+}
+.#{$ti-prefix}-lollipop:before {
+ content: $ti-icon-lollipop;
+}
+.#{$ti-prefix}-lollipop-off:before {
+ content: $ti-icon-lollipop-off;
+}
+.#{$ti-prefix}-luggage:before {
+ content: $ti-icon-luggage;
+}
+.#{$ti-prefix}-luggage-off:before {
+ content: $ti-icon-luggage-off;
+}
+.#{$ti-prefix}-lungs:before {
+ content: $ti-icon-lungs;
+}
+.#{$ti-prefix}-lungs-filled:before {
+ content: $ti-icon-lungs-filled;
+}
+.#{$ti-prefix}-lungs-off:before {
+ content: $ti-icon-lungs-off;
+}
+.#{$ti-prefix}-macro:before {
+ content: $ti-icon-macro;
+}
+.#{$ti-prefix}-macro-filled:before {
+ content: $ti-icon-macro-filled;
+}
+.#{$ti-prefix}-macro-off:before {
+ content: $ti-icon-macro-off;
+}
+.#{$ti-prefix}-magnet:before {
+ content: $ti-icon-magnet;
+}
+.#{$ti-prefix}-magnet-filled:before {
+ content: $ti-icon-magnet-filled;
+}
+.#{$ti-prefix}-magnet-off:before {
+ content: $ti-icon-magnet-off;
+}
+.#{$ti-prefix}-magnetic:before {
+ content: $ti-icon-magnetic;
+}
+.#{$ti-prefix}-mail:before {
+ content: $ti-icon-mail;
+}
+.#{$ti-prefix}-mail-ai:before {
+ content: $ti-icon-mail-ai;
+}
+.#{$ti-prefix}-mail-bolt:before {
+ content: $ti-icon-mail-bolt;
+}
+.#{$ti-prefix}-mail-cancel:before {
+ content: $ti-icon-mail-cancel;
+}
+.#{$ti-prefix}-mail-check:before {
+ content: $ti-icon-mail-check;
+}
+.#{$ti-prefix}-mail-code:before {
+ content: $ti-icon-mail-code;
+}
+.#{$ti-prefix}-mail-cog:before {
+ content: $ti-icon-mail-cog;
+}
+.#{$ti-prefix}-mail-dollar:before {
+ content: $ti-icon-mail-dollar;
+}
+.#{$ti-prefix}-mail-down:before {
+ content: $ti-icon-mail-down;
+}
+.#{$ti-prefix}-mail-exclamation:before {
+ content: $ti-icon-mail-exclamation;
+}
+.#{$ti-prefix}-mail-fast:before {
+ content: $ti-icon-mail-fast;
+}
+.#{$ti-prefix}-mail-filled:before {
+ content: $ti-icon-mail-filled;
+}
+.#{$ti-prefix}-mail-forward:before {
+ content: $ti-icon-mail-forward;
+}
+.#{$ti-prefix}-mail-heart:before {
+ content: $ti-icon-mail-heart;
+}
+.#{$ti-prefix}-mail-minus:before {
+ content: $ti-icon-mail-minus;
+}
+.#{$ti-prefix}-mail-off:before {
+ content: $ti-icon-mail-off;
+}
+.#{$ti-prefix}-mail-opened:before {
+ content: $ti-icon-mail-opened;
+}
+.#{$ti-prefix}-mail-opened-filled:before {
+ content: $ti-icon-mail-opened-filled;
+}
+.#{$ti-prefix}-mail-pause:before {
+ content: $ti-icon-mail-pause;
+}
+.#{$ti-prefix}-mail-pin:before {
+ content: $ti-icon-mail-pin;
+}
+.#{$ti-prefix}-mail-plus:before {
+ content: $ti-icon-mail-plus;
+}
+.#{$ti-prefix}-mail-question:before {
+ content: $ti-icon-mail-question;
+}
+.#{$ti-prefix}-mail-search:before {
+ content: $ti-icon-mail-search;
+}
+.#{$ti-prefix}-mail-share:before {
+ content: $ti-icon-mail-share;
+}
+.#{$ti-prefix}-mail-star:before {
+ content: $ti-icon-mail-star;
+}
+.#{$ti-prefix}-mail-up:before {
+ content: $ti-icon-mail-up;
+}
+.#{$ti-prefix}-mail-x:before {
+ content: $ti-icon-mail-x;
+}
+.#{$ti-prefix}-mailbox:before {
+ content: $ti-icon-mailbox;
+}
+.#{$ti-prefix}-mailbox-off:before {
+ content: $ti-icon-mailbox-off;
+}
+.#{$ti-prefix}-man:before {
+ content: $ti-icon-man;
+}
+.#{$ti-prefix}-man-filled:before {
+ content: $ti-icon-man-filled;
+}
+.#{$ti-prefix}-manual-gearbox:before {
+ content: $ti-icon-manual-gearbox;
+}
+.#{$ti-prefix}-manual-gearbox-filled:before {
+ content: $ti-icon-manual-gearbox-filled;
+}
+.#{$ti-prefix}-map:before {
+ content: $ti-icon-map;
+}
+.#{$ti-prefix}-map-2:before {
+ content: $ti-icon-map-2;
+}
+.#{$ti-prefix}-map-bolt:before {
+ content: $ti-icon-map-bolt;
+}
+.#{$ti-prefix}-map-cancel:before {
+ content: $ti-icon-map-cancel;
+}
+.#{$ti-prefix}-map-check:before {
+ content: $ti-icon-map-check;
+}
+.#{$ti-prefix}-map-code:before {
+ content: $ti-icon-map-code;
+}
+.#{$ti-prefix}-map-cog:before {
+ content: $ti-icon-map-cog;
+}
+.#{$ti-prefix}-map-discount:before {
+ content: $ti-icon-map-discount;
+}
+.#{$ti-prefix}-map-dollar:before {
+ content: $ti-icon-map-dollar;
+}
+.#{$ti-prefix}-map-down:before {
+ content: $ti-icon-map-down;
+}
+.#{$ti-prefix}-map-east:before {
+ content: $ti-icon-map-east;
+}
+.#{$ti-prefix}-map-exclamation:before {
+ content: $ti-icon-map-exclamation;
+}
+.#{$ti-prefix}-map-heart:before {
+ content: $ti-icon-map-heart;
+}
+.#{$ti-prefix}-map-minus:before {
+ content: $ti-icon-map-minus;
+}
+.#{$ti-prefix}-map-north:before {
+ content: $ti-icon-map-north;
+}
+.#{$ti-prefix}-map-off:before {
+ content: $ti-icon-map-off;
+}
+.#{$ti-prefix}-map-pause:before {
+ content: $ti-icon-map-pause;
+}
+.#{$ti-prefix}-map-pin:before {
+ content: $ti-icon-map-pin;
+}
+.#{$ti-prefix}-map-pin-2:before {
+ content: $ti-icon-map-pin-2;
+}
+.#{$ti-prefix}-map-pin-bolt:before {
+ content: $ti-icon-map-pin-bolt;
+}
+.#{$ti-prefix}-map-pin-cancel:before {
+ content: $ti-icon-map-pin-cancel;
+}
+.#{$ti-prefix}-map-pin-check:before {
+ content: $ti-icon-map-pin-check;
+}
+.#{$ti-prefix}-map-pin-code:before {
+ content: $ti-icon-map-pin-code;
+}
+.#{$ti-prefix}-map-pin-cog:before {
+ content: $ti-icon-map-pin-cog;
+}
+.#{$ti-prefix}-map-pin-dollar:before {
+ content: $ti-icon-map-pin-dollar;
+}
+.#{$ti-prefix}-map-pin-down:before {
+ content: $ti-icon-map-pin-down;
+}
+.#{$ti-prefix}-map-pin-exclamation:before {
+ content: $ti-icon-map-pin-exclamation;
+}
+.#{$ti-prefix}-map-pin-filled:before {
+ content: $ti-icon-map-pin-filled;
+}
+.#{$ti-prefix}-map-pin-heart:before {
+ content: $ti-icon-map-pin-heart;
+}
+.#{$ti-prefix}-map-pin-minus:before {
+ content: $ti-icon-map-pin-minus;
+}
+.#{$ti-prefix}-map-pin-off:before {
+ content: $ti-icon-map-pin-off;
+}
+.#{$ti-prefix}-map-pin-pause:before {
+ content: $ti-icon-map-pin-pause;
+}
+.#{$ti-prefix}-map-pin-pin:before {
+ content: $ti-icon-map-pin-pin;
+}
+.#{$ti-prefix}-map-pin-plus:before {
+ content: $ti-icon-map-pin-plus;
+}
+.#{$ti-prefix}-map-pin-question:before {
+ content: $ti-icon-map-pin-question;
+}
+.#{$ti-prefix}-map-pin-search:before {
+ content: $ti-icon-map-pin-search;
+}
+.#{$ti-prefix}-map-pin-share:before {
+ content: $ti-icon-map-pin-share;
+}
+.#{$ti-prefix}-map-pin-star:before {
+ content: $ti-icon-map-pin-star;
+}
+.#{$ti-prefix}-map-pin-up:before {
+ content: $ti-icon-map-pin-up;
+}
+.#{$ti-prefix}-map-pin-x:before {
+ content: $ti-icon-map-pin-x;
+}
+.#{$ti-prefix}-map-pins:before {
+ content: $ti-icon-map-pins;
+}
+.#{$ti-prefix}-map-plus:before {
+ content: $ti-icon-map-plus;
+}
+.#{$ti-prefix}-map-question:before {
+ content: $ti-icon-map-question;
+}
+.#{$ti-prefix}-map-route:before {
+ content: $ti-icon-map-route;
+}
+.#{$ti-prefix}-map-search:before {
+ content: $ti-icon-map-search;
+}
+.#{$ti-prefix}-map-share:before {
+ content: $ti-icon-map-share;
+}
+.#{$ti-prefix}-map-south:before {
+ content: $ti-icon-map-south;
+}
+.#{$ti-prefix}-map-star:before {
+ content: $ti-icon-map-star;
+}
+.#{$ti-prefix}-map-up:before {
+ content: $ti-icon-map-up;
+}
+.#{$ti-prefix}-map-west:before {
+ content: $ti-icon-map-west;
+}
+.#{$ti-prefix}-map-x:before {
+ content: $ti-icon-map-x;
+}
+.#{$ti-prefix}-markdown:before {
+ content: $ti-icon-markdown;
+}
+.#{$ti-prefix}-markdown-off:before {
+ content: $ti-icon-markdown-off;
+}
+.#{$ti-prefix}-marquee:before {
+ content: $ti-icon-marquee;
+}
+.#{$ti-prefix}-marquee-2:before {
+ content: $ti-icon-marquee-2;
+}
+.#{$ti-prefix}-marquee-off:before {
+ content: $ti-icon-marquee-off;
+}
+.#{$ti-prefix}-mars:before {
+ content: $ti-icon-mars;
+}
+.#{$ti-prefix}-mask:before {
+ content: $ti-icon-mask;
+}
+.#{$ti-prefix}-mask-off:before {
+ content: $ti-icon-mask-off;
+}
+.#{$ti-prefix}-masks-theater:before {
+ content: $ti-icon-masks-theater;
+}
+.#{$ti-prefix}-masks-theater-off:before {
+ content: $ti-icon-masks-theater-off;
+}
+.#{$ti-prefix}-massage:before {
+ content: $ti-icon-massage;
+}
+.#{$ti-prefix}-matchstick:before {
+ content: $ti-icon-matchstick;
+}
+.#{$ti-prefix}-math:before {
+ content: $ti-icon-math;
+}
+.#{$ti-prefix}-math-1-divide-2:before {
+ content: $ti-icon-math-1-divide-2;
+}
+.#{$ti-prefix}-math-1-divide-3:before {
+ content: $ti-icon-math-1-divide-3;
+}
+.#{$ti-prefix}-math-avg:before {
+ content: $ti-icon-math-avg;
+}
+.#{$ti-prefix}-math-equal-greater:before {
+ content: $ti-icon-math-equal-greater;
+}
+.#{$ti-prefix}-math-equal-lower:before {
+ content: $ti-icon-math-equal-lower;
+}
+.#{$ti-prefix}-math-function:before {
+ content: $ti-icon-math-function;
+}
+.#{$ti-prefix}-math-function-off:before {
+ content: $ti-icon-math-function-off;
+}
+.#{$ti-prefix}-math-function-y:before {
+ content: $ti-icon-math-function-y;
+}
+.#{$ti-prefix}-math-greater:before {
+ content: $ti-icon-math-greater;
+}
+.#{$ti-prefix}-math-integral:before {
+ content: $ti-icon-math-integral;
+}
+.#{$ti-prefix}-math-integral-x:before {
+ content: $ti-icon-math-integral-x;
+}
+.#{$ti-prefix}-math-integrals:before {
+ content: $ti-icon-math-integrals;
+}
+.#{$ti-prefix}-math-lower:before {
+ content: $ti-icon-math-lower;
+}
+.#{$ti-prefix}-math-max:before {
+ content: $ti-icon-math-max;
+}
+.#{$ti-prefix}-math-max-min:before {
+ content: $ti-icon-math-max-min;
+}
+.#{$ti-prefix}-math-min:before {
+ content: $ti-icon-math-min;
+}
+.#{$ti-prefix}-math-not:before {
+ content: $ti-icon-math-not;
+}
+.#{$ti-prefix}-math-off:before {
+ content: $ti-icon-math-off;
+}
+.#{$ti-prefix}-math-pi:before {
+ content: $ti-icon-math-pi;
+}
+.#{$ti-prefix}-math-pi-divide-2:before {
+ content: $ti-icon-math-pi-divide-2;
+}
+.#{$ti-prefix}-math-symbols:before {
+ content: $ti-icon-math-symbols;
+}
+.#{$ti-prefix}-math-x-divide-2:before {
+ content: $ti-icon-math-x-divide-2;
+}
+.#{$ti-prefix}-math-x-divide-y:before {
+ content: $ti-icon-math-x-divide-y;
+}
+.#{$ti-prefix}-math-x-divide-y-2:before {
+ content: $ti-icon-math-x-divide-y-2;
+}
+.#{$ti-prefix}-math-x-minus-x:before {
+ content: $ti-icon-math-x-minus-x;
+}
+.#{$ti-prefix}-math-x-minus-y:before {
+ content: $ti-icon-math-x-minus-y;
+}
+.#{$ti-prefix}-math-x-plus-x:before {
+ content: $ti-icon-math-x-plus-x;
+}
+.#{$ti-prefix}-math-x-plus-y:before {
+ content: $ti-icon-math-x-plus-y;
+}
+.#{$ti-prefix}-math-xy:before {
+ content: $ti-icon-math-xy;
+}
+.#{$ti-prefix}-math-y-minus-y:before {
+ content: $ti-icon-math-y-minus-y;
+}
+.#{$ti-prefix}-math-y-plus-y:before {
+ content: $ti-icon-math-y-plus-y;
+}
+.#{$ti-prefix}-maximize:before {
+ content: $ti-icon-maximize;
+}
+.#{$ti-prefix}-maximize-off:before {
+ content: $ti-icon-maximize-off;
+}
+.#{$ti-prefix}-meat:before {
+ content: $ti-icon-meat;
+}
+.#{$ti-prefix}-meat-off:before {
+ content: $ti-icon-meat-off;
+}
+.#{$ti-prefix}-medal:before {
+ content: $ti-icon-medal;
+}
+.#{$ti-prefix}-medal-2:before {
+ content: $ti-icon-medal-2;
+}
+.#{$ti-prefix}-medical-cross:before {
+ content: $ti-icon-medical-cross;
+}
+.#{$ti-prefix}-medical-cross-circle:before {
+ content: $ti-icon-medical-cross-circle;
+}
+.#{$ti-prefix}-medical-cross-filled:before {
+ content: $ti-icon-medical-cross-filled;
+}
+.#{$ti-prefix}-medical-cross-off:before {
+ content: $ti-icon-medical-cross-off;
+}
+.#{$ti-prefix}-medicine-syrup:before {
+ content: $ti-icon-medicine-syrup;
+}
+.#{$ti-prefix}-meeple:before {
+ content: $ti-icon-meeple;
+}
+.#{$ti-prefix}-melon:before {
+ content: $ti-icon-melon;
+}
+.#{$ti-prefix}-menorah:before {
+ content: $ti-icon-menorah;
+}
+.#{$ti-prefix}-menu:before {
+ content: $ti-icon-menu;
+}
+.#{$ti-prefix}-menu-2:before {
+ content: $ti-icon-menu-2;
+}
+.#{$ti-prefix}-menu-deep:before {
+ content: $ti-icon-menu-deep;
+}
+.#{$ti-prefix}-menu-order:before {
+ content: $ti-icon-menu-order;
+}
+.#{$ti-prefix}-message:before {
+ content: $ti-icon-message;
+}
+.#{$ti-prefix}-message-2:before {
+ content: $ti-icon-message-2;
+}
+.#{$ti-prefix}-message-2-bolt:before {
+ content: $ti-icon-message-2-bolt;
+}
+.#{$ti-prefix}-message-2-cancel:before {
+ content: $ti-icon-message-2-cancel;
+}
+.#{$ti-prefix}-message-2-check:before {
+ content: $ti-icon-message-2-check;
+}
+.#{$ti-prefix}-message-2-code:before {
+ content: $ti-icon-message-2-code;
+}
+.#{$ti-prefix}-message-2-cog:before {
+ content: $ti-icon-message-2-cog;
+}
+.#{$ti-prefix}-message-2-dollar:before {
+ content: $ti-icon-message-2-dollar;
+}
+.#{$ti-prefix}-message-2-down:before {
+ content: $ti-icon-message-2-down;
+}
+.#{$ti-prefix}-message-2-exclamation:before {
+ content: $ti-icon-message-2-exclamation;
+}
+.#{$ti-prefix}-message-2-heart:before {
+ content: $ti-icon-message-2-heart;
+}
+.#{$ti-prefix}-message-2-minus:before {
+ content: $ti-icon-message-2-minus;
+}
+.#{$ti-prefix}-message-2-off:before {
+ content: $ti-icon-message-2-off;
+}
+.#{$ti-prefix}-message-2-pause:before {
+ content: $ti-icon-message-2-pause;
+}
+.#{$ti-prefix}-message-2-pin:before {
+ content: $ti-icon-message-2-pin;
+}
+.#{$ti-prefix}-message-2-plus:before {
+ content: $ti-icon-message-2-plus;
+}
+.#{$ti-prefix}-message-2-question:before {
+ content: $ti-icon-message-2-question;
+}
+.#{$ti-prefix}-message-2-search:before {
+ content: $ti-icon-message-2-search;
+}
+.#{$ti-prefix}-message-2-share:before {
+ content: $ti-icon-message-2-share;
+}
+.#{$ti-prefix}-message-2-star:before {
+ content: $ti-icon-message-2-star;
+}
+.#{$ti-prefix}-message-2-up:before {
+ content: $ti-icon-message-2-up;
+}
+.#{$ti-prefix}-message-2-x:before {
+ content: $ti-icon-message-2-x;
+}
+.#{$ti-prefix}-message-bolt:before {
+ content: $ti-icon-message-bolt;
+}
+.#{$ti-prefix}-message-cancel:before {
+ content: $ti-icon-message-cancel;
+}
+.#{$ti-prefix}-message-chatbot:before {
+ content: $ti-icon-message-chatbot;
+}
+.#{$ti-prefix}-message-chatbot-filled:before {
+ content: $ti-icon-message-chatbot-filled;
+}
+.#{$ti-prefix}-message-check:before {
+ content: $ti-icon-message-check;
+}
+.#{$ti-prefix}-message-circle:before {
+ content: $ti-icon-message-circle;
+}
+.#{$ti-prefix}-message-circle-bolt:before {
+ content: $ti-icon-message-circle-bolt;
+}
+.#{$ti-prefix}-message-circle-cancel:before {
+ content: $ti-icon-message-circle-cancel;
+}
+.#{$ti-prefix}-message-circle-check:before {
+ content: $ti-icon-message-circle-check;
+}
+.#{$ti-prefix}-message-circle-code:before {
+ content: $ti-icon-message-circle-code;
+}
+.#{$ti-prefix}-message-circle-cog:before {
+ content: $ti-icon-message-circle-cog;
+}
+.#{$ti-prefix}-message-circle-dollar:before {
+ content: $ti-icon-message-circle-dollar;
+}
+.#{$ti-prefix}-message-circle-down:before {
+ content: $ti-icon-message-circle-down;
+}
+.#{$ti-prefix}-message-circle-exclamation:before {
+ content: $ti-icon-message-circle-exclamation;
+}
+.#{$ti-prefix}-message-circle-filled:before {
+ content: $ti-icon-message-circle-filled;
+}
+.#{$ti-prefix}-message-circle-heart:before {
+ content: $ti-icon-message-circle-heart;
+}
+.#{$ti-prefix}-message-circle-minus:before {
+ content: $ti-icon-message-circle-minus;
+}
+.#{$ti-prefix}-message-circle-off:before {
+ content: $ti-icon-message-circle-off;
+}
+.#{$ti-prefix}-message-circle-pause:before {
+ content: $ti-icon-message-circle-pause;
+}
+.#{$ti-prefix}-message-circle-pin:before {
+ content: $ti-icon-message-circle-pin;
+}
+.#{$ti-prefix}-message-circle-plus:before {
+ content: $ti-icon-message-circle-plus;
+}
+.#{$ti-prefix}-message-circle-question:before {
+ content: $ti-icon-message-circle-question;
+}
+.#{$ti-prefix}-message-circle-search:before {
+ content: $ti-icon-message-circle-search;
+}
+.#{$ti-prefix}-message-circle-share:before {
+ content: $ti-icon-message-circle-share;
+}
+.#{$ti-prefix}-message-circle-star:before {
+ content: $ti-icon-message-circle-star;
+}
+.#{$ti-prefix}-message-circle-up:before {
+ content: $ti-icon-message-circle-up;
+}
+.#{$ti-prefix}-message-circle-user:before {
+ content: $ti-icon-message-circle-user;
+}
+.#{$ti-prefix}-message-circle-x:before {
+ content: $ti-icon-message-circle-x;
+}
+.#{$ti-prefix}-message-code:before {
+ content: $ti-icon-message-code;
+}
+.#{$ti-prefix}-message-cog:before {
+ content: $ti-icon-message-cog;
+}
+.#{$ti-prefix}-message-dollar:before {
+ content: $ti-icon-message-dollar;
+}
+.#{$ti-prefix}-message-dots:before {
+ content: $ti-icon-message-dots;
+}
+.#{$ti-prefix}-message-down:before {
+ content: $ti-icon-message-down;
+}
+.#{$ti-prefix}-message-exclamation:before {
+ content: $ti-icon-message-exclamation;
+}
+.#{$ti-prefix}-message-filled:before {
+ content: $ti-icon-message-filled;
+}
+.#{$ti-prefix}-message-forward:before {
+ content: $ti-icon-message-forward;
+}
+.#{$ti-prefix}-message-heart:before {
+ content: $ti-icon-message-heart;
+}
+.#{$ti-prefix}-message-language:before {
+ content: $ti-icon-message-language;
+}
+.#{$ti-prefix}-message-minus:before {
+ content: $ti-icon-message-minus;
+}
+.#{$ti-prefix}-message-off:before {
+ content: $ti-icon-message-off;
+}
+.#{$ti-prefix}-message-pause:before {
+ content: $ti-icon-message-pause;
+}
+.#{$ti-prefix}-message-pin:before {
+ content: $ti-icon-message-pin;
+}
+.#{$ti-prefix}-message-plus:before {
+ content: $ti-icon-message-plus;
+}
+.#{$ti-prefix}-message-question:before {
+ content: $ti-icon-message-question;
+}
+.#{$ti-prefix}-message-reply:before {
+ content: $ti-icon-message-reply;
+}
+.#{$ti-prefix}-message-report:before {
+ content: $ti-icon-message-report;
+}
+.#{$ti-prefix}-message-report-filled:before {
+ content: $ti-icon-message-report-filled;
+}
+.#{$ti-prefix}-message-search:before {
+ content: $ti-icon-message-search;
+}
+.#{$ti-prefix}-message-share:before {
+ content: $ti-icon-message-share;
+}
+.#{$ti-prefix}-message-star:before {
+ content: $ti-icon-message-star;
+}
+.#{$ti-prefix}-message-up:before {
+ content: $ti-icon-message-up;
+}
+.#{$ti-prefix}-message-user:before {
+ content: $ti-icon-message-user;
+}
+.#{$ti-prefix}-message-x:before {
+ content: $ti-icon-message-x;
+}
+.#{$ti-prefix}-messages:before {
+ content: $ti-icon-messages;
+}
+.#{$ti-prefix}-messages-off:before {
+ content: $ti-icon-messages-off;
+}
+.#{$ti-prefix}-meteor:before {
+ content: $ti-icon-meteor;
+}
+.#{$ti-prefix}-meteor-off:before {
+ content: $ti-icon-meteor-off;
+}
+.#{$ti-prefix}-meter-cube:before {
+ content: $ti-icon-meter-cube;
+}
+.#{$ti-prefix}-meter-square:before {
+ content: $ti-icon-meter-square;
+}
+.#{$ti-prefix}-metronome:before {
+ content: $ti-icon-metronome;
+}
+.#{$ti-prefix}-michelin-bib-gourmand:before {
+ content: $ti-icon-michelin-bib-gourmand;
+}
+.#{$ti-prefix}-michelin-star:before {
+ content: $ti-icon-michelin-star;
+}
+.#{$ti-prefix}-michelin-star-green:before {
+ content: $ti-icon-michelin-star-green;
+}
+.#{$ti-prefix}-mickey:before {
+ content: $ti-icon-mickey;
+}
+.#{$ti-prefix}-mickey-filled:before {
+ content: $ti-icon-mickey-filled;
+}
+.#{$ti-prefix}-microphone:before {
+ content: $ti-icon-microphone;
+}
+.#{$ti-prefix}-microphone-2:before {
+ content: $ti-icon-microphone-2;
+}
+.#{$ti-prefix}-microphone-2-off:before {
+ content: $ti-icon-microphone-2-off;
+}
+.#{$ti-prefix}-microphone-filled:before {
+ content: $ti-icon-microphone-filled;
+}
+.#{$ti-prefix}-microphone-off:before {
+ content: $ti-icon-microphone-off;
+}
+.#{$ti-prefix}-microscope:before {
+ content: $ti-icon-microscope;
+}
+.#{$ti-prefix}-microscope-off:before {
+ content: $ti-icon-microscope-off;
+}
+.#{$ti-prefix}-microwave:before {
+ content: $ti-icon-microwave;
+}
+.#{$ti-prefix}-microwave-filled:before {
+ content: $ti-icon-microwave-filled;
+}
+.#{$ti-prefix}-microwave-off:before {
+ content: $ti-icon-microwave-off;
+}
+.#{$ti-prefix}-military-award:before {
+ content: $ti-icon-military-award;
+}
+.#{$ti-prefix}-military-rank:before {
+ content: $ti-icon-military-rank;
+}
+.#{$ti-prefix}-milk:before {
+ content: $ti-icon-milk;
+}
+.#{$ti-prefix}-milk-off:before {
+ content: $ti-icon-milk-off;
+}
+.#{$ti-prefix}-milkshake:before {
+ content: $ti-icon-milkshake;
+}
+.#{$ti-prefix}-minimize:before {
+ content: $ti-icon-minimize;
+}
+.#{$ti-prefix}-minus:before {
+ content: $ti-icon-minus;
+}
+.#{$ti-prefix}-minus-vertical:before {
+ content: $ti-icon-minus-vertical;
+}
+.#{$ti-prefix}-mist:before {
+ content: $ti-icon-mist;
+}
+.#{$ti-prefix}-mist-off:before {
+ content: $ti-icon-mist-off;
+}
+.#{$ti-prefix}-mobiledata:before {
+ content: $ti-icon-mobiledata;
+}
+.#{$ti-prefix}-mobiledata-off:before {
+ content: $ti-icon-mobiledata-off;
+}
+.#{$ti-prefix}-moneybag:before {
+ content: $ti-icon-moneybag;
+}
+.#{$ti-prefix}-monkeybar:before {
+ content: $ti-icon-monkeybar;
+}
+.#{$ti-prefix}-mood-angry:before {
+ content: $ti-icon-mood-angry;
+}
+.#{$ti-prefix}-mood-annoyed:before {
+ content: $ti-icon-mood-annoyed;
+}
+.#{$ti-prefix}-mood-annoyed-2:before {
+ content: $ti-icon-mood-annoyed-2;
+}
+.#{$ti-prefix}-mood-boy:before {
+ content: $ti-icon-mood-boy;
+}
+.#{$ti-prefix}-mood-check:before {
+ content: $ti-icon-mood-check;
+}
+.#{$ti-prefix}-mood-cog:before {
+ content: $ti-icon-mood-cog;
+}
+.#{$ti-prefix}-mood-confuzed:before {
+ content: $ti-icon-mood-confuzed;
+}
+.#{$ti-prefix}-mood-confuzed-filled:before {
+ content: $ti-icon-mood-confuzed-filled;
+}
+.#{$ti-prefix}-mood-crazy-happy:before {
+ content: $ti-icon-mood-crazy-happy;
+}
+.#{$ti-prefix}-mood-cry:before {
+ content: $ti-icon-mood-cry;
+}
+.#{$ti-prefix}-mood-dollar:before {
+ content: $ti-icon-mood-dollar;
+}
+.#{$ti-prefix}-mood-edit:before {
+ content: $ti-icon-mood-edit;
+}
+.#{$ti-prefix}-mood-empty:before {
+ content: $ti-icon-mood-empty;
+}
+.#{$ti-prefix}-mood-empty-filled:before {
+ content: $ti-icon-mood-empty-filled;
+}
+.#{$ti-prefix}-mood-happy:before {
+ content: $ti-icon-mood-happy;
+}
+.#{$ti-prefix}-mood-happy-filled:before {
+ content: $ti-icon-mood-happy-filled;
+}
+.#{$ti-prefix}-mood-heart:before {
+ content: $ti-icon-mood-heart;
+}
+.#{$ti-prefix}-mood-kid:before {
+ content: $ti-icon-mood-kid;
+}
+.#{$ti-prefix}-mood-kid-filled:before {
+ content: $ti-icon-mood-kid-filled;
+}
+.#{$ti-prefix}-mood-look-down:before {
+ content: $ti-icon-mood-look-down;
+}
+.#{$ti-prefix}-mood-look-left:before {
+ content: $ti-icon-mood-look-left;
+}
+.#{$ti-prefix}-mood-look-right:before {
+ content: $ti-icon-mood-look-right;
+}
+.#{$ti-prefix}-mood-look-up:before {
+ content: $ti-icon-mood-look-up;
+}
+.#{$ti-prefix}-mood-minus:before {
+ content: $ti-icon-mood-minus;
+}
+.#{$ti-prefix}-mood-nerd:before {
+ content: $ti-icon-mood-nerd;
+}
+.#{$ti-prefix}-mood-nervous:before {
+ content: $ti-icon-mood-nervous;
+}
+.#{$ti-prefix}-mood-neutral:before {
+ content: $ti-icon-mood-neutral;
+}
+.#{$ti-prefix}-mood-neutral-filled:before {
+ content: $ti-icon-mood-neutral-filled;
+}
+.#{$ti-prefix}-mood-off:before {
+ content: $ti-icon-mood-off;
+}
+.#{$ti-prefix}-mood-pin:before {
+ content: $ti-icon-mood-pin;
+}
+.#{$ti-prefix}-mood-plus:before {
+ content: $ti-icon-mood-plus;
+}
+.#{$ti-prefix}-mood-puzzled:before {
+ content: $ti-icon-mood-puzzled;
+}
+.#{$ti-prefix}-mood-sad:before {
+ content: $ti-icon-mood-sad;
+}
+.#{$ti-prefix}-mood-sad-2:before {
+ content: $ti-icon-mood-sad-2;
+}
+.#{$ti-prefix}-mood-sad-dizzy:before {
+ content: $ti-icon-mood-sad-dizzy;
+}
+.#{$ti-prefix}-mood-sad-filled:before {
+ content: $ti-icon-mood-sad-filled;
+}
+.#{$ti-prefix}-mood-sad-squint:before {
+ content: $ti-icon-mood-sad-squint;
+}
+.#{$ti-prefix}-mood-search:before {
+ content: $ti-icon-mood-search;
+}
+.#{$ti-prefix}-mood-share:before {
+ content: $ti-icon-mood-share;
+}
+.#{$ti-prefix}-mood-sick:before {
+ content: $ti-icon-mood-sick;
+}
+.#{$ti-prefix}-mood-silence:before {
+ content: $ti-icon-mood-silence;
+}
+.#{$ti-prefix}-mood-sing:before {
+ content: $ti-icon-mood-sing;
+}
+.#{$ti-prefix}-mood-smile:before {
+ content: $ti-icon-mood-smile;
+}
+.#{$ti-prefix}-mood-smile-beam:before {
+ content: $ti-icon-mood-smile-beam;
+}
+.#{$ti-prefix}-mood-smile-dizzy:before {
+ content: $ti-icon-mood-smile-dizzy;
+}
+.#{$ti-prefix}-mood-smile-filled:before {
+ content: $ti-icon-mood-smile-filled;
+}
+.#{$ti-prefix}-mood-suprised:before {
+ content: $ti-icon-mood-suprised;
+}
+.#{$ti-prefix}-mood-tongue:before {
+ content: $ti-icon-mood-tongue;
+}
+.#{$ti-prefix}-mood-tongue-wink:before {
+ content: $ti-icon-mood-tongue-wink;
+}
+.#{$ti-prefix}-mood-tongue-wink-2:before {
+ content: $ti-icon-mood-tongue-wink-2;
+}
+.#{$ti-prefix}-mood-unamused:before {
+ content: $ti-icon-mood-unamused;
+}
+.#{$ti-prefix}-mood-up:before {
+ content: $ti-icon-mood-up;
+}
+.#{$ti-prefix}-mood-wink:before {
+ content: $ti-icon-mood-wink;
+}
+.#{$ti-prefix}-mood-wink-2:before {
+ content: $ti-icon-mood-wink-2;
+}
+.#{$ti-prefix}-mood-wrrr:before {
+ content: $ti-icon-mood-wrrr;
+}
+.#{$ti-prefix}-mood-x:before {
+ content: $ti-icon-mood-x;
+}
+.#{$ti-prefix}-mood-xd:before {
+ content: $ti-icon-mood-xd;
+}
+.#{$ti-prefix}-moon:before {
+ content: $ti-icon-moon;
+}
+.#{$ti-prefix}-moon-2:before {
+ content: $ti-icon-moon-2;
+}
+.#{$ti-prefix}-moon-filled:before {
+ content: $ti-icon-moon-filled;
+}
+.#{$ti-prefix}-moon-off:before {
+ content: $ti-icon-moon-off;
+}
+.#{$ti-prefix}-moon-stars:before {
+ content: $ti-icon-moon-stars;
+}
+.#{$ti-prefix}-moped:before {
+ content: $ti-icon-moped;
+}
+.#{$ti-prefix}-motorbike:before {
+ content: $ti-icon-motorbike;
+}
+.#{$ti-prefix}-mountain:before {
+ content: $ti-icon-mountain;
+}
+.#{$ti-prefix}-mountain-off:before {
+ content: $ti-icon-mountain-off;
+}
+.#{$ti-prefix}-mouse:before {
+ content: $ti-icon-mouse;
+}
+.#{$ti-prefix}-mouse-2:before {
+ content: $ti-icon-mouse-2;
+}
+.#{$ti-prefix}-mouse-filled:before {
+ content: $ti-icon-mouse-filled;
+}
+.#{$ti-prefix}-mouse-off:before {
+ content: $ti-icon-mouse-off;
+}
+.#{$ti-prefix}-moustache:before {
+ content: $ti-icon-moustache;
+}
+.#{$ti-prefix}-movie:before {
+ content: $ti-icon-movie;
+}
+.#{$ti-prefix}-movie-off:before {
+ content: $ti-icon-movie-off;
+}
+.#{$ti-prefix}-mug:before {
+ content: $ti-icon-mug;
+}
+.#{$ti-prefix}-mug-off:before {
+ content: $ti-icon-mug-off;
+}
+.#{$ti-prefix}-multiplier-0-5x:before {
+ content: $ti-icon-multiplier-0-5x;
+}
+.#{$ti-prefix}-multiplier-1-5x:before {
+ content: $ti-icon-multiplier-1-5x;
+}
+.#{$ti-prefix}-multiplier-1x:before {
+ content: $ti-icon-multiplier-1x;
+}
+.#{$ti-prefix}-multiplier-2x:before {
+ content: $ti-icon-multiplier-2x;
+}
+.#{$ti-prefix}-mushroom:before {
+ content: $ti-icon-mushroom;
+}
+.#{$ti-prefix}-mushroom-filled:before {
+ content: $ti-icon-mushroom-filled;
+}
+.#{$ti-prefix}-mushroom-off:before {
+ content: $ti-icon-mushroom-off;
+}
+.#{$ti-prefix}-music:before {
+ content: $ti-icon-music;
+}
+.#{$ti-prefix}-music-bolt:before {
+ content: $ti-icon-music-bolt;
+}
+.#{$ti-prefix}-music-cancel:before {
+ content: $ti-icon-music-cancel;
+}
+.#{$ti-prefix}-music-check:before {
+ content: $ti-icon-music-check;
+}
+.#{$ti-prefix}-music-code:before {
+ content: $ti-icon-music-code;
+}
+.#{$ti-prefix}-music-cog:before {
+ content: $ti-icon-music-cog;
+}
+.#{$ti-prefix}-music-discount:before {
+ content: $ti-icon-music-discount;
+}
+.#{$ti-prefix}-music-dollar:before {
+ content: $ti-icon-music-dollar;
+}
+.#{$ti-prefix}-music-down:before {
+ content: $ti-icon-music-down;
+}
+.#{$ti-prefix}-music-exclamation:before {
+ content: $ti-icon-music-exclamation;
+}
+.#{$ti-prefix}-music-heart:before {
+ content: $ti-icon-music-heart;
+}
+.#{$ti-prefix}-music-minus:before {
+ content: $ti-icon-music-minus;
+}
+.#{$ti-prefix}-music-off:before {
+ content: $ti-icon-music-off;
+}
+.#{$ti-prefix}-music-pause:before {
+ content: $ti-icon-music-pause;
+}
+.#{$ti-prefix}-music-pin:before {
+ content: $ti-icon-music-pin;
+}
+.#{$ti-prefix}-music-plus:before {
+ content: $ti-icon-music-plus;
+}
+.#{$ti-prefix}-music-question:before {
+ content: $ti-icon-music-question;
+}
+.#{$ti-prefix}-music-search:before {
+ content: $ti-icon-music-search;
+}
+.#{$ti-prefix}-music-share:before {
+ content: $ti-icon-music-share;
+}
+.#{$ti-prefix}-music-star:before {
+ content: $ti-icon-music-star;
+}
+.#{$ti-prefix}-music-up:before {
+ content: $ti-icon-music-up;
+}
+.#{$ti-prefix}-music-x:before {
+ content: $ti-icon-music-x;
+}
+.#{$ti-prefix}-navigation:before {
+ content: $ti-icon-navigation;
+}
+.#{$ti-prefix}-navigation-bolt:before {
+ content: $ti-icon-navigation-bolt;
+}
+.#{$ti-prefix}-navigation-cancel:before {
+ content: $ti-icon-navigation-cancel;
+}
+.#{$ti-prefix}-navigation-check:before {
+ content: $ti-icon-navigation-check;
+}
+.#{$ti-prefix}-navigation-code:before {
+ content: $ti-icon-navigation-code;
+}
+.#{$ti-prefix}-navigation-cog:before {
+ content: $ti-icon-navigation-cog;
+}
+.#{$ti-prefix}-navigation-discount:before {
+ content: $ti-icon-navigation-discount;
+}
+.#{$ti-prefix}-navigation-dollar:before {
+ content: $ti-icon-navigation-dollar;
+}
+.#{$ti-prefix}-navigation-down:before {
+ content: $ti-icon-navigation-down;
+}
+.#{$ti-prefix}-navigation-east:before {
+ content: $ti-icon-navigation-east;
+}
+.#{$ti-prefix}-navigation-exclamation:before {
+ content: $ti-icon-navigation-exclamation;
+}
+.#{$ti-prefix}-navigation-filled:before {
+ content: $ti-icon-navigation-filled;
+}
+.#{$ti-prefix}-navigation-heart:before {
+ content: $ti-icon-navigation-heart;
+}
+.#{$ti-prefix}-navigation-minus:before {
+ content: $ti-icon-navigation-minus;
+}
+.#{$ti-prefix}-navigation-north:before {
+ content: $ti-icon-navigation-north;
+}
+.#{$ti-prefix}-navigation-off:before {
+ content: $ti-icon-navigation-off;
+}
+.#{$ti-prefix}-navigation-pause:before {
+ content: $ti-icon-navigation-pause;
+}
+.#{$ti-prefix}-navigation-pin:before {
+ content: $ti-icon-navigation-pin;
+}
+.#{$ti-prefix}-navigation-plus:before {
+ content: $ti-icon-navigation-plus;
+}
+.#{$ti-prefix}-navigation-question:before {
+ content: $ti-icon-navigation-question;
+}
+.#{$ti-prefix}-navigation-search:before {
+ content: $ti-icon-navigation-search;
+}
+.#{$ti-prefix}-navigation-share:before {
+ content: $ti-icon-navigation-share;
+}
+.#{$ti-prefix}-navigation-south:before {
+ content: $ti-icon-navigation-south;
+}
+.#{$ti-prefix}-navigation-star:before {
+ content: $ti-icon-navigation-star;
+}
+.#{$ti-prefix}-navigation-top:before {
+ content: $ti-icon-navigation-top;
+}
+.#{$ti-prefix}-navigation-up:before {
+ content: $ti-icon-navigation-up;
+}
+.#{$ti-prefix}-navigation-west:before {
+ content: $ti-icon-navigation-west;
+}
+.#{$ti-prefix}-navigation-x:before {
+ content: $ti-icon-navigation-x;
+}
+.#{$ti-prefix}-needle:before {
+ content: $ti-icon-needle;
+}
+.#{$ti-prefix}-needle-thread:before {
+ content: $ti-icon-needle-thread;
+}
+.#{$ti-prefix}-network:before {
+ content: $ti-icon-network;
+}
+.#{$ti-prefix}-network-off:before {
+ content: $ti-icon-network-off;
+}
+.#{$ti-prefix}-new-section:before {
+ content: $ti-icon-new-section;
+}
+.#{$ti-prefix}-news:before {
+ content: $ti-icon-news;
+}
+.#{$ti-prefix}-news-off:before {
+ content: $ti-icon-news-off;
+}
+.#{$ti-prefix}-nfc:before {
+ content: $ti-icon-nfc;
+}
+.#{$ti-prefix}-nfc-off:before {
+ content: $ti-icon-nfc-off;
+}
+.#{$ti-prefix}-no-copyright:before {
+ content: $ti-icon-no-copyright;
+}
+.#{$ti-prefix}-no-creative-commons:before {
+ content: $ti-icon-no-creative-commons;
+}
+.#{$ti-prefix}-no-derivatives:before {
+ content: $ti-icon-no-derivatives;
+}
+.#{$ti-prefix}-north-star:before {
+ content: $ti-icon-north-star;
+}
+.#{$ti-prefix}-note:before {
+ content: $ti-icon-note;
+}
+.#{$ti-prefix}-note-off:before {
+ content: $ti-icon-note-off;
+}
+.#{$ti-prefix}-notebook:before {
+ content: $ti-icon-notebook;
+}
+.#{$ti-prefix}-notebook-off:before {
+ content: $ti-icon-notebook-off;
+}
+.#{$ti-prefix}-notes:before {
+ content: $ti-icon-notes;
+}
+.#{$ti-prefix}-notes-off:before {
+ content: $ti-icon-notes-off;
+}
+.#{$ti-prefix}-notification:before {
+ content: $ti-icon-notification;
+}
+.#{$ti-prefix}-notification-off:before {
+ content: $ti-icon-notification-off;
+}
+.#{$ti-prefix}-number:before {
+ content: $ti-icon-number;
+}
+.#{$ti-prefix}-number-0:before {
+ content: $ti-icon-number-0;
+}
+.#{$ti-prefix}-number-0-small:before {
+ content: $ti-icon-number-0-small;
+}
+.#{$ti-prefix}-number-1:before {
+ content: $ti-icon-number-1;
+}
+.#{$ti-prefix}-number-1-small:before {
+ content: $ti-icon-number-1-small;
+}
+.#{$ti-prefix}-number-10-small:before {
+ content: $ti-icon-number-10-small;
+}
+.#{$ti-prefix}-number-11-small:before {
+ content: $ti-icon-number-11-small;
+}
+.#{$ti-prefix}-number-12-small:before {
+ content: $ti-icon-number-12-small;
+}
+.#{$ti-prefix}-number-123:before {
+ content: $ti-icon-number-123;
+}
+.#{$ti-prefix}-number-13-small:before {
+ content: $ti-icon-number-13-small;
+}
+.#{$ti-prefix}-number-14-small:before {
+ content: $ti-icon-number-14-small;
+}
+.#{$ti-prefix}-number-15-small:before {
+ content: $ti-icon-number-15-small;
+}
+.#{$ti-prefix}-number-16-small:before {
+ content: $ti-icon-number-16-small;
+}
+.#{$ti-prefix}-number-17-small:before {
+ content: $ti-icon-number-17-small;
+}
+.#{$ti-prefix}-number-18-small:before {
+ content: $ti-icon-number-18-small;
+}
+.#{$ti-prefix}-number-19-small:before {
+ content: $ti-icon-number-19-small;
+}
+.#{$ti-prefix}-number-2:before {
+ content: $ti-icon-number-2;
+}
+.#{$ti-prefix}-number-2-small:before {
+ content: $ti-icon-number-2-small;
+}
+.#{$ti-prefix}-number-20-small:before {
+ content: $ti-icon-number-20-small;
+}
+.#{$ti-prefix}-number-21-small:before {
+ content: $ti-icon-number-21-small;
+}
+.#{$ti-prefix}-number-22-small:before {
+ content: $ti-icon-number-22-small;
+}
+.#{$ti-prefix}-number-23-small:before {
+ content: $ti-icon-number-23-small;
+}
+.#{$ti-prefix}-number-24-small:before {
+ content: $ti-icon-number-24-small;
+}
+.#{$ti-prefix}-number-25-small:before {
+ content: $ti-icon-number-25-small;
+}
+.#{$ti-prefix}-number-26-small:before {
+ content: $ti-icon-number-26-small;
+}
+.#{$ti-prefix}-number-27-small:before {
+ content: $ti-icon-number-27-small;
+}
+.#{$ti-prefix}-number-28-small:before {
+ content: $ti-icon-number-28-small;
+}
+.#{$ti-prefix}-number-29-small:before {
+ content: $ti-icon-number-29-small;
+}
+.#{$ti-prefix}-number-3:before {
+ content: $ti-icon-number-3;
+}
+.#{$ti-prefix}-number-3-small:before {
+ content: $ti-icon-number-3-small;
+}
+.#{$ti-prefix}-number-4:before {
+ content: $ti-icon-number-4;
+}
+.#{$ti-prefix}-number-4-small:before {
+ content: $ti-icon-number-4-small;
+}
+.#{$ti-prefix}-number-5:before {
+ content: $ti-icon-number-5;
+}
+.#{$ti-prefix}-number-5-small:before {
+ content: $ti-icon-number-5-small;
+}
+.#{$ti-prefix}-number-6:before {
+ content: $ti-icon-number-6;
+}
+.#{$ti-prefix}-number-6-small:before {
+ content: $ti-icon-number-6-small;
+}
+.#{$ti-prefix}-number-7:before {
+ content: $ti-icon-number-7;
+}
+.#{$ti-prefix}-number-7-small:before {
+ content: $ti-icon-number-7-small;
+}
+.#{$ti-prefix}-number-8:before {
+ content: $ti-icon-number-8;
+}
+.#{$ti-prefix}-number-8-small:before {
+ content: $ti-icon-number-8-small;
+}
+.#{$ti-prefix}-number-9:before {
+ content: $ti-icon-number-9;
+}
+.#{$ti-prefix}-number-9-small:before {
+ content: $ti-icon-number-9-small;
+}
+.#{$ti-prefix}-numbers:before {
+ content: $ti-icon-numbers;
+}
+.#{$ti-prefix}-nurse:before {
+ content: $ti-icon-nurse;
+}
+.#{$ti-prefix}-nut:before {
+ content: $ti-icon-nut;
+}
+.#{$ti-prefix}-octagon:before {
+ content: $ti-icon-octagon;
+}
+.#{$ti-prefix}-octagon-filled:before {
+ content: $ti-icon-octagon-filled;
+}
+.#{$ti-prefix}-octagon-minus:before {
+ content: $ti-icon-octagon-minus;
+}
+.#{$ti-prefix}-octagon-minus-2:before {
+ content: $ti-icon-octagon-minus-2;
+}
+.#{$ti-prefix}-octagon-off:before {
+ content: $ti-icon-octagon-off;
+}
+.#{$ti-prefix}-octagon-plus:before {
+ content: $ti-icon-octagon-plus;
+}
+.#{$ti-prefix}-octagon-plus-2:before {
+ content: $ti-icon-octagon-plus-2;
+}
+.#{$ti-prefix}-octahedron:before {
+ content: $ti-icon-octahedron;
+}
+.#{$ti-prefix}-octahedron-off:before {
+ content: $ti-icon-octahedron-off;
+}
+.#{$ti-prefix}-octahedron-plus:before {
+ content: $ti-icon-octahedron-plus;
+}
+.#{$ti-prefix}-old:before {
+ content: $ti-icon-old;
+}
+.#{$ti-prefix}-olympics:before {
+ content: $ti-icon-olympics;
+}
+.#{$ti-prefix}-olympics-off:before {
+ content: $ti-icon-olympics-off;
+}
+.#{$ti-prefix}-om:before {
+ content: $ti-icon-om;
+}
+.#{$ti-prefix}-omega:before {
+ content: $ti-icon-omega;
+}
+.#{$ti-prefix}-outbound:before {
+ content: $ti-icon-outbound;
+}
+.#{$ti-prefix}-outlet:before {
+ content: $ti-icon-outlet;
+}
+.#{$ti-prefix}-oval:before {
+ content: $ti-icon-oval;
+}
+.#{$ti-prefix}-oval-filled:before {
+ content: $ti-icon-oval-filled;
+}
+.#{$ti-prefix}-oval-vertical:before {
+ content: $ti-icon-oval-vertical;
+}
+.#{$ti-prefix}-oval-vertical-filled:before {
+ content: $ti-icon-oval-vertical-filled;
+}
+.#{$ti-prefix}-overline:before {
+ content: $ti-icon-overline;
+}
+.#{$ti-prefix}-package:before {
+ content: $ti-icon-package;
+}
+.#{$ti-prefix}-package-export:before {
+ content: $ti-icon-package-export;
+}
+.#{$ti-prefix}-package-import:before {
+ content: $ti-icon-package-import;
+}
+.#{$ti-prefix}-package-off:before {
+ content: $ti-icon-package-off;
+}
+.#{$ti-prefix}-packages:before {
+ content: $ti-icon-packages;
+}
+.#{$ti-prefix}-pacman:before {
+ content: $ti-icon-pacman;
+}
+.#{$ti-prefix}-page-break:before {
+ content: $ti-icon-page-break;
+}
+.#{$ti-prefix}-paint:before {
+ content: $ti-icon-paint;
+}
+.#{$ti-prefix}-paint-filled:before {
+ content: $ti-icon-paint-filled;
+}
+.#{$ti-prefix}-paint-off:before {
+ content: $ti-icon-paint-off;
+}
+.#{$ti-prefix}-palette:before {
+ content: $ti-icon-palette;
+}
+.#{$ti-prefix}-palette-off:before {
+ content: $ti-icon-palette-off;
+}
+.#{$ti-prefix}-panorama-horizontal:before {
+ content: $ti-icon-panorama-horizontal;
+}
+.#{$ti-prefix}-panorama-horizontal-filled:before {
+ content: $ti-icon-panorama-horizontal-filled;
+}
+.#{$ti-prefix}-panorama-horizontal-off:before {
+ content: $ti-icon-panorama-horizontal-off;
+}
+.#{$ti-prefix}-panorama-vertical:before {
+ content: $ti-icon-panorama-vertical;
+}
+.#{$ti-prefix}-panorama-vertical-filled:before {
+ content: $ti-icon-panorama-vertical-filled;
+}
+.#{$ti-prefix}-panorama-vertical-off:before {
+ content: $ti-icon-panorama-vertical-off;
+}
+.#{$ti-prefix}-paper-bag:before {
+ content: $ti-icon-paper-bag;
+}
+.#{$ti-prefix}-paper-bag-off:before {
+ content: $ti-icon-paper-bag-off;
+}
+.#{$ti-prefix}-paperclip:before {
+ content: $ti-icon-paperclip;
+}
+.#{$ti-prefix}-parachute:before {
+ content: $ti-icon-parachute;
+}
+.#{$ti-prefix}-parachute-off:before {
+ content: $ti-icon-parachute-off;
+}
+.#{$ti-prefix}-parentheses:before {
+ content: $ti-icon-parentheses;
+}
+.#{$ti-prefix}-parentheses-off:before {
+ content: $ti-icon-parentheses-off;
+}
+.#{$ti-prefix}-parking:before {
+ content: $ti-icon-parking;
+}
+.#{$ti-prefix}-parking-circle:before {
+ content: $ti-icon-parking-circle;
+}
+.#{$ti-prefix}-parking-circle-filled:before {
+ content: $ti-icon-parking-circle-filled;
+}
+.#{$ti-prefix}-parking-off:before {
+ content: $ti-icon-parking-off;
+}
+.#{$ti-prefix}-password:before {
+ content: $ti-icon-password;
+}
+.#{$ti-prefix}-password-fingerprint:before {
+ content: $ti-icon-password-fingerprint;
+}
+.#{$ti-prefix}-password-mobile-phone:before {
+ content: $ti-icon-password-mobile-phone;
+}
+.#{$ti-prefix}-password-user:before {
+ content: $ti-icon-password-user;
+}
+.#{$ti-prefix}-paw:before {
+ content: $ti-icon-paw;
+}
+.#{$ti-prefix}-paw-filled:before {
+ content: $ti-icon-paw-filled;
+}
+.#{$ti-prefix}-paw-off:before {
+ content: $ti-icon-paw-off;
+}
+.#{$ti-prefix}-paywall:before {
+ content: $ti-icon-paywall;
+}
+.#{$ti-prefix}-pdf:before {
+ content: $ti-icon-pdf;
+}
+.#{$ti-prefix}-peace:before {
+ content: $ti-icon-peace;
+}
+.#{$ti-prefix}-pencil:before {
+ content: $ti-icon-pencil;
+}
+.#{$ti-prefix}-pencil-bolt:before {
+ content: $ti-icon-pencil-bolt;
+}
+.#{$ti-prefix}-pencil-cancel:before {
+ content: $ti-icon-pencil-cancel;
+}
+.#{$ti-prefix}-pencil-check:before {
+ content: $ti-icon-pencil-check;
+}
+.#{$ti-prefix}-pencil-code:before {
+ content: $ti-icon-pencil-code;
+}
+.#{$ti-prefix}-pencil-cog:before {
+ content: $ti-icon-pencil-cog;
+}
+.#{$ti-prefix}-pencil-discount:before {
+ content: $ti-icon-pencil-discount;
+}
+.#{$ti-prefix}-pencil-dollar:before {
+ content: $ti-icon-pencil-dollar;
+}
+.#{$ti-prefix}-pencil-down:before {
+ content: $ti-icon-pencil-down;
+}
+.#{$ti-prefix}-pencil-exclamation:before {
+ content: $ti-icon-pencil-exclamation;
+}
+.#{$ti-prefix}-pencil-heart:before {
+ content: $ti-icon-pencil-heart;
+}
+.#{$ti-prefix}-pencil-minus:before {
+ content: $ti-icon-pencil-minus;
+}
+.#{$ti-prefix}-pencil-off:before {
+ content: $ti-icon-pencil-off;
+}
+.#{$ti-prefix}-pencil-pause:before {
+ content: $ti-icon-pencil-pause;
+}
+.#{$ti-prefix}-pencil-pin:before {
+ content: $ti-icon-pencil-pin;
+}
+.#{$ti-prefix}-pencil-plus:before {
+ content: $ti-icon-pencil-plus;
+}
+.#{$ti-prefix}-pencil-question:before {
+ content: $ti-icon-pencil-question;
+}
+.#{$ti-prefix}-pencil-search:before {
+ content: $ti-icon-pencil-search;
+}
+.#{$ti-prefix}-pencil-share:before {
+ content: $ti-icon-pencil-share;
+}
+.#{$ti-prefix}-pencil-star:before {
+ content: $ti-icon-pencil-star;
+}
+.#{$ti-prefix}-pencil-up:before {
+ content: $ti-icon-pencil-up;
+}
+.#{$ti-prefix}-pencil-x:before {
+ content: $ti-icon-pencil-x;
+}
+.#{$ti-prefix}-pennant:before {
+ content: $ti-icon-pennant;
+}
+.#{$ti-prefix}-pennant-2:before {
+ content: $ti-icon-pennant-2;
+}
+.#{$ti-prefix}-pennant-2-filled:before {
+ content: $ti-icon-pennant-2-filled;
+}
+.#{$ti-prefix}-pennant-filled:before {
+ content: $ti-icon-pennant-filled;
+}
+.#{$ti-prefix}-pennant-off:before {
+ content: $ti-icon-pennant-off;
+}
+.#{$ti-prefix}-pentagon:before {
+ content: $ti-icon-pentagon;
+}
+.#{$ti-prefix}-pentagon-filled:before {
+ content: $ti-icon-pentagon-filled;
+}
+.#{$ti-prefix}-pentagon-minus:before {
+ content: $ti-icon-pentagon-minus;
+}
+.#{$ti-prefix}-pentagon-number-0:before {
+ content: $ti-icon-pentagon-number-0;
+}
+.#{$ti-prefix}-pentagon-number-1:before {
+ content: $ti-icon-pentagon-number-1;
+}
+.#{$ti-prefix}-pentagon-number-2:before {
+ content: $ti-icon-pentagon-number-2;
+}
+.#{$ti-prefix}-pentagon-number-3:before {
+ content: $ti-icon-pentagon-number-3;
+}
+.#{$ti-prefix}-pentagon-number-4:before {
+ content: $ti-icon-pentagon-number-4;
+}
+.#{$ti-prefix}-pentagon-number-5:before {
+ content: $ti-icon-pentagon-number-5;
+}
+.#{$ti-prefix}-pentagon-number-6:before {
+ content: $ti-icon-pentagon-number-6;
+}
+.#{$ti-prefix}-pentagon-number-7:before {
+ content: $ti-icon-pentagon-number-7;
+}
+.#{$ti-prefix}-pentagon-number-8:before {
+ content: $ti-icon-pentagon-number-8;
+}
+.#{$ti-prefix}-pentagon-number-9:before {
+ content: $ti-icon-pentagon-number-9;
+}
+.#{$ti-prefix}-pentagon-off:before {
+ content: $ti-icon-pentagon-off;
+}
+.#{$ti-prefix}-pentagon-plus:before {
+ content: $ti-icon-pentagon-plus;
+}
+.#{$ti-prefix}-pentagon-x:before {
+ content: $ti-icon-pentagon-x;
+}
+.#{$ti-prefix}-pentagram:before {
+ content: $ti-icon-pentagram;
+}
+.#{$ti-prefix}-pepper:before {
+ content: $ti-icon-pepper;
+}
+.#{$ti-prefix}-pepper-off:before {
+ content: $ti-icon-pepper-off;
+}
+.#{$ti-prefix}-percentage:before {
+ content: $ti-icon-percentage;
+}
+.#{$ti-prefix}-percentage-0:before {
+ content: $ti-icon-percentage-0;
+}
+.#{$ti-prefix}-percentage-10:before {
+ content: $ti-icon-percentage-10;
+}
+.#{$ti-prefix}-percentage-100:before {
+ content: $ti-icon-percentage-100;
+}
+.#{$ti-prefix}-percentage-20:before {
+ content: $ti-icon-percentage-20;
+}
+.#{$ti-prefix}-percentage-25:before {
+ content: $ti-icon-percentage-25;
+}
+.#{$ti-prefix}-percentage-30:before {
+ content: $ti-icon-percentage-30;
+}
+.#{$ti-prefix}-percentage-33:before {
+ content: $ti-icon-percentage-33;
+}
+.#{$ti-prefix}-percentage-40:before {
+ content: $ti-icon-percentage-40;
+}
+.#{$ti-prefix}-percentage-50:before {
+ content: $ti-icon-percentage-50;
+}
+.#{$ti-prefix}-percentage-60:before {
+ content: $ti-icon-percentage-60;
+}
+.#{$ti-prefix}-percentage-66:before {
+ content: $ti-icon-percentage-66;
+}
+.#{$ti-prefix}-percentage-70:before {
+ content: $ti-icon-percentage-70;
+}
+.#{$ti-prefix}-percentage-75:before {
+ content: $ti-icon-percentage-75;
+}
+.#{$ti-prefix}-percentage-80:before {
+ content: $ti-icon-percentage-80;
+}
+.#{$ti-prefix}-percentage-90:before {
+ content: $ti-icon-percentage-90;
+}
+.#{$ti-prefix}-perfume:before {
+ content: $ti-icon-perfume;
+}
+.#{$ti-prefix}-perspective:before {
+ content: $ti-icon-perspective;
+}
+.#{$ti-prefix}-perspective-off:before {
+ content: $ti-icon-perspective-off;
+}
+.#{$ti-prefix}-phone:before {
+ content: $ti-icon-phone;
+}
+.#{$ti-prefix}-phone-call:before {
+ content: $ti-icon-phone-call;
+}
+.#{$ti-prefix}-phone-calling:before {
+ content: $ti-icon-phone-calling;
+}
+.#{$ti-prefix}-phone-check:before {
+ content: $ti-icon-phone-check;
+}
+.#{$ti-prefix}-phone-filled:before {
+ content: $ti-icon-phone-filled;
+}
+.#{$ti-prefix}-phone-incoming:before {
+ content: $ti-icon-phone-incoming;
+}
+.#{$ti-prefix}-phone-off:before {
+ content: $ti-icon-phone-off;
+}
+.#{$ti-prefix}-phone-outgoing:before {
+ content: $ti-icon-phone-outgoing;
+}
+.#{$ti-prefix}-phone-pause:before {
+ content: $ti-icon-phone-pause;
+}
+.#{$ti-prefix}-phone-plus:before {
+ content: $ti-icon-phone-plus;
+}
+.#{$ti-prefix}-phone-x:before {
+ content: $ti-icon-phone-x;
+}
+.#{$ti-prefix}-photo:before {
+ content: $ti-icon-photo;
+}
+.#{$ti-prefix}-photo-ai:before {
+ content: $ti-icon-photo-ai;
+}
+.#{$ti-prefix}-photo-bolt:before {
+ content: $ti-icon-photo-bolt;
+}
+.#{$ti-prefix}-photo-cancel:before {
+ content: $ti-icon-photo-cancel;
+}
+.#{$ti-prefix}-photo-check:before {
+ content: $ti-icon-photo-check;
+}
+.#{$ti-prefix}-photo-circle:before {
+ content: $ti-icon-photo-circle;
+}
+.#{$ti-prefix}-photo-circle-minus:before {
+ content: $ti-icon-photo-circle-minus;
+}
+.#{$ti-prefix}-photo-circle-plus:before {
+ content: $ti-icon-photo-circle-plus;
+}
+.#{$ti-prefix}-photo-code:before {
+ content: $ti-icon-photo-code;
+}
+.#{$ti-prefix}-photo-cog:before {
+ content: $ti-icon-photo-cog;
+}
+.#{$ti-prefix}-photo-dollar:before {
+ content: $ti-icon-photo-dollar;
+}
+.#{$ti-prefix}-photo-down:before {
+ content: $ti-icon-photo-down;
+}
+.#{$ti-prefix}-photo-edit:before {
+ content: $ti-icon-photo-edit;
+}
+.#{$ti-prefix}-photo-exclamation:before {
+ content: $ti-icon-photo-exclamation;
+}
+.#{$ti-prefix}-photo-filled:before {
+ content: $ti-icon-photo-filled;
+}
+.#{$ti-prefix}-photo-heart:before {
+ content: $ti-icon-photo-heart;
+}
+.#{$ti-prefix}-photo-hexagon:before {
+ content: $ti-icon-photo-hexagon;
+}
+.#{$ti-prefix}-photo-minus:before {
+ content: $ti-icon-photo-minus;
+}
+.#{$ti-prefix}-photo-off:before {
+ content: $ti-icon-photo-off;
+}
+.#{$ti-prefix}-photo-pause:before {
+ content: $ti-icon-photo-pause;
+}
+.#{$ti-prefix}-photo-pentagon:before {
+ content: $ti-icon-photo-pentagon;
+}
+.#{$ti-prefix}-photo-pin:before {
+ content: $ti-icon-photo-pin;
+}
+.#{$ti-prefix}-photo-plus:before {
+ content: $ti-icon-photo-plus;
+}
+.#{$ti-prefix}-photo-question:before {
+ content: $ti-icon-photo-question;
+}
+.#{$ti-prefix}-photo-scan:before {
+ content: $ti-icon-photo-scan;
+}
+.#{$ti-prefix}-photo-search:before {
+ content: $ti-icon-photo-search;
+}
+.#{$ti-prefix}-photo-sensor:before {
+ content: $ti-icon-photo-sensor;
+}
+.#{$ti-prefix}-photo-sensor-2:before {
+ content: $ti-icon-photo-sensor-2;
+}
+.#{$ti-prefix}-photo-sensor-3:before {
+ content: $ti-icon-photo-sensor-3;
+}
+.#{$ti-prefix}-photo-share:before {
+ content: $ti-icon-photo-share;
+}
+.#{$ti-prefix}-photo-shield:before {
+ content: $ti-icon-photo-shield;
+}
+.#{$ti-prefix}-photo-square-rounded:before {
+ content: $ti-icon-photo-square-rounded;
+}
+.#{$ti-prefix}-photo-star:before {
+ content: $ti-icon-photo-star;
+}
+.#{$ti-prefix}-photo-up:before {
+ content: $ti-icon-photo-up;
+}
+.#{$ti-prefix}-photo-video:before {
+ content: $ti-icon-photo-video;
+}
+.#{$ti-prefix}-photo-x:before {
+ content: $ti-icon-photo-x;
+}
+.#{$ti-prefix}-physotherapist:before {
+ content: $ti-icon-physotherapist;
+}
+.#{$ti-prefix}-piano:before {
+ content: $ti-icon-piano;
+}
+.#{$ti-prefix}-pick:before {
+ content: $ti-icon-pick;
+}
+.#{$ti-prefix}-picnic-table:before {
+ content: $ti-icon-picnic-table;
+}
+.#{$ti-prefix}-picture-in-picture:before {
+ content: $ti-icon-picture-in-picture;
+}
+.#{$ti-prefix}-picture-in-picture-filled:before {
+ content: $ti-icon-picture-in-picture-filled;
+}
+.#{$ti-prefix}-picture-in-picture-off:before {
+ content: $ti-icon-picture-in-picture-off;
+}
+.#{$ti-prefix}-picture-in-picture-on:before {
+ content: $ti-icon-picture-in-picture-on;
+}
+.#{$ti-prefix}-picture-in-picture-top:before {
+ content: $ti-icon-picture-in-picture-top;
+}
+.#{$ti-prefix}-picture-in-picture-top-filled:before {
+ content: $ti-icon-picture-in-picture-top-filled;
+}
+.#{$ti-prefix}-pig:before {
+ content: $ti-icon-pig;
+}
+.#{$ti-prefix}-pig-money:before {
+ content: $ti-icon-pig-money;
+}
+.#{$ti-prefix}-pig-off:before {
+ content: $ti-icon-pig-off;
+}
+.#{$ti-prefix}-pilcrow:before {
+ content: $ti-icon-pilcrow;
+}
+.#{$ti-prefix}-pilcrow-left:before {
+ content: $ti-icon-pilcrow-left;
+}
+.#{$ti-prefix}-pilcrow-right:before {
+ content: $ti-icon-pilcrow-right;
+}
+.#{$ti-prefix}-pill:before {
+ content: $ti-icon-pill;
+}
+.#{$ti-prefix}-pill-off:before {
+ content: $ti-icon-pill-off;
+}
+.#{$ti-prefix}-pills:before {
+ content: $ti-icon-pills;
+}
+.#{$ti-prefix}-pin:before {
+ content: $ti-icon-pin;
+}
+.#{$ti-prefix}-pin-end:before {
+ content: $ti-icon-pin-end;
+}
+.#{$ti-prefix}-pin-filled:before {
+ content: $ti-icon-pin-filled;
+}
+.#{$ti-prefix}-pin-invoke:before {
+ content: $ti-icon-pin-invoke;
+}
+.#{$ti-prefix}-ping-pong:before {
+ content: $ti-icon-ping-pong;
+}
+.#{$ti-prefix}-pinned:before {
+ content: $ti-icon-pinned;
+}
+.#{$ti-prefix}-pinned-filled:before {
+ content: $ti-icon-pinned-filled;
+}
+.#{$ti-prefix}-pinned-off:before {
+ content: $ti-icon-pinned-off;
+}
+.#{$ti-prefix}-pizza:before {
+ content: $ti-icon-pizza;
+}
+.#{$ti-prefix}-pizza-off:before {
+ content: $ti-icon-pizza-off;
+}
+.#{$ti-prefix}-placeholder:before {
+ content: $ti-icon-placeholder;
+}
+.#{$ti-prefix}-plane:before {
+ content: $ti-icon-plane;
+}
+.#{$ti-prefix}-plane-arrival:before {
+ content: $ti-icon-plane-arrival;
+}
+.#{$ti-prefix}-plane-departure:before {
+ content: $ti-icon-plane-departure;
+}
+.#{$ti-prefix}-plane-inflight:before {
+ content: $ti-icon-plane-inflight;
+}
+.#{$ti-prefix}-plane-off:before {
+ content: $ti-icon-plane-off;
+}
+.#{$ti-prefix}-plane-tilt:before {
+ content: $ti-icon-plane-tilt;
+}
+.#{$ti-prefix}-planet:before {
+ content: $ti-icon-planet;
+}
+.#{$ti-prefix}-planet-off:before {
+ content: $ti-icon-planet-off;
+}
+.#{$ti-prefix}-plant:before {
+ content: $ti-icon-plant;
+}
+.#{$ti-prefix}-plant-2:before {
+ content: $ti-icon-plant-2;
+}
+.#{$ti-prefix}-plant-2-off:before {
+ content: $ti-icon-plant-2-off;
+}
+.#{$ti-prefix}-plant-off:before {
+ content: $ti-icon-plant-off;
+}
+.#{$ti-prefix}-play-basketball:before {
+ content: $ti-icon-play-basketball;
+}
+.#{$ti-prefix}-play-card:before {
+ content: $ti-icon-play-card;
+}
+.#{$ti-prefix}-play-card-off:before {
+ content: $ti-icon-play-card-off;
+}
+.#{$ti-prefix}-play-football:before {
+ content: $ti-icon-play-football;
+}
+.#{$ti-prefix}-play-handball:before {
+ content: $ti-icon-play-handball;
+}
+.#{$ti-prefix}-play-volleyball:before {
+ content: $ti-icon-play-volleyball;
+}
+.#{$ti-prefix}-player-eject:before {
+ content: $ti-icon-player-eject;
+}
+.#{$ti-prefix}-player-eject-filled:before {
+ content: $ti-icon-player-eject-filled;
+}
+.#{$ti-prefix}-player-pause:before {
+ content: $ti-icon-player-pause;
+}
+.#{$ti-prefix}-player-pause-filled:before {
+ content: $ti-icon-player-pause-filled;
+}
+.#{$ti-prefix}-player-play:before {
+ content: $ti-icon-player-play;
+}
+.#{$ti-prefix}-player-play-filled:before {
+ content: $ti-icon-player-play-filled;
+}
+.#{$ti-prefix}-player-record:before {
+ content: $ti-icon-player-record;
+}
+.#{$ti-prefix}-player-record-filled:before {
+ content: $ti-icon-player-record-filled;
+}
+.#{$ti-prefix}-player-skip-back:before {
+ content: $ti-icon-player-skip-back;
+}
+.#{$ti-prefix}-player-skip-back-filled:before {
+ content: $ti-icon-player-skip-back-filled;
+}
+.#{$ti-prefix}-player-skip-forward:before {
+ content: $ti-icon-player-skip-forward;
+}
+.#{$ti-prefix}-player-skip-forward-filled:before {
+ content: $ti-icon-player-skip-forward-filled;
+}
+.#{$ti-prefix}-player-stop:before {
+ content: $ti-icon-player-stop;
+}
+.#{$ti-prefix}-player-stop-filled:before {
+ content: $ti-icon-player-stop-filled;
+}
+.#{$ti-prefix}-player-track-next:before {
+ content: $ti-icon-player-track-next;
+}
+.#{$ti-prefix}-player-track-next-filled:before {
+ content: $ti-icon-player-track-next-filled;
+}
+.#{$ti-prefix}-player-track-prev:before {
+ content: $ti-icon-player-track-prev;
+}
+.#{$ti-prefix}-player-track-prev-filled:before {
+ content: $ti-icon-player-track-prev-filled;
+}
+.#{$ti-prefix}-playlist:before {
+ content: $ti-icon-playlist;
+}
+.#{$ti-prefix}-playlist-add:before {
+ content: $ti-icon-playlist-add;
+}
+.#{$ti-prefix}-playlist-off:before {
+ content: $ti-icon-playlist-off;
+}
+.#{$ti-prefix}-playlist-x:before {
+ content: $ti-icon-playlist-x;
+}
+.#{$ti-prefix}-playstation-circle:before {
+ content: $ti-icon-playstation-circle;
+}
+.#{$ti-prefix}-playstation-square:before {
+ content: $ti-icon-playstation-square;
+}
+.#{$ti-prefix}-playstation-triangle:before {
+ content: $ti-icon-playstation-triangle;
+}
+.#{$ti-prefix}-playstation-x:before {
+ content: $ti-icon-playstation-x;
+}
+.#{$ti-prefix}-plug:before {
+ content: $ti-icon-plug;
+}
+.#{$ti-prefix}-plug-connected:before {
+ content: $ti-icon-plug-connected;
+}
+.#{$ti-prefix}-plug-connected-x:before {
+ content: $ti-icon-plug-connected-x;
+}
+.#{$ti-prefix}-plug-off:before {
+ content: $ti-icon-plug-off;
+}
+.#{$ti-prefix}-plug-x:before {
+ content: $ti-icon-plug-x;
+}
+.#{$ti-prefix}-plus:before {
+ content: $ti-icon-plus;
+}
+.#{$ti-prefix}-plus-equal:before {
+ content: $ti-icon-plus-equal;
+}
+.#{$ti-prefix}-plus-minus:before {
+ content: $ti-icon-plus-minus;
+}
+.#{$ti-prefix}-png:before {
+ content: $ti-icon-png;
+}
+.#{$ti-prefix}-podium:before {
+ content: $ti-icon-podium;
+}
+.#{$ti-prefix}-podium-off:before {
+ content: $ti-icon-podium-off;
+}
+.#{$ti-prefix}-point:before {
+ content: $ti-icon-point;
+}
+.#{$ti-prefix}-point-filled:before {
+ content: $ti-icon-point-filled;
+}
+.#{$ti-prefix}-point-off:before {
+ content: $ti-icon-point-off;
+}
+.#{$ti-prefix}-pointer:before {
+ content: $ti-icon-pointer;
+}
+.#{$ti-prefix}-pointer-bolt:before {
+ content: $ti-icon-pointer-bolt;
+}
+.#{$ti-prefix}-pointer-cancel:before {
+ content: $ti-icon-pointer-cancel;
+}
+.#{$ti-prefix}-pointer-check:before {
+ content: $ti-icon-pointer-check;
+}
+.#{$ti-prefix}-pointer-code:before {
+ content: $ti-icon-pointer-code;
+}
+.#{$ti-prefix}-pointer-cog:before {
+ content: $ti-icon-pointer-cog;
+}
+.#{$ti-prefix}-pointer-dollar:before {
+ content: $ti-icon-pointer-dollar;
+}
+.#{$ti-prefix}-pointer-down:before {
+ content: $ti-icon-pointer-down;
+}
+.#{$ti-prefix}-pointer-exclamation:before {
+ content: $ti-icon-pointer-exclamation;
+}
+.#{$ti-prefix}-pointer-filled:before {
+ content: $ti-icon-pointer-filled;
+}
+.#{$ti-prefix}-pointer-heart:before {
+ content: $ti-icon-pointer-heart;
+}
+.#{$ti-prefix}-pointer-minus:before {
+ content: $ti-icon-pointer-minus;
+}
+.#{$ti-prefix}-pointer-off:before {
+ content: $ti-icon-pointer-off;
+}
+.#{$ti-prefix}-pointer-pause:before {
+ content: $ti-icon-pointer-pause;
+}
+.#{$ti-prefix}-pointer-pin:before {
+ content: $ti-icon-pointer-pin;
+}
+.#{$ti-prefix}-pointer-plus:before {
+ content: $ti-icon-pointer-plus;
+}
+.#{$ti-prefix}-pointer-question:before {
+ content: $ti-icon-pointer-question;
+}
+.#{$ti-prefix}-pointer-search:before {
+ content: $ti-icon-pointer-search;
+}
+.#{$ti-prefix}-pointer-share:before {
+ content: $ti-icon-pointer-share;
+}
+.#{$ti-prefix}-pointer-star:before {
+ content: $ti-icon-pointer-star;
+}
+.#{$ti-prefix}-pointer-up:before {
+ content: $ti-icon-pointer-up;
+}
+.#{$ti-prefix}-pointer-x:before {
+ content: $ti-icon-pointer-x;
+}
+.#{$ti-prefix}-pokeball:before {
+ content: $ti-icon-pokeball;
+}
+.#{$ti-prefix}-pokeball-off:before {
+ content: $ti-icon-pokeball-off;
+}
+.#{$ti-prefix}-poker-chip:before {
+ content: $ti-icon-poker-chip;
+}
+.#{$ti-prefix}-polaroid:before {
+ content: $ti-icon-polaroid;
+}
+.#{$ti-prefix}-polaroid-filled:before {
+ content: $ti-icon-polaroid-filled;
+}
+.#{$ti-prefix}-polygon:before {
+ content: $ti-icon-polygon;
+}
+.#{$ti-prefix}-polygon-off:before {
+ content: $ti-icon-polygon-off;
+}
+.#{$ti-prefix}-poo:before {
+ content: $ti-icon-poo;
+}
+.#{$ti-prefix}-poo-filled:before {
+ content: $ti-icon-poo-filled;
+}
+.#{$ti-prefix}-pool:before {
+ content: $ti-icon-pool;
+}
+.#{$ti-prefix}-pool-off:before {
+ content: $ti-icon-pool-off;
+}
+.#{$ti-prefix}-power:before {
+ content: $ti-icon-power;
+}
+.#{$ti-prefix}-pray:before {
+ content: $ti-icon-pray;
+}
+.#{$ti-prefix}-premium-rights:before {
+ content: $ti-icon-premium-rights;
+}
+.#{$ti-prefix}-prescription:before {
+ content: $ti-icon-prescription;
+}
+.#{$ti-prefix}-presentation:before {
+ content: $ti-icon-presentation;
+}
+.#{$ti-prefix}-presentation-analytics:before {
+ content: $ti-icon-presentation-analytics;
+}
+.#{$ti-prefix}-presentation-off:before {
+ content: $ti-icon-presentation-off;
+}
+.#{$ti-prefix}-printer:before {
+ content: $ti-icon-printer;
+}
+.#{$ti-prefix}-printer-off:before {
+ content: $ti-icon-printer-off;
+}
+.#{$ti-prefix}-prism:before {
+ content: $ti-icon-prism;
+}
+.#{$ti-prefix}-prism-light:before {
+ content: $ti-icon-prism-light;
+}
+.#{$ti-prefix}-prism-off:before {
+ content: $ti-icon-prism-off;
+}
+.#{$ti-prefix}-prism-plus:before {
+ content: $ti-icon-prism-plus;
+}
+.#{$ti-prefix}-prison:before {
+ content: $ti-icon-prison;
+}
+.#{$ti-prefix}-progress:before {
+ content: $ti-icon-progress;
+}
+.#{$ti-prefix}-progress-alert:before {
+ content: $ti-icon-progress-alert;
+}
+.#{$ti-prefix}-progress-bolt:before {
+ content: $ti-icon-progress-bolt;
+}
+.#{$ti-prefix}-progress-check:before {
+ content: $ti-icon-progress-check;
+}
+.#{$ti-prefix}-progress-down:before {
+ content: $ti-icon-progress-down;
+}
+.#{$ti-prefix}-progress-help:before {
+ content: $ti-icon-progress-help;
+}
+.#{$ti-prefix}-progress-x:before {
+ content: $ti-icon-progress-x;
+}
+.#{$ti-prefix}-prompt:before {
+ content: $ti-icon-prompt;
+}
+.#{$ti-prefix}-prong:before {
+ content: $ti-icon-prong;
+}
+.#{$ti-prefix}-propeller:before {
+ content: $ti-icon-propeller;
+}
+.#{$ti-prefix}-propeller-off:before {
+ content: $ti-icon-propeller-off;
+}
+.#{$ti-prefix}-protocol:before {
+ content: $ti-icon-protocol;
+}
+.#{$ti-prefix}-pumpkin-scary:before {
+ content: $ti-icon-pumpkin-scary;
+}
+.#{$ti-prefix}-puzzle:before {
+ content: $ti-icon-puzzle;
+}
+.#{$ti-prefix}-puzzle-2:before {
+ content: $ti-icon-puzzle-2;
+}
+.#{$ti-prefix}-puzzle-filled:before {
+ content: $ti-icon-puzzle-filled;
+}
+.#{$ti-prefix}-puzzle-off:before {
+ content: $ti-icon-puzzle-off;
+}
+.#{$ti-prefix}-pyramid:before {
+ content: $ti-icon-pyramid;
+}
+.#{$ti-prefix}-pyramid-off:before {
+ content: $ti-icon-pyramid-off;
+}
+.#{$ti-prefix}-pyramid-plus:before {
+ content: $ti-icon-pyramid-plus;
+}
+.#{$ti-prefix}-qrcode:before {
+ content: $ti-icon-qrcode;
+}
+.#{$ti-prefix}-qrcode-off:before {
+ content: $ti-icon-qrcode-off;
+}
+.#{$ti-prefix}-question-mark:before {
+ content: $ti-icon-question-mark;
+}
+.#{$ti-prefix}-quote:before {
+ content: $ti-icon-quote;
+}
+.#{$ti-prefix}-quote-off:before {
+ content: $ti-icon-quote-off;
+}
+.#{$ti-prefix}-quotes:before {
+ content: $ti-icon-quotes;
+}
+.#{$ti-prefix}-radar:before {
+ content: $ti-icon-radar;
+}
+.#{$ti-prefix}-radar-2:before {
+ content: $ti-icon-radar-2;
+}
+.#{$ti-prefix}-radar-filled:before {
+ content: $ti-icon-radar-filled;
+}
+.#{$ti-prefix}-radar-off:before {
+ content: $ti-icon-radar-off;
+}
+.#{$ti-prefix}-radio:before {
+ content: $ti-icon-radio;
+}
+.#{$ti-prefix}-radio-off:before {
+ content: $ti-icon-radio-off;
+}
+.#{$ti-prefix}-radioactive:before {
+ content: $ti-icon-radioactive;
+}
+.#{$ti-prefix}-radioactive-filled:before {
+ content: $ti-icon-radioactive-filled;
+}
+.#{$ti-prefix}-radioactive-off:before {
+ content: $ti-icon-radioactive-off;
+}
+.#{$ti-prefix}-radius-bottom-left:before {
+ content: $ti-icon-radius-bottom-left;
+}
+.#{$ti-prefix}-radius-bottom-right:before {
+ content: $ti-icon-radius-bottom-right;
+}
+.#{$ti-prefix}-radius-top-left:before {
+ content: $ti-icon-radius-top-left;
+}
+.#{$ti-prefix}-radius-top-right:before {
+ content: $ti-icon-radius-top-right;
+}
+.#{$ti-prefix}-rainbow:before {
+ content: $ti-icon-rainbow;
+}
+.#{$ti-prefix}-rainbow-off:before {
+ content: $ti-icon-rainbow-off;
+}
+.#{$ti-prefix}-rating-12-plus:before {
+ content: $ti-icon-rating-12-plus;
+}
+.#{$ti-prefix}-rating-14-plus:before {
+ content: $ti-icon-rating-14-plus;
+}
+.#{$ti-prefix}-rating-16-plus:before {
+ content: $ti-icon-rating-16-plus;
+}
+.#{$ti-prefix}-rating-18-plus:before {
+ content: $ti-icon-rating-18-plus;
+}
+.#{$ti-prefix}-rating-21-plus:before {
+ content: $ti-icon-rating-21-plus;
+}
+.#{$ti-prefix}-razor:before {
+ content: $ti-icon-razor;
+}
+.#{$ti-prefix}-razor-electric:before {
+ content: $ti-icon-razor-electric;
+}
+.#{$ti-prefix}-receipt:before {
+ content: $ti-icon-receipt;
+}
+.#{$ti-prefix}-receipt-2:before {
+ content: $ti-icon-receipt-2;
+}
+.#{$ti-prefix}-receipt-bitcoin:before {
+ content: $ti-icon-receipt-bitcoin;
+}
+.#{$ti-prefix}-receipt-dollar:before {
+ content: $ti-icon-receipt-dollar;
+}
+.#{$ti-prefix}-receipt-euro:before {
+ content: $ti-icon-receipt-euro;
+}
+.#{$ti-prefix}-receipt-off:before {
+ content: $ti-icon-receipt-off;
+}
+.#{$ti-prefix}-receipt-pound:before {
+ content: $ti-icon-receipt-pound;
+}
+.#{$ti-prefix}-receipt-refund:before {
+ content: $ti-icon-receipt-refund;
+}
+.#{$ti-prefix}-receipt-rupee:before {
+ content: $ti-icon-receipt-rupee;
+}
+.#{$ti-prefix}-receipt-tax:before {
+ content: $ti-icon-receipt-tax;
+}
+.#{$ti-prefix}-receipt-yen:before {
+ content: $ti-icon-receipt-yen;
+}
+.#{$ti-prefix}-receipt-yuan:before {
+ content: $ti-icon-receipt-yuan;
+}
+.#{$ti-prefix}-recharging:before {
+ content: $ti-icon-recharging;
+}
+.#{$ti-prefix}-record-mail:before {
+ content: $ti-icon-record-mail;
+}
+.#{$ti-prefix}-record-mail-off:before {
+ content: $ti-icon-record-mail-off;
+}
+.#{$ti-prefix}-rectangle:before {
+ content: $ti-icon-rectangle;
+}
+.#{$ti-prefix}-rectangle-filled:before {
+ content: $ti-icon-rectangle-filled;
+}
+.#{$ti-prefix}-rectangle-rounded-bottom:before {
+ content: $ti-icon-rectangle-rounded-bottom;
+}
+.#{$ti-prefix}-rectangle-rounded-top:before {
+ content: $ti-icon-rectangle-rounded-top;
+}
+.#{$ti-prefix}-rectangle-vertical:before {
+ content: $ti-icon-rectangle-vertical;
+}
+.#{$ti-prefix}-rectangle-vertical-filled:before {
+ content: $ti-icon-rectangle-vertical-filled;
+}
+.#{$ti-prefix}-rectangular-prism:before {
+ content: $ti-icon-rectangular-prism;
+}
+.#{$ti-prefix}-rectangular-prism-off:before {
+ content: $ti-icon-rectangular-prism-off;
+}
+.#{$ti-prefix}-rectangular-prism-plus:before {
+ content: $ti-icon-rectangular-prism-plus;
+}
+.#{$ti-prefix}-recycle:before {
+ content: $ti-icon-recycle;
+}
+.#{$ti-prefix}-recycle-off:before {
+ content: $ti-icon-recycle-off;
+}
+.#{$ti-prefix}-refresh:before {
+ content: $ti-icon-refresh;
+}
+.#{$ti-prefix}-refresh-alert:before {
+ content: $ti-icon-refresh-alert;
+}
+.#{$ti-prefix}-refresh-dot:before {
+ content: $ti-icon-refresh-dot;
+}
+.#{$ti-prefix}-refresh-off:before {
+ content: $ti-icon-refresh-off;
+}
+.#{$ti-prefix}-regex:before {
+ content: $ti-icon-regex;
+}
+.#{$ti-prefix}-regex-off:before {
+ content: $ti-icon-regex-off;
+}
+.#{$ti-prefix}-registered:before {
+ content: $ti-icon-registered;
+}
+.#{$ti-prefix}-relation-many-to-many:before {
+ content: $ti-icon-relation-many-to-many;
+}
+.#{$ti-prefix}-relation-many-to-many-filled:before {
+ content: $ti-icon-relation-many-to-many-filled;
+}
+.#{$ti-prefix}-relation-one-to-many:before {
+ content: $ti-icon-relation-one-to-many;
+}
+.#{$ti-prefix}-relation-one-to-many-filled:before {
+ content: $ti-icon-relation-one-to-many-filled;
+}
+.#{$ti-prefix}-relation-one-to-one:before {
+ content: $ti-icon-relation-one-to-one;
+}
+.#{$ti-prefix}-relation-one-to-one-filled:before {
+ content: $ti-icon-relation-one-to-one-filled;
+}
+.#{$ti-prefix}-reload:before {
+ content: $ti-icon-reload;
+}
+.#{$ti-prefix}-reorder:before {
+ content: $ti-icon-reorder;
+}
+.#{$ti-prefix}-repeat:before {
+ content: $ti-icon-repeat;
+}
+.#{$ti-prefix}-repeat-off:before {
+ content: $ti-icon-repeat-off;
+}
+.#{$ti-prefix}-repeat-once:before {
+ content: $ti-icon-repeat-once;
+}
+.#{$ti-prefix}-replace:before {
+ content: $ti-icon-replace;
+}
+.#{$ti-prefix}-replace-filled:before {
+ content: $ti-icon-replace-filled;
+}
+.#{$ti-prefix}-replace-off:before {
+ content: $ti-icon-replace-off;
+}
+.#{$ti-prefix}-report:before {
+ content: $ti-icon-report;
+}
+.#{$ti-prefix}-report-analytics:before {
+ content: $ti-icon-report-analytics;
+}
+.#{$ti-prefix}-report-medical:before {
+ content: $ti-icon-report-medical;
+}
+.#{$ti-prefix}-report-money:before {
+ content: $ti-icon-report-money;
+}
+.#{$ti-prefix}-report-off:before {
+ content: $ti-icon-report-off;
+}
+.#{$ti-prefix}-report-search:before {
+ content: $ti-icon-report-search;
+}
+.#{$ti-prefix}-reserved-line:before {
+ content: $ti-icon-reserved-line;
+}
+.#{$ti-prefix}-resize:before {
+ content: $ti-icon-resize;
+}
+.#{$ti-prefix}-restore:before {
+ content: $ti-icon-restore;
+}
+.#{$ti-prefix}-rewind-backward-10:before {
+ content: $ti-icon-rewind-backward-10;
+}
+.#{$ti-prefix}-rewind-backward-15:before {
+ content: $ti-icon-rewind-backward-15;
+}
+.#{$ti-prefix}-rewind-backward-20:before {
+ content: $ti-icon-rewind-backward-20;
+}
+.#{$ti-prefix}-rewind-backward-30:before {
+ content: $ti-icon-rewind-backward-30;
+}
+.#{$ti-prefix}-rewind-backward-40:before {
+ content: $ti-icon-rewind-backward-40;
+}
+.#{$ti-prefix}-rewind-backward-5:before {
+ content: $ti-icon-rewind-backward-5;
+}
+.#{$ti-prefix}-rewind-backward-50:before {
+ content: $ti-icon-rewind-backward-50;
+}
+.#{$ti-prefix}-rewind-backward-60:before {
+ content: $ti-icon-rewind-backward-60;
+}
+.#{$ti-prefix}-rewind-forward-10:before {
+ content: $ti-icon-rewind-forward-10;
+}
+.#{$ti-prefix}-rewind-forward-15:before {
+ content: $ti-icon-rewind-forward-15;
+}
+.#{$ti-prefix}-rewind-forward-20:before {
+ content: $ti-icon-rewind-forward-20;
+}
+.#{$ti-prefix}-rewind-forward-30:before {
+ content: $ti-icon-rewind-forward-30;
+}
+.#{$ti-prefix}-rewind-forward-40:before {
+ content: $ti-icon-rewind-forward-40;
+}
+.#{$ti-prefix}-rewind-forward-5:before {
+ content: $ti-icon-rewind-forward-5;
+}
+.#{$ti-prefix}-rewind-forward-50:before {
+ content: $ti-icon-rewind-forward-50;
+}
+.#{$ti-prefix}-rewind-forward-60:before {
+ content: $ti-icon-rewind-forward-60;
+}
+.#{$ti-prefix}-ribbon-health:before {
+ content: $ti-icon-ribbon-health;
+}
+.#{$ti-prefix}-rings:before {
+ content: $ti-icon-rings;
+}
+.#{$ti-prefix}-ripple:before {
+ content: $ti-icon-ripple;
+}
+.#{$ti-prefix}-ripple-off:before {
+ content: $ti-icon-ripple-off;
+}
+.#{$ti-prefix}-road:before {
+ content: $ti-icon-road;
+}
+.#{$ti-prefix}-road-off:before {
+ content: $ti-icon-road-off;
+}
+.#{$ti-prefix}-road-sign:before {
+ content: $ti-icon-road-sign;
+}
+.#{$ti-prefix}-robot:before {
+ content: $ti-icon-robot;
+}
+.#{$ti-prefix}-robot-face:before {
+ content: $ti-icon-robot-face;
+}
+.#{$ti-prefix}-robot-off:before {
+ content: $ti-icon-robot-off;
+}
+.#{$ti-prefix}-rocket:before {
+ content: $ti-icon-rocket;
+}
+.#{$ti-prefix}-rocket-off:before {
+ content: $ti-icon-rocket-off;
+}
+.#{$ti-prefix}-roller-skating:before {
+ content: $ti-icon-roller-skating;
+}
+.#{$ti-prefix}-rollercoaster:before {
+ content: $ti-icon-rollercoaster;
+}
+.#{$ti-prefix}-rollercoaster-off:before {
+ content: $ti-icon-rollercoaster-off;
+}
+.#{$ti-prefix}-rosette:before {
+ content: $ti-icon-rosette;
+}
+.#{$ti-prefix}-rosette-discount:before {
+ content: $ti-icon-rosette-discount;
+}
+.#{$ti-prefix}-rosette-discount-check:before {
+ content: $ti-icon-rosette-discount-check;
+}
+.#{$ti-prefix}-rosette-discount-check-filled:before {
+ content: $ti-icon-rosette-discount-check-filled;
+}
+.#{$ti-prefix}-rosette-discount-off:before {
+ content: $ti-icon-rosette-discount-off;
+}
+.#{$ti-prefix}-rosette-filled:before {
+ content: $ti-icon-rosette-filled;
+}
+.#{$ti-prefix}-rosette-number-0:before {
+ content: $ti-icon-rosette-number-0;
+}
+.#{$ti-prefix}-rosette-number-1:before {
+ content: $ti-icon-rosette-number-1;
+}
+.#{$ti-prefix}-rosette-number-2:before {
+ content: $ti-icon-rosette-number-2;
+}
+.#{$ti-prefix}-rosette-number-3:before {
+ content: $ti-icon-rosette-number-3;
+}
+.#{$ti-prefix}-rosette-number-4:before {
+ content: $ti-icon-rosette-number-4;
+}
+.#{$ti-prefix}-rosette-number-5:before {
+ content: $ti-icon-rosette-number-5;
+}
+.#{$ti-prefix}-rosette-number-6:before {
+ content: $ti-icon-rosette-number-6;
+}
+.#{$ti-prefix}-rosette-number-7:before {
+ content: $ti-icon-rosette-number-7;
+}
+.#{$ti-prefix}-rosette-number-8:before {
+ content: $ti-icon-rosette-number-8;
+}
+.#{$ti-prefix}-rosette-number-9:before {
+ content: $ti-icon-rosette-number-9;
+}
+.#{$ti-prefix}-rotate:before {
+ content: $ti-icon-rotate;
+}
+.#{$ti-prefix}-rotate-2:before {
+ content: $ti-icon-rotate-2;
+}
+.#{$ti-prefix}-rotate-360:before {
+ content: $ti-icon-rotate-360;
+}
+.#{$ti-prefix}-rotate-3d:before {
+ content: $ti-icon-rotate-3d;
+}
+.#{$ti-prefix}-rotate-clockwise:before {
+ content: $ti-icon-rotate-clockwise;
+}
+.#{$ti-prefix}-rotate-clockwise-2:before {
+ content: $ti-icon-rotate-clockwise-2;
+}
+.#{$ti-prefix}-rotate-dot:before {
+ content: $ti-icon-rotate-dot;
+}
+.#{$ti-prefix}-rotate-rectangle:before {
+ content: $ti-icon-rotate-rectangle;
+}
+.#{$ti-prefix}-route:before {
+ content: $ti-icon-route;
+}
+.#{$ti-prefix}-route-2:before {
+ content: $ti-icon-route-2;
+}
+.#{$ti-prefix}-route-alt-left:before {
+ content: $ti-icon-route-alt-left;
+}
+.#{$ti-prefix}-route-alt-right:before {
+ content: $ti-icon-route-alt-right;
+}
+.#{$ti-prefix}-route-off:before {
+ content: $ti-icon-route-off;
+}
+.#{$ti-prefix}-route-scan:before {
+ content: $ti-icon-route-scan;
+}
+.#{$ti-prefix}-route-square:before {
+ content: $ti-icon-route-square;
+}
+.#{$ti-prefix}-route-square-2:before {
+ content: $ti-icon-route-square-2;
+}
+.#{$ti-prefix}-route-x:before {
+ content: $ti-icon-route-x;
+}
+.#{$ti-prefix}-route-x-2:before {
+ content: $ti-icon-route-x-2;
+}
+.#{$ti-prefix}-router:before {
+ content: $ti-icon-router;
+}
+.#{$ti-prefix}-router-off:before {
+ content: $ti-icon-router-off;
+}
+.#{$ti-prefix}-row-insert-bottom:before {
+ content: $ti-icon-row-insert-bottom;
+}
+.#{$ti-prefix}-row-insert-top:before {
+ content: $ti-icon-row-insert-top;
+}
+.#{$ti-prefix}-row-remove:before {
+ content: $ti-icon-row-remove;
+}
+.#{$ti-prefix}-rss:before {
+ content: $ti-icon-rss;
+}
+.#{$ti-prefix}-rubber-stamp:before {
+ content: $ti-icon-rubber-stamp;
+}
+.#{$ti-prefix}-rubber-stamp-off:before {
+ content: $ti-icon-rubber-stamp-off;
+}
+.#{$ti-prefix}-ruler:before {
+ content: $ti-icon-ruler;
+}
+.#{$ti-prefix}-ruler-2:before {
+ content: $ti-icon-ruler-2;
+}
+.#{$ti-prefix}-ruler-2-off:before {
+ content: $ti-icon-ruler-2-off;
+}
+.#{$ti-prefix}-ruler-3:before {
+ content: $ti-icon-ruler-3;
+}
+.#{$ti-prefix}-ruler-measure:before {
+ content: $ti-icon-ruler-measure;
+}
+.#{$ti-prefix}-ruler-off:before {
+ content: $ti-icon-ruler-off;
+}
+.#{$ti-prefix}-run:before {
+ content: $ti-icon-run;
+}
+.#{$ti-prefix}-rv-truck:before {
+ content: $ti-icon-rv-truck;
+}
+.#{$ti-prefix}-s-turn-down:before {
+ content: $ti-icon-s-turn-down;
+}
+.#{$ti-prefix}-s-turn-left:before {
+ content: $ti-icon-s-turn-left;
+}
+.#{$ti-prefix}-s-turn-right:before {
+ content: $ti-icon-s-turn-right;
+}
+.#{$ti-prefix}-s-turn-up:before {
+ content: $ti-icon-s-turn-up;
+}
+.#{$ti-prefix}-sailboat:before {
+ content: $ti-icon-sailboat;
+}
+.#{$ti-prefix}-sailboat-2:before {
+ content: $ti-icon-sailboat-2;
+}
+.#{$ti-prefix}-sailboat-off:before {
+ content: $ti-icon-sailboat-off;
+}
+.#{$ti-prefix}-salad:before {
+ content: $ti-icon-salad;
+}
+.#{$ti-prefix}-salt:before {
+ content: $ti-icon-salt;
+}
+.#{$ti-prefix}-sandbox:before {
+ content: $ti-icon-sandbox;
+}
+.#{$ti-prefix}-satellite:before {
+ content: $ti-icon-satellite;
+}
+.#{$ti-prefix}-satellite-off:before {
+ content: $ti-icon-satellite-off;
+}
+.#{$ti-prefix}-sausage:before {
+ content: $ti-icon-sausage;
+}
+.#{$ti-prefix}-scale:before {
+ content: $ti-icon-scale;
+}
+.#{$ti-prefix}-scale-off:before {
+ content: $ti-icon-scale-off;
+}
+.#{$ti-prefix}-scale-outline:before {
+ content: $ti-icon-scale-outline;
+}
+.#{$ti-prefix}-scale-outline-off:before {
+ content: $ti-icon-scale-outline-off;
+}
+.#{$ti-prefix}-scan:before {
+ content: $ti-icon-scan;
+}
+.#{$ti-prefix}-scan-eye:before {
+ content: $ti-icon-scan-eye;
+}
+.#{$ti-prefix}-scan-position:before {
+ content: $ti-icon-scan-position;
+}
+.#{$ti-prefix}-schema:before {
+ content: $ti-icon-schema;
+}
+.#{$ti-prefix}-schema-off:before {
+ content: $ti-icon-schema-off;
+}
+.#{$ti-prefix}-school:before {
+ content: $ti-icon-school;
+}
+.#{$ti-prefix}-school-bell:before {
+ content: $ti-icon-school-bell;
+}
+.#{$ti-prefix}-school-off:before {
+ content: $ti-icon-school-off;
+}
+.#{$ti-prefix}-scissors:before {
+ content: $ti-icon-scissors;
+}
+.#{$ti-prefix}-scissors-off:before {
+ content: $ti-icon-scissors-off;
+}
+.#{$ti-prefix}-scooter:before {
+ content: $ti-icon-scooter;
+}
+.#{$ti-prefix}-scooter-electric:before {
+ content: $ti-icon-scooter-electric;
+}
+.#{$ti-prefix}-scoreboard:before {
+ content: $ti-icon-scoreboard;
+}
+.#{$ti-prefix}-screen-share:before {
+ content: $ti-icon-screen-share;
+}
+.#{$ti-prefix}-screen-share-off:before {
+ content: $ti-icon-screen-share-off;
+}
+.#{$ti-prefix}-screenshot:before {
+ content: $ti-icon-screenshot;
+}
+.#{$ti-prefix}-scribble:before {
+ content: $ti-icon-scribble;
+}
+.#{$ti-prefix}-scribble-off:before {
+ content: $ti-icon-scribble-off;
+}
+.#{$ti-prefix}-script:before {
+ content: $ti-icon-script;
+}
+.#{$ti-prefix}-script-minus:before {
+ content: $ti-icon-script-minus;
+}
+.#{$ti-prefix}-script-plus:before {
+ content: $ti-icon-script-plus;
+}
+.#{$ti-prefix}-script-x:before {
+ content: $ti-icon-script-x;
+}
+.#{$ti-prefix}-scuba-diving:before {
+ content: $ti-icon-scuba-diving;
+}
+.#{$ti-prefix}-scuba-mask:before {
+ content: $ti-icon-scuba-mask;
+}
+.#{$ti-prefix}-scuba-mask-off:before {
+ content: $ti-icon-scuba-mask-off;
+}
+.#{$ti-prefix}-sdk:before {
+ content: $ti-icon-sdk;
+}
+.#{$ti-prefix}-search:before {
+ content: $ti-icon-search;
+}
+.#{$ti-prefix}-search-off:before {
+ content: $ti-icon-search-off;
+}
+.#{$ti-prefix}-section:before {
+ content: $ti-icon-section;
+}
+.#{$ti-prefix}-section-filled:before {
+ content: $ti-icon-section-filled;
+}
+.#{$ti-prefix}-section-sign:before {
+ content: $ti-icon-section-sign;
+}
+.#{$ti-prefix}-seeding:before {
+ content: $ti-icon-seeding;
+}
+.#{$ti-prefix}-seeding-off:before {
+ content: $ti-icon-seeding-off;
+}
+.#{$ti-prefix}-select:before {
+ content: $ti-icon-select;
+}
+.#{$ti-prefix}-select-all:before {
+ content: $ti-icon-select-all;
+}
+.#{$ti-prefix}-selector:before {
+ content: $ti-icon-selector;
+}
+.#{$ti-prefix}-send:before {
+ content: $ti-icon-send;
+}
+.#{$ti-prefix}-send-2:before {
+ content: $ti-icon-send-2;
+}
+.#{$ti-prefix}-send-off:before {
+ content: $ti-icon-send-off;
+}
+.#{$ti-prefix}-seo:before {
+ content: $ti-icon-seo;
+}
+.#{$ti-prefix}-separator:before {
+ content: $ti-icon-separator;
+}
+.#{$ti-prefix}-separator-horizontal:before {
+ content: $ti-icon-separator-horizontal;
+}
+.#{$ti-prefix}-separator-vertical:before {
+ content: $ti-icon-separator-vertical;
+}
+.#{$ti-prefix}-server:before {
+ content: $ti-icon-server;
+}
+.#{$ti-prefix}-server-2:before {
+ content: $ti-icon-server-2;
+}
+.#{$ti-prefix}-server-bolt:before {
+ content: $ti-icon-server-bolt;
+}
+.#{$ti-prefix}-server-cog:before {
+ content: $ti-icon-server-cog;
+}
+.#{$ti-prefix}-server-off:before {
+ content: $ti-icon-server-off;
+}
+.#{$ti-prefix}-servicemark:before {
+ content: $ti-icon-servicemark;
+}
+.#{$ti-prefix}-settings:before {
+ content: $ti-icon-settings;
+}
+.#{$ti-prefix}-settings-2:before {
+ content: $ti-icon-settings-2;
+}
+.#{$ti-prefix}-settings-automation:before {
+ content: $ti-icon-settings-automation;
+}
+.#{$ti-prefix}-settings-bolt:before {
+ content: $ti-icon-settings-bolt;
+}
+.#{$ti-prefix}-settings-cancel:before {
+ content: $ti-icon-settings-cancel;
+}
+.#{$ti-prefix}-settings-check:before {
+ content: $ti-icon-settings-check;
+}
+.#{$ti-prefix}-settings-code:before {
+ content: $ti-icon-settings-code;
+}
+.#{$ti-prefix}-settings-cog:before {
+ content: $ti-icon-settings-cog;
+}
+.#{$ti-prefix}-settings-dollar:before {
+ content: $ti-icon-settings-dollar;
+}
+.#{$ti-prefix}-settings-down:before {
+ content: $ti-icon-settings-down;
+}
+.#{$ti-prefix}-settings-exclamation:before {
+ content: $ti-icon-settings-exclamation;
+}
+.#{$ti-prefix}-settings-filled:before {
+ content: $ti-icon-settings-filled;
+}
+.#{$ti-prefix}-settings-heart:before {
+ content: $ti-icon-settings-heart;
+}
+.#{$ti-prefix}-settings-minus:before {
+ content: $ti-icon-settings-minus;
+}
+.#{$ti-prefix}-settings-off:before {
+ content: $ti-icon-settings-off;
+}
+.#{$ti-prefix}-settings-pause:before {
+ content: $ti-icon-settings-pause;
+}
+.#{$ti-prefix}-settings-pin:before {
+ content: $ti-icon-settings-pin;
+}
+.#{$ti-prefix}-settings-plus:before {
+ content: $ti-icon-settings-plus;
+}
+.#{$ti-prefix}-settings-question:before {
+ content: $ti-icon-settings-question;
+}
+.#{$ti-prefix}-settings-search:before {
+ content: $ti-icon-settings-search;
+}
+.#{$ti-prefix}-settings-share:before {
+ content: $ti-icon-settings-share;
+}
+.#{$ti-prefix}-settings-star:before {
+ content: $ti-icon-settings-star;
+}
+.#{$ti-prefix}-settings-up:before {
+ content: $ti-icon-settings-up;
+}
+.#{$ti-prefix}-settings-x:before {
+ content: $ti-icon-settings-x;
+}
+.#{$ti-prefix}-shadow:before {
+ content: $ti-icon-shadow;
+}
+.#{$ti-prefix}-shadow-off:before {
+ content: $ti-icon-shadow-off;
+}
+.#{$ti-prefix}-shape:before {
+ content: $ti-icon-shape;
+}
+.#{$ti-prefix}-shape-2:before {
+ content: $ti-icon-shape-2;
+}
+.#{$ti-prefix}-shape-3:before {
+ content: $ti-icon-shape-3;
+}
+.#{$ti-prefix}-shape-off:before {
+ content: $ti-icon-shape-off;
+}
+.#{$ti-prefix}-share:before {
+ content: $ti-icon-share;
+}
+.#{$ti-prefix}-share-2:before {
+ content: $ti-icon-share-2;
+}
+.#{$ti-prefix}-share-3:before {
+ content: $ti-icon-share-3;
+}
+.#{$ti-prefix}-share-off:before {
+ content: $ti-icon-share-off;
+}
+.#{$ti-prefix}-shareplay:before {
+ content: $ti-icon-shareplay;
+}
+.#{$ti-prefix}-shield:before {
+ content: $ti-icon-shield;
+}
+.#{$ti-prefix}-shield-bolt:before {
+ content: $ti-icon-shield-bolt;
+}
+.#{$ti-prefix}-shield-cancel:before {
+ content: $ti-icon-shield-cancel;
+}
+.#{$ti-prefix}-shield-check:before {
+ content: $ti-icon-shield-check;
+}
+.#{$ti-prefix}-shield-check-filled:before {
+ content: $ti-icon-shield-check-filled;
+}
+.#{$ti-prefix}-shield-checkered:before {
+ content: $ti-icon-shield-checkered;
+}
+.#{$ti-prefix}-shield-checkered-filled:before {
+ content: $ti-icon-shield-checkered-filled;
+}
+.#{$ti-prefix}-shield-chevron:before {
+ content: $ti-icon-shield-chevron;
+}
+.#{$ti-prefix}-shield-code:before {
+ content: $ti-icon-shield-code;
+}
+.#{$ti-prefix}-shield-cog:before {
+ content: $ti-icon-shield-cog;
+}
+.#{$ti-prefix}-shield-dollar:before {
+ content: $ti-icon-shield-dollar;
+}
+.#{$ti-prefix}-shield-down:before {
+ content: $ti-icon-shield-down;
+}
+.#{$ti-prefix}-shield-exclamation:before {
+ content: $ti-icon-shield-exclamation;
+}
+.#{$ti-prefix}-shield-filled:before {
+ content: $ti-icon-shield-filled;
+}
+.#{$ti-prefix}-shield-half:before {
+ content: $ti-icon-shield-half;
+}
+.#{$ti-prefix}-shield-half-filled:before {
+ content: $ti-icon-shield-half-filled;
+}
+.#{$ti-prefix}-shield-heart:before {
+ content: $ti-icon-shield-heart;
+}
+.#{$ti-prefix}-shield-lock:before {
+ content: $ti-icon-shield-lock;
+}
+.#{$ti-prefix}-shield-lock-filled:before {
+ content: $ti-icon-shield-lock-filled;
+}
+.#{$ti-prefix}-shield-minus:before {
+ content: $ti-icon-shield-minus;
+}
+.#{$ti-prefix}-shield-off:before {
+ content: $ti-icon-shield-off;
+}
+.#{$ti-prefix}-shield-pause:before {
+ content: $ti-icon-shield-pause;
+}
+.#{$ti-prefix}-shield-pin:before {
+ content: $ti-icon-shield-pin;
+}
+.#{$ti-prefix}-shield-plus:before {
+ content: $ti-icon-shield-plus;
+}
+.#{$ti-prefix}-shield-question:before {
+ content: $ti-icon-shield-question;
+}
+.#{$ti-prefix}-shield-search:before {
+ content: $ti-icon-shield-search;
+}
+.#{$ti-prefix}-shield-share:before {
+ content: $ti-icon-shield-share;
+}
+.#{$ti-prefix}-shield-star:before {
+ content: $ti-icon-shield-star;
+}
+.#{$ti-prefix}-shield-up:before {
+ content: $ti-icon-shield-up;
+}
+.#{$ti-prefix}-shield-x:before {
+ content: $ti-icon-shield-x;
+}
+.#{$ti-prefix}-ship:before {
+ content: $ti-icon-ship;
+}
+.#{$ti-prefix}-ship-off:before {
+ content: $ti-icon-ship-off;
+}
+.#{$ti-prefix}-shirt:before {
+ content: $ti-icon-shirt;
+}
+.#{$ti-prefix}-shirt-filled:before {
+ content: $ti-icon-shirt-filled;
+}
+.#{$ti-prefix}-shirt-off:before {
+ content: $ti-icon-shirt-off;
+}
+.#{$ti-prefix}-shirt-sport:before {
+ content: $ti-icon-shirt-sport;
+}
+.#{$ti-prefix}-shoe:before {
+ content: $ti-icon-shoe;
+}
+.#{$ti-prefix}-shoe-off:before {
+ content: $ti-icon-shoe-off;
+}
+.#{$ti-prefix}-shopping-bag:before {
+ content: $ti-icon-shopping-bag;
+}
+.#{$ti-prefix}-shopping-bag-check:before {
+ content: $ti-icon-shopping-bag-check;
+}
+.#{$ti-prefix}-shopping-bag-discount:before {
+ content: $ti-icon-shopping-bag-discount;
+}
+.#{$ti-prefix}-shopping-bag-edit:before {
+ content: $ti-icon-shopping-bag-edit;
+}
+.#{$ti-prefix}-shopping-bag-exclamation:before {
+ content: $ti-icon-shopping-bag-exclamation;
+}
+.#{$ti-prefix}-shopping-bag-heart:before {
+ content: $ti-icon-shopping-bag-heart;
+}
+.#{$ti-prefix}-shopping-bag-minus:before {
+ content: $ti-icon-shopping-bag-minus;
+}
+.#{$ti-prefix}-shopping-bag-plus:before {
+ content: $ti-icon-shopping-bag-plus;
+}
+.#{$ti-prefix}-shopping-bag-search:before {
+ content: $ti-icon-shopping-bag-search;
+}
+.#{$ti-prefix}-shopping-bag-x:before {
+ content: $ti-icon-shopping-bag-x;
+}
+.#{$ti-prefix}-shopping-cart:before {
+ content: $ti-icon-shopping-cart;
+}
+.#{$ti-prefix}-shopping-cart-bolt:before {
+ content: $ti-icon-shopping-cart-bolt;
+}
+.#{$ti-prefix}-shopping-cart-cancel:before {
+ content: $ti-icon-shopping-cart-cancel;
+}
+.#{$ti-prefix}-shopping-cart-check:before {
+ content: $ti-icon-shopping-cart-check;
+}
+.#{$ti-prefix}-shopping-cart-code:before {
+ content: $ti-icon-shopping-cart-code;
+}
+.#{$ti-prefix}-shopping-cart-cog:before {
+ content: $ti-icon-shopping-cart-cog;
+}
+.#{$ti-prefix}-shopping-cart-copy:before {
+ content: $ti-icon-shopping-cart-copy;
+}
+.#{$ti-prefix}-shopping-cart-discount:before {
+ content: $ti-icon-shopping-cart-discount;
+}
+.#{$ti-prefix}-shopping-cart-dollar:before {
+ content: $ti-icon-shopping-cart-dollar;
+}
+.#{$ti-prefix}-shopping-cart-down:before {
+ content: $ti-icon-shopping-cart-down;
+}
+.#{$ti-prefix}-shopping-cart-exclamation:before {
+ content: $ti-icon-shopping-cart-exclamation;
+}
+.#{$ti-prefix}-shopping-cart-filled:before {
+ content: $ti-icon-shopping-cart-filled;
+}
+.#{$ti-prefix}-shopping-cart-heart:before {
+ content: $ti-icon-shopping-cart-heart;
+}
+.#{$ti-prefix}-shopping-cart-minus:before {
+ content: $ti-icon-shopping-cart-minus;
+}
+.#{$ti-prefix}-shopping-cart-off:before {
+ content: $ti-icon-shopping-cart-off;
+}
+.#{$ti-prefix}-shopping-cart-pause:before {
+ content: $ti-icon-shopping-cart-pause;
+}
+.#{$ti-prefix}-shopping-cart-pin:before {
+ content: $ti-icon-shopping-cart-pin;
+}
+.#{$ti-prefix}-shopping-cart-plus:before {
+ content: $ti-icon-shopping-cart-plus;
+}
+.#{$ti-prefix}-shopping-cart-question:before {
+ content: $ti-icon-shopping-cart-question;
+}
+.#{$ti-prefix}-shopping-cart-search:before {
+ content: $ti-icon-shopping-cart-search;
+}
+.#{$ti-prefix}-shopping-cart-share:before {
+ content: $ti-icon-shopping-cart-share;
+}
+.#{$ti-prefix}-shopping-cart-star:before {
+ content: $ti-icon-shopping-cart-star;
+}
+.#{$ti-prefix}-shopping-cart-up:before {
+ content: $ti-icon-shopping-cart-up;
+}
+.#{$ti-prefix}-shopping-cart-x:before {
+ content: $ti-icon-shopping-cart-x;
+}
+.#{$ti-prefix}-shovel:before {
+ content: $ti-icon-shovel;
+}
+.#{$ti-prefix}-shovel-pitchforks:before {
+ content: $ti-icon-shovel-pitchforks;
+}
+.#{$ti-prefix}-shredder:before {
+ content: $ti-icon-shredder;
+}
+.#{$ti-prefix}-sign-left:before {
+ content: $ti-icon-sign-left;
+}
+.#{$ti-prefix}-sign-left-filled:before {
+ content: $ti-icon-sign-left-filled;
+}
+.#{$ti-prefix}-sign-right:before {
+ content: $ti-icon-sign-right;
+}
+.#{$ti-prefix}-sign-right-filled:before {
+ content: $ti-icon-sign-right-filled;
+}
+.#{$ti-prefix}-signal-2g:before {
+ content: $ti-icon-signal-2g;
+}
+.#{$ti-prefix}-signal-3g:before {
+ content: $ti-icon-signal-3g;
+}
+.#{$ti-prefix}-signal-4g:before {
+ content: $ti-icon-signal-4g;
+}
+.#{$ti-prefix}-signal-4g-plus:before {
+ content: $ti-icon-signal-4g-plus;
+}
+.#{$ti-prefix}-signal-5g:before {
+ content: $ti-icon-signal-5g;
+}
+.#{$ti-prefix}-signal-6g:before {
+ content: $ti-icon-signal-6g;
+}
+.#{$ti-prefix}-signal-e:before {
+ content: $ti-icon-signal-e;
+}
+.#{$ti-prefix}-signal-g:before {
+ content: $ti-icon-signal-g;
+}
+.#{$ti-prefix}-signal-h:before {
+ content: $ti-icon-signal-h;
+}
+.#{$ti-prefix}-signal-h-plus:before {
+ content: $ti-icon-signal-h-plus;
+}
+.#{$ti-prefix}-signal-lte:before {
+ content: $ti-icon-signal-lte;
+}
+.#{$ti-prefix}-signature:before {
+ content: $ti-icon-signature;
+}
+.#{$ti-prefix}-signature-off:before {
+ content: $ti-icon-signature-off;
+}
+.#{$ti-prefix}-sitemap:before {
+ content: $ti-icon-sitemap;
+}
+.#{$ti-prefix}-sitemap-off:before {
+ content: $ti-icon-sitemap-off;
+}
+.#{$ti-prefix}-skateboard:before {
+ content: $ti-icon-skateboard;
+}
+.#{$ti-prefix}-skateboard-off:before {
+ content: $ti-icon-skateboard-off;
+}
+.#{$ti-prefix}-skateboarding:before {
+ content: $ti-icon-skateboarding;
+}
+.#{$ti-prefix}-skew-x:before {
+ content: $ti-icon-skew-x;
+}
+.#{$ti-prefix}-skew-y:before {
+ content: $ti-icon-skew-y;
+}
+.#{$ti-prefix}-ski-jumping:before {
+ content: $ti-icon-ski-jumping;
+}
+.#{$ti-prefix}-skull:before {
+ content: $ti-icon-skull;
+}
+.#{$ti-prefix}-slash:before {
+ content: $ti-icon-slash;
+}
+.#{$ti-prefix}-slashes:before {
+ content: $ti-icon-slashes;
+}
+.#{$ti-prefix}-sleigh:before {
+ content: $ti-icon-sleigh;
+}
+.#{$ti-prefix}-slice:before {
+ content: $ti-icon-slice;
+}
+.#{$ti-prefix}-slideshow:before {
+ content: $ti-icon-slideshow;
+}
+.#{$ti-prefix}-smart-home:before {
+ content: $ti-icon-smart-home;
+}
+.#{$ti-prefix}-smart-home-off:before {
+ content: $ti-icon-smart-home-off;
+}
+.#{$ti-prefix}-smoking:before {
+ content: $ti-icon-smoking;
+}
+.#{$ti-prefix}-smoking-no:before {
+ content: $ti-icon-smoking-no;
+}
+.#{$ti-prefix}-snowboarding:before {
+ content: $ti-icon-snowboarding;
+}
+.#{$ti-prefix}-snowflake:before {
+ content: $ti-icon-snowflake;
+}
+.#{$ti-prefix}-snowflake-off:before {
+ content: $ti-icon-snowflake-off;
+}
+.#{$ti-prefix}-snowman:before {
+ content: $ti-icon-snowman;
+}
+.#{$ti-prefix}-soccer-field:before {
+ content: $ti-icon-soccer-field;
+}
+.#{$ti-prefix}-social:before {
+ content: $ti-icon-social;
+}
+.#{$ti-prefix}-social-off:before {
+ content: $ti-icon-social-off;
+}
+.#{$ti-prefix}-sock:before {
+ content: $ti-icon-sock;
+}
+.#{$ti-prefix}-sofa:before {
+ content: $ti-icon-sofa;
+}
+.#{$ti-prefix}-sofa-off:before {
+ content: $ti-icon-sofa-off;
+}
+.#{$ti-prefix}-solar-electricity:before {
+ content: $ti-icon-solar-electricity;
+}
+.#{$ti-prefix}-solar-panel:before {
+ content: $ti-icon-solar-panel;
+}
+.#{$ti-prefix}-solar-panel-2:before {
+ content: $ti-icon-solar-panel-2;
+}
+.#{$ti-prefix}-sort-0-9:before {
+ content: $ti-icon-sort-0-9;
+}
+.#{$ti-prefix}-sort-9-0:before {
+ content: $ti-icon-sort-9-0;
+}
+.#{$ti-prefix}-sort-a-z:before {
+ content: $ti-icon-sort-a-z;
+}
+.#{$ti-prefix}-sort-ascending:before {
+ content: $ti-icon-sort-ascending;
+}
+.#{$ti-prefix}-sort-ascending-2:before {
+ content: $ti-icon-sort-ascending-2;
+}
+.#{$ti-prefix}-sort-ascending-letters:before {
+ content: $ti-icon-sort-ascending-letters;
+}
+.#{$ti-prefix}-sort-ascending-numbers:before {
+ content: $ti-icon-sort-ascending-numbers;
+}
+.#{$ti-prefix}-sort-ascending-shapes:before {
+ content: $ti-icon-sort-ascending-shapes;
+}
+.#{$ti-prefix}-sort-ascending-small-big:before {
+ content: $ti-icon-sort-ascending-small-big;
+}
+.#{$ti-prefix}-sort-descending:before {
+ content: $ti-icon-sort-descending;
+}
+.#{$ti-prefix}-sort-descending-2:before {
+ content: $ti-icon-sort-descending-2;
+}
+.#{$ti-prefix}-sort-descending-letters:before {
+ content: $ti-icon-sort-descending-letters;
+}
+.#{$ti-prefix}-sort-descending-numbers:before {
+ content: $ti-icon-sort-descending-numbers;
+}
+.#{$ti-prefix}-sort-descending-shapes:before {
+ content: $ti-icon-sort-descending-shapes;
+}
+.#{$ti-prefix}-sort-descending-small-big:before {
+ content: $ti-icon-sort-descending-small-big;
+}
+.#{$ti-prefix}-sort-z-a:before {
+ content: $ti-icon-sort-z-a;
+}
+.#{$ti-prefix}-sos:before {
+ content: $ti-icon-sos;
+}
+.#{$ti-prefix}-soup:before {
+ content: $ti-icon-soup;
+}
+.#{$ti-prefix}-soup-filled:before {
+ content: $ti-icon-soup-filled;
+}
+.#{$ti-prefix}-soup-off:before {
+ content: $ti-icon-soup-off;
+}
+.#{$ti-prefix}-source-code:before {
+ content: $ti-icon-source-code;
+}
+.#{$ti-prefix}-space:before {
+ content: $ti-icon-space;
+}
+.#{$ti-prefix}-space-off:before {
+ content: $ti-icon-space-off;
+}
+.#{$ti-prefix}-spaces:before {
+ content: $ti-icon-spaces;
+}
+.#{$ti-prefix}-spacing-horizontal:before {
+ content: $ti-icon-spacing-horizontal;
+}
+.#{$ti-prefix}-spacing-vertical:before {
+ content: $ti-icon-spacing-vertical;
+}
+.#{$ti-prefix}-spade:before {
+ content: $ti-icon-spade;
+}
+.#{$ti-prefix}-spade-filled:before {
+ content: $ti-icon-spade-filled;
+}
+.#{$ti-prefix}-sparkles:before {
+ content: $ti-icon-sparkles;
+}
+.#{$ti-prefix}-speakerphone:before {
+ content: $ti-icon-speakerphone;
+}
+.#{$ti-prefix}-speedboat:before {
+ content: $ti-icon-speedboat;
+}
+.#{$ti-prefix}-sphere:before {
+ content: $ti-icon-sphere;
+}
+.#{$ti-prefix}-sphere-off:before {
+ content: $ti-icon-sphere-off;
+}
+.#{$ti-prefix}-sphere-plus:before {
+ content: $ti-icon-sphere-plus;
+}
+.#{$ti-prefix}-spider:before {
+ content: $ti-icon-spider;
+}
+.#{$ti-prefix}-spiral:before {
+ content: $ti-icon-spiral;
+}
+.#{$ti-prefix}-spiral-off:before {
+ content: $ti-icon-spiral-off;
+}
+.#{$ti-prefix}-sport-billard:before {
+ content: $ti-icon-sport-billard;
+}
+.#{$ti-prefix}-spray:before {
+ content: $ti-icon-spray;
+}
+.#{$ti-prefix}-spy:before {
+ content: $ti-icon-spy;
+}
+.#{$ti-prefix}-spy-off:before {
+ content: $ti-icon-spy-off;
+}
+.#{$ti-prefix}-sql:before {
+ content: $ti-icon-sql;
+}
+.#{$ti-prefix}-square:before {
+ content: $ti-icon-square;
+}
+.#{$ti-prefix}-square-arrow-down:before {
+ content: $ti-icon-square-arrow-down;
+}
+.#{$ti-prefix}-square-arrow-down-filled:before {
+ content: $ti-icon-square-arrow-down-filled;
+}
+.#{$ti-prefix}-square-arrow-left:before {
+ content: $ti-icon-square-arrow-left;
+}
+.#{$ti-prefix}-square-arrow-left-filled:before {
+ content: $ti-icon-square-arrow-left-filled;
+}
+.#{$ti-prefix}-square-arrow-right:before {
+ content: $ti-icon-square-arrow-right;
+}
+.#{$ti-prefix}-square-arrow-right-filled:before {
+ content: $ti-icon-square-arrow-right-filled;
+}
+.#{$ti-prefix}-square-arrow-up:before {
+ content: $ti-icon-square-arrow-up;
+}
+.#{$ti-prefix}-square-arrow-up-filled:before {
+ content: $ti-icon-square-arrow-up-filled;
+}
+.#{$ti-prefix}-square-asterisk:before {
+ content: $ti-icon-square-asterisk;
+}
+.#{$ti-prefix}-square-asterisk-filled:before {
+ content: $ti-icon-square-asterisk-filled;
+}
+.#{$ti-prefix}-square-check:before {
+ content: $ti-icon-square-check;
+}
+.#{$ti-prefix}-square-check-filled:before {
+ content: $ti-icon-square-check-filled;
+}
+.#{$ti-prefix}-square-chevron-down:before {
+ content: $ti-icon-square-chevron-down;
+}
+.#{$ti-prefix}-square-chevron-down-filled:before {
+ content: $ti-icon-square-chevron-down-filled;
+}
+.#{$ti-prefix}-square-chevron-left:before {
+ content: $ti-icon-square-chevron-left;
+}
+.#{$ti-prefix}-square-chevron-left-filled:before {
+ content: $ti-icon-square-chevron-left-filled;
+}
+.#{$ti-prefix}-square-chevron-right:before {
+ content: $ti-icon-square-chevron-right;
+}
+.#{$ti-prefix}-square-chevron-right-filled:before {
+ content: $ti-icon-square-chevron-right-filled;
+}
+.#{$ti-prefix}-square-chevron-up:before {
+ content: $ti-icon-square-chevron-up;
+}
+.#{$ti-prefix}-square-chevron-up-filled:before {
+ content: $ti-icon-square-chevron-up-filled;
+}
+.#{$ti-prefix}-square-chevrons-down:before {
+ content: $ti-icon-square-chevrons-down;
+}
+.#{$ti-prefix}-square-chevrons-down-filled:before {
+ content: $ti-icon-square-chevrons-down-filled;
+}
+.#{$ti-prefix}-square-chevrons-left:before {
+ content: $ti-icon-square-chevrons-left;
+}
+.#{$ti-prefix}-square-chevrons-left-filled:before {
+ content: $ti-icon-square-chevrons-left-filled;
+}
+.#{$ti-prefix}-square-chevrons-right:before {
+ content: $ti-icon-square-chevrons-right;
+}
+.#{$ti-prefix}-square-chevrons-right-filled:before {
+ content: $ti-icon-square-chevrons-right-filled;
+}
+.#{$ti-prefix}-square-chevrons-up:before {
+ content: $ti-icon-square-chevrons-up;
+}
+.#{$ti-prefix}-square-chevrons-up-filled:before {
+ content: $ti-icon-square-chevrons-up-filled;
+}
+.#{$ti-prefix}-square-dot:before {
+ content: $ti-icon-square-dot;
+}
+.#{$ti-prefix}-square-dot-filled:before {
+ content: $ti-icon-square-dot-filled;
+}
+.#{$ti-prefix}-square-f0:before {
+ content: $ti-icon-square-f0;
+}
+.#{$ti-prefix}-square-f0-filled:before {
+ content: $ti-icon-square-f0-filled;
+}
+.#{$ti-prefix}-square-f1:before {
+ content: $ti-icon-square-f1;
+}
+.#{$ti-prefix}-square-f1-filled:before {
+ content: $ti-icon-square-f1-filled;
+}
+.#{$ti-prefix}-square-f2:before {
+ content: $ti-icon-square-f2;
+}
+.#{$ti-prefix}-square-f2-filled:before {
+ content: $ti-icon-square-f2-filled;
+}
+.#{$ti-prefix}-square-f3:before {
+ content: $ti-icon-square-f3;
+}
+.#{$ti-prefix}-square-f3-filled:before {
+ content: $ti-icon-square-f3-filled;
+}
+.#{$ti-prefix}-square-f4:before {
+ content: $ti-icon-square-f4;
+}
+.#{$ti-prefix}-square-f4-filled:before {
+ content: $ti-icon-square-f4-filled;
+}
+.#{$ti-prefix}-square-f5:before {
+ content: $ti-icon-square-f5;
+}
+.#{$ti-prefix}-square-f5-filled:before {
+ content: $ti-icon-square-f5-filled;
+}
+.#{$ti-prefix}-square-f6:before {
+ content: $ti-icon-square-f6;
+}
+.#{$ti-prefix}-square-f6-filled:before {
+ content: $ti-icon-square-f6-filled;
+}
+.#{$ti-prefix}-square-f7:before {
+ content: $ti-icon-square-f7;
+}
+.#{$ti-prefix}-square-f7-filled:before {
+ content: $ti-icon-square-f7-filled;
+}
+.#{$ti-prefix}-square-f8:before {
+ content: $ti-icon-square-f8;
+}
+.#{$ti-prefix}-square-f8-filled:before {
+ content: $ti-icon-square-f8-filled;
+}
+.#{$ti-prefix}-square-f9:before {
+ content: $ti-icon-square-f9;
+}
+.#{$ti-prefix}-square-f9-filled:before {
+ content: $ti-icon-square-f9-filled;
+}
+.#{$ti-prefix}-square-filled:before {
+ content: $ti-icon-square-filled;
+}
+.#{$ti-prefix}-square-forbid:before {
+ content: $ti-icon-square-forbid;
+}
+.#{$ti-prefix}-square-forbid-2:before {
+ content: $ti-icon-square-forbid-2;
+}
+.#{$ti-prefix}-square-half:before {
+ content: $ti-icon-square-half;
+}
+.#{$ti-prefix}-square-key:before {
+ content: $ti-icon-square-key;
+}
+.#{$ti-prefix}-square-letter-a:before {
+ content: $ti-icon-square-letter-a;
+}
+.#{$ti-prefix}-square-letter-a-filled:before {
+ content: $ti-icon-square-letter-a-filled;
+}
+.#{$ti-prefix}-square-letter-b:before {
+ content: $ti-icon-square-letter-b;
+}
+.#{$ti-prefix}-square-letter-b-filled:before {
+ content: $ti-icon-square-letter-b-filled;
+}
+.#{$ti-prefix}-square-letter-c:before {
+ content: $ti-icon-square-letter-c;
+}
+.#{$ti-prefix}-square-letter-c-filled:before {
+ content: $ti-icon-square-letter-c-filled;
+}
+.#{$ti-prefix}-square-letter-d:before {
+ content: $ti-icon-square-letter-d;
+}
+.#{$ti-prefix}-square-letter-d-filled:before {
+ content: $ti-icon-square-letter-d-filled;
+}
+.#{$ti-prefix}-square-letter-e:before {
+ content: $ti-icon-square-letter-e;
+}
+.#{$ti-prefix}-square-letter-e-filled:before {
+ content: $ti-icon-square-letter-e-filled;
+}
+.#{$ti-prefix}-square-letter-f:before {
+ content: $ti-icon-square-letter-f;
+}
+.#{$ti-prefix}-square-letter-f-filled:before {
+ content: $ti-icon-square-letter-f-filled;
+}
+.#{$ti-prefix}-square-letter-g:before {
+ content: $ti-icon-square-letter-g;
+}
+.#{$ti-prefix}-square-letter-g-filled:before {
+ content: $ti-icon-square-letter-g-filled;
+}
+.#{$ti-prefix}-square-letter-h:before {
+ content: $ti-icon-square-letter-h;
+}
+.#{$ti-prefix}-square-letter-h-filled:before {
+ content: $ti-icon-square-letter-h-filled;
+}
+.#{$ti-prefix}-square-letter-i:before {
+ content: $ti-icon-square-letter-i;
+}
+.#{$ti-prefix}-square-letter-i-filled:before {
+ content: $ti-icon-square-letter-i-filled;
+}
+.#{$ti-prefix}-square-letter-j:before {
+ content: $ti-icon-square-letter-j;
+}
+.#{$ti-prefix}-square-letter-j-filled:before {
+ content: $ti-icon-square-letter-j-filled;
+}
+.#{$ti-prefix}-square-letter-k:before {
+ content: $ti-icon-square-letter-k;
+}
+.#{$ti-prefix}-square-letter-k-filled:before {
+ content: $ti-icon-square-letter-k-filled;
+}
+.#{$ti-prefix}-square-letter-l:before {
+ content: $ti-icon-square-letter-l;
+}
+.#{$ti-prefix}-square-letter-l-filled:before {
+ content: $ti-icon-square-letter-l-filled;
+}
+.#{$ti-prefix}-square-letter-m:before {
+ content: $ti-icon-square-letter-m;
+}
+.#{$ti-prefix}-square-letter-m-filled:before {
+ content: $ti-icon-square-letter-m-filled;
+}
+.#{$ti-prefix}-square-letter-n:before {
+ content: $ti-icon-square-letter-n;
+}
+.#{$ti-prefix}-square-letter-n-filled:before {
+ content: $ti-icon-square-letter-n-filled;
+}
+.#{$ti-prefix}-square-letter-o:before {
+ content: $ti-icon-square-letter-o;
+}
+.#{$ti-prefix}-square-letter-o-filled:before {
+ content: $ti-icon-square-letter-o-filled;
+}
+.#{$ti-prefix}-square-letter-p:before {
+ content: $ti-icon-square-letter-p;
+}
+.#{$ti-prefix}-square-letter-p-filled:before {
+ content: $ti-icon-square-letter-p-filled;
+}
+.#{$ti-prefix}-square-letter-q:before {
+ content: $ti-icon-square-letter-q;
+}
+.#{$ti-prefix}-square-letter-q-filled:before {
+ content: $ti-icon-square-letter-q-filled;
+}
+.#{$ti-prefix}-square-letter-r:before {
+ content: $ti-icon-square-letter-r;
+}
+.#{$ti-prefix}-square-letter-r-filled:before {
+ content: $ti-icon-square-letter-r-filled;
+}
+.#{$ti-prefix}-square-letter-s:before {
+ content: $ti-icon-square-letter-s;
+}
+.#{$ti-prefix}-square-letter-s-filled:before {
+ content: $ti-icon-square-letter-s-filled;
+}
+.#{$ti-prefix}-square-letter-t:before {
+ content: $ti-icon-square-letter-t;
+}
+.#{$ti-prefix}-square-letter-t-filled:before {
+ content: $ti-icon-square-letter-t-filled;
+}
+.#{$ti-prefix}-square-letter-u:before {
+ content: $ti-icon-square-letter-u;
+}
+.#{$ti-prefix}-square-letter-u-filled:before {
+ content: $ti-icon-square-letter-u-filled;
+}
+.#{$ti-prefix}-square-letter-v:before {
+ content: $ti-icon-square-letter-v;
+}
+.#{$ti-prefix}-square-letter-v-filled:before {
+ content: $ti-icon-square-letter-v-filled;
+}
+.#{$ti-prefix}-square-letter-w:before {
+ content: $ti-icon-square-letter-w;
+}
+.#{$ti-prefix}-square-letter-w-filled:before {
+ content: $ti-icon-square-letter-w-filled;
+}
+.#{$ti-prefix}-square-letter-x:before {
+ content: $ti-icon-square-letter-x;
+}
+.#{$ti-prefix}-square-letter-x-filled:before {
+ content: $ti-icon-square-letter-x-filled;
+}
+.#{$ti-prefix}-square-letter-y:before {
+ content: $ti-icon-square-letter-y;
+}
+.#{$ti-prefix}-square-letter-y-filled:before {
+ content: $ti-icon-square-letter-y-filled;
+}
+.#{$ti-prefix}-square-letter-z:before {
+ content: $ti-icon-square-letter-z;
+}
+.#{$ti-prefix}-square-letter-z-filled:before {
+ content: $ti-icon-square-letter-z-filled;
+}
+.#{$ti-prefix}-square-minus:before {
+ content: $ti-icon-square-minus;
+}
+.#{$ti-prefix}-square-minus-filled:before {
+ content: $ti-icon-square-minus-filled;
+}
+.#{$ti-prefix}-square-number-0:before {
+ content: $ti-icon-square-number-0;
+}
+.#{$ti-prefix}-square-number-0-filled:before {
+ content: $ti-icon-square-number-0-filled;
+}
+.#{$ti-prefix}-square-number-1:before {
+ content: $ti-icon-square-number-1;
+}
+.#{$ti-prefix}-square-number-1-filled:before {
+ content: $ti-icon-square-number-1-filled;
+}
+.#{$ti-prefix}-square-number-2:before {
+ content: $ti-icon-square-number-2;
+}
+.#{$ti-prefix}-square-number-2-filled:before {
+ content: $ti-icon-square-number-2-filled;
+}
+.#{$ti-prefix}-square-number-3:before {
+ content: $ti-icon-square-number-3;
+}
+.#{$ti-prefix}-square-number-3-filled:before {
+ content: $ti-icon-square-number-3-filled;
+}
+.#{$ti-prefix}-square-number-4:before {
+ content: $ti-icon-square-number-4;
+}
+.#{$ti-prefix}-square-number-4-filled:before {
+ content: $ti-icon-square-number-4-filled;
+}
+.#{$ti-prefix}-square-number-5:before {
+ content: $ti-icon-square-number-5;
+}
+.#{$ti-prefix}-square-number-5-filled:before {
+ content: $ti-icon-square-number-5-filled;
+}
+.#{$ti-prefix}-square-number-6:before {
+ content: $ti-icon-square-number-6;
+}
+.#{$ti-prefix}-square-number-6-filled:before {
+ content: $ti-icon-square-number-6-filled;
+}
+.#{$ti-prefix}-square-number-7:before {
+ content: $ti-icon-square-number-7;
+}
+.#{$ti-prefix}-square-number-7-filled:before {
+ content: $ti-icon-square-number-7-filled;
+}
+.#{$ti-prefix}-square-number-8:before {
+ content: $ti-icon-square-number-8;
+}
+.#{$ti-prefix}-square-number-8-filled:before {
+ content: $ti-icon-square-number-8-filled;
+}
+.#{$ti-prefix}-square-number-9:before {
+ content: $ti-icon-square-number-9;
+}
+.#{$ti-prefix}-square-number-9-filled:before {
+ content: $ti-icon-square-number-9-filled;
+}
+.#{$ti-prefix}-square-off:before {
+ content: $ti-icon-square-off;
+}
+.#{$ti-prefix}-square-percentage:before {
+ content: $ti-icon-square-percentage;
+}
+.#{$ti-prefix}-square-plus:before {
+ content: $ti-icon-square-plus;
+}
+.#{$ti-prefix}-square-plus-2:before {
+ content: $ti-icon-square-plus-2;
+}
+.#{$ti-prefix}-square-root:before {
+ content: $ti-icon-square-root;
+}
+.#{$ti-prefix}-square-root-2:before {
+ content: $ti-icon-square-root-2;
+}
+.#{$ti-prefix}-square-rotated:before {
+ content: $ti-icon-square-rotated;
+}
+.#{$ti-prefix}-square-rotated-filled:before {
+ content: $ti-icon-square-rotated-filled;
+}
+.#{$ti-prefix}-square-rotated-forbid:before {
+ content: $ti-icon-square-rotated-forbid;
+}
+.#{$ti-prefix}-square-rotated-forbid-2:before {
+ content: $ti-icon-square-rotated-forbid-2;
+}
+.#{$ti-prefix}-square-rotated-off:before {
+ content: $ti-icon-square-rotated-off;
+}
+.#{$ti-prefix}-square-rounded:before {
+ content: $ti-icon-square-rounded;
+}
+.#{$ti-prefix}-square-rounded-arrow-down:before {
+ content: $ti-icon-square-rounded-arrow-down;
+}
+.#{$ti-prefix}-square-rounded-arrow-down-filled:before {
+ content: $ti-icon-square-rounded-arrow-down-filled;
+}
+.#{$ti-prefix}-square-rounded-arrow-left:before {
+ content: $ti-icon-square-rounded-arrow-left;
+}
+.#{$ti-prefix}-square-rounded-arrow-left-filled:before {
+ content: $ti-icon-square-rounded-arrow-left-filled;
+}
+.#{$ti-prefix}-square-rounded-arrow-right:before {
+ content: $ti-icon-square-rounded-arrow-right;
+}
+.#{$ti-prefix}-square-rounded-arrow-right-filled:before {
+ content: $ti-icon-square-rounded-arrow-right-filled;
+}
+.#{$ti-prefix}-square-rounded-arrow-up:before {
+ content: $ti-icon-square-rounded-arrow-up;
+}
+.#{$ti-prefix}-square-rounded-arrow-up-filled:before {
+ content: $ti-icon-square-rounded-arrow-up-filled;
+}
+.#{$ti-prefix}-square-rounded-check:before {
+ content: $ti-icon-square-rounded-check;
+}
+.#{$ti-prefix}-square-rounded-check-filled:before {
+ content: $ti-icon-square-rounded-check-filled;
+}
+.#{$ti-prefix}-square-rounded-chevron-down:before {
+ content: $ti-icon-square-rounded-chevron-down;
+}
+.#{$ti-prefix}-square-rounded-chevron-down-filled:before {
+ content: $ti-icon-square-rounded-chevron-down-filled;
+}
+.#{$ti-prefix}-square-rounded-chevron-left:before {
+ content: $ti-icon-square-rounded-chevron-left;
+}
+.#{$ti-prefix}-square-rounded-chevron-left-filled:before {
+ content: $ti-icon-square-rounded-chevron-left-filled;
+}
+.#{$ti-prefix}-square-rounded-chevron-right:before {
+ content: $ti-icon-square-rounded-chevron-right;
+}
+.#{$ti-prefix}-square-rounded-chevron-right-filled:before {
+ content: $ti-icon-square-rounded-chevron-right-filled;
+}
+.#{$ti-prefix}-square-rounded-chevron-up:before {
+ content: $ti-icon-square-rounded-chevron-up;
+}
+.#{$ti-prefix}-square-rounded-chevron-up-filled:before {
+ content: $ti-icon-square-rounded-chevron-up-filled;
+}
+.#{$ti-prefix}-square-rounded-chevrons-down:before {
+ content: $ti-icon-square-rounded-chevrons-down;
+}
+.#{$ti-prefix}-square-rounded-chevrons-down-filled:before {
+ content: $ti-icon-square-rounded-chevrons-down-filled;
+}
+.#{$ti-prefix}-square-rounded-chevrons-left:before {
+ content: $ti-icon-square-rounded-chevrons-left;
+}
+.#{$ti-prefix}-square-rounded-chevrons-left-filled:before {
+ content: $ti-icon-square-rounded-chevrons-left-filled;
+}
+.#{$ti-prefix}-square-rounded-chevrons-right:before {
+ content: $ti-icon-square-rounded-chevrons-right;
+}
+.#{$ti-prefix}-square-rounded-chevrons-right-filled:before {
+ content: $ti-icon-square-rounded-chevrons-right-filled;
+}
+.#{$ti-prefix}-square-rounded-chevrons-up:before {
+ content: $ti-icon-square-rounded-chevrons-up;
+}
+.#{$ti-prefix}-square-rounded-chevrons-up-filled:before {
+ content: $ti-icon-square-rounded-chevrons-up-filled;
+}
+.#{$ti-prefix}-square-rounded-filled:before {
+ content: $ti-icon-square-rounded-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-a:before {
+ content: $ti-icon-square-rounded-letter-a;
+}
+.#{$ti-prefix}-square-rounded-letter-a-filled:before {
+ content: $ti-icon-square-rounded-letter-a-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-b:before {
+ content: $ti-icon-square-rounded-letter-b;
+}
+.#{$ti-prefix}-square-rounded-letter-b-filled:before {
+ content: $ti-icon-square-rounded-letter-b-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-c:before {
+ content: $ti-icon-square-rounded-letter-c;
+}
+.#{$ti-prefix}-square-rounded-letter-c-filled:before {
+ content: $ti-icon-square-rounded-letter-c-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-d:before {
+ content: $ti-icon-square-rounded-letter-d;
+}
+.#{$ti-prefix}-square-rounded-letter-d-filled:before {
+ content: $ti-icon-square-rounded-letter-d-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-e:before {
+ content: $ti-icon-square-rounded-letter-e;
+}
+.#{$ti-prefix}-square-rounded-letter-e-filled:before {
+ content: $ti-icon-square-rounded-letter-e-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-f:before {
+ content: $ti-icon-square-rounded-letter-f;
+}
+.#{$ti-prefix}-square-rounded-letter-f-filled:before {
+ content: $ti-icon-square-rounded-letter-f-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-g:before {
+ content: $ti-icon-square-rounded-letter-g;
+}
+.#{$ti-prefix}-square-rounded-letter-g-filled:before {
+ content: $ti-icon-square-rounded-letter-g-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-h:before {
+ content: $ti-icon-square-rounded-letter-h;
+}
+.#{$ti-prefix}-square-rounded-letter-h-filled:before {
+ content: $ti-icon-square-rounded-letter-h-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-i:before {
+ content: $ti-icon-square-rounded-letter-i;
+}
+.#{$ti-prefix}-square-rounded-letter-i-filled:before {
+ content: $ti-icon-square-rounded-letter-i-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-j:before {
+ content: $ti-icon-square-rounded-letter-j;
+}
+.#{$ti-prefix}-square-rounded-letter-j-filled:before {
+ content: $ti-icon-square-rounded-letter-j-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-k:before {
+ content: $ti-icon-square-rounded-letter-k;
+}
+.#{$ti-prefix}-square-rounded-letter-k-filled:before {
+ content: $ti-icon-square-rounded-letter-k-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-l:before {
+ content: $ti-icon-square-rounded-letter-l;
+}
+.#{$ti-prefix}-square-rounded-letter-l-filled:before {
+ content: $ti-icon-square-rounded-letter-l-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-m:before {
+ content: $ti-icon-square-rounded-letter-m;
+}
+.#{$ti-prefix}-square-rounded-letter-m-filled:before {
+ content: $ti-icon-square-rounded-letter-m-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-n:before {
+ content: $ti-icon-square-rounded-letter-n;
+}
+.#{$ti-prefix}-square-rounded-letter-n-filled:before {
+ content: $ti-icon-square-rounded-letter-n-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-o:before {
+ content: $ti-icon-square-rounded-letter-o;
+}
+.#{$ti-prefix}-square-rounded-letter-o-filled:before {
+ content: $ti-icon-square-rounded-letter-o-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-p:before {
+ content: $ti-icon-square-rounded-letter-p;
+}
+.#{$ti-prefix}-square-rounded-letter-p-filled:before {
+ content: $ti-icon-square-rounded-letter-p-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-q:before {
+ content: $ti-icon-square-rounded-letter-q;
+}
+.#{$ti-prefix}-square-rounded-letter-q-filled:before {
+ content: $ti-icon-square-rounded-letter-q-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-r:before {
+ content: $ti-icon-square-rounded-letter-r;
+}
+.#{$ti-prefix}-square-rounded-letter-r-filled:before {
+ content: $ti-icon-square-rounded-letter-r-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-s:before {
+ content: $ti-icon-square-rounded-letter-s;
+}
+.#{$ti-prefix}-square-rounded-letter-s-filled:before {
+ content: $ti-icon-square-rounded-letter-s-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-t:before {
+ content: $ti-icon-square-rounded-letter-t;
+}
+.#{$ti-prefix}-square-rounded-letter-t-filled:before {
+ content: $ti-icon-square-rounded-letter-t-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-u:before {
+ content: $ti-icon-square-rounded-letter-u;
+}
+.#{$ti-prefix}-square-rounded-letter-u-filled:before {
+ content: $ti-icon-square-rounded-letter-u-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-v:before {
+ content: $ti-icon-square-rounded-letter-v;
+}
+.#{$ti-prefix}-square-rounded-letter-v-filled:before {
+ content: $ti-icon-square-rounded-letter-v-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-w:before {
+ content: $ti-icon-square-rounded-letter-w;
+}
+.#{$ti-prefix}-square-rounded-letter-w-filled:before {
+ content: $ti-icon-square-rounded-letter-w-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-x:before {
+ content: $ti-icon-square-rounded-letter-x;
+}
+.#{$ti-prefix}-square-rounded-letter-x-filled:before {
+ content: $ti-icon-square-rounded-letter-x-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-y:before {
+ content: $ti-icon-square-rounded-letter-y;
+}
+.#{$ti-prefix}-square-rounded-letter-y-filled:before {
+ content: $ti-icon-square-rounded-letter-y-filled;
+}
+.#{$ti-prefix}-square-rounded-letter-z:before {
+ content: $ti-icon-square-rounded-letter-z;
+}
+.#{$ti-prefix}-square-rounded-letter-z-filled:before {
+ content: $ti-icon-square-rounded-letter-z-filled;
+}
+.#{$ti-prefix}-square-rounded-minus:before {
+ content: $ti-icon-square-rounded-minus;
+}
+.#{$ti-prefix}-square-rounded-minus-2:before {
+ content: $ti-icon-square-rounded-minus-2;
+}
+.#{$ti-prefix}-square-rounded-minus-filled:before {
+ content: $ti-icon-square-rounded-minus-filled;
+}
+.#{$ti-prefix}-square-rounded-number-0:before {
+ content: $ti-icon-square-rounded-number-0;
+}
+.#{$ti-prefix}-square-rounded-number-0-filled:before {
+ content: $ti-icon-square-rounded-number-0-filled;
+}
+.#{$ti-prefix}-square-rounded-number-1:before {
+ content: $ti-icon-square-rounded-number-1;
+}
+.#{$ti-prefix}-square-rounded-number-1-filled:before {
+ content: $ti-icon-square-rounded-number-1-filled;
+}
+.#{$ti-prefix}-square-rounded-number-2:before {
+ content: $ti-icon-square-rounded-number-2;
+}
+.#{$ti-prefix}-square-rounded-number-2-filled:before {
+ content: $ti-icon-square-rounded-number-2-filled;
+}
+.#{$ti-prefix}-square-rounded-number-3:before {
+ content: $ti-icon-square-rounded-number-3;
+}
+.#{$ti-prefix}-square-rounded-number-3-filled:before {
+ content: $ti-icon-square-rounded-number-3-filled;
+}
+.#{$ti-prefix}-square-rounded-number-4:before {
+ content: $ti-icon-square-rounded-number-4;
+}
+.#{$ti-prefix}-square-rounded-number-4-filled:before {
+ content: $ti-icon-square-rounded-number-4-filled;
+}
+.#{$ti-prefix}-square-rounded-number-5:before {
+ content: $ti-icon-square-rounded-number-5;
+}
+.#{$ti-prefix}-square-rounded-number-5-filled:before {
+ content: $ti-icon-square-rounded-number-5-filled;
+}
+.#{$ti-prefix}-square-rounded-number-6:before {
+ content: $ti-icon-square-rounded-number-6;
+}
+.#{$ti-prefix}-square-rounded-number-6-filled:before {
+ content: $ti-icon-square-rounded-number-6-filled;
+}
+.#{$ti-prefix}-square-rounded-number-7:before {
+ content: $ti-icon-square-rounded-number-7;
+}
+.#{$ti-prefix}-square-rounded-number-7-filled:before {
+ content: $ti-icon-square-rounded-number-7-filled;
+}
+.#{$ti-prefix}-square-rounded-number-8:before {
+ content: $ti-icon-square-rounded-number-8;
+}
+.#{$ti-prefix}-square-rounded-number-8-filled:before {
+ content: $ti-icon-square-rounded-number-8-filled;
+}
+.#{$ti-prefix}-square-rounded-number-9:before {
+ content: $ti-icon-square-rounded-number-9;
+}
+.#{$ti-prefix}-square-rounded-number-9-filled:before {
+ content: $ti-icon-square-rounded-number-9-filled;
+}
+.#{$ti-prefix}-square-rounded-percentage:before {
+ content: $ti-icon-square-rounded-percentage;
+}
+.#{$ti-prefix}-square-rounded-plus:before {
+ content: $ti-icon-square-rounded-plus;
+}
+.#{$ti-prefix}-square-rounded-plus-2:before {
+ content: $ti-icon-square-rounded-plus-2;
+}
+.#{$ti-prefix}-square-rounded-plus-filled:before {
+ content: $ti-icon-square-rounded-plus-filled;
+}
+.#{$ti-prefix}-square-rounded-x:before {
+ content: $ti-icon-square-rounded-x;
+}
+.#{$ti-prefix}-square-rounded-x-filled:before {
+ content: $ti-icon-square-rounded-x-filled;
+}
+.#{$ti-prefix}-square-toggle:before {
+ content: $ti-icon-square-toggle;
+}
+.#{$ti-prefix}-square-toggle-horizontal:before {
+ content: $ti-icon-square-toggle-horizontal;
+}
+.#{$ti-prefix}-square-x:before {
+ content: $ti-icon-square-x;
+}
+.#{$ti-prefix}-square-x-filled:before {
+ content: $ti-icon-square-x-filled;
+}
+.#{$ti-prefix}-squares:before {
+ content: $ti-icon-squares;
+}
+.#{$ti-prefix}-squares-diagonal:before {
+ content: $ti-icon-squares-diagonal;
+}
+.#{$ti-prefix}-squares-filled:before {
+ content: $ti-icon-squares-filled;
+}
+.#{$ti-prefix}-squares-selected:before {
+ content: $ti-icon-squares-selected;
+}
+.#{$ti-prefix}-stack:before {
+ content: $ti-icon-stack;
+}
+.#{$ti-prefix}-stack-2:before {
+ content: $ti-icon-stack-2;
+}
+.#{$ti-prefix}-stack-2-filled:before {
+ content: $ti-icon-stack-2-filled;
+}
+.#{$ti-prefix}-stack-3:before {
+ content: $ti-icon-stack-3;
+}
+.#{$ti-prefix}-stack-3-filled:before {
+ content: $ti-icon-stack-3-filled;
+}
+.#{$ti-prefix}-stack-back:before {
+ content: $ti-icon-stack-back;
+}
+.#{$ti-prefix}-stack-backward:before {
+ content: $ti-icon-stack-backward;
+}
+.#{$ti-prefix}-stack-filled:before {
+ content: $ti-icon-stack-filled;
+}
+.#{$ti-prefix}-stack-forward:before {
+ content: $ti-icon-stack-forward;
+}
+.#{$ti-prefix}-stack-front:before {
+ content: $ti-icon-stack-front;
+}
+.#{$ti-prefix}-stack-middle:before {
+ content: $ti-icon-stack-middle;
+}
+.#{$ti-prefix}-stack-pop:before {
+ content: $ti-icon-stack-pop;
+}
+.#{$ti-prefix}-stack-push:before {
+ content: $ti-icon-stack-push;
+}
+.#{$ti-prefix}-stairs:before {
+ content: $ti-icon-stairs;
+}
+.#{$ti-prefix}-stairs-down:before {
+ content: $ti-icon-stairs-down;
+}
+.#{$ti-prefix}-stairs-up:before {
+ content: $ti-icon-stairs-up;
+}
+.#{$ti-prefix}-star:before {
+ content: $ti-icon-star;
+}
+.#{$ti-prefix}-star-filled:before {
+ content: $ti-icon-star-filled;
+}
+.#{$ti-prefix}-star-half:before {
+ content: $ti-icon-star-half;
+}
+.#{$ti-prefix}-star-half-filled:before {
+ content: $ti-icon-star-half-filled;
+}
+.#{$ti-prefix}-star-off:before {
+ content: $ti-icon-star-off;
+}
+.#{$ti-prefix}-stars:before {
+ content: $ti-icon-stars;
+}
+.#{$ti-prefix}-stars-filled:before {
+ content: $ti-icon-stars-filled;
+}
+.#{$ti-prefix}-stars-off:before {
+ content: $ti-icon-stars-off;
+}
+.#{$ti-prefix}-status-change:before {
+ content: $ti-icon-status-change;
+}
+.#{$ti-prefix}-steam:before {
+ content: $ti-icon-steam;
+}
+.#{$ti-prefix}-steering-wheel:before {
+ content: $ti-icon-steering-wheel;
+}
+.#{$ti-prefix}-steering-wheel-off:before {
+ content: $ti-icon-steering-wheel-off;
+}
+.#{$ti-prefix}-step-into:before {
+ content: $ti-icon-step-into;
+}
+.#{$ti-prefix}-step-out:before {
+ content: $ti-icon-step-out;
+}
+.#{$ti-prefix}-stereo-glasses:before {
+ content: $ti-icon-stereo-glasses;
+}
+.#{$ti-prefix}-stethoscope:before {
+ content: $ti-icon-stethoscope;
+}
+.#{$ti-prefix}-stethoscope-off:before {
+ content: $ti-icon-stethoscope-off;
+}
+.#{$ti-prefix}-sticker:before {
+ content: $ti-icon-sticker;
+}
+.#{$ti-prefix}-sticker-2:before {
+ content: $ti-icon-sticker-2;
+}
+.#{$ti-prefix}-storm:before {
+ content: $ti-icon-storm;
+}
+.#{$ti-prefix}-storm-off:before {
+ content: $ti-icon-storm-off;
+}
+.#{$ti-prefix}-stretching:before {
+ content: $ti-icon-stretching;
+}
+.#{$ti-prefix}-stretching-2:before {
+ content: $ti-icon-stretching-2;
+}
+.#{$ti-prefix}-strikethrough:before {
+ content: $ti-icon-strikethrough;
+}
+.#{$ti-prefix}-submarine:before {
+ content: $ti-icon-submarine;
+}
+.#{$ti-prefix}-subscript:before {
+ content: $ti-icon-subscript;
+}
+.#{$ti-prefix}-subtask:before {
+ content: $ti-icon-subtask;
+}
+.#{$ti-prefix}-sum:before {
+ content: $ti-icon-sum;
+}
+.#{$ti-prefix}-sum-off:before {
+ content: $ti-icon-sum-off;
+}
+.#{$ti-prefix}-sun:before {
+ content: $ti-icon-sun;
+}
+.#{$ti-prefix}-sun-electricity:before {
+ content: $ti-icon-sun-electricity;
+}
+.#{$ti-prefix}-sun-filled:before {
+ content: $ti-icon-sun-filled;
+}
+.#{$ti-prefix}-sun-high:before {
+ content: $ti-icon-sun-high;
+}
+.#{$ti-prefix}-sun-low:before {
+ content: $ti-icon-sun-low;
+}
+.#{$ti-prefix}-sun-moon:before {
+ content: $ti-icon-sun-moon;
+}
+.#{$ti-prefix}-sun-off:before {
+ content: $ti-icon-sun-off;
+}
+.#{$ti-prefix}-sun-wind:before {
+ content: $ti-icon-sun-wind;
+}
+.#{$ti-prefix}-sunglasses:before {
+ content: $ti-icon-sunglasses;
+}
+.#{$ti-prefix}-sunglasses-filled:before {
+ content: $ti-icon-sunglasses-filled;
+}
+.#{$ti-prefix}-sunrise:before {
+ content: $ti-icon-sunrise;
+}
+.#{$ti-prefix}-sunset:before {
+ content: $ti-icon-sunset;
+}
+.#{$ti-prefix}-sunset-2:before {
+ content: $ti-icon-sunset-2;
+}
+.#{$ti-prefix}-superscript:before {
+ content: $ti-icon-superscript;
+}
+.#{$ti-prefix}-svg:before {
+ content: $ti-icon-svg;
+}
+.#{$ti-prefix}-swimming:before {
+ content: $ti-icon-swimming;
+}
+.#{$ti-prefix}-swipe:before {
+ content: $ti-icon-swipe;
+}
+.#{$ti-prefix}-swipe-down:before {
+ content: $ti-icon-swipe-down;
+}
+.#{$ti-prefix}-swipe-left:before {
+ content: $ti-icon-swipe-left;
+}
+.#{$ti-prefix}-swipe-right:before {
+ content: $ti-icon-swipe-right;
+}
+.#{$ti-prefix}-swipe-up:before {
+ content: $ti-icon-swipe-up;
+}
+.#{$ti-prefix}-switch:before {
+ content: $ti-icon-switch;
+}
+.#{$ti-prefix}-switch-2:before {
+ content: $ti-icon-switch-2;
+}
+.#{$ti-prefix}-switch-3:before {
+ content: $ti-icon-switch-3;
+}
+.#{$ti-prefix}-switch-horizontal:before {
+ content: $ti-icon-switch-horizontal;
+}
+.#{$ti-prefix}-switch-vertical:before {
+ content: $ti-icon-switch-vertical;
+}
+.#{$ti-prefix}-sword:before {
+ content: $ti-icon-sword;
+}
+.#{$ti-prefix}-sword-off:before {
+ content: $ti-icon-sword-off;
+}
+.#{$ti-prefix}-swords:before {
+ content: $ti-icon-swords;
+}
+.#{$ti-prefix}-table:before {
+ content: $ti-icon-table;
+}
+.#{$ti-prefix}-table-alias:before {
+ content: $ti-icon-table-alias;
+}
+.#{$ti-prefix}-table-column:before {
+ content: $ti-icon-table-column;
+}
+.#{$ti-prefix}-table-down:before {
+ content: $ti-icon-table-down;
+}
+.#{$ti-prefix}-table-export:before {
+ content: $ti-icon-table-export;
+}
+.#{$ti-prefix}-table-filled:before {
+ content: $ti-icon-table-filled;
+}
+.#{$ti-prefix}-table-heart:before {
+ content: $ti-icon-table-heart;
+}
+.#{$ti-prefix}-table-import:before {
+ content: $ti-icon-table-import;
+}
+.#{$ti-prefix}-table-minus:before {
+ content: $ti-icon-table-minus;
+}
+.#{$ti-prefix}-table-off:before {
+ content: $ti-icon-table-off;
+}
+.#{$ti-prefix}-table-options:before {
+ content: $ti-icon-table-options;
+}
+.#{$ti-prefix}-table-plus:before {
+ content: $ti-icon-table-plus;
+}
+.#{$ti-prefix}-table-row:before {
+ content: $ti-icon-table-row;
+}
+.#{$ti-prefix}-table-share:before {
+ content: $ti-icon-table-share;
+}
+.#{$ti-prefix}-table-shortcut:before {
+ content: $ti-icon-table-shortcut;
+}
+.#{$ti-prefix}-tag:before {
+ content: $ti-icon-tag;
+}
+.#{$ti-prefix}-tag-off:before {
+ content: $ti-icon-tag-off;
+}
+.#{$ti-prefix}-tag-starred:before {
+ content: $ti-icon-tag-starred;
+}
+.#{$ti-prefix}-tags:before {
+ content: $ti-icon-tags;
+}
+.#{$ti-prefix}-tags-off:before {
+ content: $ti-icon-tags-off;
+}
+.#{$ti-prefix}-tallymark-1:before {
+ content: $ti-icon-tallymark-1;
+}
+.#{$ti-prefix}-tallymark-2:before {
+ content: $ti-icon-tallymark-2;
+}
+.#{$ti-prefix}-tallymark-3:before {
+ content: $ti-icon-tallymark-3;
+}
+.#{$ti-prefix}-tallymark-4:before {
+ content: $ti-icon-tallymark-4;
+}
+.#{$ti-prefix}-tallymarks:before {
+ content: $ti-icon-tallymarks;
+}
+.#{$ti-prefix}-tank:before {
+ content: $ti-icon-tank;
+}
+.#{$ti-prefix}-target:before {
+ content: $ti-icon-target;
+}
+.#{$ti-prefix}-target-arrow:before {
+ content: $ti-icon-target-arrow;
+}
+.#{$ti-prefix}-target-off:before {
+ content: $ti-icon-target-off;
+}
+.#{$ti-prefix}-teapot:before {
+ content: $ti-icon-teapot;
+}
+.#{$ti-prefix}-telescope:before {
+ content: $ti-icon-telescope;
+}
+.#{$ti-prefix}-telescope-off:before {
+ content: $ti-icon-telescope-off;
+}
+.#{$ti-prefix}-temperature:before {
+ content: $ti-icon-temperature;
+}
+.#{$ti-prefix}-temperature-celsius:before {
+ content: $ti-icon-temperature-celsius;
+}
+.#{$ti-prefix}-temperature-fahrenheit:before {
+ content: $ti-icon-temperature-fahrenheit;
+}
+.#{$ti-prefix}-temperature-minus:before {
+ content: $ti-icon-temperature-minus;
+}
+.#{$ti-prefix}-temperature-off:before {
+ content: $ti-icon-temperature-off;
+}
+.#{$ti-prefix}-temperature-plus:before {
+ content: $ti-icon-temperature-plus;
+}
+.#{$ti-prefix}-temperature-snow:before {
+ content: $ti-icon-temperature-snow;
+}
+.#{$ti-prefix}-temperature-sun:before {
+ content: $ti-icon-temperature-sun;
+}
+.#{$ti-prefix}-template:before {
+ content: $ti-icon-template;
+}
+.#{$ti-prefix}-template-off:before {
+ content: $ti-icon-template-off;
+}
+.#{$ti-prefix}-tent:before {
+ content: $ti-icon-tent;
+}
+.#{$ti-prefix}-tent-off:before {
+ content: $ti-icon-tent-off;
+}
+.#{$ti-prefix}-terminal:before {
+ content: $ti-icon-terminal;
+}
+.#{$ti-prefix}-terminal-2:before {
+ content: $ti-icon-terminal-2;
+}
+.#{$ti-prefix}-test-pipe:before {
+ content: $ti-icon-test-pipe;
+}
+.#{$ti-prefix}-test-pipe-2:before {
+ content: $ti-icon-test-pipe-2;
+}
+.#{$ti-prefix}-test-pipe-off:before {
+ content: $ti-icon-test-pipe-off;
+}
+.#{$ti-prefix}-tex:before {
+ content: $ti-icon-tex;
+}
+.#{$ti-prefix}-text-caption:before {
+ content: $ti-icon-text-caption;
+}
+.#{$ti-prefix}-text-color:before {
+ content: $ti-icon-text-color;
+}
+.#{$ti-prefix}-text-decrease:before {
+ content: $ti-icon-text-decrease;
+}
+.#{$ti-prefix}-text-direction-ltr:before {
+ content: $ti-icon-text-direction-ltr;
+}
+.#{$ti-prefix}-text-direction-rtl:before {
+ content: $ti-icon-text-direction-rtl;
+}
+.#{$ti-prefix}-text-grammar:before {
+ content: $ti-icon-text-grammar;
+}
+.#{$ti-prefix}-text-increase:before {
+ content: $ti-icon-text-increase;
+}
+.#{$ti-prefix}-text-orientation:before {
+ content: $ti-icon-text-orientation;
+}
+.#{$ti-prefix}-text-plus:before {
+ content: $ti-icon-text-plus;
+}
+.#{$ti-prefix}-text-recognition:before {
+ content: $ti-icon-text-recognition;
+}
+.#{$ti-prefix}-text-resize:before {
+ content: $ti-icon-text-resize;
+}
+.#{$ti-prefix}-text-scan-2:before {
+ content: $ti-icon-text-scan-2;
+}
+.#{$ti-prefix}-text-size:before {
+ content: $ti-icon-text-size;
+}
+.#{$ti-prefix}-text-spellcheck:before {
+ content: $ti-icon-text-spellcheck;
+}
+.#{$ti-prefix}-text-wrap:before {
+ content: $ti-icon-text-wrap;
+}
+.#{$ti-prefix}-text-wrap-column:before {
+ content: $ti-icon-text-wrap-column;
+}
+.#{$ti-prefix}-text-wrap-disabled:before {
+ content: $ti-icon-text-wrap-disabled;
+}
+.#{$ti-prefix}-texture:before {
+ content: $ti-icon-texture;
+}
+.#{$ti-prefix}-theater:before {
+ content: $ti-icon-theater;
+}
+.#{$ti-prefix}-thermometer:before {
+ content: $ti-icon-thermometer;
+}
+.#{$ti-prefix}-thumb-down:before {
+ content: $ti-icon-thumb-down;
+}
+.#{$ti-prefix}-thumb-down-filled:before {
+ content: $ti-icon-thumb-down-filled;
+}
+.#{$ti-prefix}-thumb-down-off:before {
+ content: $ti-icon-thumb-down-off;
+}
+.#{$ti-prefix}-thumb-up:before {
+ content: $ti-icon-thumb-up;
+}
+.#{$ti-prefix}-thumb-up-filled:before {
+ content: $ti-icon-thumb-up-filled;
+}
+.#{$ti-prefix}-thumb-up-off:before {
+ content: $ti-icon-thumb-up-off;
+}
+.#{$ti-prefix}-tic-tac:before {
+ content: $ti-icon-tic-tac;
+}
+.#{$ti-prefix}-ticket:before {
+ content: $ti-icon-ticket;
+}
+.#{$ti-prefix}-ticket-off:before {
+ content: $ti-icon-ticket-off;
+}
+.#{$ti-prefix}-tie:before {
+ content: $ti-icon-tie;
+}
+.#{$ti-prefix}-tilde:before {
+ content: $ti-icon-tilde;
+}
+.#{$ti-prefix}-tilt-shift:before {
+ content: $ti-icon-tilt-shift;
+}
+.#{$ti-prefix}-tilt-shift-filled:before {
+ content: $ti-icon-tilt-shift-filled;
+}
+.#{$ti-prefix}-tilt-shift-off:before {
+ content: $ti-icon-tilt-shift-off;
+}
+.#{$ti-prefix}-time-duration-0:before {
+ content: $ti-icon-time-duration-0;
+}
+.#{$ti-prefix}-time-duration-10:before {
+ content: $ti-icon-time-duration-10;
+}
+.#{$ti-prefix}-time-duration-15:before {
+ content: $ti-icon-time-duration-15;
+}
+.#{$ti-prefix}-time-duration-30:before {
+ content: $ti-icon-time-duration-30;
+}
+.#{$ti-prefix}-time-duration-45:before {
+ content: $ti-icon-time-duration-45;
+}
+.#{$ti-prefix}-time-duration-5:before {
+ content: $ti-icon-time-duration-5;
+}
+.#{$ti-prefix}-time-duration-60:before {
+ content: $ti-icon-time-duration-60;
+}
+.#{$ti-prefix}-time-duration-90:before {
+ content: $ti-icon-time-duration-90;
+}
+.#{$ti-prefix}-time-duration-off:before {
+ content: $ti-icon-time-duration-off;
+}
+.#{$ti-prefix}-timeline:before {
+ content: $ti-icon-timeline;
+}
+.#{$ti-prefix}-timeline-event:before {
+ content: $ti-icon-timeline-event;
+}
+.#{$ti-prefix}-timeline-event-exclamation:before {
+ content: $ti-icon-timeline-event-exclamation;
+}
+.#{$ti-prefix}-timeline-event-filled:before {
+ content: $ti-icon-timeline-event-filled;
+}
+.#{$ti-prefix}-timeline-event-minus:before {
+ content: $ti-icon-timeline-event-minus;
+}
+.#{$ti-prefix}-timeline-event-plus:before {
+ content: $ti-icon-timeline-event-plus;
+}
+.#{$ti-prefix}-timeline-event-text:before {
+ content: $ti-icon-timeline-event-text;
+}
+.#{$ti-prefix}-timeline-event-x:before {
+ content: $ti-icon-timeline-event-x;
+}
+.#{$ti-prefix}-tir:before {
+ content: $ti-icon-tir;
+}
+.#{$ti-prefix}-toggle-left:before {
+ content: $ti-icon-toggle-left;
+}
+.#{$ti-prefix}-toggle-left-filled:before {
+ content: $ti-icon-toggle-left-filled;
+}
+.#{$ti-prefix}-toggle-right:before {
+ content: $ti-icon-toggle-right;
+}
+.#{$ti-prefix}-toggle-right-filled:before {
+ content: $ti-icon-toggle-right-filled;
+}
+.#{$ti-prefix}-toilet-paper:before {
+ content: $ti-icon-toilet-paper;
+}
+.#{$ti-prefix}-toilet-paper-off:before {
+ content: $ti-icon-toilet-paper-off;
+}
+.#{$ti-prefix}-toml:before {
+ content: $ti-icon-toml;
+}
+.#{$ti-prefix}-tool:before {
+ content: $ti-icon-tool;
+}
+.#{$ti-prefix}-tools:before {
+ content: $ti-icon-tools;
+}
+.#{$ti-prefix}-tools-kitchen:before {
+ content: $ti-icon-tools-kitchen;
+}
+.#{$ti-prefix}-tools-kitchen-2:before {
+ content: $ti-icon-tools-kitchen-2;
+}
+.#{$ti-prefix}-tools-kitchen-2-off:before {
+ content: $ti-icon-tools-kitchen-2-off;
+}
+.#{$ti-prefix}-tools-kitchen-3:before {
+ content: $ti-icon-tools-kitchen-3;
+}
+.#{$ti-prefix}-tools-kitchen-off:before {
+ content: $ti-icon-tools-kitchen-off;
+}
+.#{$ti-prefix}-tools-off:before {
+ content: $ti-icon-tools-off;
+}
+.#{$ti-prefix}-tooltip:before {
+ content: $ti-icon-tooltip;
+}
+.#{$ti-prefix}-topology-bus:before {
+ content: $ti-icon-topology-bus;
+}
+.#{$ti-prefix}-topology-complex:before {
+ content: $ti-icon-topology-complex;
+}
+.#{$ti-prefix}-topology-full:before {
+ content: $ti-icon-topology-full;
+}
+.#{$ti-prefix}-topology-full-hierarchy:before {
+ content: $ti-icon-topology-full-hierarchy;
+}
+.#{$ti-prefix}-topology-ring:before {
+ content: $ti-icon-topology-ring;
+}
+.#{$ti-prefix}-topology-ring-2:before {
+ content: $ti-icon-topology-ring-2;
+}
+.#{$ti-prefix}-topology-ring-3:before {
+ content: $ti-icon-topology-ring-3;
+}
+.#{$ti-prefix}-topology-star:before {
+ content: $ti-icon-topology-star;
+}
+.#{$ti-prefix}-topology-star-2:before {
+ content: $ti-icon-topology-star-2;
+}
+.#{$ti-prefix}-topology-star-3:before {
+ content: $ti-icon-topology-star-3;
+}
+.#{$ti-prefix}-topology-star-ring:before {
+ content: $ti-icon-topology-star-ring;
+}
+.#{$ti-prefix}-topology-star-ring-2:before {
+ content: $ti-icon-topology-star-ring-2;
+}
+.#{$ti-prefix}-topology-star-ring-3:before {
+ content: $ti-icon-topology-star-ring-3;
+}
+.#{$ti-prefix}-torii:before {
+ content: $ti-icon-torii;
+}
+.#{$ti-prefix}-tornado:before {
+ content: $ti-icon-tornado;
+}
+.#{$ti-prefix}-tournament:before {
+ content: $ti-icon-tournament;
+}
+.#{$ti-prefix}-tower:before {
+ content: $ti-icon-tower;
+}
+.#{$ti-prefix}-tower-off:before {
+ content: $ti-icon-tower-off;
+}
+.#{$ti-prefix}-track:before {
+ content: $ti-icon-track;
+}
+.#{$ti-prefix}-tractor:before {
+ content: $ti-icon-tractor;
+}
+.#{$ti-prefix}-trademark:before {
+ content: $ti-icon-trademark;
+}
+.#{$ti-prefix}-traffic-cone:before {
+ content: $ti-icon-traffic-cone;
+}
+.#{$ti-prefix}-traffic-cone-off:before {
+ content: $ti-icon-traffic-cone-off;
+}
+.#{$ti-prefix}-traffic-lights:before {
+ content: $ti-icon-traffic-lights;
+}
+.#{$ti-prefix}-traffic-lights-off:before {
+ content: $ti-icon-traffic-lights-off;
+}
+.#{$ti-prefix}-train:before {
+ content: $ti-icon-train;
+}
+.#{$ti-prefix}-transaction-bitcoin:before {
+ content: $ti-icon-transaction-bitcoin;
+}
+.#{$ti-prefix}-transaction-dollar:before {
+ content: $ti-icon-transaction-dollar;
+}
+.#{$ti-prefix}-transaction-euro:before {
+ content: $ti-icon-transaction-euro;
+}
+.#{$ti-prefix}-transaction-pound:before {
+ content: $ti-icon-transaction-pound;
+}
+.#{$ti-prefix}-transaction-rupee:before {
+ content: $ti-icon-transaction-rupee;
+}
+.#{$ti-prefix}-transaction-yen:before {
+ content: $ti-icon-transaction-yen;
+}
+.#{$ti-prefix}-transaction-yuan:before {
+ content: $ti-icon-transaction-yuan;
+}
+.#{$ti-prefix}-transfer:before {
+ content: $ti-icon-transfer;
+}
+.#{$ti-prefix}-transfer-in:before {
+ content: $ti-icon-transfer-in;
+}
+.#{$ti-prefix}-transfer-out:before {
+ content: $ti-icon-transfer-out;
+}
+.#{$ti-prefix}-transfer-vertical:before {
+ content: $ti-icon-transfer-vertical;
+}
+.#{$ti-prefix}-transform:before {
+ content: $ti-icon-transform;
+}
+.#{$ti-prefix}-transform-filled:before {
+ content: $ti-icon-transform-filled;
+}
+.#{$ti-prefix}-transform-point:before {
+ content: $ti-icon-transform-point;
+}
+.#{$ti-prefix}-transform-point-bottom-left:before {
+ content: $ti-icon-transform-point-bottom-left;
+}
+.#{$ti-prefix}-transform-point-bottom-right:before {
+ content: $ti-icon-transform-point-bottom-right;
+}
+.#{$ti-prefix}-transform-point-top-left:before {
+ content: $ti-icon-transform-point-top-left;
+}
+.#{$ti-prefix}-transform-point-top-right:before {
+ content: $ti-icon-transform-point-top-right;
+}
+.#{$ti-prefix}-transition-bottom:before {
+ content: $ti-icon-transition-bottom;
+}
+.#{$ti-prefix}-transition-bottom-filled:before {
+ content: $ti-icon-transition-bottom-filled;
+}
+.#{$ti-prefix}-transition-left:before {
+ content: $ti-icon-transition-left;
+}
+.#{$ti-prefix}-transition-left-filled:before {
+ content: $ti-icon-transition-left-filled;
+}
+.#{$ti-prefix}-transition-right:before {
+ content: $ti-icon-transition-right;
+}
+.#{$ti-prefix}-transition-right-filled:before {
+ content: $ti-icon-transition-right-filled;
+}
+.#{$ti-prefix}-transition-top:before {
+ content: $ti-icon-transition-top;
+}
+.#{$ti-prefix}-transition-top-filled:before {
+ content: $ti-icon-transition-top-filled;
+}
+.#{$ti-prefix}-trash:before {
+ content: $ti-icon-trash;
+}
+.#{$ti-prefix}-trash-filled:before {
+ content: $ti-icon-trash-filled;
+}
+.#{$ti-prefix}-trash-off:before {
+ content: $ti-icon-trash-off;
+}
+.#{$ti-prefix}-trash-x:before {
+ content: $ti-icon-trash-x;
+}
+.#{$ti-prefix}-trash-x-filled:before {
+ content: $ti-icon-trash-x-filled;
+}
+.#{$ti-prefix}-treadmill:before {
+ content: $ti-icon-treadmill;
+}
+.#{$ti-prefix}-tree:before {
+ content: $ti-icon-tree;
+}
+.#{$ti-prefix}-trees:before {
+ content: $ti-icon-trees;
+}
+.#{$ti-prefix}-trekking:before {
+ content: $ti-icon-trekking;
+}
+.#{$ti-prefix}-trending-down:before {
+ content: $ti-icon-trending-down;
+}
+.#{$ti-prefix}-trending-down-2:before {
+ content: $ti-icon-trending-down-2;
+}
+.#{$ti-prefix}-trending-down-3:before {
+ content: $ti-icon-trending-down-3;
+}
+.#{$ti-prefix}-trending-up:before {
+ content: $ti-icon-trending-up;
+}
+.#{$ti-prefix}-trending-up-2:before {
+ content: $ti-icon-trending-up-2;
+}
+.#{$ti-prefix}-trending-up-3:before {
+ content: $ti-icon-trending-up-3;
+}
+.#{$ti-prefix}-triangle:before {
+ content: $ti-icon-triangle;
+}
+.#{$ti-prefix}-triangle-filled:before {
+ content: $ti-icon-triangle-filled;
+}
+.#{$ti-prefix}-triangle-inverted:before {
+ content: $ti-icon-triangle-inverted;
+}
+.#{$ti-prefix}-triangle-inverted-filled:before {
+ content: $ti-icon-triangle-inverted-filled;
+}
+.#{$ti-prefix}-triangle-minus:before {
+ content: $ti-icon-triangle-minus;
+}
+.#{$ti-prefix}-triangle-minus-2:before {
+ content: $ti-icon-triangle-minus-2;
+}
+.#{$ti-prefix}-triangle-off:before {
+ content: $ti-icon-triangle-off;
+}
+.#{$ti-prefix}-triangle-plus:before {
+ content: $ti-icon-triangle-plus;
+}
+.#{$ti-prefix}-triangle-plus-2:before {
+ content: $ti-icon-triangle-plus-2;
+}
+.#{$ti-prefix}-triangle-square-circle:before {
+ content: $ti-icon-triangle-square-circle;
+}
+.#{$ti-prefix}-triangle-square-circle-filled:before {
+ content: $ti-icon-triangle-square-circle-filled;
+}
+.#{$ti-prefix}-triangles:before {
+ content: $ti-icon-triangles;
+}
+.#{$ti-prefix}-trident:before {
+ content: $ti-icon-trident;
+}
+.#{$ti-prefix}-trolley:before {
+ content: $ti-icon-trolley;
+}
+.#{$ti-prefix}-trophy:before {
+ content: $ti-icon-trophy;
+}
+.#{$ti-prefix}-trophy-filled:before {
+ content: $ti-icon-trophy-filled;
+}
+.#{$ti-prefix}-trophy-off:before {
+ content: $ti-icon-trophy-off;
+}
+.#{$ti-prefix}-trowel:before {
+ content: $ti-icon-trowel;
+}
+.#{$ti-prefix}-truck:before {
+ content: $ti-icon-truck;
+}
+.#{$ti-prefix}-truck-delivery:before {
+ content: $ti-icon-truck-delivery;
+}
+.#{$ti-prefix}-truck-loading:before {
+ content: $ti-icon-truck-loading;
+}
+.#{$ti-prefix}-truck-off:before {
+ content: $ti-icon-truck-off;
+}
+.#{$ti-prefix}-truck-return:before {
+ content: $ti-icon-truck-return;
+}
+.#{$ti-prefix}-txt:before {
+ content: $ti-icon-txt;
+}
+.#{$ti-prefix}-typeface:before {
+ content: $ti-icon-typeface;
+}
+.#{$ti-prefix}-typography:before {
+ content: $ti-icon-typography;
+}
+.#{$ti-prefix}-typography-off:before {
+ content: $ti-icon-typography-off;
+}
+.#{$ti-prefix}-u-turn-left:before {
+ content: $ti-icon-u-turn-left;
+}
+.#{$ti-prefix}-u-turn-right:before {
+ content: $ti-icon-u-turn-right;
+}
+.#{$ti-prefix}-ufo:before {
+ content: $ti-icon-ufo;
+}
+.#{$ti-prefix}-ufo-off:before {
+ content: $ti-icon-ufo-off;
+}
+.#{$ti-prefix}-umbrella:before {
+ content: $ti-icon-umbrella;
+}
+.#{$ti-prefix}-umbrella-filled:before {
+ content: $ti-icon-umbrella-filled;
+}
+.#{$ti-prefix}-umbrella-off:before {
+ content: $ti-icon-umbrella-off;
+}
+.#{$ti-prefix}-underline:before {
+ content: $ti-icon-underline;
+}
+.#{$ti-prefix}-universe:before {
+ content: $ti-icon-universe;
+}
+.#{$ti-prefix}-unlink:before {
+ content: $ti-icon-unlink;
+}
+.#{$ti-prefix}-upload:before {
+ content: $ti-icon-upload;
+}
+.#{$ti-prefix}-urgent:before {
+ content: $ti-icon-urgent;
+}
+.#{$ti-prefix}-usb:before {
+ content: $ti-icon-usb;
+}
+.#{$ti-prefix}-user:before {
+ content: $ti-icon-user;
+}
+.#{$ti-prefix}-user-bolt:before {
+ content: $ti-icon-user-bolt;
+}
+.#{$ti-prefix}-user-cancel:before {
+ content: $ti-icon-user-cancel;
+}
+.#{$ti-prefix}-user-check:before {
+ content: $ti-icon-user-check;
+}
+.#{$ti-prefix}-user-circle:before {
+ content: $ti-icon-user-circle;
+}
+.#{$ti-prefix}-user-code:before {
+ content: $ti-icon-user-code;
+}
+.#{$ti-prefix}-user-cog:before {
+ content: $ti-icon-user-cog;
+}
+.#{$ti-prefix}-user-dollar:before {
+ content: $ti-icon-user-dollar;
+}
+.#{$ti-prefix}-user-down:before {
+ content: $ti-icon-user-down;
+}
+.#{$ti-prefix}-user-edit:before {
+ content: $ti-icon-user-edit;
+}
+.#{$ti-prefix}-user-exclamation:before {
+ content: $ti-icon-user-exclamation;
+}
+.#{$ti-prefix}-user-filled:before {
+ content: $ti-icon-user-filled;
+}
+.#{$ti-prefix}-user-heart:before {
+ content: $ti-icon-user-heart;
+}
+.#{$ti-prefix}-user-hexagon:before {
+ content: $ti-icon-user-hexagon;
+}
+.#{$ti-prefix}-user-minus:before {
+ content: $ti-icon-user-minus;
+}
+.#{$ti-prefix}-user-off:before {
+ content: $ti-icon-user-off;
+}
+.#{$ti-prefix}-user-pause:before {
+ content: $ti-icon-user-pause;
+}
+.#{$ti-prefix}-user-pentagon:before {
+ content: $ti-icon-user-pentagon;
+}
+.#{$ti-prefix}-user-pin:before {
+ content: $ti-icon-user-pin;
+}
+.#{$ti-prefix}-user-plus:before {
+ content: $ti-icon-user-plus;
+}
+.#{$ti-prefix}-user-question:before {
+ content: $ti-icon-user-question;
+}
+.#{$ti-prefix}-user-scan:before {
+ content: $ti-icon-user-scan;
+}
+.#{$ti-prefix}-user-screen:before {
+ content: $ti-icon-user-screen;
+}
+.#{$ti-prefix}-user-search:before {
+ content: $ti-icon-user-search;
+}
+.#{$ti-prefix}-user-share:before {
+ content: $ti-icon-user-share;
+}
+.#{$ti-prefix}-user-shield:before {
+ content: $ti-icon-user-shield;
+}
+.#{$ti-prefix}-user-square:before {
+ content: $ti-icon-user-square;
+}
+.#{$ti-prefix}-user-square-rounded:before {
+ content: $ti-icon-user-square-rounded;
+}
+.#{$ti-prefix}-user-star:before {
+ content: $ti-icon-user-star;
+}
+.#{$ti-prefix}-user-up:before {
+ content: $ti-icon-user-up;
+}
+.#{$ti-prefix}-user-x:before {
+ content: $ti-icon-user-x;
+}
+.#{$ti-prefix}-users:before {
+ content: $ti-icon-users;
+}
+.#{$ti-prefix}-users-group:before {
+ content: $ti-icon-users-group;
+}
+.#{$ti-prefix}-users-minus:before {
+ content: $ti-icon-users-minus;
+}
+.#{$ti-prefix}-users-plus:before {
+ content: $ti-icon-users-plus;
+}
+.#{$ti-prefix}-uv-index:before {
+ content: $ti-icon-uv-index;
+}
+.#{$ti-prefix}-ux-circle:before {
+ content: $ti-icon-ux-circle;
+}
+.#{$ti-prefix}-vaccine:before {
+ content: $ti-icon-vaccine;
+}
+.#{$ti-prefix}-vaccine-bottle:before {
+ content: $ti-icon-vaccine-bottle;
+}
+.#{$ti-prefix}-vaccine-bottle-off:before {
+ content: $ti-icon-vaccine-bottle-off;
+}
+.#{$ti-prefix}-vaccine-off:before {
+ content: $ti-icon-vaccine-off;
+}
+.#{$ti-prefix}-vacuum-cleaner:before {
+ content: $ti-icon-vacuum-cleaner;
+}
+.#{$ti-prefix}-variable:before {
+ content: $ti-icon-variable;
+}
+.#{$ti-prefix}-variable-minus:before {
+ content: $ti-icon-variable-minus;
+}
+.#{$ti-prefix}-variable-off:before {
+ content: $ti-icon-variable-off;
+}
+.#{$ti-prefix}-variable-plus:before {
+ content: $ti-icon-variable-plus;
+}
+.#{$ti-prefix}-vector:before {
+ content: $ti-icon-vector;
+}
+.#{$ti-prefix}-vector-bezier:before {
+ content: $ti-icon-vector-bezier;
+}
+.#{$ti-prefix}-vector-bezier-2:before {
+ content: $ti-icon-vector-bezier-2;
+}
+.#{$ti-prefix}-vector-bezier-arc:before {
+ content: $ti-icon-vector-bezier-arc;
+}
+.#{$ti-prefix}-vector-bezier-circle:before {
+ content: $ti-icon-vector-bezier-circle;
+}
+.#{$ti-prefix}-vector-off:before {
+ content: $ti-icon-vector-off;
+}
+.#{$ti-prefix}-vector-spline:before {
+ content: $ti-icon-vector-spline;
+}
+.#{$ti-prefix}-vector-triangle:before {
+ content: $ti-icon-vector-triangle;
+}
+.#{$ti-prefix}-vector-triangle-off:before {
+ content: $ti-icon-vector-triangle-off;
+}
+.#{$ti-prefix}-venus:before {
+ content: $ti-icon-venus;
+}
+.#{$ti-prefix}-versions:before {
+ content: $ti-icon-versions;
+}
+.#{$ti-prefix}-versions-filled:before {
+ content: $ti-icon-versions-filled;
+}
+.#{$ti-prefix}-versions-off:before {
+ content: $ti-icon-versions-off;
+}
+.#{$ti-prefix}-video:before {
+ content: $ti-icon-video;
+}
+.#{$ti-prefix}-video-minus:before {
+ content: $ti-icon-video-minus;
+}
+.#{$ti-prefix}-video-off:before {
+ content: $ti-icon-video-off;
+}
+.#{$ti-prefix}-video-plus:before {
+ content: $ti-icon-video-plus;
+}
+.#{$ti-prefix}-view-360:before {
+ content: $ti-icon-view-360;
+}
+.#{$ti-prefix}-view-360-arrow:before {
+ content: $ti-icon-view-360-arrow;
+}
+.#{$ti-prefix}-view-360-number:before {
+ content: $ti-icon-view-360-number;
+}
+.#{$ti-prefix}-view-360-off:before {
+ content: $ti-icon-view-360-off;
+}
+.#{$ti-prefix}-viewfinder:before {
+ content: $ti-icon-viewfinder;
+}
+.#{$ti-prefix}-viewfinder-off:before {
+ content: $ti-icon-viewfinder-off;
+}
+.#{$ti-prefix}-viewport-narrow:before {
+ content: $ti-icon-viewport-narrow;
+}
+.#{$ti-prefix}-viewport-wide:before {
+ content: $ti-icon-viewport-wide;
+}
+.#{$ti-prefix}-vinyl:before {
+ content: $ti-icon-vinyl;
+}
+.#{$ti-prefix}-vip:before {
+ content: $ti-icon-vip;
+}
+.#{$ti-prefix}-vip-off:before {
+ content: $ti-icon-vip-off;
+}
+.#{$ti-prefix}-virus:before {
+ content: $ti-icon-virus;
+}
+.#{$ti-prefix}-virus-off:before {
+ content: $ti-icon-virus-off;
+}
+.#{$ti-prefix}-virus-search:before {
+ content: $ti-icon-virus-search;
+}
+.#{$ti-prefix}-vocabulary:before {
+ content: $ti-icon-vocabulary;
+}
+.#{$ti-prefix}-vocabulary-off:before {
+ content: $ti-icon-vocabulary-off;
+}
+.#{$ti-prefix}-volcano:before {
+ content: $ti-icon-volcano;
+}
+.#{$ti-prefix}-volume:before {
+ content: $ti-icon-volume;
+}
+.#{$ti-prefix}-volume-2:before {
+ content: $ti-icon-volume-2;
+}
+.#{$ti-prefix}-volume-3:before {
+ content: $ti-icon-volume-3;
+}
+.#{$ti-prefix}-volume-off:before {
+ content: $ti-icon-volume-off;
+}
+.#{$ti-prefix}-vs:before {
+ content: $ti-icon-vs;
+}
+.#{$ti-prefix}-walk:before {
+ content: $ti-icon-walk;
+}
+.#{$ti-prefix}-wall:before {
+ content: $ti-icon-wall;
+}
+.#{$ti-prefix}-wall-off:before {
+ content: $ti-icon-wall-off;
+}
+.#{$ti-prefix}-wallet:before {
+ content: $ti-icon-wallet;
+}
+.#{$ti-prefix}-wallet-off:before {
+ content: $ti-icon-wallet-off;
+}
+.#{$ti-prefix}-wallpaper:before {
+ content: $ti-icon-wallpaper;
+}
+.#{$ti-prefix}-wallpaper-off:before {
+ content: $ti-icon-wallpaper-off;
+}
+.#{$ti-prefix}-wand:before {
+ content: $ti-icon-wand;
+}
+.#{$ti-prefix}-wand-off:before {
+ content: $ti-icon-wand-off;
+}
+.#{$ti-prefix}-wash:before {
+ content: $ti-icon-wash;
+}
+.#{$ti-prefix}-wash-dry:before {
+ content: $ti-icon-wash-dry;
+}
+.#{$ti-prefix}-wash-dry-1:before {
+ content: $ti-icon-wash-dry-1;
+}
+.#{$ti-prefix}-wash-dry-2:before {
+ content: $ti-icon-wash-dry-2;
+}
+.#{$ti-prefix}-wash-dry-3:before {
+ content: $ti-icon-wash-dry-3;
+}
+.#{$ti-prefix}-wash-dry-a:before {
+ content: $ti-icon-wash-dry-a;
+}
+.#{$ti-prefix}-wash-dry-dip:before {
+ content: $ti-icon-wash-dry-dip;
+}
+.#{$ti-prefix}-wash-dry-f:before {
+ content: $ti-icon-wash-dry-f;
+}
+.#{$ti-prefix}-wash-dry-flat:before {
+ content: $ti-icon-wash-dry-flat;
+}
+.#{$ti-prefix}-wash-dry-hang:before {
+ content: $ti-icon-wash-dry-hang;
+}
+.#{$ti-prefix}-wash-dry-off:before {
+ content: $ti-icon-wash-dry-off;
+}
+.#{$ti-prefix}-wash-dry-p:before {
+ content: $ti-icon-wash-dry-p;
+}
+.#{$ti-prefix}-wash-dry-shade:before {
+ content: $ti-icon-wash-dry-shade;
+}
+.#{$ti-prefix}-wash-dry-w:before {
+ content: $ti-icon-wash-dry-w;
+}
+.#{$ti-prefix}-wash-dryclean:before {
+ content: $ti-icon-wash-dryclean;
+}
+.#{$ti-prefix}-wash-dryclean-off:before {
+ content: $ti-icon-wash-dryclean-off;
+}
+.#{$ti-prefix}-wash-eco:before {
+ content: $ti-icon-wash-eco;
+}
+.#{$ti-prefix}-wash-gentle:before {
+ content: $ti-icon-wash-gentle;
+}
+.#{$ti-prefix}-wash-hand:before {
+ content: $ti-icon-wash-hand;
+}
+.#{$ti-prefix}-wash-machine:before {
+ content: $ti-icon-wash-machine;
+}
+.#{$ti-prefix}-wash-off:before {
+ content: $ti-icon-wash-off;
+}
+.#{$ti-prefix}-wash-press:before {
+ content: $ti-icon-wash-press;
+}
+.#{$ti-prefix}-wash-temperature-1:before {
+ content: $ti-icon-wash-temperature-1;
+}
+.#{$ti-prefix}-wash-temperature-2:before {
+ content: $ti-icon-wash-temperature-2;
+}
+.#{$ti-prefix}-wash-temperature-3:before {
+ content: $ti-icon-wash-temperature-3;
+}
+.#{$ti-prefix}-wash-temperature-4:before {
+ content: $ti-icon-wash-temperature-4;
+}
+.#{$ti-prefix}-wash-temperature-5:before {
+ content: $ti-icon-wash-temperature-5;
+}
+.#{$ti-prefix}-wash-temperature-6:before {
+ content: $ti-icon-wash-temperature-6;
+}
+.#{$ti-prefix}-wash-tumble-dry:before {
+ content: $ti-icon-wash-tumble-dry;
+}
+.#{$ti-prefix}-wash-tumble-off:before {
+ content: $ti-icon-wash-tumble-off;
+}
+.#{$ti-prefix}-waterpolo:before {
+ content: $ti-icon-waterpolo;
+}
+.#{$ti-prefix}-wave-saw-tool:before {
+ content: $ti-icon-wave-saw-tool;
+}
+.#{$ti-prefix}-wave-sine:before {
+ content: $ti-icon-wave-sine;
+}
+.#{$ti-prefix}-wave-square:before {
+ content: $ti-icon-wave-square;
+}
+.#{$ti-prefix}-waves-electricity:before {
+ content: $ti-icon-waves-electricity;
+}
+.#{$ti-prefix}-webhook:before {
+ content: $ti-icon-webhook;
+}
+.#{$ti-prefix}-webhook-off:before {
+ content: $ti-icon-webhook-off;
+}
+.#{$ti-prefix}-weight:before {
+ content: $ti-icon-weight;
+}
+.#{$ti-prefix}-wheel:before {
+ content: $ti-icon-wheel;
+}
+.#{$ti-prefix}-wheelchair:before {
+ content: $ti-icon-wheelchair;
+}
+.#{$ti-prefix}-wheelchair-off:before {
+ content: $ti-icon-wheelchair-off;
+}
+.#{$ti-prefix}-whirl:before {
+ content: $ti-icon-whirl;
+}
+.#{$ti-prefix}-wifi:before {
+ content: $ti-icon-wifi;
+}
+.#{$ti-prefix}-wifi-0:before {
+ content: $ti-icon-wifi-0;
+}
+.#{$ti-prefix}-wifi-1:before {
+ content: $ti-icon-wifi-1;
+}
+.#{$ti-prefix}-wifi-2:before {
+ content: $ti-icon-wifi-2;
+}
+.#{$ti-prefix}-wifi-off:before {
+ content: $ti-icon-wifi-off;
+}
+.#{$ti-prefix}-wind:before {
+ content: $ti-icon-wind;
+}
+.#{$ti-prefix}-wind-electricity:before {
+ content: $ti-icon-wind-electricity;
+}
+.#{$ti-prefix}-wind-off:before {
+ content: $ti-icon-wind-off;
+}
+.#{$ti-prefix}-windmill:before {
+ content: $ti-icon-windmill;
+}
+.#{$ti-prefix}-windmill-filled:before {
+ content: $ti-icon-windmill-filled;
+}
+.#{$ti-prefix}-windmill-off:before {
+ content: $ti-icon-windmill-off;
+}
+.#{$ti-prefix}-window:before {
+ content: $ti-icon-window;
+}
+.#{$ti-prefix}-window-maximize:before {
+ content: $ti-icon-window-maximize;
+}
+.#{$ti-prefix}-window-minimize:before {
+ content: $ti-icon-window-minimize;
+}
+.#{$ti-prefix}-window-off:before {
+ content: $ti-icon-window-off;
+}
+.#{$ti-prefix}-windsock:before {
+ content: $ti-icon-windsock;
+}
+.#{$ti-prefix}-wiper:before {
+ content: $ti-icon-wiper;
+}
+.#{$ti-prefix}-wiper-wash:before {
+ content: $ti-icon-wiper-wash;
+}
+.#{$ti-prefix}-woman:before {
+ content: $ti-icon-woman;
+}
+.#{$ti-prefix}-woman-filled:before {
+ content: $ti-icon-woman-filled;
+}
+.#{$ti-prefix}-wood:before {
+ content: $ti-icon-wood;
+}
+.#{$ti-prefix}-world:before {
+ content: $ti-icon-world;
+}
+.#{$ti-prefix}-world-bolt:before {
+ content: $ti-icon-world-bolt;
+}
+.#{$ti-prefix}-world-cancel:before {
+ content: $ti-icon-world-cancel;
+}
+.#{$ti-prefix}-world-check:before {
+ content: $ti-icon-world-check;
+}
+.#{$ti-prefix}-world-code:before {
+ content: $ti-icon-world-code;
+}
+.#{$ti-prefix}-world-cog:before {
+ content: $ti-icon-world-cog;
+}
+.#{$ti-prefix}-world-dollar:before {
+ content: $ti-icon-world-dollar;
+}
+.#{$ti-prefix}-world-down:before {
+ content: $ti-icon-world-down;
+}
+.#{$ti-prefix}-world-download:before {
+ content: $ti-icon-world-download;
+}
+.#{$ti-prefix}-world-exclamation:before {
+ content: $ti-icon-world-exclamation;
+}
+.#{$ti-prefix}-world-heart:before {
+ content: $ti-icon-world-heart;
+}
+.#{$ti-prefix}-world-latitude:before {
+ content: $ti-icon-world-latitude;
+}
+.#{$ti-prefix}-world-longitude:before {
+ content: $ti-icon-world-longitude;
+}
+.#{$ti-prefix}-world-minus:before {
+ content: $ti-icon-world-minus;
+}
+.#{$ti-prefix}-world-off:before {
+ content: $ti-icon-world-off;
+}
+.#{$ti-prefix}-world-pause:before {
+ content: $ti-icon-world-pause;
+}
+.#{$ti-prefix}-world-pin:before {
+ content: $ti-icon-world-pin;
+}
+.#{$ti-prefix}-world-plus:before {
+ content: $ti-icon-world-plus;
+}
+.#{$ti-prefix}-world-question:before {
+ content: $ti-icon-world-question;
+}
+.#{$ti-prefix}-world-search:before {
+ content: $ti-icon-world-search;
+}
+.#{$ti-prefix}-world-share:before {
+ content: $ti-icon-world-share;
+}
+.#{$ti-prefix}-world-star:before {
+ content: $ti-icon-world-star;
+}
+.#{$ti-prefix}-world-up:before {
+ content: $ti-icon-world-up;
+}
+.#{$ti-prefix}-world-upload:before {
+ content: $ti-icon-world-upload;
+}
+.#{$ti-prefix}-world-www:before {
+ content: $ti-icon-world-www;
+}
+.#{$ti-prefix}-world-x:before {
+ content: $ti-icon-world-x;
+}
+.#{$ti-prefix}-wrecking-ball:before {
+ content: $ti-icon-wrecking-ball;
+}
+.#{$ti-prefix}-writing:before {
+ content: $ti-icon-writing;
+}
+.#{$ti-prefix}-writing-off:before {
+ content: $ti-icon-writing-off;
+}
+.#{$ti-prefix}-writing-sign:before {
+ content: $ti-icon-writing-sign;
+}
+.#{$ti-prefix}-writing-sign-off:before {
+ content: $ti-icon-writing-sign-off;
+}
+.#{$ti-prefix}-x:before {
+ content: $ti-icon-x;
+}
+.#{$ti-prefix}-xbox-a:before {
+ content: $ti-icon-xbox-a;
+}
+.#{$ti-prefix}-xbox-a-filled:before {
+ content: $ti-icon-xbox-a-filled;
+}
+.#{$ti-prefix}-xbox-b:before {
+ content: $ti-icon-xbox-b;
+}
+.#{$ti-prefix}-xbox-b-filled:before {
+ content: $ti-icon-xbox-b-filled;
+}
+.#{$ti-prefix}-xbox-x:before {
+ content: $ti-icon-xbox-x;
+}
+.#{$ti-prefix}-xbox-x-filled:before {
+ content: $ti-icon-xbox-x-filled;
+}
+.#{$ti-prefix}-xbox-y:before {
+ content: $ti-icon-xbox-y;
+}
+.#{$ti-prefix}-xbox-y-filled:before {
+ content: $ti-icon-xbox-y-filled;
+}
+.#{$ti-prefix}-xd:before {
+ content: $ti-icon-xd;
+}
+.#{$ti-prefix}-xxx:before {
+ content: $ti-icon-xxx;
+}
+.#{$ti-prefix}-yin-yang:before {
+ content: $ti-icon-yin-yang;
+}
+.#{$ti-prefix}-yin-yang-filled:before {
+ content: $ti-icon-yin-yang-filled;
+}
+.#{$ti-prefix}-yoga:before {
+ content: $ti-icon-yoga;
+}
+.#{$ti-prefix}-zeppelin:before {
+ content: $ti-icon-zeppelin;
+}
+.#{$ti-prefix}-zeppelin-filled:before {
+ content: $ti-icon-zeppelin-filled;
+}
+.#{$ti-prefix}-zeppelin-off:before {
+ content: $ti-icon-zeppelin-off;
+}
+.#{$ti-prefix}-zip:before {
+ content: $ti-icon-zip;
+}
+.#{$ti-prefix}-zodiac-aquarius:before {
+ content: $ti-icon-zodiac-aquarius;
+}
+.#{$ti-prefix}-zodiac-aries:before {
+ content: $ti-icon-zodiac-aries;
+}
+.#{$ti-prefix}-zodiac-cancer:before {
+ content: $ti-icon-zodiac-cancer;
+}
+.#{$ti-prefix}-zodiac-capricorn:before {
+ content: $ti-icon-zodiac-capricorn;
+}
+.#{$ti-prefix}-zodiac-gemini:before {
+ content: $ti-icon-zodiac-gemini;
+}
+.#{$ti-prefix}-zodiac-leo:before {
+ content: $ti-icon-zodiac-leo;
+}
+.#{$ti-prefix}-zodiac-libra:before {
+ content: $ti-icon-zodiac-libra;
+}
+.#{$ti-prefix}-zodiac-pisces:before {
+ content: $ti-icon-zodiac-pisces;
+}
+.#{$ti-prefix}-zodiac-sagittarius:before {
+ content: $ti-icon-zodiac-sagittarius;
+}
+.#{$ti-prefix}-zodiac-scorpio:before {
+ content: $ti-icon-zodiac-scorpio;
+}
+.#{$ti-prefix}-zodiac-taurus:before {
+ content: $ti-icon-zodiac-taurus;
+}
+.#{$ti-prefix}-zodiac-virgo:before {
+ content: $ti-icon-zodiac-virgo;
+}
+.#{$ti-prefix}-zoom:before {
+ content: $ti-icon-zoom;
+}
+.#{$ti-prefix}-zoom-cancel:before {
+ content: $ti-icon-zoom-cancel;
+}
+.#{$ti-prefix}-zoom-cancel-filled:before {
+ content: $ti-icon-zoom-cancel-filled;
+}
+.#{$ti-prefix}-zoom-check:before {
+ content: $ti-icon-zoom-check;
+}
+.#{$ti-prefix}-zoom-check-filled:before {
+ content: $ti-icon-zoom-check-filled;
+}
+.#{$ti-prefix}-zoom-code:before {
+ content: $ti-icon-zoom-code;
+}
+.#{$ti-prefix}-zoom-code-filled:before {
+ content: $ti-icon-zoom-code-filled;
+}
+.#{$ti-prefix}-zoom-exclamation:before {
+ content: $ti-icon-zoom-exclamation;
+}
+.#{$ti-prefix}-zoom-exclamation-filled:before {
+ content: $ti-icon-zoom-exclamation-filled;
+}
+.#{$ti-prefix}-zoom-filled:before {
+ content: $ti-icon-zoom-filled;
+}
+.#{$ti-prefix}-zoom-in:before {
+ content: $ti-icon-zoom-in;
+}
+.#{$ti-prefix}-zoom-in-area:before {
+ content: $ti-icon-zoom-in-area;
+}
+.#{$ti-prefix}-zoom-in-area-filled:before {
+ content: $ti-icon-zoom-in-area-filled;
+}
+.#{$ti-prefix}-zoom-in-filled:before {
+ content: $ti-icon-zoom-in-filled;
+}
+.#{$ti-prefix}-zoom-money:before {
+ content: $ti-icon-zoom-money;
+}
+.#{$ti-prefix}-zoom-money-filled:before {
+ content: $ti-icon-zoom-money-filled;
+}
+.#{$ti-prefix}-zoom-out:before {
+ content: $ti-icon-zoom-out;
+}
+.#{$ti-prefix}-zoom-out-area:before {
+ content: $ti-icon-zoom-out-area;
+}
+.#{$ti-prefix}-zoom-out-area-filled:before {
+ content: $ti-icon-zoom-out-area-filled;
+}
+.#{$ti-prefix}-zoom-out-filled:before {
+ content: $ti-icon-zoom-out-filled;
+}
+.#{$ti-prefix}-zoom-pan:before {
+ content: $ti-icon-zoom-pan;
+}
+.#{$ti-prefix}-zoom-pan-filled:before {
+ content: $ti-icon-zoom-pan-filled;
+}
+.#{$ti-prefix}-zoom-question:before {
+ content: $ti-icon-zoom-question;
+}
+.#{$ti-prefix}-zoom-question-filled:before {
+ content: $ti-icon-zoom-question-filled;
+}
+.#{$ti-prefix}-zoom-replace:before {
+ content: $ti-icon-zoom-replace;
+}
+.#{$ti-prefix}-zoom-reset:before {
+ content: $ti-icon-zoom-reset;
+}
+.#{$ti-prefix}-zoom-scan:before {
+ content: $ti-icon-zoom-scan;
+}
+.#{$ti-prefix}-zoom-scan-filled:before {
+ content: $ti-icon-zoom-scan-filled;
+}
+.#{$ti-prefix}-zzz:before {
+ content: $ti-icon-zzz;
+}
+.#{$ti-prefix}-zzz-off:before {
+ content: $ti-icon-zzz-off;
+}
+
+// Aliases
+.#{$ti-prefix}-123:before {
+ content: $ti-icon-number-123;
+}
+.#{$ti-prefix}-360:before {
+ content: $ti-icon-view-360-arrow;
+}
+.#{$ti-prefix}-code-asterix:before {
+ content: $ti-icon-code-asterisk;
+}
+.#{$ti-prefix}-discount-2:before {
+ content: $ti-icon-rosette-discount;
+}
+.#{$ti-prefix}-discount-2-off:before {
+ content: $ti-icon-rosette-discount-off;
+}
+.#{$ti-prefix}-discount-check:before {
+ content: $ti-icon-rosette-discount-check;
+}
+.#{$ti-prefix}-hand-rock:before {
+ content: $ti-icon-hand-love-you;
+}
+.#{$ti-prefix}-sort-deacending-small-big:before {
+ content: $ti-icon-sort-descending-small-big;
+}
+.#{$ti-prefix}-shi-jumping:before {
+ content: $ti-icon-ski-jumping;
+}
+.#{$ti-prefix}-box-seam:before {
+ content: $ti-icon-package;
+}
+.#{$ti-prefix}-kering:before {
+ content: $ti-icon-kerning;
+}
+.#{$ti-prefix}-2fa:before {
+ content: $ti-icon-auth-2fa;
+}
+.#{$ti-prefix}-3d-cube-sphere:before {
+ content: $ti-icon-cube-3d-sphere;
+}
+.#{$ti-prefix}-3d-cube-sphere-off:before {
+ content: $ti-icon-cube-3d-sphere-off;
+}
+.#{$ti-prefix}-3d-rotate:before {
+ content: $ti-icon-rotate-3d;
+}
+.#{$ti-prefix}-12-hours:before {
+ content: $ti-icon-hours-12;
+}
+.#{$ti-prefix}-24-hours:before {
+ content: $ti-icon-hours-24;
+}
+.#{$ti-prefix}-360-view:before {
+ content: $ti-icon-view-360-number;
+}
+.#{$ti-prefix}-circle-0:before {
+ content: $ti-icon-circle-number-0;
+}
+.#{$ti-prefix}-circle-1:before {
+ content: $ti-icon-circle-number-1;
+}
+.#{$ti-prefix}-circle-2:before {
+ content: $ti-icon-circle-number-2;
+}
+.#{$ti-prefix}-circle-3:before {
+ content: $ti-icon-circle-number-3;
+}
+.#{$ti-prefix}-circle-4:before {
+ content: $ti-icon-circle-number-4;
+}
+.#{$ti-prefix}-circle-5:before {
+ content: $ti-icon-circle-number-5;
+}
+.#{$ti-prefix}-circle-6:before {
+ content: $ti-icon-circle-number-6;
+}
+.#{$ti-prefix}-circle-7:before {
+ content: $ti-icon-circle-number-7;
+}
+.#{$ti-prefix}-circle-8:before {
+ content: $ti-icon-circle-number-8;
+}
+.#{$ti-prefix}-circle-9:before {
+ content: $ti-icon-circle-number-9;
+}
+.#{$ti-prefix}-hexagon-0:before {
+ content: $ti-icon-hexagon-number-0;
+}
+.#{$ti-prefix}-hexagon-1:before {
+ content: $ti-icon-hexagon-number-1;
+}
+.#{$ti-prefix}-hexagon-2:before {
+ content: $ti-icon-hexagon-number-2;
+}
+.#{$ti-prefix}-hexagon-3:before {
+ content: $ti-icon-hexagon-number-3;
+}
+.#{$ti-prefix}-hexagon-4:before {
+ content: $ti-icon-hexagon-number-4;
+}
+.#{$ti-prefix}-hexagon-5:before {
+ content: $ti-icon-hexagon-number-5;
+}
+.#{$ti-prefix}-hexagon-6:before {
+ content: $ti-icon-hexagon-number-6;
+}
+.#{$ti-prefix}-hexagon-7:before {
+ content: $ti-icon-hexagon-number-7;
+}
+.#{$ti-prefix}-hexagon-8:before {
+ content: $ti-icon-hexagon-number-8;
+}
+.#{$ti-prefix}-hexagon-9:before {
+ content: $ti-icon-hexagon-number-9;
+}
+.#{$ti-prefix}-square-0:before {
+ content: $ti-icon-square-number-0;
+}
+.#{$ti-prefix}-square-1:before {
+ content: $ti-icon-square-number-1;
+}
+.#{$ti-prefix}-square-2:before {
+ content: $ti-icon-square-number-2;
+}
+.#{$ti-prefix}-square-3:before {
+ content: $ti-icon-square-number-3;
+}
+.#{$ti-prefix}-square-4:before {
+ content: $ti-icon-square-number-4;
+}
+.#{$ti-prefix}-square-5:before {
+ content: $ti-icon-square-number-5;
+}
+.#{$ti-prefix}-square-6:before {
+ content: $ti-icon-square-number-6;
+}
+.#{$ti-prefix}-square-7:before {
+ content: $ti-icon-square-number-7;
+}
+.#{$ti-prefix}-square-8:before {
+ content: $ti-icon-square-number-8;
+}
+.#{$ti-prefix}-square-9:before {
+ content: $ti-icon-square-number-9;
+}
+.#{$ti-prefix}-message-circle-2:before {
+ content: $ti-icon-message-circle;
+}
+.#{$ti-prefix}-discount-check-filled:before {
+ content: $ti-icon-rosette-discount-check-filled;
+}
+.#{$ti-prefix}-message-circle-2-filled:before {
+ content: $ti-icon-message-circle-filled;
+}
diff --git a/resources/assets/vendor/fonts/tabler/tabler-icons.eot b/resources/assets/vendor/fonts/tabler/tabler-icons.eot
new file mode 100644
index 0000000..9eb3d27
Binary files /dev/null and b/resources/assets/vendor/fonts/tabler/tabler-icons.eot differ
diff --git a/resources/assets/vendor/fonts/tabler/tabler-icons.svg b/resources/assets/vendor/fonts/tabler/tabler-icons.svg
new file mode 100644
index 0000000..d641624
--- /dev/null
+++ b/resources/assets/vendor/fonts/tabler/tabler-icons.svg
@@ -0,0 +1,6384 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/vendor/fonts/tabler/tabler-icons.ttf b/resources/assets/vendor/fonts/tabler/tabler-icons.ttf
new file mode 100644
index 0000000..7e2d1ef
Binary files /dev/null and b/resources/assets/vendor/fonts/tabler/tabler-icons.ttf differ
diff --git a/resources/assets/vendor/fonts/tabler/tabler-icons.woff b/resources/assets/vendor/fonts/tabler/tabler-icons.woff
new file mode 100644
index 0000000..c4e7e10
Binary files /dev/null and b/resources/assets/vendor/fonts/tabler/tabler-icons.woff differ
diff --git a/resources/assets/vendor/fonts/tabler/tabler-icons.woff2 b/resources/assets/vendor/fonts/tabler/tabler-icons.woff2
new file mode 100644
index 0000000..6fdb616
Binary files /dev/null and b/resources/assets/vendor/fonts/tabler/tabler-icons.woff2 differ
diff --git a/resources/assets/vendor/js/_template-customizer/_template-customizer.html b/resources/assets/vendor/js/_template-customizer/_template-customizer.html
new file mode 100644
index 0000000..d3d0cf1
--- /dev/null
+++ b/resources/assets/vendor/js/_template-customizer/_template-customizer.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/vendor/js/_template-customizer/_template-customizer.scss b/resources/assets/vendor/js/_template-customizer/_template-customizer.scss
new file mode 100644
index 0000000..facd41b
--- /dev/null
+++ b/resources/assets/vendor/js/_template-customizer/_template-customizer.scss
@@ -0,0 +1,342 @@
+/*
+* Template Customizer Style
+**/
+
+$customizer-width: 400px;
+$customizer-width-sm: 300px;
+$customizer-hide-width: 1200px;
+$customizer-spacer: 20px;
+$customizer-font-size: inherit;
+
+$open-btn-size: 38px;
+$open-btn-spacer: 0;
+$open-btn-font-size: 18px;
+$open-btn-top: 180px;
+$open-btn-top-md: 145px;
+
+$open-btn-bg: var(--bs-primary);
+$open-btn-bg-dark: var(--bs-primary);
+$open-btn-color: #fff;
+$open-btn-border-radius: 0.375rem;
+$open-customizer-primary-color: var(--bs-primary);
+
+#template-customizer {
+ font-family: 'Public Sans', BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' !important;
+ font-size: $customizer-font-size !important;
+ position: fixed;
+ top: 0;
+ right: 0;
+ height: 100%;
+ z-index: 99999999;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ width: $customizer-width;
+ -webkit-box-shadow: 0px 5px 30px 0px rgba(47, 43, 61, 0.18);
+ box-shadow: 0px 5px 30px 0px rgba(47, 43, 61, 0.18);
+ -webkit-transition: all 0.2s ease-in;
+ -o-transition: all 0.2s ease-in;
+ transition: all 0.2s ease-in;
+ -webkit-transform: translateX($customizer-width + $customizer-spacer);
+ -ms-transform: translateX($customizer-width + $customizer-spacer);
+ transform: translateX($customizer-width + $customizer-spacer);
+
+ .dark-style & {
+ -webkit-box-shadow: 0px 5px 30px 0px rgba(19, 17, 32, 0.24);
+ box-shadow: 0px 5px 30px 0px rgba(19, 17, 32, 0.24);
+ }
+
+ h5 {
+ position: relative;
+ font-size: 11px;
+ }
+
+ > h5 {
+ flex: 0 0 auto;
+ }
+
+ .disabled {
+ color: #d1d2d3 !important;
+ }
+ .form-label {
+ font-size: 0.9375rem;
+ }
+ .form-check-label {
+ font-size: 0.8125rem;
+ }
+ &.template-customizer-open {
+ -webkit-transition-delay: 0.1s;
+ -o-transition-delay: 0.1s;
+ transition-delay: 0.1s;
+ -webkit-transform: none !important;
+ -ms-transform: none !important;
+ transform: none !important;
+
+ .custom-option.checked {
+ color: $open-customizer-primary-color;
+ border-width: 2px;
+ margin: 0;
+ }
+ }
+
+ .template-customizer-header {
+ a:hover {
+ color: inherit !important;
+ }
+ }
+ // Customizer button
+
+ .template-customizer-open-btn {
+ position: absolute;
+ top: $open-btn-top;
+
+ @media (max-width: 991.98px) {
+ top: $open-btn-top-md;
+ }
+ left: 0;
+ z-index: -1;
+ display: block;
+ width: $open-btn-size;
+ height: $open-btn-size;
+ border-top-left-radius: $open-btn-border-radius;
+ border-bottom-left-radius: $open-btn-border-radius;
+ background: $open-btn-bg;
+ box-shadow: 0px 2px 6px 0px rgba(115, 103, 240, 0.3);
+ color: $open-btn-color !important;
+ text-align: center;
+ font-size: $open-btn-font-size !important;
+ line-height: $open-btn-size;
+ opacity: 1;
+ -webkit-transition: all 0.1s linear 0.2s;
+ -o-transition: all 0.1s linear 0.2s;
+ transition: all 0.1s linear 0.2s;
+ -webkit-transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
+ -ms-transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
+ transform: translateX(-($open-btn-size + $customizer-spacer + $open-btn-spacer));
+
+ .dark-style & {
+ background: $open-btn-bg-dark;
+ }
+ &::before {
+ content: '';
+ width: 22px;
+ height: 22px;
+ display: block;
+ background-size: 100% 100%;
+ position: absolute;
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABClJREFUaEPtmY1RFEEQhbsjUCIQIhAiUCNQIxAiECIQIxAiECIAIpAMhAiECIQI2vquZqnZvp6fhb3SK5mqq6Ju92b69bzXf6is+dI1t1+eAfztG5z1BsxsU0S+ici2iPB3vm5E5EpEDlSVv2dZswFIxv8UkZcNy+5EZGcuEHMCOBeR951uvVDVD53vVl+bE8DvDu8Pxtyo6ta/BsByg1R15Bwzqz5/LJgn34CZwfnPInI4BUB6/1hV0cSjVxcAM4PbcBZjL0XklIPN7Is3fLCkdQPpPYw/VNXj5IhPIvJWRIhSl6p60ULWBGBm30Vk123EwRxCuIzWkkjNrCZywith10ewE1Xdq4GoAjCz/RTXW44Ynt+LyBEfT43kYfbj86J3w5Q32DNcRQDpwF+dkQXDMey8xem0L3TEqB4g3PZWad8agBMRgZPeu96D1/C2Zbh3X0p80Op1xxloztN48bMQQNoc7+eLEuAoPSPiIDY4Ooo+E6ixeNXM+D3GERz2U3CIqMstLJUgJQDe+7eq6mub0NYEkLAKwEHkiBQDCZtddZCZ8d6r7JDwFkoARklHRPZUFVDVZWbwGuNrC4EfdOzFrRABh3Wnqhv+d70AEBLGFROPmeHlnM81G69UdSd6IUuM0GgUVn1uqWmg5EmMfBeEyB7Pe3txBkY+rGT8j0J+WXq/BgDkUCaqLgEAnwcRog0veMIqFAAwCy2wnw+bI2GaGboBgF9k5N0o0rUSGUb4eO0BeO9j/GYhkSHMHMTIqwGARX6p6a+nlPBl8kZuXMD9j6pKfF9aZuaFOdJCEL5D4eYb9wCYVCanrBmGyii/tIq+SLj/HQBCaM5bLzwfPqdQ6FpVHyra4IbuVbXaY7dETC2ESPNNWiIOi69CcdgSMXsh4tNSUiklMgwmC0aNd08Y5WAES6HHehM4gu97wyhBgWpgqXsrASglprDy7CwhehMZOSbK6JMSma+Fio1KltCmlBIj7gfZOGx8ppQSXrhzFnOhJ/31BDkjFHRvOd09x0mRBA9SFgxUgHpQg0q0t5ymPMlL+EnldFTfDA0NAmf+OTQ0X0sRouf7NNkYGhrOYNrxtIaGg83MNzVDSe3LXLhP7O/yrCsCz1zlWTpjWkuZAOBpX3yVnLqI1yLCOKU6qMrmP7SSrUEw54XF4WBIK5FxCMOr3lVsfGqNSmPzBXUnJTIX1jyVBq9wO6UObOpgC5GjO98vFKnTdQMZXxEsWZlDiCZMIxAbNxQOqlpVZtobejBaZNoBnRDzMFpkxvTQOD36BlrcySZuI6p1ACB6LU3wWuf5581+oHfD1vi89bz3nFUC8Nm7ZlP3nKkFbM4bWPt/MSFwklprYItwt6cmvpWJ2IVcQBCz6bLysSCv3SaANCiTsnaNRrNRqMXVVT1/BrAqz/buu/Y38Ad3KC5PARej0QAAAABJRU5ErkJggg==');
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+
+ // Customizer Hidden
+ .customizer-hide & {
+ display: none;
+ }
+
+ [dir='rtl'] & {
+ border-radius: 0;
+ border-top-right-radius: $open-btn-border-radius;
+ border-bottom-right-radius: $open-btn-border-radius;
+
+ &::before {
+ margin-left: -2px;
+ }
+ }
+ }
+
+ &.template-customizer-open .template-customizer-open-btn {
+ opacity: 0;
+ -webkit-transition-delay: 0s;
+ -o-transition-delay: 0s;
+ transition-delay: 0s;
+ -webkit-transform: none !important;
+ -ms-transform: none !important;
+ transform: none !important;
+ }
+
+ // Customizer inner
+ .template-customizer-inner {
+ position: relative;
+ overflow: auto;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ opacity: 1;
+ -webkit-transition: opacity 0.2s;
+ -o-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+
+ > div:first-child {
+ > hr:first-of-type {
+ display: none !important;
+ }
+ > h5:first-of-type {
+ padding-top: 0 !important;
+ }
+ }
+ }
+
+ // Theme
+ .template-customizer-themes-inner {
+ position: relative;
+ opacity: 1;
+ -webkit-transition: opacity 0.2s;
+ -o-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ }
+
+ .template-customizer-theme-item {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -ms-flex-align: center;
+ -webkit-box-flex: 1;
+ -ms-flex: 1 1 100%;
+ flex: 1 1 100%;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ margin-bottom: 10px;
+ padding: 0 24px;
+ width: 100%;
+ cursor: pointer;
+
+ input {
+ position: absolute;
+ z-index: -1; // Put the input behind the label so it doesn't overlay text
+ opacity: 0;
+ }
+
+ input ~ span {
+ opacity: 0.25;
+ -webkit-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+ }
+
+ .template-customizer-theme-checkmark {
+ display: inline-block;
+ width: 6px;
+ height: 12px;
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ opacity: 0;
+ -webkit-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+ -webkit-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ transform: rotate(45deg);
+
+ [dir='rtl'] & {
+ border-right: none;
+ border-left: 1px solid;
+ -webkit-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ }
+ }
+
+ input:checked:not([disabled]) ~ span,
+ &:hover input:not([disabled]) ~ span {
+ opacity: 1;
+ }
+
+ input:checked:not([disabled]) ~ span .template-customizer-theme-checkmark {
+ opacity: 1;
+ }
+ }
+
+ .template-customizer-theme-colors {
+ span {
+ display: block;
+ margin: 0 1px;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset;
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset;
+ }
+ }
+
+ &.template-customizer-loading .template-customizer-inner,
+ &.template-customizer-loading-theme .template-customizer-themes-inner {
+ opacity: 0.2;
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 999;
+ display: block;
+ }
+ }
+}
+@media (max-width: $customizer-hide-width) {
+ #template-customizer {
+ display: none;
+ visibility: hidden !important;
+ }
+}
+@media (max-width: 575.98px) {
+ #template-customizer {
+ width: $customizer-width-sm;
+ -webkit-transform: translateX($customizer-width-sm + $customizer-spacer);
+ -ms-transform: translateX($customizer-width-sm + $customizer-spacer);
+ transform: translateX($customizer-width-sm + $customizer-spacer);
+ }
+}
+
+.layout-menu-100vh #template-customizer {
+ height: 100vh;
+}
+
+// RTL
+//
+
+[dir='rtl'] {
+ #template-customizer {
+ right: auto;
+ left: 0;
+ -webkit-transform: translateX(-($customizer-width + $customizer-spacer));
+ -ms-transform: translateX(-($customizer-width + $customizer-spacer));
+ transform: translateX(-($customizer-width + $customizer-spacer));
+ }
+
+ #template-customizer .template-customizer-open-btn {
+ right: 0;
+ left: auto;
+ -webkit-transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
+ -ms-transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
+ transform: translateX($open-btn-size + $customizer-spacer + $open-btn-spacer);
+ }
+
+ #template-customizer .template-customizer-close-btn {
+ right: auto;
+ left: 0;
+ }
+}
+
+#template-customizer .template-customizer-layouts-options[disabled] {
+ opacity: 0.5;
+ pointer-events: none;
+}
+
+// ! FIX: mode switch position in RTL
+[dir='rtl'] {
+ .template-customizer-t-style_switch_light {
+ padding-right: 0 !important;
+ }
+}
diff --git a/resources/assets/vendor/js/bootstrap.js b/resources/assets/vendor/js/bootstrap.js
new file mode 100644
index 0000000..16cd75a
--- /dev/null
+++ b/resources/assets/vendor/js/bootstrap.js
@@ -0,0 +1,7 @@
+import * as bootstrap from 'bootstrap'
+
+try {
+ window.bootstrap = bootstrap
+} catch (e) {}
+
+export { bootstrap }
diff --git a/resources/assets/vendor/js/dropdown-hover.js b/resources/assets/vendor/js/dropdown-hover.js
new file mode 100644
index 0000000..a986336
--- /dev/null
+++ b/resources/assets/vendor/js/dropdown-hover.js
@@ -0,0 +1,73 @@
+// Add onHover event for dropdowns
+
+;(function ($) {
+ if (!$ || !$.fn) return
+
+ const SELECTOR = '[data-bs-toggle=dropdown][data-trigger=hover]'
+ const TIMEOUT = 150
+
+ function openDropdown($i) {
+ let t = $i.data('dd-timeout')
+
+ if (t) {
+ clearTimeout(t)
+ t = null
+ $i.data('dd-timeout', t)
+ }
+
+ if ($i.attr('aria-expanded') !== 'true') $i.dropdown('toggle')
+ }
+
+ function closeDropdown($i) {
+ let t = $i.data('dd-timeout')
+
+ if (t) clearTimeout(t)
+
+ t = setTimeout(() => {
+ let t2 = $i.data('dd-timeout')
+
+ if (t2) {
+ clearTimeout(t2)
+ t2 = null
+ $i.data('dd-timeout', t2)
+ }
+
+ if ($i.attr('aria-expanded') === 'true') $i.dropdown('toggle')
+ }, TIMEOUT)
+
+ $i.data('dd-timeout', t)
+ }
+
+ $(function () {
+ $('body')
+ .on('mouseenter', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () {
+ const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')
+ const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu')
+
+ if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return
+
+ // Set hovered flag
+ if ($(this).is(SELECTOR)) {
+ $(this).data('hovered', true)
+ }
+
+ openDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle'))
+ })
+ .on('mouseleave', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () {
+ const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')
+ const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu')
+
+ if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return
+
+ // Remove hovered flag
+ if ($(this).is(SELECTOR)) {
+ $(this).data('hovered', false)
+ }
+
+ closeDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle'))
+ })
+ .on('hide.bs.dropdown', function (e) {
+ if ($(this).find(SELECTOR).data('hovered')) e.preventDefault()
+ })
+ })
+})(window.jQuery)
diff --git a/resources/assets/vendor/js/helpers.js b/resources/assets/vendor/js/helpers.js
new file mode 100644
index 0000000..9ca5341
--- /dev/null
+++ b/resources/assets/vendor/js/helpers.js
@@ -0,0 +1,1151 @@
+// Constants
+const TRANS_EVENTS = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd']
+const TRANS_PROPERTIES = ['transition', 'MozTransition', 'webkitTransition', 'WebkitTransition', 'OTransition']
+const INLINE_STYLES = `
+.layout-menu-fixed .layout-navbar-full .layout-menu,
+.layout-menu-fixed-offcanvas .layout-navbar-full .layout-menu {
+ top: {navbarHeight}px !important;
+}
+.layout-page {
+ padding-top: {navbarHeight}px !important;
+}
+.content-wrapper {
+ padding-bottom: {footerHeight}px !important;
+}`
+
+// Guard
+function requiredParam(name) {
+ throw new Error(`Parameter required${name ? `: \`${name}\`` : ''}`)
+}
+
+const Helpers = {
+ // Root Element
+ ROOT_EL: typeof window !== 'undefined' ? document.documentElement : null,
+
+ // Large screens breakpoint
+ LAYOUT_BREAKPOINT: 1200,
+
+ // Resize delay in milliseconds
+ RESIZE_DELAY: 200,
+
+ menuPsScroll: null,
+
+ mainMenu: null,
+
+ // Internal variables
+ _curStyle: null,
+ _styleEl: null,
+ _resizeTimeout: null,
+ _resizeCallback: null,
+ _transitionCallback: null,
+ _transitionCallbackTimeout: null,
+ _listeners: [],
+ _initialized: false,
+ _autoUpdate: false,
+ _lastWindowHeight: 0,
+
+ // *******************************************************************************
+ // * Utilities
+
+ // ---
+ // Scroll To Active Menu Item
+ _scrollToActive(animate = false, duration = 500) {
+ const layoutMenu = this.getLayoutMenu()
+
+ if (!layoutMenu) return
+
+ let activeEl = layoutMenu.querySelector('li.menu-item.active:not(.open)')
+
+ if (activeEl) {
+ // t = current time
+ // b = start value
+ // c = change in value
+ // d = duration
+ const easeInOutQuad = (t, b, c, d) => {
+ t /= d / 2
+ if (t < 1) return (c / 2) * t * t + b
+ t -= 1
+ return (-c / 2) * (t * (t - 2) - 1) + b
+ }
+
+ const element = this.getLayoutMenu().querySelector('.menu-inner')
+
+ if (typeof activeEl === 'string') {
+ activeEl = document.querySelector(activeEl)
+ }
+ if (typeof activeEl !== 'number') {
+ activeEl = activeEl.getBoundingClientRect().top + element.scrollTop
+ }
+
+ // If active element's top position is less than 2/3 (66%) of menu height than do not scroll
+ if (activeEl < parseInt((element.clientHeight * 2) / 3, 10)) return
+
+ const start = element.scrollTop
+ const change = activeEl - start - parseInt(element.clientHeight / 2, 10)
+ const startDate = +new Date()
+
+ if (animate === true) {
+ const animateScroll = () => {
+ const currentDate = +new Date()
+ const currentTime = currentDate - startDate
+ const val = easeInOutQuad(currentTime, start, change, duration)
+ element.scrollTop = val
+ if (currentTime < duration) {
+ requestAnimationFrame(animateScroll)
+ } else {
+ element.scrollTop = change
+ }
+ }
+ animateScroll()
+ } else {
+ element.scrollTop = change
+ }
+ }
+ },
+
+ // ---
+ // Swipe In Gesture
+ _swipeIn(targetEl, callback) {
+ const { Hammer } = window
+ if (typeof Hammer !== 'undefined' && typeof targetEl === 'string') {
+ // Swipe menu gesture
+ const swipeInElement = document.querySelector(targetEl)
+
+ if (swipeInElement) {
+ const hammerInstance = new Hammer(swipeInElement)
+
+ hammerInstance.on('panright', callback)
+ }
+ }
+ },
+
+ // ---
+ // Swipe Out Gesture
+ _swipeOut(targetEl, callback) {
+ const { Hammer } = window
+ if (typeof Hammer !== 'undefined' && typeof targetEl === 'string') {
+ setTimeout(() => {
+ // Swipe menu gesture
+ const swipeOutElement = document.querySelector(targetEl)
+
+ if (swipeOutElement) {
+ const hammerInstance = new Hammer(swipeOutElement)
+
+ hammerInstance.get('pan').set({ direction: Hammer.DIRECTION_ALL, threshold: 250 })
+ hammerInstance.on('panleft', callback)
+ }
+ }, 500)
+ }
+ },
+
+ // ---
+ // Swipe Out On Overlay Tap
+ _overlayTap(targetEl, callback) {
+ const { Hammer } = window
+
+ if (typeof Hammer !== 'undefined' && typeof targetEl === 'string') {
+ // Swipe out overlay element
+ const swipeOutOverlayElement = document.querySelector(targetEl)
+
+ if (swipeOutOverlayElement) {
+ const hammerInstance = new Hammer(swipeOutOverlayElement)
+
+ hammerInstance.on('tap', callback)
+ }
+ }
+ },
+
+ // ---
+ // Add classes
+ _addClass(cls, el = this.ROOT_EL) {
+ if (el && el.length !== undefined) {
+ // Add classes to multiple elements
+ el.forEach(e => {
+ if (e) {
+ cls.split(' ').forEach(c => e.classList.add(c))
+ }
+ })
+ } else if (el) {
+ // Add classes to single element
+ cls.split(' ').forEach(c => el.classList.add(c))
+ }
+ },
+
+ // ---
+ // Remove classes
+ _removeClass(cls, el = this.ROOT_EL) {
+ if (el && el.length !== undefined) {
+ // Remove classes to multiple elements
+ el.forEach(e => {
+ if (e) {
+ cls.split(' ').forEach(c => e.classList.remove(c))
+ }
+ })
+ } else if (el) {
+ // Remove classes to single element
+ cls.split(' ').forEach(c => el.classList.remove(c))
+ }
+ },
+
+ // Toggle classes
+ _toggleClass(el = this.ROOT_EL, cls1, cls2) {
+ if (el.classList.contains(cls1)) {
+ el.classList.replace(cls1, cls2)
+ } else {
+ el.classList.replace(cls2, cls1)
+ }
+ },
+
+ // ---
+ // Has class
+ _hasClass(cls, el = this.ROOT_EL) {
+ let result = false
+
+ cls.split(' ').forEach(c => {
+ if (el.classList.contains(c)) result = true
+ })
+
+ return result
+ },
+
+ _findParent(el, cls) {
+ if ((el && el.tagName.toUpperCase() === 'BODY') || el.tagName.toUpperCase() === 'HTML') return null
+ el = el.parentNode
+ while (el && el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {
+ el = el.parentNode
+ }
+ el = el && el.tagName.toUpperCase() !== 'BODY' ? el : null
+ return el
+ },
+
+ // ---
+ // Trigger window event
+ _triggerWindowEvent(name) {
+ if (typeof window === 'undefined') return
+
+ if (document.createEvent) {
+ let event
+
+ if (typeof Event === 'function') {
+ event = new Event(name)
+ } else {
+ event = document.createEvent('Event')
+ event.initEvent(name, false, true)
+ }
+
+ window.dispatchEvent(event)
+ } else {
+ window.fireEvent(`on${name}`, document.createEventObject())
+ }
+ },
+
+ // ---
+ // Trigger event
+ _triggerEvent(name) {
+ this._triggerWindowEvent(`layout${name}`)
+
+ this._listeners.filter(listener => listener.event === name).forEach(listener => listener.callback.call(null))
+ },
+
+ // ---
+ // Update style
+ _updateInlineStyle(navbarHeight = 0, footerHeight = 0) {
+ if (!this._styleEl) {
+ this._styleEl = document.createElement('style')
+ this._styleEl.type = 'text/css'
+ document.head.appendChild(this._styleEl)
+ }
+
+ const newStyle = INLINE_STYLES.replace(/\{navbarHeight\}/gi, navbarHeight).replace(
+ /\{footerHeight\}/gi,
+ footerHeight
+ )
+
+ if (this._curStyle !== newStyle) {
+ this._curStyle = newStyle
+ this._styleEl.textContent = newStyle
+ }
+ },
+
+ // ---
+ // Remove style
+ _removeInlineStyle() {
+ if (this._styleEl) document.head.removeChild(this._styleEl)
+ this._styleEl = null
+ this._curStyle = null
+ },
+
+ // ---
+ // Redraw layout menu (Safari bugfix)
+ _redrawLayoutMenu() {
+ const layoutMenu = this.getLayoutMenu()
+
+ if (layoutMenu && layoutMenu.querySelector('.menu')) {
+ const inner = layoutMenu.querySelector('.menu-inner')
+ const { scrollTop } = inner
+ const pageScrollTop = document.documentElement.scrollTop
+
+ layoutMenu.style.display = 'none'
+ // layoutMenu.offsetHeight
+ layoutMenu.style.display = ''
+ inner.scrollTop = scrollTop
+ document.documentElement.scrollTop = pageScrollTop
+
+ return true
+ }
+
+ return false
+ },
+
+ // ---
+ // Check for transition support
+ _supportsTransitionEnd() {
+ if (window.QUnit) return false
+
+ const el = document.body || document.documentElement
+
+ if (!el) return false
+
+ let result = false
+ TRANS_PROPERTIES.forEach(evnt => {
+ if (typeof el.style[evnt] !== 'undefined') result = true
+ })
+
+ return result
+ },
+
+ // ---
+ // Calculate current navbar height
+ _getNavbarHeight() {
+ const layoutNavbar = this.getLayoutNavbar()
+
+ if (!layoutNavbar) return 0
+ if (!this.isSmallScreen()) return layoutNavbar.getBoundingClientRect().height
+
+ // Needs some logic to get navbar height on small screens
+
+ const clonedEl = layoutNavbar.cloneNode(true)
+ clonedEl.id = null
+ clonedEl.style.visibility = 'hidden'
+ clonedEl.style.position = 'absolute'
+
+ Array.prototype.slice.call(clonedEl.querySelectorAll('.collapse.show')).forEach(el => this._removeClass('show', el))
+
+ layoutNavbar.parentNode.insertBefore(clonedEl, layoutNavbar)
+
+ const navbarHeight = clonedEl.getBoundingClientRect().height
+
+ clonedEl.parentNode.removeChild(clonedEl)
+
+ return navbarHeight
+ },
+
+ // ---
+ // Get current footer height
+ _getFooterHeight() {
+ const layoutFooter = this.getLayoutFooter()
+
+ if (!layoutFooter) return 0
+
+ return layoutFooter.getBoundingClientRect().height
+ },
+
+ // ---
+ // Get animation duration of element
+ _getAnimationDuration(el) {
+ const duration = window.getComputedStyle(el).transitionDuration
+
+ return parseFloat(duration) * (duration.indexOf('ms') !== -1 ? 1 : 1000)
+ },
+
+ // ---
+ // Set menu hover state
+ _setMenuHoverState(hovered) {
+ this[hovered ? '_addClass' : '_removeClass']('layout-menu-hover')
+ },
+
+ // ---
+ // Toggle collapsed
+ _setCollapsed(collapsed) {
+ if (this.isSmallScreen()) {
+ if (collapsed) {
+ this._removeClass('layout-menu-expanded')
+ } else {
+ setTimeout(
+ () => {
+ this._addClass('layout-menu-expanded')
+ },
+ this._redrawLayoutMenu() ? 5 : 0
+ )
+ }
+ } else {
+ this[collapsed ? '_addClass' : '_removeClass']('layout-menu-collapsed')
+ }
+ },
+
+ // ---
+ // Add layout sivenav toggle animationEnd event
+ _bindLayoutAnimationEndEvent(modifier, cb) {
+ const menu = this.getMenu()
+ const duration = menu ? this._getAnimationDuration(menu) + 50 : 0
+
+ if (!duration) {
+ modifier.call(this)
+ cb.call(this)
+ return
+ }
+
+ this._transitionCallback = e => {
+ if (e.target !== menu) return
+ this._unbindLayoutAnimationEndEvent()
+ cb.call(this)
+ }
+
+ TRANS_EVENTS.forEach(e => {
+ menu.addEventListener(e, this._transitionCallback, false)
+ })
+
+ modifier.call(this)
+
+ this._transitionCallbackTimeout = setTimeout(() => {
+ this._transitionCallback.call(this, { target: menu })
+ }, duration)
+ },
+
+ // ---
+ // Remove layout sivenav toggle animationEnd event
+ _unbindLayoutAnimationEndEvent() {
+ const menu = this.getMenu()
+
+ if (this._transitionCallbackTimeout) {
+ clearTimeout(this._transitionCallbackTimeout)
+ this._transitionCallbackTimeout = null
+ }
+
+ if (menu && this._transitionCallback) {
+ TRANS_EVENTS.forEach(e => {
+ menu.removeEventListener(e, this._transitionCallback, false)
+ })
+ }
+
+ if (this._transitionCallback) {
+ this._transitionCallback = null
+ }
+ },
+
+ // ---
+ // Bind delayed window resize event
+ _bindWindowResizeEvent() {
+ this._unbindWindowResizeEvent()
+
+ const cb = () => {
+ if (this._resizeTimeout) {
+ clearTimeout(this._resizeTimeout)
+ this._resizeTimeout = null
+ }
+ this._triggerEvent('resize')
+ }
+
+ this._resizeCallback = () => {
+ if (this._resizeTimeout) clearTimeout(this._resizeTimeout)
+ this._resizeTimeout = setTimeout(cb, this.RESIZE_DELAY)
+ }
+
+ window.addEventListener('resize', this._resizeCallback, false)
+ },
+
+ // ---
+ // Unbind delayed window resize event
+ _unbindWindowResizeEvent() {
+ if (this._resizeTimeout) {
+ clearTimeout(this._resizeTimeout)
+ this._resizeTimeout = null
+ }
+
+ if (this._resizeCallback) {
+ window.removeEventListener('resize', this._resizeCallback, false)
+ this._resizeCallback = null
+ }
+ },
+
+ _bindMenuMouseEvents() {
+ if (this._menuMouseEnter && this._menuMouseLeave && this._windowTouchStart) return
+
+ const layoutMenu = this.getLayoutMenu()
+ if (!layoutMenu) return this._unbindMenuMouseEvents()
+
+ if (!this._menuMouseEnter) {
+ this._menuMouseEnter = () => {
+ if (
+ this.isSmallScreen() ||
+ !this._hasClass('layout-menu-collapsed') ||
+ this.isOffcanvas() ||
+ this._hasClass('layout-transitioning')
+ ) {
+ return this._setMenuHoverState(false)
+ }
+
+ return this._setMenuHoverState(true)
+ }
+ layoutMenu.addEventListener('mouseenter', this._menuMouseEnter, false)
+ layoutMenu.addEventListener('touchstart', this._menuMouseEnter, false)
+ }
+
+ if (!this._menuMouseLeave) {
+ this._menuMouseLeave = () => {
+ this._setMenuHoverState(false)
+ }
+ layoutMenu.addEventListener('mouseleave', this._menuMouseLeave, false)
+ }
+
+ if (!this._windowTouchStart) {
+ this._windowTouchStart = e => {
+ if (!e || !e.target || !this._findParent(e.target, '.layout-menu')) {
+ this._setMenuHoverState(false)
+ }
+ }
+ window.addEventListener('touchstart', this._windowTouchStart, true)
+ }
+ },
+
+ _unbindMenuMouseEvents() {
+ if (!this._menuMouseEnter && !this._menuMouseLeave && !this._windowTouchStart) return
+
+ const layoutMenu = this.getLayoutMenu()
+
+ if (this._menuMouseEnter) {
+ if (layoutMenu) {
+ layoutMenu.removeEventListener('mouseenter', this._menuMouseEnter, false)
+ layoutMenu.removeEventListener('touchstart', this._menuMouseEnter, false)
+ }
+ this._menuMouseEnter = null
+ }
+
+ if (this._menuMouseLeave) {
+ if (layoutMenu) {
+ layoutMenu.removeEventListener('mouseleave', this._menuMouseLeave, false)
+ }
+ this._menuMouseLeave = null
+ }
+
+ if (this._windowTouchStart) {
+ if (layoutMenu) {
+ window.addEventListener('touchstart', this._windowTouchStart, true)
+ }
+ this._windowTouchStart = null
+ }
+
+ this._setMenuHoverState(false)
+ },
+
+ // *******************************************************************************
+ // * Methods
+
+ scrollToActive(animate = false) {
+ this._scrollToActive(animate)
+ },
+
+ swipeIn(el, callback) {
+ this._swipeIn(el, callback)
+ },
+
+ swipeOut(el, callback) {
+ this._swipeOut(el, callback)
+ },
+
+ overlayTap(el, callback) {
+ this._overlayTap(el, callback)
+ },
+
+ scrollPageTo(to, duration = 500) {
+ // t = current time
+ // b = start value
+ // c = change in value
+ // d = duration
+ const easeInOutQuad = (t, b, c, d) => {
+ t /= d / 2
+ if (t < 1) return (c / 2) * t * t + b
+ t -= 1
+ return (-c / 2) * (t * (t - 2) - 1) + b
+ }
+
+ const element = document.scrollingElement
+
+ if (typeof to === 'string') {
+ to = document.querySelector(to)
+ }
+ if (typeof to !== 'number') {
+ to = to.getBoundingClientRect().top + element.scrollTop
+ }
+
+ const start = element.scrollTop
+ const change = to - start
+ const startDate = +new Date()
+ // const increment = 20
+
+ const animateScroll = () => {
+ const currentDate = +new Date()
+ const currentTime = currentDate - startDate
+ const val = easeInOutQuad(currentTime, start, change, duration)
+ element.scrollTop = val
+ if (currentTime < duration) {
+ requestAnimationFrame(animateScroll)
+ } else {
+ element.scrollTop = to
+ }
+ }
+ animateScroll()
+ },
+
+ // ---
+ // Collapse / expand layout
+ setCollapsed(collapsed = requiredParam('collapsed'), animate = true) {
+ const layoutMenu = this.getLayoutMenu()
+
+ if (!layoutMenu) return
+
+ this._unbindLayoutAnimationEndEvent()
+
+ if (animate && this._supportsTransitionEnd()) {
+ this._addClass('layout-transitioning')
+ if (collapsed) this._setMenuHoverState(false)
+
+ this._bindLayoutAnimationEndEvent(
+ () => {
+ // Collapse / Expand
+ this._setCollapsed(collapsed)
+ },
+ () => {
+ this._removeClass('layout-transitioning')
+ this._triggerWindowEvent('resize')
+ this._triggerEvent('toggle')
+ this._setMenuHoverState(false)
+ }
+ )
+ } else {
+ this._addClass('layout-no-transition')
+ if (collapsed) this._setMenuHoverState(false)
+
+ // Collapse / Expand
+ this._setCollapsed(collapsed)
+
+ setTimeout(() => {
+ this._removeClass('layout-no-transition')
+ this._triggerWindowEvent('resize')
+ this._triggerEvent('toggle')
+ this._setMenuHoverState(false)
+ }, 1)
+ }
+ },
+
+ // ---
+ // Toggle layout
+ toggleCollapsed(animate = true) {
+ this.setCollapsed(!this.isCollapsed(), animate)
+ },
+
+ // ---
+ // Set layout positioning
+ setPosition(fixed = requiredParam('fixed'), offcanvas = requiredParam('offcanvas')) {
+ this._removeClass('layout-menu-offcanvas layout-menu-fixed layout-menu-fixed-offcanvas')
+
+ if (!fixed && offcanvas) {
+ this._addClass('layout-menu-offcanvas')
+ } else if (fixed && !offcanvas) {
+ this._addClass('layout-menu-fixed')
+ this._redrawLayoutMenu()
+ } else if (fixed && offcanvas) {
+ this._addClass('layout-menu-fixed-offcanvas')
+ this._redrawLayoutMenu()
+ }
+
+ this.update()
+ },
+
+ // *******************************************************************************
+ // * Getters
+
+ getLayoutMenu() {
+ return document.querySelector('.layout-menu')
+ },
+
+ getMenu() {
+ const layoutMenu = this.getLayoutMenu()
+
+ if (!layoutMenu) return null
+
+ return !this._hasClass('menu', layoutMenu) ? layoutMenu.querySelector('.menu') : layoutMenu
+ },
+
+ getLayoutNavbar() {
+ return document.querySelector('.layout-navbar')
+ },
+
+ getLayoutFooter() {
+ return document.querySelector('.content-footer')
+ },
+
+ getLayoutContainer() {
+ return document.querySelector('.layout-page')
+ },
+
+ // *******************************************************************************
+ // * Setters
+
+ setNavbarFixed(fixed = requiredParam('fixed')) {
+ this[fixed ? '_addClass' : '_removeClass']('layout-navbar-fixed')
+ this.update()
+ },
+
+ setNavbar(type) {
+ if (type === 'sticky') {
+ this._addClass('layout-navbar-fixed')
+ this._removeClass('layout-navbar-hidden')
+ } else if (type === 'hidden') {
+ this._addClass('layout-navbar-hidden')
+ this._removeClass('layout-navbar-fixed')
+ } else {
+ this._removeClass('layout-navbar-hidden')
+ this._removeClass('layout-navbar-fixed')
+ }
+ this.update()
+ },
+
+ setFooterFixed(fixed = requiredParam('fixed')) {
+ this[fixed ? '_addClass' : '_removeClass']('layout-footer-fixed')
+ this.update()
+ },
+
+ setContentLayout(contentLayout = requiredParam('contentLayout')) {
+ setTimeout(() => {
+ const contentArea = document.querySelector('.content-wrapper > div') // For content area
+ const navbarArea = document.querySelector('.layout-navbar') // For navbar area for vertical menu
+ const navbarAreaHorizontal = document.querySelector('.layout-navbar > div') // For navbar area for horizontal menu
+ const navbarSearchInputWrapper = document.querySelector('.layout-navbar .search-input-wrapper') // For navbar search input wrapper
+ const navbarSearchInput = document.querySelector('.layout-navbar .search-input-wrapper .search-input') // For navbar search input
+ const footerArea = document.querySelector('.content-footer > div') // For footer area
+ const containerFluid = [].slice.call(document.querySelectorAll('.container-fluid')) // To get container-fluid
+ const containerXxl = [].slice.call(document.querySelectorAll('.container-xxl')) // To get container-xxl
+ const verticalMenu = document.querySelector('.menu-vertical')
+ let horizontalMenu = false // For horizontal menu
+ let horizontalMenuArea // For horizontal menu area
+ // Condition to check if layout is horizontal menu
+ if (document.querySelector('.content-wrapper > .menu-horizontal > div')) {
+ horizontalMenu = true
+ horizontalMenuArea = document.querySelector('.content-wrapper > .menu-horizontal > div')
+ }
+ // If compact mode layout
+ if (contentLayout === 'compact') {
+ // Remove container fluid class from content area and footer area
+ if (containerFluid.some(el => [contentArea, footerArea].includes(el))) {
+ this._removeClass('container-fluid', [contentArea, footerArea])
+ this._addClass('container-xxl', [contentArea, footerArea])
+ }
+ // Navbar search input container condition is separated because it is not in starter kit
+ if (navbarSearchInput) {
+ this._removeClass('container-fluid', [navbarSearchInput])
+ this._addClass('container-xxl', [navbarSearchInput])
+ }
+ // Remove container fluid class from navbar area in vertical menu
+ if (verticalMenu) {
+ if (containerFluid.some(el => [navbarArea].includes(el))) {
+ this._removeClass('container-fluid', [navbarArea])
+ this._addClass('container-xxl', [navbarArea])
+ }
+ }
+ // For horizontal menu only
+ if (horizontalMenu) {
+ this._removeClass('container-fluid', horizontalMenuArea)
+ this._addClass('container-xxl', horizontalMenuArea)
+ // For horizontal navbar only
+ if (navbarAreaHorizontal) {
+ this._removeClass('container-fluid', navbarAreaHorizontal)
+ this._addClass('container-xxl', navbarAreaHorizontal)
+ }
+ // Navbar search input container condition is separated because it is not in starter kit
+ if (navbarSearchInputWrapper) {
+ this._removeClass('container-fluid', navbarSearchInputWrapper)
+ this._addClass('container-xxl', navbarSearchInputWrapper)
+ }
+ }
+ } else {
+ // If wide mode layout
+
+ // Remove container xxl class from content area and footer area
+ if (containerXxl.some(el => [contentArea, footerArea].includes(el))) {
+ this._removeClass('container-xxl', [contentArea, footerArea])
+ this._addClass('container-fluid', [contentArea, footerArea])
+ }
+ // Navbar search input container condition is separated because it is not in starter kit
+ if (navbarSearchInput) {
+ this._removeClass('container-xxl', [navbarSearchInput])
+ this._addClass('container-fluid', [navbarSearchInput])
+ }
+ // Remove container xxl class from navbar area in vertical menu
+ if (verticalMenu) {
+ if (containerXxl.some(el => [navbarArea].includes(el))) {
+ this._removeClass('container-xxl', [navbarArea])
+ this._addClass('container-fluid', [navbarArea])
+ }
+ }
+ // For horizontal menu only
+ if (horizontalMenu) {
+ this._removeClass('container-xxl', horizontalMenuArea)
+ this._addClass('container-fluid', horizontalMenuArea)
+ // For horizontal navbar only
+ if (navbarAreaHorizontal) {
+ this._removeClass('container-xxl', navbarAreaHorizontal)
+ this._addClass('container-fluid', navbarAreaHorizontal)
+ }
+ // Navbar search input container condition is separated because it is not in starter kit
+ if (navbarSearchInputWrapper) {
+ this._removeClass('container-xxl', navbarSearchInputWrapper)
+ this._addClass('container-fluid', navbarSearchInputWrapper)
+ }
+ }
+ }
+ }, 100)
+ },
+
+ // *******************************************************************************
+ // * Update
+
+ update() {
+ if (
+ (this.getLayoutNavbar() &&
+ ((!this.isSmallScreen() && this.isLayoutNavbarFull() && this.isFixed()) || this.isNavbarFixed())) ||
+ (this.getLayoutFooter() && this.isFooterFixed())
+ ) {
+ this._updateInlineStyle(this._getNavbarHeight(), this._getFooterHeight())
+ }
+
+ this._bindMenuMouseEvents()
+ },
+
+ setAutoUpdate(enable = requiredParam('enable')) {
+ if (enable && !this._autoUpdate) {
+ this.on('resize.Helpers:autoUpdate', () => this.update())
+ this._autoUpdate = true
+ } else if (!enable && this._autoUpdate) {
+ this.off('resize.Helpers:autoUpdate')
+ this._autoUpdate = false
+ }
+ },
+
+ // Update custom option based on element
+ updateCustomOptionCheck(el) {
+ if (el.checked) {
+ // If custom option element is radio, remove checked from the siblings (closest `.row`)
+ if (el.type === 'radio') {
+ const customRadioOptionList = [].slice.call(el.closest('.row').querySelectorAll('.custom-option'))
+ customRadioOptionList.map(function (customRadioOptionEL) {
+ customRadioOptionEL.closest('.custom-option').classList.remove('checked')
+ })
+ }
+ el.closest('.custom-option').classList.add('checked')
+ } else {
+ el.closest('.custom-option').classList.remove('checked')
+ }
+ },
+
+ // *******************************************************************************
+ // * Tests
+
+ isRtl() {
+ return (
+ document.querySelector('body').getAttribute('dir') === 'rtl' ||
+ document.querySelector('html').getAttribute('dir') === 'rtl'
+ )
+ },
+
+ isMobileDevice() {
+ return typeof window.orientation !== 'undefined' || navigator.userAgent.indexOf('IEMobile') !== -1
+ },
+
+ isSmallScreen() {
+ return (
+ (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) < this.LAYOUT_BREAKPOINT
+ )
+ },
+
+ isLayoutNavbarFull() {
+ return !!document.querySelector('.layout-wrapper.layout-navbar-full')
+ },
+
+ isCollapsed() {
+ if (this.isSmallScreen()) {
+ return !this._hasClass('layout-menu-expanded')
+ }
+ return this._hasClass('layout-menu-collapsed')
+ },
+
+ isFixed() {
+ return this._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
+ },
+
+ isOffcanvas() {
+ return this._hasClass('layout-menu-offcanvas layout-menu-fixed-offcanvas')
+ },
+
+ isNavbarFixed() {
+ return (
+ this._hasClass('layout-navbar-fixed') || (!this.isSmallScreen() && this.isFixed() && this.isLayoutNavbarFull())
+ )
+ },
+
+ isFooterFixed() {
+ return this._hasClass('layout-footer-fixed')
+ },
+
+ isLightStyle() {
+ return document.documentElement.classList.contains('light-style')
+ },
+
+ isDarkStyle() {
+ return document.documentElement.classList.contains('dark-style')
+ },
+
+ // *******************************************************************************
+ // * Events
+
+ on(event = requiredParam('event'), callback = requiredParam('callback')) {
+ const [_event] = event.split('.')
+ let [, ...namespace] = event.split('.')
+ // let [_event, ...namespace] = event.split('.')
+ namespace = namespace.join('.') || null
+
+ this._listeners.push({ event: _event, namespace, callback })
+ },
+
+ off(event = requiredParam('event')) {
+ const [_event] = event.split('.')
+ let [, ...namespace] = event.split('.')
+ namespace = namespace.join('.') || null
+
+ this._listeners
+ .filter(listener => listener.event === _event && listener.namespace === namespace)
+ .forEach(listener => this._listeners.splice(this._listeners.indexOf(listener), 1))
+ },
+
+ // *******************************************************************************
+ // * Life cycle
+
+ init() {
+ if (this._initialized) return
+ this._initialized = true
+
+ // Initialize `style` element
+ this._updateInlineStyle(0)
+
+ // Bind window resize event
+ this._bindWindowResizeEvent()
+
+ // Bind init event
+ this.off('init._Helpers')
+ this.on('init._Helpers', () => {
+ this.off('resize._Helpers:redrawMenu')
+ this.on('resize._Helpers:redrawMenu', () => {
+ // eslint-disable-next-line no-unused-expressions
+ this.isSmallScreen() && !this.isCollapsed() && this._redrawLayoutMenu()
+ })
+
+ // Force repaint in IE 10
+ if (typeof document.documentMode === 'number' && document.documentMode < 11) {
+ this.off('resize._Helpers:ie10RepaintBody')
+ this.on('resize._Helpers:ie10RepaintBody', () => {
+ if (this.isFixed()) return
+ const { scrollTop } = document.documentElement
+ document.body.style.display = 'none'
+ // document.body.offsetHeight
+ document.body.style.display = 'block'
+ document.documentElement.scrollTop = scrollTop
+ })
+ }
+ })
+
+ this._triggerEvent('init')
+ },
+
+ destroy() {
+ if (!this._initialized) return
+ this._initialized = false
+
+ this._removeClass('layout-transitioning')
+ this._removeInlineStyle()
+ this._unbindLayoutAnimationEndEvent()
+ this._unbindWindowResizeEvent()
+ this._unbindMenuMouseEvents()
+ this.setAutoUpdate(false)
+
+ this.off('init._Helpers')
+
+ // Remove all listeners except `init`
+ this._listeners
+ .filter(listener => listener.event !== 'init')
+ .forEach(listener => this._listeners.splice(this._listeners.indexOf(listener), 1))
+ },
+
+ // ---
+ // Init Password Toggle
+ initPasswordToggle() {
+ const toggler = document.querySelectorAll('.form-password-toggle i')
+ if (typeof toggler !== 'undefined' && toggler !== null) {
+ toggler.forEach(el => {
+ el.addEventListener('click', e => {
+ e.preventDefault()
+ const formPasswordToggle = el.closest('.form-password-toggle')
+ const formPasswordToggleIcon = formPasswordToggle.querySelector('i')
+ const formPasswordToggleInput = formPasswordToggle.querySelector('input')
+
+ if (formPasswordToggleInput.getAttribute('type') === 'text') {
+ formPasswordToggleInput.setAttribute('type', 'password')
+ formPasswordToggleIcon.classList.replace('ti-eye', 'ti-eye-off')
+ } else if (formPasswordToggleInput.getAttribute('type') === 'password') {
+ formPasswordToggleInput.setAttribute('type', 'text')
+ formPasswordToggleIcon.classList.replace('ti-eye-off', 'ti-eye')
+ }
+ })
+ })
+ }
+ },
+
+ //--
+ // Init custom option check
+ initCustomOptionCheck() {
+ const _this = this
+
+ const custopOptionList = [].slice.call(document.querySelectorAll('.custom-option .form-check-input'))
+ custopOptionList.map(function (customOptionEL) {
+ // Update custom options check on page load
+ _this.updateCustomOptionCheck(customOptionEL)
+
+ // Update custom options check on click
+ customOptionEL.addEventListener('click', e => {
+ _this.updateCustomOptionCheck(customOptionEL)
+ })
+ })
+ },
+
+ // ---
+ // Init Speech To Text
+ initSpeechToText() {
+ const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition
+ const speechToText = document.querySelectorAll('.speech-to-text')
+ if (SpeechRecognition !== undefined && SpeechRecognition !== null) {
+ if (typeof speechToText !== 'undefined' && speechToText !== null) {
+ const recognition = new SpeechRecognition()
+ const toggler = document.querySelectorAll('.speech-to-text i')
+ toggler.forEach(el => {
+ let listening = false
+ el.addEventListener('click', () => {
+ el.closest('.input-group').querySelector('.form-control').focus()
+ recognition.onspeechstart = () => {
+ listening = true
+ }
+ if (listening === false) {
+ recognition.start()
+ }
+ recognition.onerror = () => {
+ listening = false
+ }
+ recognition.onresult = event => {
+ el.closest('.input-group').querySelector('.form-control').value = event.results[0][0].transcript
+ }
+ recognition.onspeechend = () => {
+ listening = false
+ recognition.stop()
+ }
+ })
+ })
+ }
+ }
+ },
+
+ // ---
+ // Init Navbar Dropdown (i.e notification) PerfectScrollbar
+ initNavbarDropdownScrollbar() {
+ const scrollbarContainer = document.querySelectorAll('.navbar-dropdown .scrollable-container')
+ const { PerfectScrollbar } = window
+
+ if (PerfectScrollbar !== undefined) {
+ if (typeof scrollbarContainer !== 'undefined' && scrollbarContainer !== null) {
+ scrollbarContainer.forEach(el => {
+ // eslint-disable-next-line no-new
+ new PerfectScrollbar(el, {
+ wheelPropagation: false,
+ suppressScrollX: true
+ })
+ })
+ }
+ }
+ },
+
+ // Ajax Call Promise
+ ajaxCall(url) {
+ return new Promise((resolve, reject) => {
+ const req = new XMLHttpRequest()
+ req.open('GET', url)
+ req.onload = () => (req.status === 200 ? resolve(req.response) : reject(Error(req.statusText)))
+ req.onerror = e => reject(Error(`Network Error: ${e}`))
+ req.send()
+ })
+ },
+
+ // ---
+ // SidebarToggle (Used in Apps)
+ initSidebarToggle() {
+ const sidebarToggler = document.querySelectorAll('[data-bs-toggle="sidebar"]')
+
+ sidebarToggler.forEach(el => {
+ el.addEventListener('click', () => {
+ const target = el.getAttribute('data-target')
+ const overlay = el.getAttribute('data-overlay')
+ const appOverlay = document.querySelectorAll('.app-overlay')
+ const targetEl = document.querySelectorAll(target)
+
+ targetEl.forEach(tel => {
+ tel.classList.toggle('show')
+ if (
+ typeof overlay !== 'undefined' &&
+ overlay !== null &&
+ overlay !== false &&
+ typeof appOverlay !== 'undefined'
+ ) {
+ if (tel.classList.contains('show')) {
+ appOverlay[0].classList.add('show')
+ } else {
+ appOverlay[0].classList.remove('show')
+ }
+ appOverlay[0].addEventListener('click', e => {
+ e.currentTarget.classList.remove('show')
+ tel.classList.remove('show')
+ })
+ }
+ })
+ })
+ })
+ }
+}
+
+// *******************************************************************************
+// * Initialization
+
+if (typeof window !== 'undefined') {
+ Helpers.init()
+
+ if (Helpers.isMobileDevice() && window.chrome) {
+ document.documentElement.classList.add('layout-menu-100vh')
+ }
+
+ // Update layout after page load
+ if (document.readyState === 'complete') Helpers.update()
+ else
+ document.addEventListener('DOMContentLoaded', function onContentLoaded() {
+ Helpers.update()
+ document.removeEventListener('DOMContentLoaded', onContentLoaded)
+ })
+}
+
+// ---
+window.Helpers = Helpers
+export { Helpers }
diff --git a/resources/assets/vendor/js/mega-dropdown.js b/resources/assets/vendor/js/mega-dropdown.js
new file mode 100644
index 0000000..2525cd5
--- /dev/null
+++ b/resources/assets/vendor/js/mega-dropdown.js
@@ -0,0 +1,206 @@
+const TIMEOUT = 150
+
+class MegaDropdown {
+ constructor(element, options = {}) {
+ this._onHover = options.trigger === 'hover' || element.getAttribute('data-trigger') === 'hover'
+
+ this._container = MegaDropdown._findParent(element, 'mega-dropdown')
+ if (!this._container) return
+
+ this._menu = this._container.querySelector('.dropdown-toggle ~ .dropdown-menu')
+ if (!this._menu) return
+
+ element.setAttribute('aria-expanded', 'false')
+
+ this._el = element
+ this._bindEvents()
+ }
+
+ open() {
+ if (this._timeout) {
+ clearTimeout(this._timeout)
+ this._timeout = null
+ }
+ if (this._focusTimeout) {
+ clearTimeout(this._focusTimeout)
+ this._focusTimeout = null
+ }
+
+ if (this._el.getAttribute('aria-expanded') !== 'true') {
+ this._triggerEvent('show')
+ this._container.classList.add('show')
+ this._menu.classList.add('show')
+ this._el.setAttribute('aria-expanded', 'true')
+ this._el.focus()
+ this._triggerEvent('shown')
+ }
+ }
+
+ close(force) {
+ if (this._timeout) {
+ clearTimeout(this._timeout)
+ this._timeout = null
+ }
+ if (this._focusTimeout) {
+ clearTimeout(this._focusTimeout)
+ this._focusTimeout = null
+ }
+
+ if (this._onHover && !force) {
+ this._timeout = setTimeout(() => {
+ if (this._timeout) {
+ clearTimeout(this._timeout)
+ this._timeout = null
+ }
+ this._close()
+ }, TIMEOUT)
+ } else {
+ this._close()
+ }
+ }
+
+ toggle() {
+ // eslint-disable-next-line no-unused-expressions
+ this._el.getAttribute('aria-expanded') === 'true' ? this.close(true) : this.open()
+ }
+
+ destroy() {
+ this._unbindEvents()
+ this._el = null
+
+ if (this._timeout) {
+ clearTimeout(this._timeout)
+ this._timeout = null
+ }
+
+ if (this._focusTimeout) {
+ clearTimeout(this._focusTimeout)
+ this._focusTimeout = null
+ }
+ }
+
+ _close() {
+ if (this._el.getAttribute('aria-expanded') === 'true') {
+ this._triggerEvent('hide')
+ this._container.classList.remove('show')
+ this._menu.classList.remove('show')
+ this._el.setAttribute('aria-expanded', 'false')
+ this._triggerEvent('hidden')
+ }
+ }
+
+ _bindEvents() {
+ this._elClickEvnt = e => {
+ e.preventDefault()
+ this.toggle()
+ }
+ this._el.addEventListener('click', this._elClickEvnt)
+
+ this._bodyClickEvnt = e => {
+ if (!this._container.contains(e.target) && this._container.classList.contains('show')) {
+ this.close(true)
+ }
+ }
+ document.body.addEventListener('click', this._bodyClickEvnt, true)
+
+ this._menuClickEvnt = e => {
+ if (e.target.classList.contains('mega-dropdown-link')) {
+ this.close(true)
+ }
+ }
+ this._menu.addEventListener('click', this._menuClickEvnt, true)
+
+ this._focusoutEvnt = () => {
+ if (this._focusTimeout) {
+ clearTimeout(this._focusTimeout)
+ this._focusTimeout = null
+ }
+
+ if (this._el.getAttribute('aria-expanded') !== 'true') return
+
+ this._focusTimeout = setTimeout(() => {
+ if (
+ document.activeElement.tagName.toUpperCase() !== 'BODY' &&
+ MegaDropdown._findParent(document.activeElement, 'mega-dropdown') !== this._container
+ ) {
+ this.close(true)
+ }
+ }, 100)
+ }
+ this._container.addEventListener('focusout', this._focusoutEvnt, true)
+
+ if (this._onHover) {
+ this._enterEvnt = () => {
+ if (window.getComputedStyle(this._menu, null).getPropertyValue('position') === 'static') return
+ this.open()
+ }
+ this._leaveEvnt = () => {
+ if (window.getComputedStyle(this._menu, null).getPropertyValue('position') === 'static') return
+ this.close()
+ }
+
+ this._el.addEventListener('mouseenter', this._enterEvnt)
+ this._menu.addEventListener('mouseenter', this._enterEvnt)
+ this._el.addEventListener('mouseleave', this._leaveEvnt)
+ this._menu.addEventListener('mouseleave', this._leaveEvnt)
+ }
+ }
+
+ _unbindEvents() {
+ if (this._elClickEvnt) {
+ this._el.removeEventListener('click', this._elClickEvnt)
+ this._elClickEvnt = null
+ }
+ if (this._bodyClickEvnt) {
+ document.body.removeEventListener('click', this._bodyClickEvnt, true)
+ this._bodyClickEvnt = null
+ }
+ if (this._menuClickEvnt) {
+ this._menu.removeEventListener('click', this._menuClickEvnt, true)
+ this._menuClickEvnt = null
+ }
+ if (this._focusoutEvnt) {
+ this._container.removeEventListener('focusout', this._focusoutEvnt, true)
+ this._focusoutEvnt = null
+ }
+ if (this._enterEvnt) {
+ this._el.removeEventListener('mouseenter', this._enterEvnt)
+ this._menu.removeEventListener('mouseenter', this._enterEvnt)
+ this._enterEvnt = null
+ }
+ if (this._leaveEvnt) {
+ this._el.removeEventListener('mouseleave', this._leaveEvnt)
+ this._menu.removeEventListener('mouseleave', this._leaveEvnt)
+ this._leaveEvnt = null
+ }
+ }
+
+ static _findParent(el, cls) {
+ if (el.tagName.toUpperCase() === 'BODY') return null
+ el = el.parentNode
+ while (el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {
+ el = el.parentNode
+ }
+ return el.tagName.toUpperCase() !== 'BODY' ? el : null
+ }
+
+ _triggerEvent(event) {
+ if (document.createEvent) {
+ let customEvent
+
+ if (typeof Event === 'function') {
+ customEvent = new Event(event)
+ } else {
+ customEvent = document.createEvent('Event')
+ customEvent.initEvent(event, false, true)
+ }
+
+ this._container.dispatchEvent(customEvent)
+ } else {
+ this._container.fireEvent(`on${event}`, document.createEventObject())
+ }
+ }
+}
+
+window.MegaDropdown = MegaDropdown
+export { MegaDropdown }
diff --git a/resources/assets/vendor/js/menu.js b/resources/assets/vendor/js/menu.js
new file mode 100644
index 0000000..6bdf909
--- /dev/null
+++ b/resources/assets/vendor/js/menu.js
@@ -0,0 +1,991 @@
+const TRANSITION_EVENTS = ['transitionend', 'webkitTransitionEnd', 'oTransitionEnd']
+// const TRANSITION_PROPERTIES = ['transition', 'MozTransition', 'webkitTransition', 'WebkitTransition', 'OTransition']
+const DELTA = 5
+
+class Menu {
+ constructor(el, config = {}, _PS = null) {
+ this._el = el
+ this._horizontal = config.orientation === 'horizontal'
+ this._animate = config.animate !== false
+ this._accordion = config.accordion !== false
+ this._showDropdownOnHover = Boolean(config.showDropdownOnHover)
+ this._closeChildren = Boolean(config.closeChildren)
+ this._rtl = document.documentElement.getAttribute('dir') === 'rtl' || document.body.getAttribute('dir') === 'rtl'
+
+ this._onOpen = config.onOpen || (() => {})
+ this._onOpened = config.onOpened || (() => {})
+ this._onClose = config.onClose || (() => {})
+ this._onClosed = config.onClosed || (() => {})
+
+ this._psScroll = null
+ this._topParent = null
+ this._menuBgClass = null
+
+ el.classList.add('menu')
+ el.classList[this._animate ? 'remove' : 'add']('menu-no-animation')
+
+ if (!this._horizontal) {
+ el.classList.add('menu-vertical')
+ el.classList.remove('menu-horizontal')
+
+ const PerfectScrollbarLib = _PS || window.PerfectScrollbar
+
+ if (PerfectScrollbarLib) {
+ this._scrollbar = new PerfectScrollbarLib(el.querySelector('.menu-inner'), {
+ suppressScrollX: true,
+ wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
+ })
+
+ window.Helpers.menuPsScroll = this._scrollbar
+ } else {
+ el.querySelector('.menu-inner').classList.add('overflow-auto')
+ }
+ } else {
+ el.classList.add('menu-horizontal')
+ el.classList.remove('menu-vertical')
+
+ this._inner = el.querySelector('.menu-inner')
+ const container = this._inner.parentNode
+
+ this._prevBtn = el.querySelector('.menu-horizontal-prev')
+ if (!this._prevBtn) {
+ this._prevBtn = document.createElement('a')
+ this._prevBtn.href = '#'
+ this._prevBtn.className = 'menu-horizontal-prev'
+ container.appendChild(this._prevBtn)
+ }
+
+ this._wrapper = el.querySelector('.menu-horizontal-wrapper')
+ if (!this._wrapper) {
+ this._wrapper = document.createElement('div')
+ this._wrapper.className = 'menu-horizontal-wrapper'
+ this._wrapper.appendChild(this._inner)
+ container.appendChild(this._wrapper)
+ }
+
+ this._nextBtn = el.querySelector('.menu-horizontal-next')
+ if (!this._nextBtn) {
+ this._nextBtn = document.createElement('a')
+ this._nextBtn.href = '#'
+ this._nextBtn.className = 'menu-horizontal-next'
+ container.appendChild(this._nextBtn)
+ }
+
+ this._innerPosition = 0
+ this.update()
+ }
+
+ // Add data attribute for bg color class of menu
+ const menuClassList = el.classList
+
+ for (let i = 0; i < menuClassList.length; i++) {
+ if (menuClassList[i].startsWith('bg-')) {
+ this._menuBgClass = menuClassList[i]
+ }
+ }
+ el.setAttribute('data-bg-class', this._menuBgClass)
+
+ // Switch to vertical menu on small screen for horizontal menu layout on page load
+ if (this._horizontal && window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
+ this.switchMenu('vertical')
+ } else {
+ this._bindEvents()
+ }
+
+ // Link menu instance to element
+ el.menuInstance = this
+ }
+
+ _bindEvents() {
+ // Click Event
+ this._evntElClick = e => {
+ // Find top parent element
+ if (e.target.closest('ul') && e.target.closest('ul').classList.contains('menu-inner')) {
+ const menuItem = Menu._findParent(e.target, 'menu-item', false)
+
+ // eslint-disable-next-line prefer-destructuring
+ if (menuItem) this._topParent = menuItem.childNodes[0]
+ }
+
+ const toggleLink = e.target.classList.contains('menu-toggle')
+ ? e.target
+ : Menu._findParent(e.target, 'menu-toggle', false)
+
+ if (toggleLink) {
+ e.preventDefault()
+
+ if (toggleLink.getAttribute('data-hover') !== 'true') {
+ this.toggle(toggleLink)
+ }
+ }
+ }
+ if ((!this._showDropdownOnHover && this._horizontal) || !this._horizontal || window.Helpers.isMobileDevice)
+ this._el.addEventListener('click', this._evntElClick)
+
+ this._evntWindowResize = () => {
+ this.update()
+ if (this._lastWidth !== window.innerWidth) {
+ this._lastWidth = window.innerWidth
+ this.update()
+ }
+
+ const horizontalMenuTemplate = document.querySelector("[data-template^='horizontal-menu']")
+ if (!this._horizontal && !horizontalMenuTemplate) this.manageScroll()
+ }
+ window.addEventListener('resize', this._evntWindowResize)
+
+ if (this._horizontal) {
+ this._evntPrevBtnClick = e => {
+ e.preventDefault()
+ if (this._prevBtn.classList.contains('disabled')) return
+ this._slide('prev')
+ }
+ this._prevBtn.addEventListener('click', this._evntPrevBtnClick)
+
+ this._evntNextBtnClick = e => {
+ e.preventDefault()
+ if (this._nextBtn.classList.contains('disabled')) return
+ this._slide('next')
+ }
+ this._nextBtn.addEventListener('click', this._evntNextBtnClick)
+
+ this._evntBodyClick = e => {
+ if (!this._inner.contains(e.target) && this._el.querySelectorAll('.menu-inner > .menu-item.open').length)
+ this.closeAll()
+ }
+ document.body.addEventListener('click', this._evntBodyClick)
+
+ if (this._showDropdownOnHover) {
+ /** ***********************************************
+ * Horizontal Menu Mouse Over Event
+ * ? e.target !== e.currentTarget condition to disable mouseover event on whole menu navbar
+ * ? !e.target.parentNode.classList.contains('open') to disable mouseover events on icon, text and dropdown arrow
+ */
+ this._evntElMouseOver = e => {
+ if (e.target !== e.currentTarget && !e.target.parentNode.classList.contains('open')) {
+ const toggleLink = e.target.classList.contains('menu-toggle') ? e.target : null
+
+ if (toggleLink) {
+ e.preventDefault()
+
+ if (toggleLink.getAttribute('data-hover') !== 'true') {
+ this.toggle(toggleLink)
+ }
+ }
+ }
+ e.stopPropagation()
+ }
+ if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {
+ this._el.addEventListener('mouseover', this._evntElMouseOver)
+ }
+
+ /** ***********************************************
+ * Horizontal Menu Mouse Out Event
+ * ? e.target !== e.currentTarget condition to disable mouseout event on whole menu navbar
+ * ? mouseOutEl.parentNode.classList.contains('open') to check if the mouseout element has open class or not
+ * ? !mouseOutEl.classList.contains('menu-toggle') to check if mouseout was from single menu item and not from the one which has submenu
+ * ? !mouseOverEl.parentNode.classList.contains('menu-link') to disable mouseout event for icon, text and dropdown arrow
+ */
+ this._evntElMouseOut = e => {
+ const mainEl = e.currentTarget
+ const mouseOutEl = e.target
+ const mouseOverEl = e.toElement || e.relatedTarget
+
+ // Find absolute parent of any menu item from which mouseout event triggered
+ if (mouseOutEl.closest('ul') && mouseOutEl.closest('ul').classList.contains('menu-inner')) {
+ this._topParent = mouseOutEl
+ }
+
+ if (
+ mouseOutEl !== mainEl &&
+ (mouseOutEl.parentNode.classList.contains('open') || !mouseOutEl.classList.contains('menu-toggle')) &&
+ mouseOverEl &&
+ mouseOverEl.parentNode &&
+ !mouseOverEl.parentNode.classList.contains('menu-link')
+ ) {
+ // When mouse goes totally out of menu items, check mouse over element to confirm it's not the child of menu, once confirmed close the menu
+ if (this._topParent && !Menu.childOf(mouseOverEl, this._topParent.parentNode)) {
+ const toggleLink = this._topParent.classList.contains('menu-toggle') ? this._topParent : null
+
+ if (toggleLink) {
+ e.preventDefault()
+
+ if (toggleLink.getAttribute('data-hover') !== 'true') {
+ this.toggle(toggleLink)
+ this._topParent = null
+ }
+ }
+ }
+
+ // When mouse enter the sub menu, check if it's child of the initially mouse overed menu item(Actual Parent),
+ // if it's the parent do not close the sub menu else close the sub menu
+ if (Menu.childOf(mouseOverEl, mouseOutEl.parentNode)) {
+ return
+ }
+ const toggleLink = mouseOutEl.classList.contains('menu-toggle') ? mouseOutEl : null
+
+ if (toggleLink) {
+ e.preventDefault()
+
+ if (toggleLink.getAttribute('data-hover') !== 'true') {
+ this.toggle(toggleLink)
+ }
+ }
+ }
+ e.stopPropagation()
+ }
+ if (this._horizontal && window.screen.width > window.Helpers.LAYOUT_BREAKPOINT) {
+ this._el.addEventListener('mouseout', this._evntElMouseOut)
+ }
+ }
+ }
+ }
+
+ static childOf(/* child node */ c, /* parent node */ p) {
+ // returns boolean
+ if (c.parentNode) {
+ while ((c = c.parentNode) && c !== p);
+ return !!c
+ }
+ return false
+ }
+
+ _unbindEvents() {
+ if (this._evntElClick) {
+ this._el.removeEventListener('click', this._evntElClick)
+ this._evntElClick = null
+ }
+
+ if (this._evntElMouseOver) {
+ this._el.removeEventListener('mouseover', this._evntElMouseOver)
+ this._evntElMouseOver = null
+ }
+
+ if (this._evntElMouseOut) {
+ this._el.removeEventListener('mouseout', this._evntElMouseOut)
+ this._evntElMouseOut = null
+ }
+
+ if (this._evntWindowResize) {
+ window.removeEventListener('resize', this._evntWindowResize)
+ this._evntWindowResize = null
+ }
+
+ if (this._evntBodyClick) {
+ document.body.removeEventListener('click', this._evntBodyClick)
+ this._evntBodyClick = null
+ }
+
+ if (this._evntInnerMousemove) {
+ this._inner.removeEventListener('mousemove', this._evntInnerMousemove)
+ this._evntInnerMousemove = null
+ }
+
+ if (this._evntInnerMouseleave) {
+ this._inner.removeEventListener('mouseleave', this._evntInnerMouseleave)
+ this._evntInnerMouseleave = null
+ }
+ }
+
+ static _isRoot(item) {
+ return !Menu._findParent(item, 'menu-item', false)
+ }
+
+ static _findParent(el, cls, throwError = true) {
+ if (el.tagName.toUpperCase() === 'BODY') return null
+ el = el.parentNode
+ while (el.tagName.toUpperCase() !== 'BODY' && !el.classList.contains(cls)) {
+ el = el.parentNode
+ }
+
+ el = el.tagName.toUpperCase() !== 'BODY' ? el : null
+
+ if (!el && throwError) throw new Error(`Cannot find \`.${cls}\` parent element`)
+
+ return el
+ }
+
+ static _findChild(el, cls) {
+ const items = el.childNodes
+ const found = []
+
+ for (let i = 0, l = items.length; i < l; i++) {
+ if (items[i].classList) {
+ let passed = 0
+
+ for (let j = 0; j < cls.length; j++) {
+ if (items[i].classList.contains(cls[j])) passed += 1
+ }
+
+ if (cls.length === passed) found.push(items[i])
+ }
+ }
+
+ return found
+ }
+
+ static _findMenu(item) {
+ let curEl = item.childNodes[0]
+ let menu = null
+
+ while (curEl && !menu) {
+ if (curEl.classList && curEl.classList.contains('menu-sub')) menu = curEl
+ curEl = curEl.nextSibling
+ }
+
+ if (!menu) throw new Error('Cannot find `.menu-sub` element for the current `.menu-toggle`')
+
+ return menu
+ }
+
+ // Has class
+ static _hasClass(cls, el = window.Helpers.ROOT_EL) {
+ let result = false
+
+ cls.split(' ').forEach(c => {
+ if (el.classList.contains(c)) result = true
+ })
+
+ return result
+ }
+
+ open(el, closeChildren = this._closeChildren) {
+ const item = this._findUnopenedParent(Menu._getItem(el, true), closeChildren)
+
+ if (!item) return
+
+ const toggleLink = Menu._getLink(item, true)
+
+ Menu._promisify(this._onOpen, this, item, toggleLink, Menu._findMenu(item))
+ .then(() => {
+ if (!this._horizontal || !Menu._isRoot(item)) {
+ if (this._animate && !this._horizontal) {
+ window.requestAnimationFrame(() => this._toggleAnimation(true, item, false))
+ if (this._accordion) this._closeOther(item, closeChildren)
+ } else if (this._animate) {
+ this._toggleDropdown(true, item, closeChildren)
+ // eslint-disable-next-line no-unused-expressions
+ this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
+ } else {
+ item.classList.add('open')
+ // eslint-disable-next-line no-unused-expressions
+ this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
+ if (this._accordion) this._closeOther(item, closeChildren)
+ }
+ } else {
+ this._toggleDropdown(true, item, closeChildren)
+ // eslint-disable-next-line no-unused-expressions
+ this._onOpened && this._onOpened(this, item, toggleLink, Menu._findMenu(item))
+ }
+ })
+ .catch(() => {})
+ }
+
+ close(el, closeChildren = this._closeChildren, _autoClose = false) {
+ const item = Menu._getItem(el, true)
+ const toggleLink = Menu._getLink(el, true)
+
+ if (!item.classList.contains('open') || item.classList.contains('disabled')) return
+
+ Menu._promisify(this._onClose, this, item, toggleLink, Menu._findMenu(item), _autoClose)
+ .then(() => {
+ if (!this._horizontal || !Menu._isRoot(item)) {
+ if (this._animate && !this._horizontal) {
+ window.requestAnimationFrame(() => this._toggleAnimation(false, item, closeChildren))
+ } else {
+ item.classList.remove('open')
+
+ if (closeChildren) {
+ const opened = item.querySelectorAll('.menu-item.open')
+ for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
+ }
+
+ // eslint-disable-next-line no-unused-expressions
+ this._onClosed && this._onClosed(this, item, toggleLink, Menu._findMenu(item))
+ }
+ } else {
+ this._toggleDropdown(false, item, closeChildren)
+ // eslint-disable-next-line no-unused-expressions
+ this._onClosed && this._onClosed(this, item, toggleLink, Menu._findMenu(item))
+ }
+ })
+ .catch(() => {})
+ }
+
+ _closeOther(item, closeChildren) {
+ const opened = Menu._findChild(item.parentNode, ['menu-item', 'open'])
+
+ for (let i = 0, l = opened.length; i < l; i++) {
+ if (opened[i] !== item) this.close(opened[i], closeChildren)
+ }
+ }
+
+ toggle(el, closeChildren = this._closeChildren) {
+ const item = Menu._getItem(el, true)
+ // const toggleLink = Menu._getLink(el, true)
+
+ if (item.classList.contains('open')) this.close(item, closeChildren)
+ else this.open(item, closeChildren)
+ }
+
+ _toggleDropdown(show, item, closeChildren) {
+ const menu = Menu._findMenu(item)
+ const actualItem = item
+ let subMenuItem = false
+
+ if (show) {
+ if (Menu._findParent(item, 'menu-sub', false)) {
+ subMenuItem = true
+ item = this._topParent ? this._topParent.parentNode : item
+ }
+
+ const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
+ const position = this._innerPosition
+ const itemOffset = this._getItemOffset(item)
+ const itemWidth = Math.round(item.getBoundingClientRect().width)
+
+ if (itemOffset - DELTA <= -1 * position) {
+ this._innerPosition = -1 * itemOffset
+ } else if (itemOffset + position + itemWidth + DELTA >= wrapperWidth) {
+ if (itemWidth > wrapperWidth) {
+ this._innerPosition = -1 * itemOffset
+ } else {
+ this._innerPosition = -1 * (itemOffset + itemWidth - wrapperWidth)
+ }
+ }
+
+ actualItem.classList.add('open')
+
+ const menuWidth = Math.round(menu.getBoundingClientRect().width)
+
+ if (subMenuItem) {
+ if (
+ itemOffset + this._innerPosition + menuWidth * 2 > wrapperWidth &&
+ menuWidth < wrapperWidth &&
+ menuWidth >= itemWidth
+ ) {
+ menu.style.left = [this._rtl ? '100%' : '-100%']
+ }
+ } else if (
+ itemOffset + this._innerPosition + menuWidth > wrapperWidth &&
+ menuWidth < wrapperWidth &&
+ menuWidth > itemWidth
+ ) {
+ menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = `-${menuWidth - itemWidth}px`
+ }
+
+ this._closeOther(actualItem, closeChildren)
+ this._updateSlider()
+ } else {
+ const toggle = Menu._findChild(item, ['menu-toggle'])
+
+ // eslint-disable-next-line no-unused-expressions
+ toggle.length && toggle[0].removeAttribute('data-hover', 'true')
+ item.classList.remove('open')
+ menu.style[this._rtl ? 'marginRight' : 'marginLeft'] = null
+
+ if (closeChildren) {
+ const opened = menu.querySelectorAll('.menu-item.open')
+
+ for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
+ }
+ }
+ }
+
+ _slide(direction) {
+ const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
+ const innerWidth = this._innerWidth
+ let newPosition
+
+ if (direction === 'next') {
+ newPosition = this._getSlideNextPos()
+
+ if (innerWidth + newPosition < wrapperWidth) {
+ newPosition = wrapperWidth - innerWidth
+ }
+ } else {
+ newPosition = this._getSlidePrevPos()
+
+ if (newPosition > 0) newPosition = 0
+ }
+
+ this._innerPosition = newPosition
+ this.update()
+ }
+
+ _getSlideNextPos() {
+ const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
+ const position = this._innerPosition
+ let curItem = this._inner.childNodes[0]
+ let left = 0
+
+ while (curItem) {
+ if (curItem.tagName) {
+ const curItemWidth = Math.round(curItem.getBoundingClientRect().width)
+
+ if (left + position - DELTA <= wrapperWidth && left + position + curItemWidth + DELTA >= wrapperWidth) {
+ if (curItemWidth > wrapperWidth && left === -1 * position) left += curItemWidth
+ break
+ }
+
+ left += curItemWidth
+ }
+
+ curItem = curItem.nextSibling
+ }
+
+ return -1 * left
+ }
+
+ _getSlidePrevPos() {
+ const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
+ const position = this._innerPosition
+ let curItem = this._inner.childNodes[0]
+ let left = 0
+
+ while (curItem) {
+ if (curItem.tagName) {
+ const curItemWidth = Math.round(curItem.getBoundingClientRect().width)
+
+ if (left - DELTA <= -1 * position && left + curItemWidth + DELTA >= -1 * position) {
+ if (curItemWidth <= wrapperWidth) left = left + curItemWidth - wrapperWidth
+ break
+ }
+
+ left += curItemWidth
+ }
+
+ curItem = curItem.nextSibling
+ }
+
+ return -1 * left
+ }
+
+ static _getItem(el, toggle) {
+ let item = null
+ const selector = toggle ? 'menu-toggle' : 'menu-link'
+
+ if (el.classList.contains('menu-item')) {
+ if (Menu._findChild(el, [selector]).length) item = el
+ } else if (el.classList.contains(selector)) {
+ item = el.parentNode.classList.contains('menu-item') ? el.parentNode : null
+ }
+
+ if (!item) {
+ throw new Error(`${toggle ? 'Toggable ' : ''}\`.menu-item\` element not found.`)
+ }
+
+ return item
+ }
+
+ static _getLink(el, toggle) {
+ let found = []
+ const selector = toggle ? 'menu-toggle' : 'menu-link'
+
+ if (el.classList.contains(selector)) found = [el]
+ else if (el.classList.contains('menu-item')) found = Menu._findChild(el, [selector])
+
+ if (!found.length) throw new Error(`\`${selector}\` element not found.`)
+
+ return found[0]
+ }
+
+ _findUnopenedParent(item, closeChildren) {
+ let tree = []
+ let parentItem = null
+
+ while (item) {
+ if (item.classList.contains('disabled')) {
+ parentItem = null
+ tree = []
+ } else {
+ if (!item.classList.contains('open')) parentItem = item
+ tree.push(item)
+ }
+
+ item = Menu._findParent(item, 'menu-item', false)
+ }
+
+ if (!parentItem) return null
+ if (tree.length === 1) return parentItem
+
+ tree = tree.slice(0, tree.indexOf(parentItem))
+
+ for (let i = 0, l = tree.length; i < l; i++) {
+ tree[i].classList.add('open')
+
+ if (this._accordion) {
+ const openedItems = Menu._findChild(tree[i].parentNode, ['menu-item', 'open'])
+
+ for (let j = 0, k = openedItems.length; j < k; j++) {
+ if (openedItems[j] !== tree[i]) {
+ openedItems[j].classList.remove('open')
+
+ if (closeChildren) {
+ const openedChildren = openedItems[j].querySelectorAll('.menu-item.open')
+ for (let x = 0, z = openedChildren.length; x < z; x++) {
+ openedChildren[x].classList.remove('open')
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return parentItem
+ }
+
+ _toggleAnimation(open, item, closeChildren) {
+ const toggleLink = Menu._getLink(item, true)
+ const menu = Menu._findMenu(item)
+
+ Menu._unbindAnimationEndEvent(item)
+
+ const linkHeight = Math.round(toggleLink.getBoundingClientRect().height)
+
+ item.style.overflow = 'hidden'
+
+ const clearItemStyle = () => {
+ item.classList.remove('menu-item-animating')
+ item.classList.remove('menu-item-closing')
+ item.style.overflow = null
+ item.style.height = null
+
+ if (!this._horizontal) this.update()
+ }
+
+ if (open) {
+ item.style.height = `${linkHeight}px`
+ item.classList.add('menu-item-animating')
+ item.classList.add('open')
+
+ Menu._bindAnimationEndEvent(item, () => {
+ clearItemStyle()
+ this._onOpened(this, item, toggleLink, menu)
+ })
+
+ setTimeout(() => {
+ item.style.height = `${linkHeight + Math.round(menu.getBoundingClientRect().height)}px`
+ }, 50)
+ } else {
+ item.style.height = `${linkHeight + Math.round(menu.getBoundingClientRect().height)}px`
+ item.classList.add('menu-item-animating')
+ item.classList.add('menu-item-closing')
+
+ Menu._bindAnimationEndEvent(item, () => {
+ item.classList.remove('open')
+ clearItemStyle()
+
+ if (closeChildren) {
+ const opened = item.querySelectorAll('.menu-item.open')
+ for (let i = 0, l = opened.length; i < l; i++) opened[i].classList.remove('open')
+ }
+
+ this._onClosed(this, item, toggleLink, menu)
+ })
+
+ setTimeout(() => {
+ item.style.height = `${linkHeight}px`
+ }, 50)
+ }
+ }
+
+ static _bindAnimationEndEvent(el, handler) {
+ const cb = e => {
+ if (e.target !== el) return
+ Menu._unbindAnimationEndEvent(el)
+ handler(e)
+ }
+
+ let duration = window.getComputedStyle(el).transitionDuration
+ duration = parseFloat(duration) * (duration.indexOf('ms') !== -1 ? 1 : 1000)
+
+ el._menuAnimationEndEventCb = cb
+ TRANSITION_EVENTS.forEach(ev => el.addEventListener(ev, el._menuAnimationEndEventCb, false))
+
+ el._menuAnimationEndEventTimeout = setTimeout(() => {
+ cb({ target: el })
+ }, duration + 50)
+ }
+
+ _getItemOffset(item) {
+ let curItem = this._inner.childNodes[0]
+ let left = 0
+
+ while (curItem !== item) {
+ if (curItem.tagName) {
+ left += Math.round(curItem.getBoundingClientRect().width)
+ }
+
+ curItem = curItem.nextSibling
+ }
+
+ return left
+ }
+
+ _updateSlider(wrapperWidth = null, innerWidth = null, position = null) {
+ const _wrapperWidth = wrapperWidth !== null ? wrapperWidth : Math.round(this._wrapper.getBoundingClientRect().width)
+ const _innerWidth = innerWidth !== null ? innerWidth : this._innerWidth
+ const _position = position !== null ? position : this._innerPosition
+
+ if (_innerWidth < _wrapperWidth || window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
+ this._prevBtn.classList.add('d-none')
+ this._nextBtn.classList.add('d-none')
+ } else {
+ this._prevBtn.classList.remove('d-none')
+ this._nextBtn.classList.remove('d-none')
+ }
+ if (_innerWidth > _wrapperWidth && window.innerWidth > window.Helpers.LAYOUT_BREAKPOINT) {
+ if (_position === 0) this._prevBtn.classList.add('disabled')
+ else this._prevBtn.classList.remove('disabled')
+
+ if (_innerWidth + _position <= _wrapperWidth) this._nextBtn.classList.add('disabled')
+ else this._nextBtn.classList.remove('disabled')
+ }
+ }
+
+ static _promisify(fn, ...args) {
+ const result = fn(...args)
+ if (result instanceof Promise) {
+ return result
+ }
+ if (result === false) {
+ return Promise.reject()
+ }
+ return Promise.resolve()
+ }
+
+ get _innerWidth() {
+ const items = this._inner.childNodes
+ let width = 0
+
+ for (let i = 0, l = items.length; i < l; i++) {
+ if (items[i].tagName) {
+ width += Math.round(items[i].getBoundingClientRect().width)
+ }
+ }
+
+ return width
+ }
+
+ get _innerPosition() {
+ return parseInt(this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] || '0px', 10)
+ }
+
+ set _innerPosition(value) {
+ this._inner.style[this._rtl ? 'marginRight' : 'marginLeft'] = `${value}px`
+ return value
+ }
+
+ static _unbindAnimationEndEvent(el) {
+ const cb = el._menuAnimationEndEventCb
+
+ if (el._menuAnimationEndEventTimeout) {
+ clearTimeout(el._menuAnimationEndEventTimeout)
+ el._menuAnimationEndEventTimeout = null
+ }
+
+ if (!cb) return
+
+ TRANSITION_EVENTS.forEach(ev => el.removeEventListener(ev, cb, false))
+ el._menuAnimationEndEventCb = null
+ }
+
+ closeAll(closeChildren = this._closeChildren) {
+ const opened = this._el.querySelectorAll('.menu-inner > .menu-item.open')
+
+ for (let i = 0, l = opened.length; i < l; i++) this.close(opened[i], closeChildren)
+ }
+
+ static setDisabled(el, disabled) {
+ Menu._getItem(el, false).classList[disabled ? 'add' : 'remove']('disabled')
+ }
+
+ static isActive(el) {
+ return Menu._getItem(el, false).classList.contains('active')
+ }
+
+ static isOpened(el) {
+ return Menu._getItem(el, false).classList.contains('open')
+ }
+
+ static isDisabled(el) {
+ return Menu._getItem(el, false).classList.contains('disabled')
+ }
+
+ update() {
+ if (!this._horizontal) {
+ if (this._scrollbar) {
+ this._scrollbar.update()
+ }
+ } else {
+ this.closeAll()
+
+ const wrapperWidth = Math.round(this._wrapper.getBoundingClientRect().width)
+ const innerWidth = this._innerWidth
+ let position = this._innerPosition
+
+ if (wrapperWidth - position > innerWidth) {
+ position = wrapperWidth - innerWidth
+ if (position > 0) position = 0
+ this._innerPosition = position
+ }
+
+ this._updateSlider(wrapperWidth, innerWidth, position)
+ }
+ }
+
+ manageScroll() {
+ const { PerfectScrollbar } = window
+ const menuInner = document.querySelector('.menu-inner')
+
+ if (window.innerWidth < window.Helpers.LAYOUT_BREAKPOINT) {
+ if (this._scrollbar !== null) {
+ // window.Helpers.menuPsScroll.destroy()
+ this._scrollbar.destroy()
+ this._scrollbar = null
+ }
+ menuInner.classList.add('overflow-auto')
+ } else {
+ if (this._scrollbar === null) {
+ const menuScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {
+ suppressScrollX: true,
+ wheelPropagation: false
+ })
+ // window.Helpers.menuPsScroll = menuScroll
+ this._scrollbar = menuScroll
+ }
+ menuInner.classList.remove('overflow-auto')
+ }
+ }
+
+ switchMenu(menu) {
+ // Unbind Events
+ this._unbindEvents()
+
+ // const html = document.documentElement
+ const navbar = document.querySelector('nav.layout-navbar')
+ const navbarCollapse = document.querySelector('#navbar-collapse')
+ /* const fullNavbar = document.querySelector('.layout-navbar-full')
+ const contentNavbar = document.querySelector('.layout-content-navbar')
+ const contentWrapper = document.querySelector('.content-wrapper') */
+ const asideMenuWrapper = document.querySelector('#layout-menu div')
+ const asideMenu = document.querySelector('#layout-menu')
+ const horzMenuClasses = ['layout-menu-horizontal', 'menu', 'menu-horizontal', 'container-fluid', 'flex-grow-0']
+ const vertMenuClasses = ['layout-menu', 'menu', 'menu-vertical']
+ const horzMenuWrapper = document.querySelector('.menu-horizontal-wrapper')
+ const menuInner = document.querySelector('.menu-inner')
+ const brand = document.querySelector('.app-brand')
+ const menuToggler = document.querySelector('.layout-menu-toggle')
+ const activeMenuItems = document.querySelectorAll('.menu-inner .active')
+ /* const layoutPage = document.querySelector('.layout-page')
+ const layoutContainer = document.querySelector('.layout-container')
+ const content = document.querySelector('.container-fluid') */
+
+ // const { PerfectScrollbar } = window
+
+ if (menu === 'vertical') {
+ this._horizontal = false
+ asideMenuWrapper.insertBefore(brand, horzMenuWrapper)
+ asideMenuWrapper.insertBefore(menuInner, horzMenuWrapper)
+ asideMenuWrapper.classList.add('flex-column', 'p-0')
+ asideMenu.classList.remove(...asideMenu.classList)
+ asideMenu.classList.add(...vertMenuClasses, this._menuBgClass)
+ brand.classList.remove('d-none', 'd-lg-flex')
+ menuToggler.classList.remove('d-none')
+ // if (PerfectScrollbar !== undefined) {
+ // this._psScroll = new PerfectScrollbar(document.querySelector('.menu-inner'), {
+ // suppressScrollX: true,
+ // wheelPropagation: !Menu._hasClass('layout-menu-fixed layout-menu-fixed-offcanvas')
+ // })
+ // }
+
+ menuInner.classList.add('overflow-auto')
+
+ // Add open class to active items
+ for (let i = 0; i < activeMenuItems.length - 1; ++i) {
+ activeMenuItems[i].classList.add('open')
+ }
+ } else {
+ this._horizontal = true
+ navbar.children[0].insertBefore(brand, navbarCollapse)
+ brand.classList.add('d-none', 'd-lg-flex')
+ horzMenuWrapper.appendChild(menuInner)
+ asideMenuWrapper.classList.remove('flex-column', 'p-0')
+ asideMenu.classList.remove(...asideMenu.classList)
+ asideMenu.classList.add(...horzMenuClasses, this._menuBgClass)
+ menuToggler.classList.add('d-none')
+ menuInner.classList.remove('overflow-auto')
+
+ // if (PerfectScrollbar !== undefined && this._psScroll !== null) {
+ // this._psScroll.destroy()
+ // this._psScroll = null
+ // }
+
+ // Remove open class from active items
+ for (let i = 0; i < activeMenuItems.length; ++i) {
+ activeMenuItems[i].classList.remove('open')
+ }
+ }
+
+ this._bindEvents()
+ }
+
+ destroy() {
+ if (!this._el) return
+
+ this._unbindEvents()
+
+ const items = this._el.querySelectorAll('.menu-item')
+ for (let i = 0, l = items.length; i < l; i++) {
+ Menu._unbindAnimationEndEvent(items[i])
+ items[i].classList.remove('menu-item-animating')
+ items[i].classList.remove('open')
+ items[i].style.overflow = null
+ items[i].style.height = null
+ }
+
+ const menus = this._el.querySelectorAll('.menu-menu')
+ for (let i2 = 0, l2 = menus.length; i2 < l2; i2++) {
+ menus[i2].style.marginRight = null
+ menus[i2].style.marginLeft = null
+ }
+
+ this._el.classList.remove('menu-no-animation')
+
+ if (this._wrapper) {
+ this._prevBtn.parentNode.removeChild(this._prevBtn)
+ this._nextBtn.parentNode.removeChild(this._nextBtn)
+ this._wrapper.parentNode.insertBefore(this._inner, this._wrapper)
+ this._wrapper.parentNode.removeChild(this._wrapper)
+ this._inner.style.marginLeft = null
+ this._inner.style.marginRight = null
+ }
+
+ this._el.menuInstance = null
+ delete this._el.menuInstance
+
+ this._el = null
+ this._horizontal = null
+ this._animate = null
+ this._accordion = null
+ this._showDropdownOnHover = null
+ this._closeChildren = null
+ this._rtl = null
+ this._onOpen = null
+ this._onOpened = null
+ this._onClose = null
+ this._onClosed = null
+ if (this._scrollbar) {
+ this._scrollbar.destroy()
+ this._scrollbar = null
+ }
+ this._inner = null
+ this._prevBtn = null
+ this._wrapper = null
+ this._nextBtn = null
+ }
+}
+
+window.Menu = Menu
+export { Menu }
diff --git a/resources/assets/vendor/js/template-customizer.js b/resources/assets/vendor/js/template-customizer.js
new file mode 100644
index 0000000..217fd89
--- /dev/null
+++ b/resources/assets/vendor/js/template-customizer.js
@@ -0,0 +1,1400 @@
+import './_template-customizer/_template-customizer.scss'
+import customizerMarkup from './_template-customizer/_template-customizer.html?raw'
+
+const CSS_FILENAME_PATTERN = '%name%.scss'
+const CONTROLS = [
+ 'rtl',
+ 'style',
+ 'headerType',
+ 'contentLayout',
+ 'layoutCollapsed',
+ 'showDropdownOnHover',
+ 'layoutNavbarOptions',
+ 'layoutFooterFixed',
+ 'themes'
+]
+const STYLES = ['light', 'dark', 'system']
+const NAVBAR_OPTIONS = ['sticky', 'static', 'hidden']
+let layoutNavbarVar
+const cl = document.documentElement.classList
+
+if (cl.contains('layout-navbar-fixed')) layoutNavbarVar = 'sticky'
+else if (cl.contains('layout-navbar-hidden')) layoutNavbarVar = 'hidden'
+else layoutNavbarVar = 'static'
+
+const DISPLAY_CUSTOMIZER = true
+const DEFAULT_THEME = document.getElementsByTagName('HTML')[0].getAttribute('data-theme') || 0
+const DEFAULT_STYLE = cl.contains('dark-style') ? 'dark' : 'light'
+const DEFAULT_TEXT_DIR = document.documentElement.getAttribute('dir') === 'rtl'
+const DEFAULT_MENU_COLLAPSED = !!cl.contains('layout-menu-collapsed')
+const DEFAULT_SHOW_DROPDOWN_ON_HOVER = true
+const DEFAULT_NAVBAR_FIXED = layoutNavbarVar
+const DEFAULT_CONTENT_LAYOUT = cl.contains('layout-wide') ? 'wide' : 'compact'
+const DEFAULT_FOOTER_FIXED = !!cl.contains('layout-footer-fixed')
+
+let headerType
+if (cl.contains('layout-menu-offcanvas')) {
+ headerType = 'static-offcanvas'
+} else if (cl.contains('layout-menu-fixed')) {
+ headerType = 'fixed'
+} else if (cl.contains('layout-menu-fixed-offcanvas')) {
+ headerType = 'fixed-offcanvas'
+} else {
+ headerType = 'static'
+}
+const DEFAULT_LAYOUT_TYPE = headerType
+
+class TemplateCustomizer {
+ constructor({
+ cssPath,
+ themesPath,
+ cssFilenamePattern,
+ displayCustomizer,
+ controls,
+ defaultTextDir,
+ defaultHeaderType,
+ defaultContentLayout,
+ defaultMenuCollapsed,
+ defaultShowDropdownOnHover,
+ defaultNavbarType,
+ defaultFooterFixed,
+ styles,
+ navbarOptions,
+ defaultStyle,
+ availableContentLayouts,
+ availableDirections,
+ availableStyles,
+ availableThemes,
+ availableLayouts,
+ availableHeaderTypes,
+ availableNavbarOptions,
+ defaultTheme,
+ pathResolver,
+ onSettingsChange,
+ lang
+ }) {
+ if (this._ssr) return
+ if (!window.Helpers) throw new Error('window.Helpers required.')
+ this.settings = {}
+ this.settings.cssPath = cssPath
+ this.settings.themesPath = themesPath
+ this.settings.cssFilenamePattern = cssFilenamePattern || CSS_FILENAME_PATTERN
+ this.settings.displayCustomizer = typeof displayCustomizer !== 'undefined' ? displayCustomizer : DISPLAY_CUSTOMIZER
+
+ this.settings.controls = controls || CONTROLS
+ this.settings.defaultTextDir = defaultTextDir === 'rtl' ? true : false || DEFAULT_TEXT_DIR
+ this.settings.defaultHeaderType = defaultHeaderType || DEFAULT_LAYOUT_TYPE
+ this.settings.defaultMenuCollapsed =
+ typeof defaultMenuCollapsed !== 'undefined' ? defaultMenuCollapsed : DEFAULT_MENU_COLLAPSED
+ this.settings.defaultContentLayout =
+ typeof defaultContentLayout !== 'undefined' ? defaultContentLayout : DEFAULT_CONTENT_LAYOUT
+ this.settings.defaultShowDropdownOnHover =
+ typeof defaultShowDropdownOnHover !== 'undefined' ? defaultShowDropdownOnHover : DEFAULT_SHOW_DROPDOWN_ON_HOVER
+ this.settings.defaultNavbarType =
+ typeof defaultNavbarType !== 'undefined' ? defaultNavbarType : DEFAULT_NAVBAR_FIXED
+ this.settings.defaultFooterFixed =
+ typeof defaultFooterFixed !== 'undefined' ? defaultFooterFixed : DEFAULT_FOOTER_FIXED
+
+ this.settings.availableDirections = availableDirections || TemplateCustomizer.DIRECTIONS
+ this.settings.availableStyles = availableStyles || TemplateCustomizer.STYLES
+ this.settings.availableThemes = availableThemes || TemplateCustomizer.THEMES
+ this.settings.availableHeaderTypes = availableHeaderTypes || TemplateCustomizer.HEADER_TYPES
+ this.settings.availableContentLayouts = availableContentLayouts || TemplateCustomizer.CONTENT
+ this.settings.availableLayouts = availableLayouts || TemplateCustomizer.LAYOUTS
+ this.settings.availableNavbarOptions = availableNavbarOptions || TemplateCustomizer.NAVBAR_OPTIONS
+ this.settings.defaultTheme = this._getDefaultTheme(
+ typeof defaultTheme !== 'undefined' ? defaultTheme : DEFAULT_THEME
+ )
+
+ this.settings.styles = styles || STYLES
+ this.settings.navbarOptions = navbarOptions || NAVBAR_OPTIONS
+ this.settings.defaultStyle = defaultStyle || DEFAULT_STYLE
+ this.settings.lang = lang || 'en'
+ this.pathResolver = pathResolver || (p => p)
+
+ if (this.settings.styles.length < 2) {
+ const i = this.settings.controls.indexOf('style')
+ if (i !== -1) {
+ this.settings.controls = this.settings.controls.slice(0, i).concat(this.settings.controls.slice(i + 1))
+ }
+ }
+ this.settings.onSettingsChange = typeof onSettingsChange === 'function' ? onSettingsChange : () => {}
+
+ this._loadSettings()
+
+ this._listeners = []
+ this._controls = {}
+
+ this._initDirection()
+ this._initStyle()
+ this._initTheme()
+ this.setLayoutType(this.settings.headerType, false)
+ this.setContentLayout(this.settings.contentLayout, false)
+ this.setDropdownOnHover(this.settings.showDropdownOnHover, false)
+ this.setLayoutNavbarOption(this.settings.layoutNavbarOptions, false)
+ this.setLayoutFooterFixed(this.settings.layoutFooterFixed, false)
+ this._setup()
+ }
+
+ setRtl(rtl) {
+ if (!this._hasControls('rtl')) return
+ this._setSetting('Rtl', String(rtl))
+ this._setCookie('direction', rtl, 365)
+ window.location.reload()
+ }
+
+ setContentLayout(contentLayout, updateStorage = true) {
+ if (!this._hasControls('contentLayout')) return
+ this.settings.contentLayout = contentLayout
+ if (updateStorage) this._setSetting('contentLayout', contentLayout)
+
+ window.Helpers.setContentLayout(contentLayout)
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+ }
+
+ setStyle(style) {
+ const layoutName = this._getLayoutName()
+ const isAdmin = !layoutName.includes('front')
+ this._setSetting('Style', style)
+
+ const modeCookieName = isAdmin ? 'admin-mode' : 'front-mode'
+ const colorPrefCookieName = isAdmin ? 'admin-colorPref' : 'front-colorPref'
+
+ if (style !== '' && this._checkCookie(modeCookieName)) {
+ if (style === 'system') {
+ this._setCookie(modeCookieName, 'system', 365)
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ this._setCookie(colorPrefCookieName, 'dark', 365)
+ } else {
+ this._setCookie(colorPrefCookieName, 'light', 365)
+ }
+ } else {
+ if (style === 'dark') {
+ this._setCookie(modeCookieName, 'dark', 365)
+ this._setCookie(colorPrefCookieName, 'dark', 365)
+ } else {
+ this._setCookie(modeCookieName, 'light', 365)
+ this._setCookie(colorPrefCookieName, 'light', 365)
+ }
+ }
+ } else {
+ this._setCookie(modeCookieName, style || 'light', 365)
+ }
+
+ window.location.reload()
+ }
+
+ setTheme(themeName, updateStorage = true, cb = null) {
+ if (!this._hasControls('themes')) return
+
+ const theme = this._getThemeByName(themeName)
+
+ if (!theme) return
+
+ this.settings.theme = theme
+ if (updateStorage) this._setSetting('Theme', themeName)
+
+ this._setCookie('theme', themeName, 365)
+ const themeUrl = this.pathResolver(
+ this.settings.themesPath +
+ this.settings.cssFilenamePattern.replace(
+ '%name%',
+ themeName + (this.settings.style !== 'light' ? `-${this.settings.style}` : '')
+ )
+ )
+
+ this._loadStylesheets({ [themeUrl]: document.querySelector('.template-customizer-theme-css') }, cb || (() => {}))
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+ }
+
+ setLayoutType(pos, updateStorage = true) {
+ if (!this._hasControls('headerType')) return
+ if (pos !== 'static' && pos !== 'static-offcanvas' && pos !== 'fixed' && pos !== 'fixed-offcanvas') return
+
+ this.settings.headerType = pos
+ if (updateStorage) this._setSetting('LayoutType', pos)
+
+ window.Helpers.setPosition(
+ pos === 'fixed' || pos === 'fixed-offcanvas',
+ pos === 'static-offcanvas' || pos === 'fixed-offcanvas'
+ )
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+
+ // Perfectscrollbar change on Layout change
+ let menuScroll = window.Helpers.menuPsScroll
+ const PerfectScrollbarLib = window.PerfectScrollbar
+
+ if (this.settings.headerType === 'fixed' || this.settings.headerType === 'fixed-offcanvas') {
+ // Set perfectscrollbar wheelPropagation false for fixed layout
+ if (PerfectScrollbarLib && menuScroll) {
+ window.Helpers.menuPsScroll.destroy()
+ menuScroll = new PerfectScrollbarLib(document.querySelector('.menu-inner'), {
+ suppressScrollX: true,
+ wheelPropagation: false
+ })
+ window.Helpers.menuPsScroll = menuScroll
+ }
+ } else if (menuScroll) {
+ // Destroy perfectscrollbar for static layout
+ window.Helpers.menuPsScroll.destroy()
+ }
+ }
+
+ setDropdownOnHover(open, updateStorage = true) {
+ if (!this._hasControls('showDropdownOnHover')) return
+ this.settings.showDropdownOnHover = open
+ if (updateStorage) this._setSetting('ShowDropdownOnHover', open)
+
+ if (window.Helpers.mainMenu) {
+ window.Helpers.mainMenu.destroy()
+ config.showDropdownOnHover = open
+
+ const { Menu } = window
+
+ window.Helpers.mainMenu = new Menu(document.getElementById('layout-menu'), {
+ orientation: 'horizontal',
+ closeChildren: true,
+ showDropdownOnHover: config.showDropdownOnHover
+ })
+ }
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+ }
+
+ setLayoutNavbarOption(navbarType, updateStorage = true) {
+ if (!this._hasControls('layoutNavbarOptions')) return
+ this.settings.layoutNavbarOptions = navbarType
+ if (updateStorage) this._setSetting('FixedNavbarOption', navbarType)
+
+ window.Helpers.setNavbar(navbarType)
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+ }
+
+ setLayoutFooterFixed(fixed, updateStorage = true) {
+ // if (!this._hasControls('layoutFooterFixed')) return
+ this.settings.layoutFooterFixed = fixed
+ if (updateStorage) this._setSetting('FixedFooter', fixed)
+
+ window.Helpers.setFooterFixed(fixed)
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+ }
+
+ setLang(lang, updateStorage = true, force = false) {
+ if (lang === this.settings.lang && !force) return
+ if (!TemplateCustomizer.LANGUAGES[lang]) throw new Error(`Language "${lang}" not found!`)
+
+ const t = TemplateCustomizer.LANGUAGES[lang]
+
+ ;[
+ 'panel_header',
+ 'panel_sub_header',
+ 'theming_header',
+ 'style_label',
+ 'style_switch_light',
+ 'style_switch_dark',
+ 'layout_header',
+ 'layout_label',
+ 'layout_header_label',
+ 'content_label',
+ 'layout_static',
+ 'layout_offcanvas',
+ 'layout_fixed',
+ 'layout_fixed_offcanvas',
+ 'layout_dd_open_label',
+ 'layout_navbar_label',
+ 'layout_footer_label',
+ 'misc_header',
+ 'theme_label',
+ 'direction_label'
+ ].forEach(key => {
+ const el = this.container.querySelector(`.template-customizer-t-${key}`)
+ // eslint-disable-next-line no-unused-expressions
+ el && (el.textContent = t[key])
+ })
+
+ const tt = t.themes || {}
+ const themes = this.container.querySelectorAll('.template-customizer-theme-item') || []
+
+ for (let i = 0, l = themes.length; i < l; i++) {
+ const themeName = themes[i].querySelector('input[type="radio"]').value
+ themes[i].querySelector('.template-customizer-theme-name').textContent =
+ tt[themeName] || this._getThemeByName(themeName).title
+ }
+
+ this.settings.lang = lang
+
+ if (updateStorage) this._setSetting('Lang', lang)
+
+ if (updateStorage) this.settings.onSettingsChange.call(this, this.settings)
+ }
+
+ // Update theme settings control
+ update() {
+ if (this._ssr) return
+
+ const hasNavbar = !!document.querySelector('.layout-navbar')
+ const hasMenu = !!document.querySelector('.layout-menu')
+ const hasHorizontalMenu = !!document.querySelector('.layout-menu-horizontal.menu, .layout-menu-horizontal .menu')
+ const isLayout1 = !!document.querySelector('.layout-wrapper.layout-navbar-full')
+ const hasFooter = !!document.querySelector('.content-footer')
+
+ if (this._controls.showDropdownOnHover) {
+ if (hasMenu) {
+ this._controls.showDropdownOnHover.setAttribute('disabled', 'disabled')
+ this._controls.showDropdownOnHover.classList.add('disabled')
+ } else {
+ this._controls.showDropdownOnHover.removeAttribute('disabled')
+ this._controls.showDropdownOnHover.classList.remove('disabled')
+ }
+ }
+
+ if (this._controls.layoutNavbarOptions) {
+ if (!hasNavbar) {
+ this._controls.layoutNavbarOptions.setAttribute('disabled', 'disabled')
+ this._controls.layoutNavbarOptionsW.classList.add('disabled')
+ } else {
+ this._controls.layoutNavbarOptions.removeAttribute('disabled')
+ this._controls.layoutNavbarOptionsW.classList.remove('disabled')
+ }
+
+ // Horizontal menu fixed layout - disabled fixed navbar switch
+ if (hasHorizontalMenu && hasNavbar && this.settings.headerType === 'fixed') {
+ this._controls.layoutNavbarOptions.setAttribute('disabled', 'disabled')
+ this._controls.layoutNavbarOptionsW.classList.add('disabled')
+ }
+ }
+
+ if (this._controls.layoutFooterFixed) {
+ if (!hasFooter) {
+ this._controls.layoutFooterFixed.setAttribute('disabled', 'disabled')
+ this._controls.layoutFooterFixedW.classList.add('disabled')
+ } else {
+ this._controls.layoutFooterFixed.removeAttribute('disabled')
+ this._controls.layoutFooterFixedW.classList.remove('disabled')
+ }
+ }
+
+ if (this._controls.headerType) {
+ // ? Uncomment If using offcanvas layout
+ /*
+ if (!hasMenu) {
+ this._controls.headerType.querySelector('[value="static-offcanvas"]').setAttribute('disabled', 'disabled')
+ this._controls.headerType.querySelector('[value="fixed-offcanvas"]').setAttribute('disabled', 'disabled')
+ } else {
+ this._controls.headerType.querySelector('[value="static-offcanvas"]').removeAttribute('disabled')
+ this._controls.headerType.querySelector('[value="fixed-offcanvas"]').removeAttribute('disabled')
+ }
+ */
+
+ // Disable menu layouts options if menu (vertical or horizontal) is not there
+ // if ((!hasNavbar && !hasMenu) || (!hasMenu && !isLayout1)) {
+ if (hasMenu || hasHorizontalMenu) {
+ // (Updated condition)
+ this._controls.headerType.removeAttribute('disabled')
+ } else {
+ this._controls.headerType.setAttribute('disabled', 'disabled')
+ }
+ }
+ }
+
+ // Clear local storage
+ clearLocalStorage() {
+ if (this._ssr) return
+ const layoutName = this._getLayoutName()
+ const keysToRemove = [
+ 'Theme',
+ 'Style',
+ 'LayoutCollapsed',
+ 'FixedNavbarOption',
+ 'LayoutType',
+ 'contentLayout',
+ 'Rtl',
+ 'Lang'
+ ]
+
+ keysToRemove.forEach(key => {
+ const localStorageKey = `templateCustomizer-${layoutName}--${key}`
+ localStorage.removeItem(localStorageKey)
+ })
+
+ this._showResetBtnNotification(false)
+ }
+
+ // Clear local storage
+ destroy() {
+ if (this._ssr) return
+
+ this._cleanup()
+
+ this.settings = null
+ this.container.parentNode.removeChild(this.container)
+ this.container = null
+ }
+
+ _loadSettings() {
+ // Get settings
+
+ // const cl = document.documentElement.classList;
+ const rtl = this._getSetting('Rtl')
+ const style = this._getSetting('Style')
+ const theme = this._getSetting('Theme')
+ const contentLayout = this._getSetting('contentLayout')
+ const collapsedMenu = this._getSetting('LayoutCollapsed') // Value will be set from main.js
+ const dropdownOnHover = this._getSetting('ShowDropdownOnHover') // Value will be set from main.js
+ const navbarOption = this._getSetting('FixedNavbarOption')
+ const fixedFooter = this._getSetting('FixedFooter')
+ const lType = this._getSetting('LayoutType')
+
+ const layoutName = this._getLayoutName()
+ const isAdmin = !layoutName.includes('front')
+
+ const modeCookieName = isAdmin ? 'admin-mode' : 'front-mode'
+ const colorPrefCookieName = isAdmin ? 'admin-colorPref' : 'front-colorPref'
+
+ if (
+ rtl !== '' ||
+ style !== '' ||
+ theme !== '' ||
+ contentLayout !== '' ||
+ collapsedMenu !== '' ||
+ navbarOption !== '' ||
+ lType !== ''
+ ) {
+ this._showResetBtnNotification(true)
+ } else {
+ this._showResetBtnNotification(false)
+ }
+ let type
+
+ if (lType !== '' && ['static', 'static-offcanvas', 'fixed', 'fixed-offcanvas'].indexOf(lType) !== -1) {
+ type = lType
+ } else {
+ type = this.settings.defaultHeaderType
+ }
+ this.settings.headerType = type
+
+ // ! Set settings by following priority: Local Storage, Theme Config, HTML Classes
+ this.settings.rtl = this._checkCookie('direction')
+ ? this._getCookie('direction')
+ : rtl !== ''
+ ? rtl === 'true'
+ : this.settings.defaultTextDir
+ this.settings.stylesOpt = this.settings.styles.indexOf(style) !== -1 ? style : this.settings.defaultStyle
+
+ if (this._getCookie(modeCookieName) === 'system') {
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ this._setCookie(colorPrefCookieName, 'dark', 365)
+ this.settings.style = 'dark'
+ } else {
+ this._setCookie(colorPrefCookieName, 'light', 365)
+ this.settings.style = 'light'
+ }
+ } else {
+ if (this.settings.stylesOpt === 'system') {
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ this.settings.style = 'dark'
+ } else {
+ this.settings.style = 'light'
+ }
+ } else {
+ this.settings.style = this.settings.styles.indexOf(style) !== -1 ? style : this.settings.stylesOpt
+ }
+ }
+ this.settings.contentLayout = contentLayout !== '' ? contentLayout : this.settings.defaultContentLayout
+ this.settings.layoutCollapsed = collapsedMenu !== '' ? collapsedMenu === 'true' : this.settings.defaultMenuCollapsed
+ this.settings.showDropdownOnHover =
+ dropdownOnHover !== '' ? dropdownOnHover === 'true' : this.settings.defaultShowDropdownOnHover
+ let navType
+ if (navbarOption !== '' && ['static', 'sticky', 'hidden'].indexOf(navbarOption) !== -1) {
+ navType = navbarOption
+ } else {
+ navType = this.settings.defaultNavbarType
+ }
+
+ this.settings.layoutNavbarOptions = navType
+ this.settings.layoutFooterFixed = fixedFooter !== '' ? fixedFooter === 'true' : this.settings.defaultFooterFixed
+
+ if (this._checkCookie('theme')) {
+ this.settings.theme = this._getThemeByName(this._getCookie('theme'), true)
+ } else {
+ this.settings.theme = this._getThemeByName(this._getSetting('Theme'), true)
+ }
+
+ // Filter options depending on available controls
+ if (!this._hasControls('rtl')) this.settings.rtl = document.documentElement.getAttribute('dir') === 'rtl'
+ if (!this._hasControls('style')) this.settings.style = cl.contains('dark-style') ? 'dark' : 'light'
+ if (!this._hasControls('contentLayout')) this.settings.contentLayout = null
+ if (!this._hasControls('headerType')) this.settings.headerType = null
+ if (!this._hasControls('layoutCollapsed')) this.settings.layoutCollapsed = null
+ if (!this._hasControls('layoutNavbarOptions')) this.settings.layoutNavbarOptions = null
+ if (!this._hasControls('themes')) this.settings.theme = null
+ }
+
+ // Setup theme settings controls and events
+ _setup(_container = document) {
+ // Function to create customizer elements
+ const createOptionElement = (nameVal, title, inputName, isDarkStyle, image) => {
+ image = image || nameVal
+
+ return this._getElementFromString(``)
+ }
+
+ this._cleanup()
+ this.container = this._getElementFromString(customizerMarkup)
+
+ // Customizer visibility condition
+ //
+ const customizerW = this.container
+ if (this.settings.displayCustomizer) customizerW.setAttribute('style', 'visibility: visible')
+ else customizerW.setAttribute('style', 'visibility: hidden')
+
+ // Open btn
+ //
+ const openBtn = this.container.querySelector('.template-customizer-open-btn')
+ const openBtnCb = () => {
+ this.container.classList.add('template-customizer-open')
+ this.update()
+
+ if (this._updateInterval) clearInterval(this._updateInterval)
+ this._updateInterval = setInterval(() => {
+ this.update()
+ }, 500)
+ }
+ openBtn.addEventListener('click', openBtnCb)
+ this._listeners.push([openBtn, 'click', openBtnCb])
+
+ // Reset btn
+ //
+
+ const resetBtn = this.container.querySelector('.template-customizer-reset-btn')
+ const resetBtnCb = () => {
+ const layoutName = this._getLayoutName()
+ if (layoutName.includes('front')) {
+ this._deleteCookie('front-mode')
+ this._deleteCookie('front-colorPref')
+ } else {
+ this._deleteCookie('admin-mode')
+ this._deleteCookie('admin-colorPref')
+ }
+ this.clearLocalStorage()
+ window.location.reload()
+ this._deleteCookie('colorPref')
+ this._deleteCookie('theme')
+ this._deleteCookie('direction')
+ }
+ resetBtn.addEventListener('click', resetBtnCb)
+ this._listeners.push([resetBtn, 'click', resetBtnCb])
+
+ // Close btn
+ //
+
+ const closeBtn = this.container.querySelector('.template-customizer-close-btn')
+ const closeBtnCb = () => {
+ this.container.classList.remove('template-customizer-open')
+
+ if (this._updateInterval) {
+ clearInterval(this._updateInterval)
+ this._updateInterval = null
+ }
+ }
+ closeBtn.addEventListener('click', closeBtnCb)
+ this._listeners.push([closeBtn, 'click', closeBtnCb])
+
+ // Style
+ const styleW = this.container.querySelector('.template-customizer-style')
+ const styleOpt = styleW.querySelector('.template-customizer-styles-options')
+
+ if (!this._hasControls('style')) {
+ styleW.parentNode.removeChild(styleW)
+ } else {
+ this.settings.availableStyles.forEach(style => {
+ const styleEl = createOptionElement(style.name, style.title, 'customRadioIcon', cl.contains('dark-style'))
+ styleOpt.appendChild(styleEl)
+ })
+ styleOpt.querySelector(`input[value="${this.settings.stylesOpt}"]`).setAttribute('checked', 'checked')
+
+ // styleCb
+ const styleCb = e => {
+ this._loadingState(true)
+ this.setStyle(e.target.value, true, () => {
+ this._loadingState(false)
+ })
+ }
+
+ styleOpt.addEventListener('change', styleCb)
+ this._listeners.push([styleOpt, 'change', styleCb])
+ }
+
+ // Theme
+ const themesW = this.container.querySelector('.template-customizer-themes')
+ const themesWInner = themesW.querySelector('.template-customizer-themes-options')
+
+ if (!this._hasControls('themes')) {
+ themesW.parentNode.removeChild(themesW)
+ } else {
+ this.settings.availableThemes.forEach(theme => {
+ let image = ''
+ if (theme.name === 'theme-semi-dark') {
+ image = `semi-dark`
+ } else if (theme.name === 'theme-bordered') {
+ image = `border`
+ } else {
+ image = `default`
+ }
+ const themeEl = createOptionElement(theme.name, theme.title, 'themeRadios', cl.contains('dark-style'), image)
+ themesWInner.appendChild(themeEl)
+ })
+
+ themesWInner.querySelector(`input[value="${this.settings.theme.name}"]`).setAttribute('checked', 'checked')
+
+ const themeCb = e => {
+ this._loading = true
+ this._loadingState(true, true)
+
+ this.setTheme(e.target.value, true, () => {
+ this._loading = false
+ this._loadingState(false, true)
+ })
+ }
+
+ themesWInner.addEventListener('change', themeCb)
+ this._listeners.push([themesWInner, 'change', themeCb])
+ }
+ const themingW = this.container.querySelector('.template-customizer-theming')
+
+ if (!this._hasControls('style') && !this._hasControls('themes')) {
+ themingW.parentNode.removeChild(themingW)
+ }
+
+ // Layout wrapper
+ const layoutW = this.container.querySelector('.template-customizer-layout')
+
+ if (!this._hasControls('rtl headerType contentLayout layoutCollapsed layoutNavbarOptions', true)) {
+ layoutW.parentNode.removeChild(layoutW)
+ } else {
+ // RTL
+ //
+
+ const directionW = this.container.querySelector('.template-customizer-directions')
+ // ? Hide RTL control in following 2 case
+ if (!this._hasControls('rtl') || !rtlSupport) {
+ directionW.parentNode.removeChild(directionW)
+ } else {
+ const directionOpt = directionW.querySelector('.template-customizer-directions-options')
+ this.settings.availableDirections.forEach(dir => {
+ const dirEl = createOptionElement(dir.name, dir.title, 'directionRadioIcon', cl.contains('dark-style'))
+ directionOpt.appendChild(dirEl)
+ })
+ directionOpt
+ .querySelector(`input[value="${this.settings.rtl === 'true' ? 'rtl' : 'ltr'}"]`)
+ .setAttribute('checked', 'checked')
+
+ const rtlCb = e => {
+ this._loadingState(true)
+ // For demo purpose, we will use EN as LTR and AR as RTL Language
+ this._getSetting('Lang') === 'ar' ? this._setSetting('Lang', 'en') : this._setSetting('Lang', 'ar')
+ this.setRtl(e.target.value === 'rtl', true, () => {
+ this._loadingState(false)
+ })
+ if (e.target.value === 'rtl') {
+ window.location.href = baseUrl + 'lang/ar'
+ } else {
+ window.location.href = baseUrl + 'lang/en'
+ }
+ }
+
+ directionOpt.addEventListener('change', rtlCb)
+ this._listeners.push([directionOpt, 'change', rtlCb])
+ }
+
+ // Header Layout Type
+ const headerTypeW = this.container.querySelector('.template-customizer-headerOptions')
+ const templateName = document.documentElement.getAttribute('data-template').split('-')
+ if (!this._hasControls('headerType')) {
+ headerTypeW.parentNode.removeChild(headerTypeW)
+ } else {
+ const headerOpt = headerTypeW.querySelector('.template-customizer-header-options')
+ setTimeout(() => {
+ if (templateName.includes('vertical')) {
+ headerTypeW.parentNode.removeChild(headerTypeW)
+ }
+ }, 100)
+ this.settings.availableHeaderTypes.forEach(header => {
+ const headerEl = createOptionElement(
+ header.name,
+ header.title,
+ 'headerRadioIcon',
+ cl.contains('dark-style'),
+ `horizontal-${header.name}`
+ )
+ headerOpt.appendChild(headerEl)
+ })
+ headerOpt.querySelector(`input[value="${this.settings.headerType}"]`).setAttribute('checked', 'checked')
+
+ const headerTypeCb = e => {
+ this.setLayoutType(e.target.value)
+ }
+
+ headerOpt.addEventListener('change', headerTypeCb)
+ this._listeners.push([headerOpt, 'change', headerTypeCb])
+ }
+
+ // CONTENT
+ //
+
+ const contentWrapper = this.container.querySelector('.template-customizer-content')
+ // ? Hide RTL control in following 2 case
+ if (!this._hasControls('contentLayout')) {
+ contentWrapper.parentNode.removeChild(contentWrapper)
+ } else {
+ const contentOpt = contentWrapper.querySelector('.template-customizer-content-options')
+ this.settings.availableContentLayouts.forEach(content => {
+ const contentEl = createOptionElement(
+ content.name,
+ content.title,
+ 'contentRadioIcon',
+ cl.contains('dark-style')
+ )
+ contentOpt.appendChild(contentEl)
+ })
+ contentOpt.querySelector(`input[value="${this.settings.contentLayout}"]`).setAttribute('checked', 'checked')
+
+ const contentCb = e => {
+ this._loading = true
+ this._loadingState(true, true)
+ this.setContentLayout(e.target.value, true, () => {
+ this._loading = false
+ this._loadingState(false, true)
+ })
+ }
+
+ contentOpt.addEventListener('change', contentCb)
+ this._listeners.push([contentOpt, 'change', contentCb])
+ }
+
+ // Layouts Collapsed: Expanded, Collapsed
+ const layoutCollapsedW = this.container.querySelector('.template-customizer-layouts')
+
+ if (!this._hasControls('layoutCollapsed')) {
+ layoutCollapsedW.parentNode.removeChild(layoutCollapsedW)
+ } else {
+ setTimeout(() => {
+ if (document.querySelector('.layout-menu-horizontal')) {
+ layoutCollapsedW.parentNode.removeChild(layoutCollapsedW)
+ }
+ }, 100)
+ const layoutCollapsedOpt = layoutCollapsedW.querySelector('.template-customizer-layouts-options')
+ this.settings.availableLayouts.forEach(layoutOpt => {
+ const layoutsEl = createOptionElement(
+ layoutOpt.name,
+ layoutOpt.title,
+ 'layoutsRadios',
+ cl.contains('dark-style')
+ )
+ layoutCollapsedOpt.appendChild(layoutsEl)
+ })
+ layoutCollapsedOpt
+ .querySelector(`input[value="${this.settings.layoutCollapsed ? 'collapsed' : 'expanded'}"]`)
+ .setAttribute('checked', 'checked')
+
+ const layoutCb = e => {
+ window.Helpers.setCollapsed(e.target.value === 'collapsed', true)
+
+ this._setSetting('LayoutCollapsed', e.target.value === 'collapsed')
+ }
+
+ layoutCollapsedOpt.addEventListener('change', layoutCb)
+ this._listeners.push([layoutCollapsedOpt, 'change', layoutCb])
+ }
+
+ // Layout Navbar Options
+ const navbarOption = this.container.querySelector('.template-customizer-layoutNavbarOptions')
+
+ if (!this._hasControls('layoutNavbarOptions')) {
+ navbarOption.parentNode.removeChild(navbarOption)
+ } else {
+ setTimeout(() => {
+ if (templateName.includes('horizontal')) {
+ navbarOption.parentNode.removeChild(navbarOption)
+ }
+ }, 100)
+ const navbarTypeOpt = navbarOption.querySelector('.template-customizer-navbar-options')
+ this.settings.availableNavbarOptions.forEach(navbarOpt => {
+ const navbarEl = createOptionElement(
+ navbarOpt.name,
+ navbarOpt.title,
+ 'navbarOptionRadios',
+ cl.contains('dark-style')
+ )
+ navbarTypeOpt.appendChild(navbarEl)
+ })
+ // check navbar option from settings
+ navbarTypeOpt
+ .querySelector(`input[value="${this.settings.layoutNavbarOptions}"]`)
+ .setAttribute('checked', 'checked')
+ const navbarCb = e => {
+ this._loading = true
+ this._loadingState(true, true)
+ this.setLayoutNavbarOption(e.target.value, true, () => {
+ this._loading = false
+ this._loadingState(false, true)
+ })
+ }
+
+ navbarTypeOpt.addEventListener('change', navbarCb)
+ this._listeners.push([navbarTypeOpt, 'change', navbarCb])
+ }
+ }
+
+ setTimeout(() => {
+ const layoutCustom = this.container.querySelector('.template-customizer-layout')
+ if (document.querySelector('.menu-vertical')) {
+ if (!this._hasControls('rtl contentLayout layoutCollapsed layoutNavbarOptions', true)) {
+ if (layoutCustom) {
+ layoutCustom.parentNode.removeChild(layoutCustom)
+ }
+ }
+ } else if (document.querySelector('.menu-horizontal')) {
+ if (!this._hasControls('rtl contentLayout headerType', true)) {
+ if (layoutCustom) {
+ layoutCustom.parentNode.removeChild(layoutCustom)
+ }
+ }
+ }
+ }, 100)
+
+ // Set language
+ this.setLang(this.settings.lang, false, true)
+
+ // Append container
+ if (_container === document) {
+ if (_container.body) {
+ _container.body.appendChild(this.container)
+ } else {
+ window.addEventListener('DOMContentLoaded', () => _container.body.appendChild(this.container))
+ }
+ } else {
+ _container.appendChild(this.container)
+ }
+ }
+
+ _initDirection() {
+ if (this._hasControls('rtl')) {
+ document.documentElement.setAttribute(
+ 'dir',
+ this._checkCookie('direction')
+ ? this._getCookie('direction') === 'true'
+ ? 'rtl'
+ : 'ltr'
+ : this.settings.rtl
+ ? 'rtl'
+ : 'ltr'
+ )
+ }
+ }
+
+ // Init template styles
+ _initStyle() {
+ if (!this._hasControls('style')) return
+
+ const { style } = this.settings
+
+ this._insertStylesheet(
+ 'template-customizer-core-css',
+ this.pathResolver(
+ this.settings.cssPath +
+ this.settings.cssFilenamePattern.replace('%name%', `core${style !== 'light' ? `-${style}` : ''}`)
+ )
+ )
+ // ? Uncomment if needed
+ /*
+ this._insertStylesheet(
+ 'template-customizer-bootstrap-css',
+ this.pathResolver(
+ this.settings.cssPath +
+ this.settings.cssFilenamePattern.replace('%name%', `bootstrap${style !== 'light' ? `-${style}` : ''}`)
+ )
+ )
+ this._insertStylesheet(
+ 'template-customizer-bsextended-css',
+ this.pathResolver(
+ this.settings.cssPath +
+ this.settings.cssFilenamePattern.replace(
+ '%name%',
+ `bootstrap-extended${style !== 'light' ? `-${style}` : ''}`
+ )
+ )
+ )
+ this._insertStylesheet(
+ 'template-customizer-components-css',
+ this.pathResolver(
+ this.settings.cssPath +
+ this.settings.cssFilenamePattern.replace('%name%', `components${style !== 'light' ? `-${style}` : ''}`)
+ )
+ )
+ this._insertStylesheet(
+ 'template-customizer-colors-css',
+ this.pathResolver(
+ this.settings.cssPath +
+ this.settings.cssFilenamePattern.replace('%name%', `colors${style !== 'light' ? `-${style}` : ''}`)
+ )
+ )
+ */
+
+ const classesToRemove = style === 'light' ? ['dark-style'] : ['light-style']
+ classesToRemove.forEach(cls => {
+ document.documentElement.classList.remove(cls)
+ })
+
+ document.documentElement.classList.add(`${style}-style`)
+ }
+
+ // Init theme style
+ _initTheme() {
+ if (this._hasControls('themes')) {
+ this._insertStylesheet(
+ 'template-customizer-theme-css',
+ this.pathResolver(
+ this.settings.themesPath +
+ this.settings.cssFilenamePattern.replace(
+ '%name%',
+ this.settings.theme.name + (this.settings.style !== 'light' ? `-${this.settings.style}` : '')
+ )
+ )
+ )
+ } else {
+ // If theme control is not enabled, get the current theme from localstorage else display default theme
+ const theme = this._getSetting('Theme')
+ this._insertStylesheet(
+ 'template-customizer-theme-css',
+ this.pathResolver(
+ this.settings.themesPath +
+ this.settings.cssFilenamePattern.replace(
+ '%name%',
+ theme
+ ? theme
+ : this.settings.defaultTheme.name + (this.settings.style !== 'light' ? `-${this.settings.style}` : '')
+ )
+ )
+ )
+ }
+ }
+
+ _loadStylesheet(href, className) {
+ const link = document.createElement('link')
+ link.rel = 'stylesheet'
+ link.type = 'text/css'
+ link.href = href
+ link.className = className
+ document.head.appendChild(link)
+ }
+
+ _insertStylesheet(className, href) {
+ const curLink = document.querySelector(`.${className}`)
+
+ if (typeof document.documentMode === 'number' && document.documentMode < 11) {
+ if (!curLink) return
+ if (href === curLink.getAttribute('href')) return
+
+ const link = document.createElement('link')
+
+ link.setAttribute('rel', 'stylesheet')
+ link.setAttribute('type', 'text/css')
+ link.className = className
+ link.setAttribute('href', href)
+
+ curLink.parentNode.insertBefore(link, curLink.nextSibling)
+ } else {
+ this._loadStylesheet(href, className)
+ }
+
+ if (curLink) {
+ curLink.parentNode.removeChild(curLink)
+ }
+ }
+
+ _loadStylesheets(stylesheets, cb) {
+ const paths = Object.keys(stylesheets)
+ const count = paths.length
+ let loaded = 0
+
+ function loadStylesheet(path, curLink, _cb = () => {}) {
+ const link = document.createElement('link')
+
+ link.setAttribute('href', path)
+ link.setAttribute('rel', 'stylesheet')
+ link.setAttribute('type', 'text/css')
+ link.className = curLink.className
+
+ const sheet = 'sheet' in link ? 'sheet' : 'styleSheet'
+ const cssRules = 'sheet' in link ? 'cssRules' : 'rules'
+
+ let intervalId
+
+ const timeoutId = setTimeout(() => {
+ clearInterval(intervalId)
+ clearTimeout(timeoutId)
+ if (curLink.parentNode.contains(link)) {
+ curLink.parentNode.removeChild(link)
+ }
+ _cb(false, path)
+ }, 15000)
+
+ intervalId = setInterval(() => {
+ try {
+ if (link[sheet] && link[sheet][cssRules].length) {
+ clearInterval(intervalId)
+ clearTimeout(timeoutId)
+ curLink.parentNode.removeChild(curLink)
+ _cb(true)
+ }
+ } catch (e) {
+ // Catch error
+ }
+ }, 10)
+ curLink.setAttribute('href', link.href)
+ }
+
+ function stylesheetCallBack() {
+ if ((loaded += 1) >= count) {
+ cb()
+ }
+ }
+ for (let i = 0; i < paths.length; i++) {
+ loadStylesheet(paths[i], stylesheets[paths[i]], stylesheetCallBack())
+ }
+ }
+
+ _loadingState(enable, themes) {
+ this.container.classList[enable ? 'add' : 'remove'](`template-customizer-loading${themes ? '-theme' : ''}`)
+ }
+
+ _getElementFromString(str) {
+ const wrapper = document.createElement('div')
+ wrapper.innerHTML = str
+ return wrapper.firstChild
+ }
+
+ // Set settings in LocalStorage with layout & key
+ _getSetting(key) {
+ let result = null
+ const layoutName = this._getLayoutName()
+ try {
+ result = localStorage.getItem(`templateCustomizer-${layoutName}--${key}`)
+ } catch (e) {
+ // Catch error
+ }
+ return String(result || '')
+ }
+
+ _showResetBtnNotification(show = true) {
+ setTimeout(() => {
+ const resetBtnAttr = this.container.querySelector('.template-customizer-reset-btn .badge')
+ if (show) {
+ resetBtnAttr.classList.remove('d-none')
+ } else {
+ resetBtnAttr.classList.add('d-none')
+ }
+ }, 200)
+ }
+
+ // Set settings in LocalStorage with layout & key
+ _setSetting(key, val) {
+ const layoutName = this._getLayoutName()
+ try {
+ localStorage.setItem(`templateCustomizer-${layoutName}--${key}`, String(val))
+ this._showResetBtnNotification()
+ } catch (e) {
+ // Catch Error
+ }
+ }
+
+ // Get layout name to set unique
+ _getLayoutName() {
+ return document.getElementsByTagName('HTML')[0].getAttribute('data-template')
+ }
+
+ _removeListeners() {
+ for (let i = 0, l = this._listeners.length; i < l; i++) {
+ this._listeners[i][0].removeEventListener(this._listeners[i][1], this._listeners[i][2])
+ }
+ }
+
+ _cleanup() {
+ this._removeListeners()
+ this._listeners = []
+ this._controls = {}
+
+ if (this._updateInterval) {
+ clearInterval(this._updateInterval)
+ this._updateInterval = null
+ }
+ }
+
+ get _ssr() {
+ return typeof window === 'undefined'
+ }
+
+ // Check controls availability
+ _hasControls(controls, oneOf = false) {
+ return controls.split(' ').reduce((result, control) => {
+ if (this.settings.controls.indexOf(control) !== -1) {
+ if (oneOf || result !== false) result = true
+ } else if (!oneOf || result !== true) result = false
+ return result
+ }, null)
+ }
+
+ // Get the default theme
+ _getDefaultTheme(themeId) {
+ let theme
+ if (typeof themeId === 'string') {
+ theme = this._getThemeByName(themeId, false)
+ } else {
+ theme = this.settings.availableThemes[themeId]
+ }
+
+ if (!theme) {
+ throw new Error(`Theme ID "${themeId}" not found!`)
+ }
+
+ return theme
+ }
+
+ // Get theme by themeId/themeName
+ _getThemeByName(themeName, returnDefault = false) {
+ const themes = this.settings.availableThemes
+
+ for (let i = 0, l = themes.length; i < l; i++) {
+ if (themes[i].name === themeName) return themes[i]
+ }
+
+ return returnDefault ? this.settings.defaultTheme : null
+ }
+
+ _setCookie(name, value, daysToExpire, path = '/', domain = '') {
+ const cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`
+
+ let expires = ''
+ if (daysToExpire) {
+ const expirationDate = new Date()
+ expirationDate.setTime(expirationDate.getTime() + daysToExpire * 24 * 60 * 60 * 1000)
+ expires = `; expires=${expirationDate.toUTCString()}`
+ }
+
+ const pathString = `; path=${path}`
+ const domainString = domain ? `; domain=${domain}` : ''
+
+ document.cookie = `${cookie}${expires}${pathString}${domainString}`
+ }
+
+ _getCookie(name) {
+ const cookies = document.cookie.split('; ')
+
+ for (let i = 0; i < cookies.length; i++) {
+ const [cookieName, cookieValue] = cookies[i].split('=')
+ if (decodeURIComponent(cookieName) === name) {
+ return decodeURIComponent(cookieValue)
+ }
+ }
+
+ return null
+ }
+
+ _checkCookie(name) {
+ return this._getCookie(name) !== null
+ }
+
+ _deleteCookie(name) {
+ document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'
+ }
+}
+
+// Styles
+TemplateCustomizer.STYLES = [
+ {
+ name: 'light',
+ title: 'Light'
+ },
+ {
+ name: 'dark',
+ title: 'Dark'
+ },
+ {
+ name: 'system',
+ title: 'System'
+ }
+]
+
+// Themes
+TemplateCustomizer.THEMES = [
+ {
+ name: 'theme-default',
+ title: 'Default'
+ },
+ {
+ name: 'theme-bordered',
+ title: 'Bordered'
+ },
+ {
+ name: 'theme-semi-dark',
+ title: 'Semi Dark'
+ }
+]
+
+// Layouts
+TemplateCustomizer.LAYOUTS = [
+ {
+ name: 'expanded',
+ title: 'Expanded'
+ },
+ {
+ name: 'collapsed',
+ title: 'Collapsed'
+ }
+]
+
+// Navbar Options
+TemplateCustomizer.NAVBAR_OPTIONS = [
+ {
+ name: 'sticky',
+ title: 'Sticky'
+ },
+ {
+ name: 'static',
+ title: 'Static'
+ },
+ {
+ name: 'hidden',
+ title: 'Hidden'
+ }
+]
+
+// Header Types
+TemplateCustomizer.HEADER_TYPES = [
+ {
+ name: 'fixed',
+ title: 'Fixed'
+ },
+ {
+ name: 'static',
+ title: 'Static'
+ }
+]
+
+// Content Types
+TemplateCustomizer.CONTENT = [
+ {
+ name: 'compact',
+ title: 'Compact'
+ },
+ {
+ name: 'wide',
+ title: 'Wide'
+ }
+]
+
+// Directions
+TemplateCustomizer.DIRECTIONS = [
+ {
+ name: 'ltr',
+ title: 'Left to Right (En)'
+ },
+ {
+ name: 'rtl',
+ title: 'Right to Left (Ar)'
+ }
+]
+
+// Theme setting language
+TemplateCustomizer.LANGUAGES = {
+ en: {
+ panel_header: 'Template Customizer',
+ panel_sub_header: 'Customize and preview in real time',
+ theming_header: 'Theming',
+ style_label: 'Style (Mode)',
+ theme_label: 'Themes',
+ layout_header: 'Layout',
+ layout_label: 'Menu (Navigation)',
+ layout_header_label: 'Header Types',
+ content_label: 'Content',
+ layout_navbar_label: 'Navbar Type',
+ direction_label: 'Direction'
+ },
+ es: {
+ panel_header: 'Personalizador de Plantilla',
+ panel_sub_header: 'Personaliza y previsualiza en tiempo real',
+ theming_header: 'Tematización',
+ style_label: 'Estilo (Modo)',
+ theme_label: 'Temas',
+ layout_header: 'Diseño',
+ layout_label: 'Menú (Navegación)',
+ layout_header_label: 'Tipos de Encabezado',
+ content_label: 'Contenido',
+ layout_navbar_label: 'Tipo de Barra de Navegación',
+ direction_label: 'Dirección'
+ },
+ fr: {
+ panel_header: 'Modèle De Personnalisation',
+ panel_sub_header: 'Personnalisez et prévisualisez en temps réel',
+ theming_header: 'Thématisation',
+ style_label: 'Style (Mode)',
+ theme_label: 'Thèmes',
+ layout_header: 'Disposition',
+ layout_label: 'Menu (Navigation)',
+ layout_header_label: "Types d'en-tête",
+ content_label: 'Contenu',
+ layout_navbar_label: 'Type de barre de navigation',
+ direction_label: 'Direction'
+ },
+ ar: {
+ panel_header: 'أداة تخصيص القالب',
+ panel_sub_header: 'تخصيص ومعاينة في الوقت الحقيقي',
+ theming_header: 'السمات',
+ style_label: 'النمط (الوضع)',
+ theme_label: 'المواضيع',
+ layout_header: 'تَخطِيط',
+ layout_label: 'القائمة (الملاحة)',
+ layout_header_label: 'أنواع الرأس',
+ content_label: 'محتوى',
+ layout_navbar_label: 'نوع شريط التنقل',
+ direction_label: 'اتجاه'
+ },
+ de: {
+ panel_header: 'Vorlagen-Anpasser',
+ panel_sub_header: 'Anpassen und Vorschau in Echtzeit',
+ theming_header: 'Themen',
+ style_label: 'Stil (Modus)',
+ theme_label: 'Themen',
+ layout_header: 'Layout',
+ layout_label: 'Menü (Navigation)',
+ layout_header_label: 'Header-Typen',
+ content_label: 'Inhalt',
+ layout_navbar_label: 'Art der Navigationsleiste',
+ direction_label: 'Richtung'
+ }
+}
+
+window.TemplateCustomizer = TemplateCustomizer
diff --git a/resources/assets/vendor/libs/@form-validation/auto-focus.js b/resources/assets/vendor/libs/@form-validation/auto-focus.js
new file mode 100644
index 0000000..c2b3bd8
--- /dev/null
+++ b/resources/assets/vendor/libs/@form-validation/auto-focus.js
@@ -0,0 +1,7 @@
+import { AutoFocus } from '@form-validation/plugin-auto-focus';
+
+try {
+ FormValidation.plugins.AutoFocus = AutoFocus;
+} catch (e) {}
+
+export { AutoFocus };
diff --git a/resources/assets/vendor/libs/@form-validation/bootstrap5.js b/resources/assets/vendor/libs/@form-validation/bootstrap5.js
new file mode 100644
index 0000000..d7ad20a
--- /dev/null
+++ b/resources/assets/vendor/libs/@form-validation/bootstrap5.js
@@ -0,0 +1,7 @@
+import { Bootstrap5 } from '@form-validation/plugin-bootstrap5';
+
+try {
+ FormValidation.plugins.Bootstrap5 = Bootstrap5;
+} catch (e) {}
+
+export { Bootstrap5 };
diff --git a/resources/assets/vendor/libs/@form-validation/form-validation.scss b/resources/assets/vendor/libs/@form-validation/form-validation.scss
new file mode 100644
index 0000000..1ed7751
--- /dev/null
+++ b/resources/assets/vendor/libs/@form-validation/form-validation.scss
@@ -0,0 +1,4 @@
+@import '@form-validation/core/lib/styles/index';
+@import '@form-validation/plugin-framework/lib/styles/index';
+@import '@form-validation/plugin-message/lib/styles/index';
+@import '@form-validation/plugin-bootstrap5/lib/styles/index';
diff --git a/resources/assets/vendor/libs/@form-validation/popular.js b/resources/assets/vendor/libs/@form-validation/popular.js
new file mode 100644
index 0000000..b07f96f
--- /dev/null
+++ b/resources/assets/vendor/libs/@form-validation/popular.js
@@ -0,0 +1,8 @@
+import FormValidation from '@form-validation/bundle/popular'
+
+try {
+ window.FormValidation = FormValidation;
+} catch (e) {}
+
+export { FormValidation };
+
diff --git a/resources/assets/vendor/libs/_tabler/_tabler.scss b/resources/assets/vendor/libs/_tabler/_tabler.scss
new file mode 100644
index 0000000..56eb8b4
--- /dev/null
+++ b/resources/assets/vendor/libs/_tabler/_tabler.scss
@@ -0,0 +1,414 @@
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes burst {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 90% {
+ -webkit-transform: scale(1.5);
+ transform: scale(1.5);
+ opacity: 0;
+ }
+}
+@keyframes burst {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 90% {
+ -webkit-transform: scale(1.5);
+ transform: scale(1.5);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes flashing {
+ 0% {
+ opacity: 1;
+ }
+ 45% {
+ opacity: 0;
+ }
+ 90% {
+ opacity: 1;
+ }
+}
+@keyframes flashing {
+ 0% {
+ opacity: 1;
+ }
+ 45% {
+ opacity: 0;
+ }
+ 90% {
+ opacity: 1;
+ }
+}
+@-webkit-keyframes fade-left {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+ opacity: 0;
+ }
+}
+@keyframes fade-left {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateX(-20px);
+ transform: translateX(-20px);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fade-right {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+ opacity: 0;
+ }
+}
+@keyframes fade-right {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateX(20px);
+ transform: translateX(20px);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fade-up {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ opacity: 0;
+ }
+}
+@keyframes fade-up {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateY(-20px);
+ transform: translateY(-20px);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fade-down {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+ opacity: 0;
+ }
+}
+@keyframes fade-down {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ opacity: 1;
+ }
+ 75% {
+ -webkit-transform: translateY(20px);
+ transform: translateY(20px);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes tada {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+ 10%,
+ 20% {
+ -webkit-transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
+ transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
+ }
+ 30%,
+ 50%,
+ 70%,
+ 90% {
+ -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ }
+ 40%,
+ 60%,
+ 80% {
+ -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, -10deg);
+ }
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+@keyframes tada {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+ 10%,
+ 20% {
+ -webkit-transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
+ transform: scale3d(0.95, 0.95, 0.95) rotate3d(0, 0, 1, -10deg);
+ }
+ 30%,
+ 50%,
+ 70%,
+ 90% {
+ -webkit-transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ transform: scale3d(1, 1, 1) rotate3d(0, 0, 1, 10deg);
+ }
+ 40%,
+ 60%,
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
+ transform: rotate3d(0, 0, 1, -10deg);
+ }
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+.ti-spin {
+ -webkit-animation: spin 2s linear infinite;
+ animation: spin 2s linear infinite;
+}
+
+.ti-spin-hover:hover {
+ -webkit-animation: spin 2s linear infinite;
+ animation: spin 2s linear infinite;
+}
+
+.ti-tada {
+ -webkit-animation: tada 1.5s ease infinite;
+ animation: tada 1.5s ease infinite;
+}
+
+.ti-tada-hover:hover {
+ -webkit-animation: tada 1.5s ease infinite;
+ animation: tada 1.5s ease infinite;
+}
+
+.ti-flashing {
+ -webkit-animation: flashing 1.5s infinite linear;
+ animation: flashing 1.5s infinite linear;
+}
+
+.ti-flashing-hover:hover {
+ -webkit-animation: flashing 1.5s infinite linear;
+ animation: flashing 1.5s infinite linear;
+}
+
+.ti-burst {
+ -webkit-animation: burst 1.5s infinite linear;
+ animation: burst 1.5s infinite linear;
+}
+
+.ti-burst-hover:hover {
+ -webkit-animation: burst 1.5s infinite linear;
+ animation: burst 1.5s infinite linear;
+}
+
+.ti-fade-up {
+ -webkit-animation: fade-up 1.5s infinite linear;
+ animation: fade-up 1.5s infinite linear;
+}
+
+.ti-fade-up-hover:hover {
+ -webkit-animation: fade-up 1.5s infinite linear;
+ animation: fade-up 1.5s infinite linear;
+}
+
+.ti-fade-down {
+ -webkit-animation: fade-down 1.5s infinite linear;
+ animation: fade-down 1.5s infinite linear;
+}
+
+.ti-fade-down-hover:hover {
+ -webkit-animation: fade-down 1.5s infinite linear;
+ animation: fade-down 1.5s infinite linear;
+}
+
+.ti-fade-left {
+ -webkit-animation: fade-left 1.5s infinite linear;
+ animation: fade-left 1.5s infinite linear;
+}
+
+.ti-fade-left-hover:hover {
+ -webkit-animation: fade-left 1.5s infinite linear;
+ animation: fade-left 1.5s infinite linear;
+}
+
+.ti-fade-right {
+ -webkit-animation: fade-right 1.5s infinite linear;
+ animation: fade-right 1.5s infinite linear;
+}
+
+.ti-fade-right-hover:hover {
+ -webkit-animation: fade-right 1.5s infinite linear;
+ animation: fade-right 1.5s infinite linear;
+}
+
+.ti-xs {
+ font-size: 1rem !important;
+}
+
+.ti-sm {
+ font-size: 1.125rem !important;
+}
+
+.ti-md {
+ font-size: 1.375rem !important;
+}
+
+.ti-lg {
+ font-size: 1.5rem !important;
+}
+
+.ti-xl {
+ font-size: 2.25rem !important;
+}
+
+.ti-10px {
+ &,
+ &:before {
+ font-size: 10px;
+ }
+}
+.ti-12px {
+ &,
+ &:before {
+ font-size: 12px;
+ }
+}
+.ti-14px {
+ &,
+ &:before {
+ font-size: 14px;
+ }
+}
+.ti-16px {
+ &,
+ &:before {
+ font-size: 16px;
+ }
+}
+.ti-18px {
+ &,
+ &:before {
+ font-size: 18px;
+ }
+}
+.ti-20px {
+ &,
+ &:before {
+ font-size: 20px;
+ }
+}
+.ti-22px {
+ &,
+ &:before {
+ font-size: 22px;
+ }
+}
+.ti-24px {
+ &,
+ &:before {
+ font-size: 24px;
+ }
+}
+.ti-26px {
+ &,
+ &:before {
+ font-size: 26px;
+ }
+}
+.ti-28px {
+ &,
+ &:before {
+ font-size: 28px;
+ }
+}
+.ti-30px {
+ &,
+ &:before {
+ font-size: 30px;
+ }
+}
+.ti-32px {
+ &,
+ &:before {
+ font-size: 32px;
+ }
+}
+.ti-36px {
+ &,
+ &:before {
+ font-size: 36px;
+ }
+}
+.ti-40px {
+ &,
+ &:before {
+ font-size: 40px;
+ }
+}
+.ti-42px {
+ &,
+ &:before {
+ font-size: 42px;
+ }
+}
+.ti-48px {
+ &,
+ &:before {
+ font-size: 48px;
+ }
+}
diff --git a/resources/assets/vendor/libs/animate-css/animate.scss b/resources/assets/vendor/libs/animate-css/animate.scss
new file mode 100644
index 0000000..0c9e900
--- /dev/null
+++ b/resources/assets/vendor/libs/animate-css/animate.scss
@@ -0,0 +1 @@
+@import 'animate.css/animate';
diff --git a/resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss b/resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss
new file mode 100644
index 0000000..ef93725
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss
@@ -0,0 +1,93 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin bs-datepicker-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+ $range-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ $range-color: $background;
+
+ .datepicker {
+ table {
+ tr td {
+ &.active,
+ &.active.highlighted,
+ .focused,
+ span.active,
+ span.active.disabled,
+ &.range-start,
+ &.range-end {
+ background: $background !important;
+ color: $color !important;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+
+ &.range,
+ &.range.highlighted,
+ &.range.today {
+ color: $range-color !important;
+ background: $range-bg !important;
+
+ &.focused {
+ background: rgba-to-hex(rgba($background, 0.24), $card-bg) !important;
+ }
+
+ &.disabled {
+ background: transparentize($range-bg, 0.5) !important;
+ color: transparentize($range-color, 0.5) !important;
+ }
+ }
+
+ &.today:not(.active),
+ &.today:not(.active):hover {
+ color: $background;
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ }
+ }
+ }
+ }
+}
+
+@mixin bs-datepicker-dark-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+ $range-bg: rgba-to-hex(rgba($background, 0.24), $card-bg);
+ $range-color: $background;
+
+ .datepicker {
+ table {
+ tr td {
+ &.active,
+ &.active.highlighted,
+ .focused,
+ span.active,
+ span.active.disabled,
+ &.range-start,
+ &.range-end {
+ color: $color !important;
+ background: $background !important;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+
+ &.range,
+ &.range.highlighted,
+ &.range.today {
+ color: $range-color !important;
+ background: $range-bg !important;
+
+ &.disabled {
+ color: transparentize($range-color, 0.5) !important;
+ background: transparentize($range-bg, 0.5) !important;
+ }
+
+ &.focused {
+ background: rgba-to-hex(rgba($background, 0.24), $card-bg) !important;
+ }
+ }
+
+ &.today:not(.active),
+ &.today:not(.active):hover {
+ color: $background;
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js b/resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js
new file mode 100644
index 0000000..bcb020b
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js
@@ -0,0 +1 @@
+import 'bootstrap-datepicker/dist/js/bootstrap-datepicker';
diff --git a/resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss b/resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss
new file mode 100644
index 0000000..933dc74
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss
@@ -0,0 +1,482 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+$datepicker-arrow-size: 0.45rem !default;
+$datepicker-item-width: 2.25rem !default;
+$datepicker-item-height: 2.25rem !default;
+$white: #fff;
+
+.datepicker {
+ direction: ltr;
+
+ &.dropdown-menu {
+ padding: 0;
+ margin: 0;
+ }
+ .datepicker-days {
+ margin: 0.875rem 0.875rem 0.875rem;
+ }
+
+ // Basic styles for next and prev arrows
+ .next,
+ .prev {
+ color: transparent !important;
+ position: absolute;
+ top: 0.65rem;
+ height: 1.875rem;
+ width: 1.875rem;
+ border-radius: light.$border-radius-pill;
+ display: table-caption;
+ }
+
+ // LRT & RTL only styles for arrows
+ table thead tr th {
+ &.next {
+ @include app-ltr {
+ float: right;
+ right: 0.125rem;
+ }
+ @include app-rtl {
+ float: left;
+ left: 0.125rem;
+ }
+ }
+ &.prev {
+ @include app-ltr {
+ right: 2.75rem;
+ }
+ @include app-rtl {
+ left: 2.75rem;
+ }
+ }
+ }
+ &.datepicker-inline {
+ table {
+ thead tr th {
+ &.next {
+ inset-inline-end: 0.5rem !important;
+ }
+ }
+ }
+ .datepicker-days {
+ .datepicker-switch {
+ top: 0;
+ }
+ }
+ }
+
+ // next & prev arrow after style
+ .next::after,
+ .prev::after {
+ content: '';
+ display: block;
+ position: absolute;
+ left: 46%;
+ top: 46%;
+ height: $datepicker-arrow-size;
+ width: $datepicker-arrow-size;
+ border-radius: 0;
+ border-style: solid;
+ transform: rotate(-45deg);
+ transform-origin: left;
+ }
+
+ .next::after {
+ margin-left: -$datepicker-arrow-size * 0.35;
+ border-width: 0 1.9px 1.9px 0;
+
+ @include app-rtl {
+ transform: rotate(-45deg);
+ border-width: 1.9px 0 0 1.9px;
+ margin-left: 0;
+ }
+ }
+
+ .prev::after {
+ border-width: 1.9px 0 0 1.9px;
+
+ @include app-rtl {
+ transform: rotate(-45deg);
+ border-width: 0 1.9px 1.9px 0;
+ margin-left: -$datepicker-arrow-size * 0.5;
+ }
+ }
+
+ // arrow alignments excluding datepicker-days
+ .datepicker-months,
+ .datepicker-years,
+ .datepicker-decades,
+ .datepicker-centuries {
+ .next {
+ @include app-ltr {
+ right: 1rem;
+ }
+ @include app-rtl {
+ left: 1rem;
+ }
+ }
+ .prev {
+ @include app-ltr {
+ right: 3.4rem;
+ }
+ @include app-rtl {
+ left: 3.4rem;
+ }
+ }
+ }
+
+ // switch default styles
+ .datepicker-switch {
+ vertical-align: middle;
+ position: relative;
+ @include app-ltr {
+ text-align: left;
+ }
+ @include app-rtl {
+ text-align: right;
+ }
+ }
+
+ // switch alignments datepicker-days
+ .datepicker-days {
+ .datepicker-switch {
+ top: -4px;
+ @include app-ltr {
+ left: -1.68rem;
+ }
+ @include app-rtl {
+ right: -1.68rem;
+ }
+ }
+ }
+
+ // switch alignments excluding datepicker-days
+ .datepicker-months,
+ .datepicker-years,
+ .datepicker-decades,
+ .datepicker-centuries {
+ .datepicker-switch {
+ @include app-ltr {
+ left: 1rem;
+ }
+ @include app-rtl {
+ right: 1rem;
+ }
+ }
+ }
+
+ table thead tr:nth-child(2) {
+ height: 60px !important;
+ width: 80px;
+ position: relative;
+ }
+
+ &.datepicker-rtl {
+ direction: rtl;
+
+ table tr td span {
+ float: right;
+ }
+ }
+
+ @include app-rtl {
+ direction: rtl;
+ }
+}
+
+.datepicker table {
+ user-select: none;
+ margin: 0;
+ overflow: hidden;
+ border-radius: light.$dropdown-border-radius;
+ tbody {
+ //! FIX: padding or margin top will not work in table
+ &:before {
+ content: '@';
+ display: block;
+ line-height: 6px;
+ text-indent: -99999px;
+ }
+ }
+}
+
+.datepicker table tr td,
+.datepicker table tr th {
+ font-weight: 400;
+ text-align: center;
+ border: none;
+
+ &.dow {
+ font-size: light.$font-size-sm;
+ }
+}
+
+.datepicker table tr td {
+ border-radius: light.$border-radius-pill;
+ width: $datepicker-item-width;
+ height: $datepicker-item-height;
+ &.day:hover,
+ &.focused {
+ cursor: pointer;
+ }
+
+ &.disabled,
+ &.disabled:hover {
+ cursor: default;
+ background: none;
+ }
+
+ &.range {
+ border-radius: 0 !important;
+ &.today {
+ box-shadow: none !important;
+ }
+ }
+
+ // span.month,
+ // span.year {
+ // margin: 0 0.5rem;
+ // }
+
+ &.range-start:not(.range-end) {
+ @include app-ltr {
+ border-bottom-right-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+ }
+
+ @include app-rtl {
+ border-bottom-left-radius: 0 !important;
+ border-top-left-radius: 0 !important;
+ }
+ }
+
+ &.range-end:not(.range-start) {
+ @include app-ltr {
+ border-bottom-left-radius: 0 !important;
+ border-top-left-radius: 0 !important;
+ }
+
+ @include app-rtl {
+ border-bottom-right-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+ }
+ }
+
+ &.selected,
+ &.selected:hover,
+ &.selected.highlighted {
+ color: $white;
+ }
+}
+
+// Styles for datepicker months, years, decades etc
+.datepicker table tr td span {
+ display: block;
+ float: left;
+ width: 3.625rem;
+ height: 2rem;
+ line-height: 2rem;
+ cursor: pointer;
+
+ &.disabled,
+ &.disabled:hover {
+ background: none;
+ cursor: default;
+ }
+
+ @include app-rtl {
+ float: right;
+ }
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+ cursor: pointer;
+}
+
+.datepicker-months table,
+.datepicker-years table,
+.datepicker-decades table,
+.datepicker-centuries table {
+ width: (3.375rem * 3) + 2.625rem;
+
+ td {
+ padding: 0 0 0.5rem 0.8125rem;
+
+ @include app-rtl {
+ padding: 0 0.8125rem 0.5rem 0;
+ }
+ }
+}
+
+.datepicker-dropdown {
+ left: 0;
+ top: 0;
+ padding: 0;
+}
+
+.input-daterange input {
+ text-align: center;
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .datepicker-dropdown {
+ z-index: light.$zindex-popover !important;
+ box-shadow: light.$card-box-shadow;
+ }
+
+ .datepicker {
+ th {
+ &.prev,
+ &.next {
+ background-color: light.rgba-to-hex(rgba(light.$black, 0.08), light.$card-bg);
+ &::after {
+ border-color: light.$body-color;
+ }
+ }
+ }
+ &.datepicker-inline {
+ table {
+ box-shadow: light.$box-shadow;
+ }
+ }
+
+ table {
+ thead {
+ background-color: light.$card-bg;
+ tr,
+ td {
+ color: light.$headings-color;
+ }
+ }
+ tr td,
+ tr th {
+ &.new {
+ color: light.$text-muted;
+ }
+ }
+
+ tr td {
+ &.old,
+ &.disabled {
+ color: light.$text-muted;
+ }
+
+ &.cw {
+ background-color: light.$card-bg;
+ color: light.$body-color;
+ }
+
+ &.day:hover,
+ &.focused {
+ background: light.rgba-to-hex(light.$gray-50, light.$card-bg);
+ }
+ }
+ }
+ }
+
+ .datepicker table tr td span {
+ border-radius: light.$border-radius;
+
+ &:hover,
+ &.focused {
+ background: light.rgba-to-hex(light.$gray-50, light.$card-bg);
+ }
+
+ &.disabled,
+ &.disabled:hover {
+ color: light.$text-muted;
+ }
+
+ &.old,
+ &.new {
+ color: light.$text-muted;
+ }
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ .datepicker-dropdown {
+ z-index: dark.$zindex-popover !important;
+ box-shadow: dark.$card-box-shadow;
+ }
+
+ .datepicker {
+ th {
+ &.prev,
+ &.next {
+ background-color: dark.rgba-to-hex(rgba(dark.$base, 0.08), dark.$card-bg);
+ &::after {
+ border-color: dark.$body-color;
+ }
+ }
+ }
+ &.datepicker-inline {
+ table {
+ box-shadow: dark.$card-box-shadow;
+ }
+ }
+
+ table {
+ thead {
+ background-color: dark.$card-bg;
+ tr,
+ td {
+ color: dark.$headings-color;
+ }
+ }
+ tr td,
+ tr th {
+ &.new {
+ color: dark.$text-muted;
+ }
+ }
+
+ tr td {
+ color: dark.$body-color;
+
+ &.old,
+ &.disabled {
+ color: dark.$text-muted;
+ }
+
+ &.cw {
+ background-color: dark.$card-bg;
+ color: dark.$body-color;
+ }
+
+ &.day:hover,
+ &.focused {
+ background: dark.rgba-to-hex(dark.$gray-50, dark.$card-bg);
+ }
+ }
+ }
+ }
+
+ .datepicker table tr td span {
+ border-radius: dark.$border-radius;
+
+ &:hover,
+ &.focused {
+ background: dark.rgba-to-hex(dark.$gray-50, dark.$card-bg);
+ }
+
+ &.disabled,
+ &.disabled:hover {
+ color: dark.$text-muted;
+ }
+
+ &.old,
+ &.new {
+ color: dark.$text-muted;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss b/resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss
new file mode 100644
index 0000000..45f5302
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss
@@ -0,0 +1,81 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin bs-daterangepicker-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ $highlighted-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ $highlighted-color: $background;
+
+ .daterangepicker td.active:not(.off) {
+ background: $background !important;
+ color: $white;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+
+ .daterangepicker {
+ .start-date:not(.end-date):not(.off),
+ .end-date:not(.start-date):not(.off) {
+ background-color: $background;
+ color: $white;
+ border: 0 !important;
+
+ &:hover {
+ background-color: $background !important;
+ }
+ }
+ }
+
+ .daterangepicker .input-mini.active {
+ border-color: $background !important;
+ }
+
+ .daterangepicker td.in-range:not(.start-date):not(.end-date):not(.off) {
+ color: $highlighted-color !important;
+ background-color: $highlighted-bg !important;
+ }
+
+ .ranges li.active {
+ color: $highlighted-color !important;
+ background-color: $highlighted-bg !important;
+ }
+}
+
+@mixin bs-daterangepicker-dark-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ $highlighted-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ $highlighted-color: $background;
+
+ .daterangepicker td.active:not(.off) {
+ background: $background !important;
+ color: $white;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+
+ .daterangepicker {
+ .start-date:not(.end-date):not(.off),
+ .end-date:not(.start-date):not(.off) {
+ background-color: $background;
+ color: $white;
+ border: 0 !important;
+
+ &:hover {
+ background-color: $background !important;
+ }
+ }
+ }
+
+ .daterangepicker .input-mini.active {
+ border-color: $background !important;
+ }
+
+ .daterangepicker td.in-range:not(.start-date):not(.end-date):not(.off) {
+ color: $highlighted-color !important;
+ background-color: $highlighted-bg !important;
+ }
+
+ .ranges li.active {
+ color: $highlighted-color !important;
+ background-color: $highlighted-bg !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js b/resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js
new file mode 100644
index 0000000..3950a71
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js
@@ -0,0 +1,18 @@
+import 'bootstrap-daterangepicker/daterangepicker';
+
+// Patch detect when weeks are shown
+
+const fnDaterangepicker = $.fn.daterangepicker;
+
+$.fn.daterangepicker = function (options, callback) {
+ fnDaterangepicker.call(this, options, callback);
+
+ if (options && (options.showWeekNumbers || options.showISOWeekNumbers)) {
+ this.each(function () {
+ const instance = $(this).data('daterangepicker');
+ if (instance && instance.container) instance.container.addClass('with-week-numbers');
+ });
+ }
+
+ return this;
+};
diff --git a/resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss b/resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss
new file mode 100644
index 0000000..5eca304
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss
@@ -0,0 +1,744 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+$daterangepicker-arrow-size: 0.45rem !default;
+$daterangepicker-select-width: 3.125rem !default;
+$daterangepicker-cell-size: 2.25rem !default;
+$daterangepicker-padding: 0.8rem !default;
+
+// Calculate widths
+$daterangepicker-width: ($daterangepicker-cell-size * 7)+ ($daterangepicker-padding * 2);
+$daterangepicker-width-with-weeks: $daterangepicker-width + $daterangepicker-cell-size;
+
+.daterangepicker {
+ position: absolute;
+ max-width: none;
+ padding: 0.875rem 0 0.5rem;
+ display: none;
+
+ tbody {
+ //! FIX: padding or margin top will not work in table
+ &:before {
+ content: '@';
+ display: block;
+ line-height: 6px;
+ text-indent: -99999px;
+ }
+ }
+
+ @include app-rtl {
+ direction: rtl !important;
+ }
+
+ // datepicker header styles
+ table thead tr:first-child {
+ height: 52px !important;
+ position: relative;
+ }
+ .calendar-table td {
+ border-radius: 50rem;
+ }
+
+ // month and year select styles
+ table thead {
+ th,
+ td {
+ select {
+ background-color: transparent;
+ font-weight: light.$font-weight-medium;
+ }
+ }
+ }
+}
+
+// prev arrow styles excluding single daterangepicker
+.daterangepicker {
+ .drp-calendar:not(.single).left {
+ .prev {
+ @include app-ltr {
+ left: 0.25rem;
+ }
+ @include app-rtl {
+ right: 0.25rem;
+ }
+ }
+ }
+
+ // next arrow styles excluding single daterangepicker
+ .drp-calendar:not(.single).right {
+ .next {
+ @include app-ltr {
+ right: 0.25rem;
+ }
+ @include app-rtl {
+ left: 0.25rem;
+ }
+ }
+ }
+}
+
+.daterangepicker.auto-apply .drp-buttons {
+ display: none;
+}
+
+.daterangepicker.show-calendar .drp-calendar,
+.daterangepicker.show-calendar .drp-buttons {
+ display: block;
+}
+
+.daterangepicker .drp-calendar {
+ display: none;
+ padding: 0 $daterangepicker-padding $daterangepicker-padding;
+
+ &.single .calendar-table {
+ border: 0;
+ }
+}
+
+.daterangepicker.single {
+ .drp-selected {
+ display: none;
+ }
+ .daterangepicker .ranges,
+ .drp-calendar {
+ float: none;
+ }
+}
+
+.daterangepicker .calendar-table {
+ border: 0;
+
+ // prev & next arrow default styles
+ .next,
+ .prev {
+ position: absolute;
+ top: 0.65rem;
+ min-width: unset;
+ height: 1.875rem;
+ width: 1.875rem;
+ border-radius: 50rem;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .next span,
+ .prev span {
+ display: inline-block;
+ border-width: 0 1.9px 1.9px 0;
+ border-style: solid;
+ border-radius: 0;
+ height: $daterangepicker-arrow-size;
+ width: $daterangepicker-arrow-size;
+ }
+
+ .prev span {
+ margin-right: -$daterangepicker-arrow-size * 0.5;
+ transform: rotate(135deg);
+
+ @include app-rtl {
+ margin-left: -$daterangepicker-arrow-size * 0.5;
+ margin-right: 0;
+ transform: rotate(-45deg);
+ }
+ }
+
+ .next span {
+ margin-left: -$daterangepicker-arrow-size * 0.5;
+ transform: rotate(-45deg);
+
+ @include app-rtl {
+ margin-left: 0;
+ margin-right: -$daterangepicker-arrow-size * 0.5;
+ transform: rotate(135deg);
+ }
+ }
+
+ table {
+ border: 0;
+ border-spacing: 0;
+ border-collapse: collapse;
+ margin: 0;
+ width: 100%;
+ }
+
+ th,
+ td {
+ vertical-align: middle;
+ min-width: $daterangepicker-cell-size;
+ line-height: calc(#{$daterangepicker-cell-size} - 2px);
+ white-space: nowrap;
+ text-align: center;
+ cursor: pointer;
+ }
+ td {
+ height: $daterangepicker-cell-size;
+ width: $daterangepicker-cell-size;
+ }
+ th {
+ width: $daterangepicker-cell-size;
+ height: $daterangepicker-cell-size + 0.5rem;
+ }
+ tr:first-child th:not(.prev):not(.next) {
+ height: $daterangepicker-cell-size;
+ }
+ // daterangepicker single
+ .daterangepicker .single {
+ // arrow alignments
+ .next {
+ float: right;
+ @include app-ltr {
+ right: 0.625rem;
+ }
+ @include app-rtl {
+ left: 0.625rem;
+ }
+ }
+ .prev {
+ @include app-ltr {
+ right: 3.125rem;
+ }
+ @include app-rtl {
+ left: 3.125rem;
+ }
+ }
+ // month alignments
+ th.month {
+ position: absolute;
+ top: 0.5rem;
+ @include app-ltr {
+ text-align: left;
+ left: 0.562rem;
+ }
+ @include app-rtl {
+ text-align: right;
+ right: 0.562rem;
+ }
+ }
+ }
+}
+
+.daterangepicker td {
+ @include app-ltr {
+ &.start-date:not(.end-date) {
+ border-bottom-right-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+ }
+
+ &.end-date:not(.start-date) {
+ border-bottom-left-radius: 0 !important;
+ border-top-left-radius: 0 !important;
+ }
+ }
+
+ &.in-range:not(.start-date):not(.end-date) {
+ border-radius: 0 !important;
+ }
+
+ @include app-rtl {
+ &.start-date:not(.end-date) {
+ border-bottom-left-radius: 0 !important;
+ border-top-left-radius: 0 !important;
+ }
+
+ &.end-date:not(.start-date) {
+ border-bottom-right-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+ }
+ }
+}
+
+.daterangepicker td.disabled,
+.daterangepicker option.disabled {
+ cursor: not-allowed;
+ text-decoration: line-through;
+}
+
+.daterangepicker th.month {
+ width: auto;
+}
+.daterangepicker select {
+ &.monthselect,
+ &.yearselect {
+ height: auto;
+ padding: 1px;
+ margin: 0;
+ border: 0;
+ cursor: default;
+ }
+ &:focus-visible {
+ outline: 0;
+ }
+
+ &.monthselect {
+ width: 46%;
+ margin-right: 2%;
+
+ @include app-rtl {
+ margin-left: 2%;
+ margin-right: 0;
+ }
+ }
+
+ &.yearselect {
+ width: 40%;
+ }
+
+ &.hourselect,
+ &.minuteselect,
+ &.secondselect,
+ &.ampmselect {
+ outline: 0;
+ width: $daterangepicker-select-width;
+ padding: 2px;
+ margin: 0 auto;
+ border-radius: light.$border-radius-sm;
+ }
+}
+
+.daterangepicker .calendar-time {
+ position: relative;
+ line-height: 30px;
+ text-align: center;
+ margin: 0 auto;
+
+ select.disabled {
+ cursor: not-allowed;
+ }
+}
+
+.daterangepicker .drp-buttons {
+ padding: $daterangepicker-padding $daterangepicker-padding * 1.5;
+ clear: both;
+ display: none;
+ text-align: right;
+ vertical-align: middle;
+
+ .btn {
+ margin-left: $daterangepicker-padding * 1.2;
+ }
+
+ @include app-rtl {
+ text-align: left;
+
+ .btn {
+ margin-left: 0;
+ margin-right: $daterangepicker-padding * 1.2;
+ }
+ }
+}
+
+.daterangepicker .drp-selected {
+ width: 100%;
+ padding-bottom: $daterangepicker-padding;
+ display: block;
+}
+
+.daterangepicker .ranges {
+ text-align: left;
+ float: none;
+ margin: 0;
+
+ // Daterangepicker Ranges spacing
+ ul {
+ padding: 0.5rem;
+ margin: 0 auto;
+ list-style: none;
+ width: 100%;
+ }
+ li {
+ border-radius: light.$border-radius;
+ padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
+ &:not(:first-child) {
+ margin-top: 0.125rem;
+ }
+ }
+
+ @include app-rtl {
+ text-align: right;
+ }
+}
+
+.daterangepicker.show-calendar .ranges {
+ border-bottom: 1px solid;
+
+ &:empty {
+ display: none;
+ }
+}
+
+.daterangepicker .drp-calendar.right {
+ @include app-ltr {
+ padding-left: 1px;
+ }
+ @include app-rtl {
+ padding-right: 1px;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .daterangepicker {
+ z-index: light.$zindex-popover !important;
+ border: light.$dropdown-border-width solid light.$dropdown-border-color;
+ border-radius: light.$border-radius;
+ width: calc(#{$daterangepicker-width} + calc(#{light.$dropdown-border-width} * 2));
+ box-shadow: light.$card-box-shadow;
+ background-color: light.$dropdown-bg;
+
+ table thead {
+ background: light.$dropdown-bg;
+ th,
+ td {
+ color: light.$headings-color;
+
+ &.prev,
+ &.next {
+ span {
+ border-color: light.$body-color !important;
+ }
+ }
+
+ select {
+ background-color: transparent;
+ color: light.$headings-color;
+ }
+ }
+ }
+ &.drop-up {
+ margin-top: -(light.$dropdown-spacer);
+ }
+
+ &.with-week-numbers {
+ width: calc(#{$daterangepicker-width-with-weeks} + calc(#{light.$dropdown-border-width} * 2));
+ }
+ }
+ .daterangepicker .calendar-table td {
+ border-radius: light.$border-radius-pill;
+ }
+
+ .daterangepicker .drp-selected {
+ font-size: light.$font-size-sm;
+ }
+
+ .daterangepicker .calendar-table thead tr:last-child th {
+ border-radius: 0 !important;
+ color: light.$headings-color;
+ font-size: light.$font-size-sm;
+ font-weight: light.$font-weight-normal;
+ }
+
+ .daterangepicker th.month {
+ color: light.$headings-color;
+ font-weight: light.$font-weight-normal;
+ }
+
+ .daterangepicker td.week,
+ .daterangepicker th.week {
+ color: light.$headings-color;
+ font-weight: light.$font-weight-normal;
+ }
+
+ .daterangepicker td.disabled,
+ .daterangepicker option.disabled {
+ color: light.$text-muted;
+ }
+
+ .daterangepicker td.available:not(.active):hover,
+ .daterangepicker th.available:hover {
+ background-color: light.$gray-50;
+ }
+
+ .daterangepicker td.off {
+ color: light.$text-muted;
+ }
+
+ .daterangepicker .ranges li {
+ cursor: pointer;
+ padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
+
+ &:hover {
+ background-color: light.$dropdown-link-hover-bg;
+ }
+ }
+
+ .daterangepicker .calendar-table .next,
+ .daterangepicker .calendar-table .prev {
+ background-color: light.$gray-50;
+ span {
+ border-color: light.$body-color;
+ }
+ }
+
+ .daterangepicker select {
+ &.hourselect,
+ &.minuteselect,
+ &.secondselect,
+ &.ampmselect {
+ background: light.rgba-to-hex(light.$gray-100, light.$rgba-to-hex-bg);
+ font-size: light.$font-size-sm;
+ color: light.$body-color;
+ border: 1px solid transparent;
+ option {
+ background: light.$card-bg;
+ }
+ }
+
+ // ! FIX: OS Windows and Linux Browsers DD Option color
+ &.monthselect,
+ &.yearselect {
+ option {
+ color: light.$body-color;
+ background: light.$input-bg;
+ &:disabled {
+ color: light.$text-muted;
+ }
+ }
+ }
+ }
+
+ .daterangepicker .calendar-time select.disabled {
+ color: light.$text-light;
+ }
+
+ @include light.media-breakpoint-up(md) {
+ .daterangepicker {
+ width: auto !important;
+
+ &:not(.single) .drp-selected {
+ width: auto;
+ padding: 0;
+ display: inline-block;
+ }
+ }
+
+ @include app-ltr-style {
+ .daterangepicker:not(.single) .drp-calendar {
+ float: left;
+
+ &.left {
+ padding-right: 1rem;
+ }
+ }
+ }
+
+ @include app-rtl-style {
+ .daterangepicker:not(.single) .drp-calendar {
+ float: right;
+ &.left {
+ padding-left: 1rem;
+ }
+ }
+ }
+ }
+
+ @include light.media-breakpoint-up(lg) {
+ .daterangepicker .ranges {
+ border-bottom: 0;
+ }
+
+ @include app-ltr-style {
+ .daterangepicker {
+ .ranges {
+ float: left;
+ }
+ }
+ }
+
+ @include app-rtl-style {
+ .daterangepicker {
+ .ranges {
+ float: right;
+ }
+ }
+ }
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ .daterangepicker {
+ box-shadow: dark.$card-box-shadow;
+ width: calc(#{$daterangepicker-width} + calc(#{dark.$dropdown-border-width} * 2));
+ margin-top: dark.$dropdown-spacer;
+ background-color: dark.$dropdown-bg;
+ border: dark.$dropdown-border-width solid dark.$dropdown-border-color;
+ border-radius: dark.$border-radius;
+ z-index: dark.$zindex-popover !important;
+
+ table thead {
+ background: dark.$dropdown-bg;
+ th,
+ td {
+ color: dark.$headings-color;
+
+ &.prev,
+ &.next {
+ span {
+ border-color: dark.$headings-color !important;
+ }
+ }
+
+ select {
+ background-color: transparent;
+ color: dark.$headings-color;
+ }
+ }
+ }
+
+ &.with-week-numbers {
+ width: calc(#{$daterangepicker-width-with-weeks} + calc(#{dark.$dropdown-border-width} * 2));
+ }
+
+ &.drop-up {
+ margin-top: -(dark.$dropdown-spacer);
+ }
+ }
+
+ .daterangepicker .calendar-table td {
+ border-radius: dark.$border-radius-pill;
+ }
+
+ .daterangepicker .drp-selected {
+ font-size: dark.$font-size-sm;
+ }
+
+ .daterangepicker .calendar-table thead tr:last-child th {
+ border-radius: 0 !important;
+ color: dark.$headings-color;
+ font-size: dark.$font-size-sm;
+ font-weight: dark.$font-weight-normal;
+ }
+
+ .daterangepicker th.month {
+ color: dark.$headings-color;
+ font-weight: dark.$font-weight-normal;
+ }
+
+ .daterangepicker td.week,
+ .daterangepicker th.week {
+ color: dark.$headings-color;
+ font-weight: dark.$font-weight-normal;
+ }
+
+ .daterangepicker td.disabled,
+ .daterangepicker option.disabled {
+ color: dark.$text-muted;
+ }
+
+ .daterangepicker td.available:not(.active):hover,
+ .daterangepicker th.available:hover {
+ background-color: dark.$gray-50;
+ }
+
+ .daterangepicker td.off {
+ color: dark.$text-muted;
+ }
+
+ .daterangepicker .ranges li {
+ cursor: pointer;
+ padding: dark.$dropdown-item-padding-y dark.$dropdown-item-padding-x;
+
+ &:hover {
+ background-color: dark.$dropdown-link-hover-bg;
+ }
+ }
+
+ .daterangepicker .calendar-table .next,
+ .daterangepicker .calendar-table .prev {
+ background-color: dark.$gray-50;
+ span {
+ border-color: dark.$body-color;
+ }
+ }
+
+ .daterangepicker select {
+ &.hourselect,
+ &.minuteselect,
+ &.secondselect,
+ &.ampmselect {
+ background: dark.rgba-to-hex(dark.$gray-100, dark.$rgba-to-hex-bg);
+ border: 1px solid transparent;
+ font-size: dark.$font-size-sm;
+ color: dark.$body-color;
+ option {
+ background: dark.$card-bg;
+ }
+ }
+
+ // ! FIX: OS Windows and Linux Browsers DD Option color
+ &.monthselect,
+ &.yearselect {
+ option {
+ color: dark.$body-color;
+ background: dark.$card-bg;
+ &:disabled {
+ color: dark.$text-muted;
+ }
+ }
+ }
+ }
+
+ .daterangepicker .calendar-time select.disabled {
+ color: dark.$text-light;
+ }
+
+ @include dark.media-breakpoint-up(md) {
+ .daterangepicker {
+ width: auto !important;
+
+ &:not(.single) .drp-selected {
+ display: inline-block;
+ width: auto;
+ padding: 0;
+ }
+ }
+
+ @include app-ltr-style {
+ .daterangepicker:not(.single) .drp-calendar {
+ float: left;
+
+ &.left {
+ padding-right: 1rem;
+ }
+ }
+ }
+
+ @include app-rtl-style {
+ .daterangepicker:not(.single) .drp-calendar {
+ float: right;
+
+ &.left {
+ padding-left: 1rem;
+ }
+ }
+ }
+ }
+
+ @include dark.media-breakpoint-up(lg) {
+ .daterangepicker .ranges {
+ border-bottom: 0;
+ }
+
+ @include app-ltr-style {
+ .daterangepicker {
+ .ranges {
+ float: left;
+ }
+ }
+ }
+
+ @include app-rtl-style {
+ .daterangepicker {
+ .ranges {
+ float: right;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/bootstrap-select/_mixins.scss b/resources/assets/vendor/libs/bootstrap-select/_mixins.scss
new file mode 100644
index 0000000..ef88b3f
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-select/_mixins.scss
@@ -0,0 +1,16 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin bs-select-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .bootstrap-select {
+ .dropdown-menu.inner a[aria-selected='true'] {
+ background: $background !important;
+ color: $color !important;
+ }
+ // Fix: To add focus border, .bootstrap-select adding border but not able to update as we can not have the focus on div
+ .dropdown-toggle.show {
+ border-color: $background;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js b/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js
new file mode 100644
index 0000000..a9eb0f5
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js
@@ -0,0 +1 @@
+import 'bootstrap-select/js/bootstrap-select';
diff --git a/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss b/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss
new file mode 100644
index 0000000..6839d76
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss
@@ -0,0 +1,259 @@
+// Bootstrap Select
+// *******************************************************************************
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'bootstrap-select/sass/bootstrap-select.scss';
+
+// Common Styles
+.bootstrap-select *,
+.bootstrap-select .dropdown-toggle:focus {
+ outline: 0 !important;
+}
+.bootstrap-select {
+ .bs-searchbox,
+ .bs-actionsbox,
+ .bs-donebutton {
+ padding: 0 0 8px;
+ }
+ .dropdown-toggle {
+ transition: none;
+ padding: calc(light.$input-padding-y - light.$input-border-width) light.$input-padding-x;
+ box-shadow: none !important;
+ &.show,
+ &:focus {
+ padding: calc(light.$input-padding-y - light.$input-focus-border-width)
+ calc(light.$input-padding-x - light.$input-border-width);
+ }
+ &:after {
+ transform: rotate(45deg) translateY(-100%);
+ position: absolute;
+ inset-inline-end: 23px;
+ top: 50%;
+ margin: 0 !important;
+ @include app-rtl {
+ inset-inline-end: 12px;
+ }
+ }
+ &:active {
+ transform: none !important;
+ }
+ &.show {
+ &:after {
+ inset-inline-end: calc(23px - light.$input-border-width);
+ @include app-rtl {
+ inset-inline-end: calc(12px - light.$input-border-width);
+ }
+ }
+ }
+ .filter-option-inner-inner {
+ line-height: light.$input-line-height;
+ }
+ }
+ .btn {
+ &:disabled,
+ &.disabled {
+ color: light.$btn-color !important;
+ }
+ }
+
+ // For header dropdown close btn
+ .dropdown-menu .popover-header {
+ display: flex;
+ align-items: center;
+ button {
+ border: none;
+ font-size: light.$h4-font-size;
+ background: transparent;
+ padding-bottom: 0.125rem;
+ }
+ }
+ .is-invalid {
+ ~ .dropdown-toggle {
+ &:after {
+ inset-inline-end: calc(23px - light.$input-border-width);
+ @include app-rtl {
+ inset-inline-end: calc(12px - light.$input-border-width);
+ }
+ }
+ }
+ }
+}
+
+.bootstrap-select.dropup {
+ .dropdown-toggle {
+ &:after {
+ transform: rotate(317deg) translateY(-30%);
+ inset-inline-end: 14px;
+ @include app-rtl {
+ inset-inline-end: calc(18px);
+ }
+ }
+ &.show {
+ &:after {
+ inset-inline-end: calc(14px - light.$input-border-width);
+ @include app-rtl {
+ inset-inline-end: calc(18px - light.$input-border-width);
+ }
+ }
+ }
+ }
+ .is-invalid {
+ ~ .dropdown-toggle {
+ &:after {
+ inset-inline-end: calc(14px - light.$input-border-width);
+ @include app-rtl {
+ inset-inline-end: calc(18px - light.$input-border-width);
+ }
+ }
+ }
+ }
+}
+
+// Menu Position
+.bootstrap-select.show-tick .dropdown-menu {
+ li a {
+ position: relative;
+ }
+ // RTL
+ @include app-rtl {
+ li a span.text {
+ margin-left: 2.125rem;
+ margin-right: 0;
+ }
+ }
+
+ .selected span.check-mark {
+ display: block;
+ right: 1rem;
+ top: 50%;
+ margin: 0;
+ transform: translateY(-50%);
+ line-height: 1;
+
+ @include app-rtl {
+ left: 1rem;
+ right: auto;
+ }
+ }
+}
+
+// To remove ripple effect
+.bootstrap-select .dropdown-menu.inner .selected .waves-ripple {
+ display: none !important;
+}
+
+.bootstrap-select:not(.input-group-btn),
+.bootstrap-select[class*='col-'] {
+ display: block;
+}
+
+html[class] .bootstrap-select.form-select {
+ background: none !important;
+ border: 0 !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+
+// RTL
+
+@include app-rtl(false) {
+ .bootstrap-select .dropdown-toggle .filter-option {
+ float: right;
+ right: 0;
+ left: auto;
+ text-align: right;
+ padding-left: inherit;
+ padding-right: 0;
+ margin-left: -100%;
+ margin-right: 0;
+ }
+ // Fix: Subtext rtl support
+ .bootstrap-select .filter-option-inner-inner {
+ float: right;
+ }
+ .bootstrap-select .dropdown-menu li small.text-muted,
+ .bootstrap-select .filter-option small.text-muted {
+ position: relative;
+ top: 2px;
+ padding-left: 0;
+ padding-right: 0.5em;
+ float: left;
+ }
+
+ .bootstrap-select .dropdown-toggle .filter-option-inner {
+ padding-left: inherit;
+ padding-right: 0;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .bootstrap-select {
+ background-color: light.$input-bg;
+ .dropdown-toggle {
+ border-radius: light.$border-radius;
+ border: light.$input-border-width solid light.$input-border-color;
+ &.show,
+ &:focus {
+ border: light.$input-focus-border-width solid light.$primary;
+ }
+ &:not(.show):hover {
+ border-color: light.$input-border-hover-color;
+ }
+ }
+ .dropdown-menu {
+ &[data-popper-placement='top-start'],
+ &[data-popper-placement='top-end'] {
+ box-shadow: 0 -0.2rem 1.25rem rgba(light.rgba-to-hex(light.$gray-500, light.$rgba-to-hex-bg), 0.4);
+ }
+ .notify {
+ background: light.$popover-bg;
+ border: light.$input-border-width solid light.$popover-border-color;
+ }
+ .popover-header button {
+ color: light.$body-color;
+ }
+ }
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ .bootstrap-select {
+ background-color: dark.$input-bg;
+ .dropdown-toggle {
+ color: dark.$input-color;
+ &:hover {
+ color: dark.$input-color;
+ }
+ border: dark.$input-border-width solid dark.$input-border-color;
+ border-radius: dark.$border-radius;
+ &.show,
+ &:focus {
+ border: dark.$input-focus-border-width solid dark.$primary;
+ }
+ &:not(.show):hover {
+ border-color: dark.$input-border-hover-color;
+ }
+ }
+ .dropdown-menu {
+ &[data-popper-placement='top-start'],
+ &[data-popper-placement='top-end'] {
+ box-shadow: 0 -0.2rem 1.25rem rgba(15, 20, 34, 0.55);
+ }
+ .notify {
+ background: dark.$popover-bg;
+ border: dark.$input-border-width solid dark.$popover-border-color;
+ }
+ .popover-header button {
+ color: dark.$body-color;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js b/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js
new file mode 100644
index 0000000..4021c9b
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.js
@@ -0,0 +1,9 @@
+import 'bootstrap-table';
+import('bootstrap-table/dist/extensions/cookie/bootstrap-table-cookie.js')
+import 'bootstrap-table/dist/extensions/export/bootstrap-table-export.js';
+import 'bootstrap-table/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.js';
+import 'bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile.js';
+import 'bootstrap-table/dist/locale/bootstrap-table-es-MX.js';
+
+import * as XLSX from 'xlsx';
+window.XLSX = XLSX;
diff --git a/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.scss b/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.scss
new file mode 100644
index 0000000..965ec66
--- /dev/null
+++ b/resources/assets/vendor/libs/bootstrap-table/bootstrap-table.scss
@@ -0,0 +1,2 @@
+@import 'bootstrap-table/dist/bootstrap-table.css';
+@import 'bootstrap-table/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.css';
diff --git a/resources/assets/vendor/libs/bs-stepper/_mixins.scss b/resources/assets/vendor/libs/bs-stepper/_mixins.scss
new file mode 100644
index 0000000..8f643c1
--- /dev/null
+++ b/resources/assets/vendor/libs/bs-stepper/_mixins.scss
@@ -0,0 +1,51 @@
+// Stepper Mixin
+// *******************************************************************************
+@mixin bs-stepper-theme($background) {
+ $color: color-contrast($background);
+ .bs-stepper {
+ .step {
+ &.active {
+ .bs-stepper-circle {
+ background-color: $background;
+ color: $color;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+ .bs-stepper-icon svg {
+ fill: $background !important;
+ }
+ .bs-stepper-icon i,
+ .bs-stepper-label {
+ color: $background !important;
+ }
+ }
+ &.crossed {
+ .step-trigger {
+ .bs-stepper-circle {
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
+ color: $background !important;
+ }
+ .bs-stepper-icon svg {
+ fill: $background !important;
+ }
+ .bs-stepper-icon i {
+ color: $background !important;
+ }
+ }
+ }
+ }
+ &.wizard-icons {
+ .step.crossed {
+ .bs-stepper-label {
+ color: $background !important;
+ }
+ & + {
+ .line {
+ i {
+ color: $background;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/bs-stepper/bs-stepper.js b/resources/assets/vendor/libs/bs-stepper/bs-stepper.js
new file mode 100644
index 0000000..dad4783
--- /dev/null
+++ b/resources/assets/vendor/libs/bs-stepper/bs-stepper.js
@@ -0,0 +1,37 @@
+import Stepper from 'bs-stepper/dist/js/bs-stepper';
+
+const bsStepper = document.querySelectorAll('.bs-stepper');
+
+// Adds crossed class
+bsStepper.forEach(el => {
+ el.addEventListener('show.bs-stepper', function (event) {
+ var index = event.detail.indexStep;
+ var numberOfSteps = el.querySelectorAll('.line').length;
+ var line = el.querySelectorAll('.step');
+
+ // The first for loop is for increasing the steps,
+ // the second is for turning them off when going back
+ // and the third with the if statement because the last line
+ // can't seem to turn off when I press the first item. ¯\_(ツ)_/¯
+
+ for (let i = 0; i < index; i++) {
+ line[i].classList.add('crossed');
+
+ for (let j = index; j < numberOfSteps; j++) {
+ line[j].classList.remove('crossed');
+ }
+ }
+ if (event.detail.to == 0) {
+ for (let k = index; k < numberOfSteps; k++) {
+ line[k].classList.remove('crossed');
+ }
+ line[0].classList.remove('crossed');
+ }
+ });
+});
+
+try {
+ window.Stepper = Stepper;
+} catch (e) {}
+
+export { Stepper };
diff --git a/resources/assets/vendor/libs/bs-stepper/bs-stepper.scss b/resources/assets/vendor/libs/bs-stepper/bs-stepper.scss
new file mode 100644
index 0000000..1c5dbeb
--- /dev/null
+++ b/resources/assets/vendor/libs/bs-stepper/bs-stepper.scss
@@ -0,0 +1,549 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import 'bs-stepper/dist/css/bs-stepper';
+@import '../../scss/_custom-variables/libs';
+
+$bs-stepper-header-padding-y: 1.5rem !default;
+$bs-stepper-header-padding-x: $bs-stepper-header-padding-y !default;
+$bs-stepper-content-padding-x: 1.5rem !default;
+$bs-stepper-content-padding-y: $bs-stepper-content-padding-x !default;
+$bs-stepper-trigger-padding: 1.25rem !default;
+$bs-stepper-trigger-padding-vertical: 0.6rem !default;
+$bs-stepper-label-max-width: 224px !default;
+$bs-stepper-svg-icon-height: 3.75rem !default;
+$bs-stepper-svg-icon-width: 3.75rem !default;
+$bs-stepper-icon-font-size: 1.6rem !default;
+$bs-stepper-vertical-separator-height: 1.55rem !default;
+$bs-stepper-vertical-header-min-width: 18rem !default;
+
+// Default Styles
+.bs-stepper {
+ border-radius: light.$border-radius;
+ .line {
+ flex: 0;
+ min-width: auto;
+ min-height: auto;
+ background-color: transparent;
+ margin: 0;
+ }
+
+ .bs-stepper-header {
+ padding: $bs-stepper-header-padding-y $bs-stepper-header-padding-x;
+
+ .step {
+ .step-trigger {
+ padding: 0;
+ flex-wrap: nowrap;
+ gap: 0.5rem;
+ font-weight: light.$font-weight-medium;
+ .bs-stepper-label {
+ margin: 0;
+ max-width: $bs-stepper-label-max-width;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ text-align: start;
+ display: inline-grid;
+ font-weight: light.$font-weight-medium;
+ font-size: light.$font-size-base;
+ line-height: light.$h6-line-height;
+ .bs-stepper-title {
+ font-weight: light.$font-weight-medium;
+ }
+ .bs-stepper-subtitle {
+ font-size: light.$small-font-size;
+ font-weight: light.$font-weight-base;
+ }
+ }
+ &:hover {
+ background-color: transparent;
+ }
+ @include light.media-breakpoint-down(lg) {
+ padding: calc($bs-stepper-trigger-padding * 0.5) 0;
+ }
+ }
+ .bs-stepper-circle {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: light.$border-radius;
+ width: 2.375rem;
+ height: 2.375rem;
+ font-size: light.$h5-font-size;
+ font-weight: light.$font-weight-medium;
+ i {
+ font-size: 1.375rem;
+ }
+ }
+ }
+ }
+
+ .bs-stepper-content {
+ padding: $bs-stepper-content-padding-y $bs-stepper-content-padding-x;
+ }
+
+ &.vertical {
+ .bs-stepper-header {
+ min-width: $bs-stepper-vertical-header-min-width;
+ .step {
+ .step-trigger {
+ padding: $bs-stepper-trigger-padding-vertical 0;
+ }
+ &:first-child {
+ .step-trigger {
+ padding-top: 0;
+ }
+ }
+ &:last-child {
+ .step-trigger {
+ padding-bottom: 0;
+ }
+ }
+ }
+ .line {
+ position: relative;
+ min-height: 1px;
+ }
+ }
+ .bs-stepper-content {
+ width: 100%;
+ .content {
+ &:not(.active) {
+ display: none;
+ }
+ }
+ }
+
+ &.wizard-icons {
+ .step {
+ text-align: center;
+ padding: 0.75rem 0;
+ }
+ }
+ }
+
+ &.wizard-icons {
+ .bs-stepper-header {
+ justify-content: center;
+ .step-trigger {
+ padding: $bs-stepper-trigger-padding;
+ flex-direction: column;
+ gap: 0.5rem;
+ .bs-stepper-icon {
+ svg {
+ height: $bs-stepper-svg-icon-height;
+ width: $bs-stepper-svg-icon-width;
+ }
+ i {
+ font-size: $bs-stepper-icon-font-size;
+ }
+ }
+ }
+ @include light.media-breakpoint-up(lg) {
+ justify-content: space-around;
+ gap: 1rem;
+ }
+ }
+ }
+
+ // Remove borders from wizard modern
+ &.wizard-modern {
+ .bs-stepper-header {
+ border-bottom: none !important;
+ }
+
+ .bs-stepper-content {
+ border-radius: light.$border-radius;
+ }
+
+ &.vertical {
+ .bs-stepper-header {
+ border-right: none !important;
+ }
+ }
+ }
+
+ &:not(.vertical):not(.wizard-icons) .bs-stepper-header {
+ @include light.media-breakpoint-up(lg) {
+ gap: 1.25rem;
+ }
+ }
+}
+
+@include app-rtl(false) {
+ .bs-stepper.wizard-icons .bs-stepper-header .step-trigger {
+ @include light.media-breakpoint-down(lg) {
+ padding-right: 0;
+ }
+ }
+}
+@include app-ltr(false) {
+ .bs-stepper.wizard-icons .bs-stepper-header .step-trigger {
+ @include light.media-breakpoint-down(lg) {
+ padding-left: 0;
+ }
+ }
+}
+// Styles for Modal example Create App wizard
+#wizard-create-app {
+ &.vertical {
+ .bs-stepper-header {
+ min-width: $bs-stepper-vertical-header-min-width - 3;
+ }
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .bs-stepper {
+ background-color: light.$card-bg;
+ &:not(.wizard-modern) {
+ box-shadow: light.$card-box-shadow;
+ }
+ .bs-stepper-header {
+ border-bottom: 1px solid light.$border-color;
+
+ .line {
+ i {
+ color: light.$body-color;
+ }
+ }
+
+ .bs-stepper-title,
+ .bs-stepper-label {
+ color: light.$headings-color;
+ }
+
+ .bs-stepper-label {
+ .bs-stepper-subtitle {
+ color: light.$body-color;
+ }
+ }
+
+ .step {
+ &:not(.active) {
+ .bs-stepper-circle {
+ background-color: light.$gray-50;
+ color: light.$headings-color;
+ }
+ }
+ &.crossed .step-trigger {
+ .bs-stepper-label .bs-stepper-subtitle,
+ .bs-stepper-title {
+ color: light.$text-muted;
+ }
+ }
+ }
+ }
+ .step-trigger:focus {
+ color: light.$headings-color;
+ }
+
+ &.vertical {
+ .bs-stepper-header {
+ border-bottom: none;
+ @include light.media-breakpoint-down(lg) {
+ border-right: none !important;
+ border-left: none !important;
+ border-bottom: 1px solid light.$border-color;
+ }
+ }
+ }
+
+ &.wizard-modern {
+ background-color: transparent;
+ .bs-stepper-content {
+ background-color: light.$card-bg;
+ box-shadow: light.$card-box-shadow;
+ }
+ }
+
+ &.wizard-icons {
+ .bs-stepper-header {
+ .bs-stepper-icon {
+ svg {
+ fill: light.$headings-color;
+ }
+ i {
+ fill: light.$headings-color;
+ }
+ }
+ .bs-stepper-label {
+ color: light.$headings-color;
+ }
+ }
+ }
+ }
+ }
+
+ // ! FIX: Vertical border issue in rtl and ltr
+ @include app-rtl(false) {
+ .light-style {
+ .bs-stepper {
+ &.vertical {
+ .bs-stepper-header {
+ border-left: 1px solid light.$border-color;
+ }
+ }
+ }
+ }
+ }
+ @include app-ltr(false) {
+ .light-style {
+ .bs-stepper {
+ &.vertical {
+ .bs-stepper-header {
+ border-right: 1px solid light.$border-color;
+ }
+ }
+ }
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ .bs-stepper {
+ background-color: dark.$card-bg;
+ .bs-stepper-header {
+ border-bottom: 1px solid dark.$border-color;
+ .line {
+ i {
+ color: dark.$body-color;
+ }
+ }
+
+ .bs-stepper-label,
+ .bs-stepper-title {
+ color: dark.$headings-color;
+ }
+
+ .bs-stepper-label {
+ .bs-stepper-subtitle {
+ color: dark.$body-color;
+ }
+ }
+
+ .step {
+ &:not(.active) {
+ .bs-stepper-circle {
+ background-color: dark.$gray-50;
+ color: dark.$headings-color;
+ }
+ }
+ &.crossed .step-trigger {
+ .bs-stepper-label .bs-stepper-subtitle,
+ .bs-stepper-title {
+ color: dark.$text-muted;
+ }
+ }
+ }
+ }
+ .step-trigger:focus {
+ color: dark.$headings-color;
+ }
+
+ &.vertical {
+ .bs-stepper-header {
+ border-bottom: none;
+ @include light.media-breakpoint-down(lg) {
+ border-right: none !important;
+ border-left: none !important;
+ border-bottom: 1px solid dark.$border-color;
+ }
+ }
+ }
+
+ &.wizard-modern {
+ background-color: transparent;
+ .bs-stepper-content {
+ background-color: dark.$card-bg;
+ box-shadow: dark.$card-box-shadow;
+ }
+ }
+
+ &.wizard-icons {
+ .bs-stepper-header {
+ .bs-stepper-icon {
+ i {
+ color: dark.$headings-color;
+ }
+
+ svg {
+ fill: dark.$headings-color;
+ }
+ }
+ .bs-stepper-label {
+ color: dark.$headings-color;
+ }
+ }
+ }
+ }
+ }
+
+ // ! FIX: Vertical border issue in rtl and ltr
+ @include app-rtl(false) {
+ .dark-style {
+ .bs-stepper {
+ &.vertical {
+ .bs-stepper-header {
+ border-left: 1px solid dark.$border-color;
+ }
+ }
+ }
+ }
+ }
+ @include app-ltr(false) {
+ .dark-style {
+ .bs-stepper {
+ &.vertical {
+ .bs-stepper-header {
+ border-right: 1px solid dark.$border-color;
+ }
+ }
+ }
+ }
+ }
+}
+
+// RTL
+@include app-rtl(false) {
+ .bs-stepper {
+ .bs-stepper-content {
+ .btn-next:not(.btn-submit),
+ .btn-prev {
+ i {
+ transform: rotate(180deg);
+ }
+ }
+ }
+
+ &.vertical {
+ &.wizard-icons {
+ .bs-stepper-header {
+ .line:before {
+ right: 50%;
+ }
+ }
+ }
+ }
+
+ // Remove borders from wizard modern
+ &.wizard-modern {
+ &.vertical {
+ .bs-stepper-header {
+ border-left: none !important;
+ }
+ }
+ }
+
+ @include light.media-breakpoint-up(lg) {
+ .bs-stepper-header {
+ .line {
+ i {
+ transform: rotate(180deg);
+ }
+ }
+ }
+ }
+
+ @include light.media-breakpoint-down(lg) {
+ .bs-stepper-header {
+ .step {
+ .step-trigger {
+ .bs-stepper-label {
+ margin-left: 0;
+ margin-right: 1rem;
+ }
+ }
+ }
+ }
+ &.wizard-icons {
+ .bs-stepper-header {
+ .line {
+ &:before {
+ margin-right: 0.75rem;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+// Media Queries
+@include light.media-breakpoint-down(lg) {
+ .bs-stepper {
+ .bs-stepper-header {
+ flex-direction: column;
+ align-items: flex-start;
+ .step {
+ .step-trigger {
+ flex-direction: row;
+ .bs-stepper-label {
+ margin-left: 0.35rem;
+ }
+ }
+ &:first-child {
+ .step-trigger {
+ padding-top: 0;
+ }
+ }
+ &:last-child {
+ .step-trigger {
+ padding-bottom: 0;
+ }
+ }
+ }
+ }
+ &.vertical {
+ flex-direction: column;
+ .bs-stepper-header {
+ align-items: flex-start;
+ }
+
+ &.wizard-icons {
+ .bs-stepper-header {
+ .line:before {
+ left: 0.75rem;
+ margin-left: 0;
+ }
+ }
+ }
+ }
+ &:not(.vertical) {
+ .bs-stepper-header {
+ .line {
+ i {
+ display: none;
+ }
+ }
+ }
+ }
+ &.wizard-icons {
+ .bs-stepper-header .step:not(:first-child) {
+ .bs-stepper-icon {
+ svg {
+ margin-top: 0.5rem;
+ }
+ }
+ }
+ }
+ }
+}
+
+@media (max-width: 520px) {
+ .bs-stepper-header {
+ margin: 0;
+ }
+}
+
+// Styles for Create App Modal Wizard
+#wizard-create-app {
+ &.vertical {
+ .bs-stepper-header {
+ min-width: $bs-stepper-vertical-header-min-width - 3;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/cleavejs/cleave-phone.js b/resources/assets/vendor/libs/cleavejs/cleave-phone.js
new file mode 100644
index 0000000..9adf7c6
--- /dev/null
+++ b/resources/assets/vendor/libs/cleavejs/cleave-phone.js
@@ -0,0 +1 @@
+import 'cleave.js/dist/addons/cleave-phone.us';
diff --git a/resources/assets/vendor/libs/cleavejs/cleave.js b/resources/assets/vendor/libs/cleavejs/cleave.js
new file mode 100644
index 0000000..64c1ded
--- /dev/null
+++ b/resources/assets/vendor/libs/cleavejs/cleave.js
@@ -0,0 +1 @@
+import 'cleave.js/dist/cleave';
diff --git a/resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js b/resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js
new file mode 100644
index 0000000..a55c38f
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js
@@ -0,0 +1,28 @@
+import JSZip from 'jszip';
+import pdfMake from 'pdfmake';
+import 'pdfmake/build/vfs_fonts';
+import 'datatables.net-bs5';
+import 'datatables.net-fixedcolumns-bs5';
+import 'datatables.net-fixedheader-bs5';
+import 'datatables.net-select-bs5';
+import 'datatables.net-buttons';
+import 'datatables.net-buttons-bs5';
+import 'datatables.net-buttons/js/buttons.html5';
+import 'datatables.net-buttons/js/buttons.print';
+import 'datatables.net-responsive';
+import 'datatables.net-responsive-bs5';
+import 'datatables.net-rowgroup-bs5';
+import Checkbox from 'jquery-datatables-checkboxes';
+
+// This solution related to font issues with pdfMake
+pdfMake.fonts = {
+ Roboto: {
+ normal: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Regular.ttf',
+ bold: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Medium.ttf',
+ italics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Italic.ttf',
+ bolditalics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-MediumItalic.ttf'
+ }
+};
+$.fn.dataTable.ext.Checkbox = Checkbox(window, $);
+$.fn.dataTable.ext.buttons.pdfMake = pdfMake;
+window.JSZip = JSZip;
diff --git a/resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss b/resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss
new file mode 100644
index 0000000..2e531d0
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss
@@ -0,0 +1,394 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'datatables.net-bs5/css/dataTables.bootstrap5';
+
+// Margin between select, input field and text
+div.dataTables_wrapper div.dataTables_length select {
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+ margin-left: 1em;
+}
+
+.dataTable .emp_name {
+ font-weight: light.$font-weight-medium;
+}
+
+// Shadow none for action buttons
+.dataTable td .btn {
+ box-shadow: none !important;
+}
+
+// Card header inside the datatable
+div.dataTables_wrapper .card-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+div.dataTables_wrapper div.dataTables_info {
+ padding-top: light.$spacer * 0.5;
+}
+
+table.table-bordered.dataTable {
+ // For complex header and column search datatable
+ &.dt-complex-header,
+ &.dt-column-search {
+ thead tr th {
+ border-width: 1px;
+ }
+ tfoot tr th {
+ border-width: 1px;
+ }
+ }
+ & tfoot tr th {
+ border-bottom-width: 1px;
+ }
+ & > :not(caption) > * {
+ & > * {
+ border-width: 0;
+ }
+ }
+}
+
+// Remove left and right border from datatable with table-bordered class
+table.table-bordered.dataTable {
+ tr:first-child th,
+ td {
+ &:first-child {
+ @include app-ltr() {
+ border-left-width: 0;
+ }
+ @include app-rtl() {
+ border-right-width: 0;
+ }
+ }
+ &:last-child {
+ @include app-ltr() {
+ border-right-width: 0;
+ }
+ @include app-rtl() {
+ border-left-width: 0;
+ }
+ }
+ }
+ > tbody:not(caption) tr:first-child {
+ border-top-width: 0;
+ }
+}
+
+// Responsive datatable in desktop screen
+@media screen and (min-width: 1399.98px) {
+ table.table-responsive {
+ display: table;
+ }
+}
+
+// RTL style
+@include app-rtl(false) {
+ div.dataTables_wrapper .dataTables_filter {
+ display: flex;
+ justify-content: flex-end;
+ input {
+ margin-left: 0;
+ margin-right: 1rem;
+ }
+ }
+
+ table.table-bordered.dataTable th,
+ table.table-bordered.dataTable td {
+ border-right-width: 0;
+ border-left-width: 1px;
+
+ &:last-child {
+ border-left-width: 0;
+ }
+ }
+}
+
+table.dataTable {
+ width: 100% !important;
+ border-collapse: collapse !important;
+ margin-bottom: light.$spacer !important;
+ margin-top: 0 !important;
+ thead th {
+ &.sorting_disabled {
+ &::before,
+ &::after {
+ display: none !important;
+ }
+ }
+ &.sorting {
+ &:before,
+ &:after {
+ visibility: hidden;
+ }
+ &:hover {
+ &:before,
+ &:after {
+ visibility: visible;
+ }
+ }
+ }
+ }
+ @include app-rtl {
+ &.table-sm > thead > tr > th {
+ padding-left: 1.25rem;
+ }
+
+ &.table-sm .sorting:before,
+ &.table-sm .sorting_asc:before,
+ &.table-sm .sorting_desc:before {
+ right: auto !important;
+ left: 0.85em !important;
+ }
+ thead th,
+ thead td,
+ tfoot th,
+ tfoot td {
+ text-align: right;
+ }
+ }
+ // Checkbox height & width for datatables checkboxes
+ .form-check-input {
+ width: light.$form-datatables-check-input-size;
+ height: light.$form-datatables-check-input-size;
+ }
+}
+
+// to add spacing between table and datatable footer elements like pagination & info
+.dataTables_scroll {
+ margin-bottom: 0.75rem;
+}
+
+// Used while complex headers
+table.dataTable thead th {
+ vertical-align: middle;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ &::before,
+ &::after {
+ line-height: 1.25rem !important;
+ font-family: tabler-icons !important;
+ font-size: 1rem !important;
+ width: 10px;
+ height: 10px;
+ right: 0.78rem !important;
+ }
+ &::before {
+ content: '\ea62' !important;
+ top: 0.58rem !important;
+ }
+ &::after {
+ bottom: 0.72rem !important;
+ content: '\ea5f' !important;
+ }
+ @include app-rtl {
+ &::before {
+ right: auto !important;
+ left: 0.58em !important;
+ }
+
+ &::after {
+ right: auto !important;
+ left: 0.58em !important;
+ }
+ }
+}
+
+// DataTable within card
+div.card-datatable.dataTable,
+div.card-datatable .dataTable {
+ border-right: 0;
+ border-left: 0;
+}
+
+// Card header inside the datatable
+@media screen and (max-width: 575.98px) {
+ div.dataTables_wrapper .card-header {
+ display: block;
+ }
+
+ .dtr-bs-modal.modal {
+ // padding-left: 0.75rem;
+ .modal-body {
+ padding: 0;
+ overflow: auto;
+ }
+ }
+ .dataTable_select div.dataTables_wrapper div.dataTables_info {
+ flex-direction: column;
+ }
+}
+
+@media screen and (max-width: 767.98px) {
+ div.dataTables_wrapper div.dataTables_info {
+ padding-bottom: light.$table-cell-padding-y;
+ }
+}
+
+div.dataTables_wrapper {
+ div.dataTables_length,
+ .dataTables_filter {
+ margin-top: light.$spacer * 1.5;
+ margin-bottom: light.$spacer * 1.5;
+ }
+}
+
+// common style for light / dark
+
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+ .page-item {
+ &,
+ &.next,
+ &.previous,
+ &.first,
+ &.last {
+ .page-link {
+ border-radius: light.$border-radius;
+ }
+ }
+ }
+}
+
+div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-link {
+ div:not(.table-responsive) div.dataTables_wrapper .dataTables_paginate {
+ margin-right: 0;
+ }
+}
+
+@include light.media-breakpoint-down(md) {
+ div.dataTables_wrapper div.dataTables_length label,
+ div.dataTables_wrapper div.dataTables_filter label,
+ div.dataTables_wrapper div.dataTables_info,
+ div.dataTables_wrapper div.dataTables_paginate {
+ justify-content: center;
+ }
+}
+@include light.media-breakpoint-down(sm) {
+ div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+ justify-content: start !important;
+ overflow-x: scroll;
+ }
+}
+
+// DataTable within card
+div.card-datatable {
+ padding-bottom: light.$card-spacer-x-sm; // Check this in site and update if needed
+
+ [class*='col-md-'] {
+ padding-right: light.$table-cell-padding-x !important;
+ padding-left: light.$table-cell-padding-x !important;
+ }
+ // length, filter & info, pagination row margin
+ &:not(.table-responsive) .dataTables_wrapper .row {
+ &:first-child,
+ &:last-child {
+ margin: 0;
+ }
+ }
+}
+
+// LTR style
+@include app-ltr(false) {
+ div.card-datatable table.dataTable thead th,
+ div.card-datatable table.dataTable tfoot th {
+ &:first-child {
+ padding-left: light.$card-spacer-x;
+ padding-right: light.$card-spacer-x;
+ }
+
+ &:last-child {
+ padding-right: light.$card-spacer-x-sm;
+ }
+ }
+ div.card-datatable table.dataTable tbody td {
+ &:first-child {
+ padding-left: light.$card-spacer-x;
+ padding-right: light.$card-spacer-x;
+ }
+ }
+}
+
+// RTL Style
+@include app-rtl(false) {
+ table.dataTable.table-sm > thead > tr > th {
+ padding-right: light.$table-cell-padding-x-sm;
+ }
+ table.table-bordered.dataTable tr {
+ td,
+ th,
+ th:first-child {
+ border-left-width: 0 !important;
+ }
+ }
+
+ table.dataTable {
+ thead th,
+ tbody td,
+ tfoot th {
+ padding-right: light.$table-cell-padding-x;
+ }
+
+ &.table-sm thead th,
+ &.table-sm tbody td,
+ &.table-sm tfoot th {
+ padding-right: light.$table-cell-padding-x-sm;
+ }
+ }
+
+ div.card-datatable table.dataTable {
+ thead th,
+ tbody td,
+ tfoot th {
+ &:first-child {
+ padding-right: light.$card-spacer-x;
+ }
+
+ &:last-child {
+ padding-left: light.$card-spacer-x;
+ }
+ }
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ div.dataTables_wrapper div.dataTables_info {
+ color: light.$text-muted;
+ }
+
+ div.dataTables_scrollBody table {
+ border-top-color: light.$table-border-color;
+ }
+
+ table.dataTable th,
+ table.dataTable td {
+ border-color: light.$table-border-color !important;
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ div.dataTables_wrapper div.dataTables_info {
+ color: dark.$text-muted;
+ }
+
+ div.dataTables_scrollBody table {
+ border-top-color: dark.$table-border-color;
+ }
+
+ table.dataTable th,
+ table.dataTable td {
+ border-color: dark.$table-border-color !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss b/resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss
new file mode 100644
index 0000000..03b1c07
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss
@@ -0,0 +1,101 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'datatables.net-buttons-bs5/css/buttons.bootstrap5';
+
+// remove 0.5em margin bottom from dt-buttons
+@media screen and (max-width: 767px) {
+ div.dt-buttons {
+ margin-bottom: 0;
+ }
+}
+div.dataTables_wrapper .dt-button-collection {
+ border: 0;
+ border-radius: light.$dropdown-border-radius;
+ padding: light.$dropdown-padding-y light.$dropdown-padding-x;
+ width: auto;
+ > div[role='menu'] {
+ text-align: left;
+ }
+}
+// avoid dropdown to overlap the trigger button
+.dt-button-collection {
+ margin-top: 0.2rem;
+}
+div.dropdown-menu.dt-button-collection,
+div.dt-button-collection .dt-button:not(.dt-btn-split-drop) {
+ min-width: 8rem;
+}
+
+.dt-down-arrow {
+ display: none;
+}
+
+// override button radius
+div.dt-button-collection .dt-button,
+div.dt-buttons div.dropdown-menu .dt-button {
+ border-radius: light.$dropdown-border-radius;
+}
+// Light style
+@if $enable-light-style {
+ .light-style {
+ div.dataTables_wrapper .dt-button-collection {
+ background-color: light.$dropdown-bg;
+ }
+ .dataTable a:not([href]):not([tabindex]) {
+ color: map-get(light.$theme-colors, success);
+ }
+ .dt-button-info {
+ box-shadow: light.$floating-component-shadow;
+ }
+ .dt-button-collection {
+ .dropdown-item {
+ padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
+ }
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ div.dataTables_wrapper .dt-button-collection {
+ background-color: dark.$dropdown-bg;
+ }
+ .dataTable a:not([href]):not([tabindex]) {
+ color: map-get(dark.$theme-colors, success);
+ }
+ .dt-button-info {
+ box-shadow: dark.$floating-component-shadow;
+ }
+ .dt-button-collection {
+ .dropdown-item {
+ padding: dark.$dropdown-item-padding-y dark.$dropdown-item-padding-x;
+ }
+ }
+ }
+}
+.dt-button-info {
+ border-width: 0 !important;
+ border-radius: light.$border-radius !important;
+ h2 {
+ font-size: light.$h4-font-size !important;
+ }
+}
+.dt-buttons {
+ position: relative;
+ .dt-button-collection .dropdown-item {
+ @include app-rtl {
+ text-align: right;
+ }
+ }
+ &.btn-group {
+ button {
+ border-color: transparent !important;
+ border-radius: light.$border-radius !important;
+ }
+ }
+}
+div.dt-buttons .dropdown-menu .dt-button {
+ border-radius: light.$border-radius;
+}
diff --git a/resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss b/resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss
new file mode 100644
index 0000000..2628c5e
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss
@@ -0,0 +1,2 @@
+@import '../../scss/_custom-variables/libs';
+@import 'jquery-datatables-checkboxes/css/dataTables.checkboxes';
diff --git a/resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss b/resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss
new file mode 100644
index 0000000..3ef12dd
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss
@@ -0,0 +1,133 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'datatables.net-fixedcolumns-bs5/css/fixedColumns.bootstrap5';
+
+// Fixed column style
+div.dataTables_scrollBody thead tr,
+div.DTFC_LeftBodyLiner thead tr {
+ border-top-width: 0;
+ border-bottom-width: 0;
+}
+div.dataTables_scrollBody {
+ border: 0 !important;
+}
+@include app-ltr(false) {
+ div.dataTables_scrollFootInner table.table-bordered tr th:first-child,
+ div.dataTables_scrollHeadInner table.table-bordered tr th:first-child {
+ border-left: 0 !important;
+ }
+}
+
+@include app-rtl(false) {
+ table.dataTable thead th,
+ table.dataTable thead td,
+ table.dataTable tfoot th,
+ table.dataTable tfoot td {
+ text-align: right !important;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ table.DTFC_Cloned tr {
+ border-color: light.$table-border-color;
+ }
+ // fixed header and footer border
+ div.dataTables_scrollFootInner table.table-bordered tr th:first-child,
+ div.dataTables_scrollHeadInner table.table-bordered tr th:first-child {
+ border-left: 1px solid light.$table-border-color;
+ }
+ // fixed column background color
+ table.dataTable thead tr > .dtfc-fixed-left,
+ table.dataTable thead tr > .dtfc-fixed-right,
+ table.dataTable tbody tr > .dtfc-fixed-left,
+ table.dataTable tbody tr > .dtfc-fixed-right,
+ div.dtfc-right-top-blocker,
+ div.dtfc-left-top-blocker {
+ background-color: light.$card-bg;
+ margin-top: 1px !important;
+ height: 0px !important;
+ }
+ // To override BS5 css
+ .dt-fixedcolumns thead {
+ border-top-color: light.$table-border-color;
+ }
+ &[dir='rtl'] {
+ div.dataTables_scrollHead,
+ div.dataTables_scrollBody {
+ table {
+ border-width: 0;
+ }
+ }
+ div.DTFC_LeftBodyLiner {
+ padding-right: 0 !important;
+ }
+ div.DTFC_RightHeadWrapper,
+ div.DTFC_RightBodyWrapper {
+ table {
+ border: 0;
+ }
+ }
+ div.DTFC_RightBodyLiner {
+ padding-left: 0 !important;
+ }
+ }
+ }
+}
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ table.DTFC_Cloned tr {
+ background-color: dark.$card-bg;
+ border-color: dark.$table-border-color;
+ }
+ div.dataTables_scrollHead table,
+ div.DTFC_RightHeadWrapper table,
+ table.dataTable.fixedHeader-floating,
+ table.dataTable.fixedHeader-locked {
+ background-color: dark.$card-bg;
+ }
+ // fixed header and footer border
+ div.dataTables_scrollFootInner table.table-bordered tr th:first-child,
+ div.dataTables_scrollHeadInner table.table-bordered tr th:first-child {
+ border-left: 1px solid dark.$table-border-color !important;
+ }
+ // fixed column background color
+ table.dataTable thead tr > .dtfc-fixed-left,
+ table.dataTable thead tr > .dtfc-fixed-right,
+ table.dataTable tbody tr > .dtfc-fixed-left,
+ table.dataTable tbody tr > .dtfc-fixed-right,
+ div.dtfc-right-top-blocker,
+ div.dtfc-left-top-blocker {
+ background-color: dark.$card-bg;
+ margin-top: 1px !important;
+ height: 0px !important;
+ }
+ // To override BS5 css
+ .dt-fixedcolumns thead {
+ border-top-color: dark.$table-border-color;
+ }
+ &[dir='rtl'] {
+ div.dataTables_scrollHead,
+ div.dataTables_scrollBody {
+ table {
+ border-width: 0;
+ }
+ }
+ div.DTFC_LeftBodyLiner {
+ padding-right: 0 !important;
+ }
+ div.DTFC_RightHeadWrapper,
+ div.DTFC_RightBodyWrapper {
+ table {
+ border: 0;
+ }
+ }
+ div.DTFC_RightBodyLiner {
+ padding-left: 0 !important;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss b/resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss
new file mode 100644
index 0000000..599b7e1
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss
@@ -0,0 +1,40 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'datatables.net-fixedheader-bs5/css/fixedHeader.bootstrap5';
+
+// Fixed header Style
+.dt-fixedheader.fixedHeader-floating.table.dataTable {
+ width: auto !important;
+}
+.dt-fixedheader.fixedHeader-locked.table.dataTable {
+ display: none;
+}
+
+// Last style
+@if $enable-light-style {
+ .light-style {
+ .dtfh-floatingparenthead {
+ border-bottom: 1px solid light.$table-border-color;
+ }
+ .table-bordered.dt-fixedheader.fixedHeader-floating.table.dataTable thead > tr > th,
+ .table-bordered.dt-fixedheader.fixedHeader-locked.table.dataTable thead > tr > th {
+ border-bottom-width: 1px;
+ border-color: light.$table-border-color;
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ .dtfh-floatingparenthead {
+ border-bottom: 1px solid dark.$table-border-color;
+ }
+ .table-bordered.dt-fixedheader.fixedHeader-floating.table.dataTable thead > tr > th,
+ .table-bordered.dt-fixedheader.fixedHeader-locked.table.dataTable thead > tr > th {
+ border-bottom-width: 1px;
+ border-color: dark.$table-border-color;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js b/resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js
new file mode 100644
index 0000000..e37d675
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js
@@ -0,0 +1,195 @@
+export const datatable_spanish_default = {
+ processing: 'Procesando...',
+ lengthMenu: 'Mostrar _MENU_ registros',
+ zeroRecords: 'No se encontraron resultados',
+ emptyTable: 'Ningún dato disponible en esta tabla',
+ infoEmpty: 'Mostrando registros del 0 al 0 de un total de 0 registros',
+ infoFiltered: '(filtrado de un total de _MAX_ registros)',
+ search: 'Buscar:',
+ infoThousands: ',',
+ loadingRecords: 'Cargando...',
+ paginate: {
+ first: 'Primero',
+ last: 'Último',
+ next: 'Siguiente',
+ previous: 'Anterior'
+ },
+ aria: {
+ sortAscending: ': Activar para ordenar la columna de manera ascendente',
+ sortDescending: ': Activar para ordenar la columna de manera descendente'
+ },
+ buttons: {
+ copy: 'Copiar',
+ colvis: 'Visibilidad',
+ collection: 'Colección',
+ colvisRestore: 'Restaurar visibilidad',
+ copyKeys:
+ 'Presione ctrl o u2318 + C para copiar los datos de la tabla al portapapeles del sistema. Para cancelar, haga clic en este mensaje o presione escape.',
+ copySuccess: {
+ 1: 'Copiada 1 fila al portapapeles',
+ _: 'Copiadas %d fila al portapapeles'
+ },
+ copyTitle: 'Copiar al portapapeles',
+ csv: 'CSV',
+ excel: 'Excel',
+ pageLength: {
+ '-1': 'Mostrar todas las filas',
+ _: 'Mostrar %d filas'
+ },
+ pdf: 'PDF',
+ print: 'Imprimir'
+ },
+ autoFill: {
+ cancel: 'Cancelar',
+ fill: 'Rellene todas las celdas con %d ',
+ fillHorizontal: 'Rellenar celdas horizontalmente',
+ fillVertical: 'Rellenar celdas verticalmentemente'
+ },
+ decimal: ',',
+ searchBuilder: {
+ add: 'Añadir condición',
+ button: {
+ 0: 'Constructor de búsqueda',
+ _: 'Constructor de búsqueda (%d)'
+ },
+ clearAll: 'Borrar todo',
+ condition: 'Condición',
+ conditions: {
+ date: {
+ after: 'Despues',
+ before: 'Antes',
+ between: 'Entre',
+ empty: 'Vacío',
+ equals: 'Igual a',
+ notBetween: 'No entre',
+ notEmpty: 'No Vacio',
+ not: 'Diferente de'
+ },
+ number: {
+ between: 'Entre',
+ empty: 'Vacio',
+ equals: 'Igual a',
+ gt: 'Mayor a',
+ gte: 'Mayor o igual a',
+ lt: 'Menor que',
+ lte: 'Menor o igual que',
+ notBetween: 'No entre',
+ notEmpty: 'No vacío',
+ not: 'Diferente de'
+ },
+ string: {
+ contains: 'Contiene',
+ empty: 'Vacío',
+ endsWith: 'Termina en',
+ equals: 'Igual a',
+ notEmpty: 'No Vacio',
+ startsWith: 'Empieza con',
+ not: 'Diferente de'
+ },
+ array: {
+ not: 'Diferente de',
+ equals: 'Igual',
+ empty: 'Vacío',
+ contains: 'Contiene',
+ notEmpty: 'No Vacío',
+ without: 'Sin'
+ }
+ },
+ data: 'Data',
+ deleteTitle: 'Eliminar regla de filtrado',
+ leftTitle: 'Criterios anulados',
+ logicAnd: 'Y',
+ logicOr: 'O',
+ rightTitle: 'Criterios de sangría',
+ title: {
+ 0: 'Constructor de búsqueda',
+ _: 'Constructor de búsqueda (%d)'
+ },
+ value: 'Valor'
+ },
+ searchPanes: {
+ clearMessage: 'Borrar todo',
+ collapse: {
+ 0: 'Paneles de búsqueda',
+ _: 'Paneles de búsqueda (%d)'
+ },
+ count: '{total}',
+ countFiltered: '{shown} ({total})',
+ emptyPanes: 'Sin paneles de búsqueda',
+ loadMessage: 'Cargando paneles de búsqueda',
+ title: 'Filtros Activos - %d'
+ },
+ select: {
+ cells: {
+ 1: '1 celda seleccionada',
+ _: '%d celdas seleccionadas'
+ },
+ columns: {
+ 1: '1 columna seleccionada',
+ _: '%d columnas seleccionadas'
+ },
+ rows: {
+ 1: '1 fila seleccionada',
+ _: '%d filas seleccionadas'
+ }
+ },
+ thousands: '.',
+ datetime: {
+ previous: 'Anterior',
+ next: 'Proximo',
+ hours: 'Horas',
+ minutes: 'Minutos',
+ seconds: 'Segundos',
+ unknown: '-',
+ amPm: ['AM', 'PM'],
+ months: {
+ 0: 'Enero',
+ 1: 'Febrero',
+ 10: 'Noviembre',
+ 11: 'Diciembre',
+ 2: 'Marzo',
+ 3: 'Abril',
+ 4: 'Mayo',
+ 5: 'Junio',
+ 6: 'Julio',
+ 7: 'Agosto',
+ 8: 'Septiembre',
+ 9: 'Octubre'
+ },
+ weekdays: ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab']
+ },
+ editor: {
+ close: 'Cerrar',
+ create: {
+ button: 'Nuevo',
+ title: 'Crear Nuevo Registro',
+ submit: 'Crear'
+ },
+ edit: {
+ button: 'Editar',
+ title: 'Editar Registro',
+ submit: 'Actualizar'
+ },
+ remove: {
+ button: 'Eliminar',
+ title: 'Eliminar Registro',
+ submit: 'Eliminar',
+ confirm: {
+ _: '¿Está seguro que desea eliminar %d filas?',
+ 1: '¿Está seguro que desea eliminar 1 fila?'
+ }
+ },
+ error: {
+ system: 'Ha ocurrido un error en el sistema (Más información<\\/a>). '
+ },
+ multi: {
+ title: 'Múltiples Valores',
+ info: 'Los elementos seleccionados contienen diferentes valores para este registro. Para editar y establecer todos los elementos de este registro con el mismo valor, hacer click o tap aquí, de lo contrario conservarán sus valores individuales.',
+ restore: 'Deshacer Cambios',
+ noMulti: 'Este registro puede ser editado individualmente, pero no como parte de un grupo.'
+ }
+ },
+ info: 'Mostrando _START_ a _END_ de _TOTAL_ registros',
+ search: '',
+ searchPlaceholder: 'Buscar'
+};
diff --git a/resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss b/resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss
new file mode 100644
index 0000000..4619524
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss
@@ -0,0 +1,9 @@
+@mixin bs-datatables-theme($background) {
+ // Style for responsive icon
+ table.dataTable.dtr-column > tbody > tr > td.control:before,
+ table.dataTable.dtr-column > tbody > tr > th.control:before {
+ background-color: $background;
+ border: 2px solid $rgba-to-hex-bg;
+ box-shadow: 0 0 3px $gray-800;
+ }
+}
diff --git a/resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss b/resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss
new file mode 100644
index 0000000..7d97024
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss
@@ -0,0 +1,57 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import 'datatables.net-responsive-bs5/css/responsive.bootstrap5';
+@import 'mixins';
+
+// Responsive table area '+' icon position
+table.dataTable.dtr-column > tbody > tr > td.control,
+table.dataTable.dtr-column > tbody > tr > th.control {
+ position: relative;
+ &:before,
+ &:before {
+ position: absolute;
+ line-height: 0.9em;
+ font-weight: light.$font-weight-medium;
+ height: 0.85em;
+ width: 0.85em;
+ color: light.$white;
+ border-radius: 1em;
+ box-sizing: content-box;
+ text-align: center;
+ font-family: 'Courier New', Courier, monospace;
+ content: '+';
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+}
+table.dataTable.dtr-column > tbody > tr.parent td.dtr-control:before,
+table.dataTable.dtr-column > tbody > tr.parent th.dtr-control:before,
+table.dataTable.dtr-column > tbody > tr.parent td.control:before,
+table.dataTable.dtr-column > tbody > tr.parent th.control:before {
+ content: '+';
+}
+// To scroll within datatable area
+@media screen and (max-width: 1399.98px) {
+ table.dataTable.table-responsive {
+ display: block;
+ }
+}
+
+// Modal table style
+.modal.dtr-bs-modal {
+ .modal-body {
+ padding: 0;
+ }
+ .table {
+ tr:last-child > td {
+ border-bottom: 0;
+ }
+ .btn {
+ box-shadow: none !important;
+ }
+ .emp_name {
+ font-weight: light.$font-weight-medium;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss b/resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss
new file mode 100644
index 0000000..feea55b
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss
@@ -0,0 +1,25 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+@import 'datatables.net-rowgroup-bs5/css/rowGroup.bootstrap5';
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ tr.group,
+ tr.group:hover {
+ background-color: light.$gray-100 !important;
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ tr.group,
+ tr.group:hover {
+ background-color: rgba(dark.$base, 0.1) !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss b/resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss
new file mode 100644
index 0000000..99faa43
--- /dev/null
+++ b/resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss
@@ -0,0 +1,39 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@use '../../scss/_components/include' as comp;
+
+@import '../../scss/_custom-variables/libs';
+@import 'datatables.net-select-bs5/css/select.bootstrap5';
+
+// Background color for select row
+table.dataTable tbody > tr.selected td,
+table.dataTable tbody > tr > .selected td {
+ background-color: rgba(light.$primary, 0.08);
+ box-shadow: none;
+}
+// Light style
+@if $enable-light-style {
+ .light-style {
+ table.dataTable tbody tr.selected td,
+ table.dataTable tbody th.selected td,
+ table.dataTable tbody td.selected td {
+ color: light.$body-color !important;
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ table.dataTable tbody > tr.selected > *,
+ table.dataTable tbody > tr > .selected > * {
+ box-shadow: inset 0 0 0 dark.$gray-50;
+ color: dark.$table-active-color;
+ }
+ table.dataTable tbody tr.selected td,
+ table.dataTable tbody th.selected td,
+ table.dataTable tbody td.selected td {
+ color: inherit;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/dropzone/_mixins.scss b/resources/assets/vendor/libs/dropzone/_mixins.scss
new file mode 100644
index 0000000..75e2c7f
--- /dev/null
+++ b/resources/assets/vendor/libs/dropzone/_mixins.scss
@@ -0,0 +1,5 @@
+@mixin dropzone-theme($border) {
+ .dropzone.dz-drag-hover {
+ border-color: $border !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/dropzone/dropzone.js b/resources/assets/vendor/libs/dropzone/dropzone.js
new file mode 100644
index 0000000..6122097
--- /dev/null
+++ b/resources/assets/vendor/libs/dropzone/dropzone.js
@@ -0,0 +1,56 @@
+import Dropzone from 'dropzone/dist/dropzone';
+
+Dropzone.autoDiscover = false;
+
+// File upload progress animation
+Dropzone.prototype.uploadFiles = function (files) {
+ const minSteps = 6;
+ const maxSteps = 60;
+ const timeBetweenSteps = 100;
+ const bytesPerStep = 100000;
+ const isUploadSuccess = true;
+
+ const self = this;
+
+ for (let i = 0; i < files.length; i++) {
+ const file = files[i];
+ const totalSteps = Math.round(Math.min(maxSteps, Math.max(minSteps, file.size / bytesPerStep)));
+
+ for (let step = 0; step < totalSteps; step++) {
+ const duration = timeBetweenSteps * (step + 1);
+
+ setTimeout(
+ (function (file, totalSteps, step) {
+ return function () {
+ file.upload = {
+ progress: (100 * (step + 1)) / totalSteps,
+ total: file.size,
+ bytesSent: ((step + 1) * file.size) / totalSteps
+ };
+
+ self.emit('uploadprogress', file, file.upload.progress, file.upload.bytesSent);
+ if (file.upload.progress === 100) {
+ if (isUploadSuccess) {
+ file.status = Dropzone.SUCCESS;
+ self.emit('success', file, 'success', null);
+ } else {
+ file.status = Dropzone.ERROR;
+ self.emit('error', file, 'Some upload error', null);
+ }
+
+ self.emit('complete', file);
+ self.processQueue();
+ }
+ };
+ })(file, totalSteps, step),
+ duration
+ );
+ }
+ }
+};
+
+try {
+ window.Dropzone = Dropzone;
+} catch (e) {}
+
+export { Dropzone };
diff --git a/resources/assets/vendor/libs/dropzone/dropzone.scss b/resources/assets/vendor/libs/dropzone/dropzone.scss
new file mode 100644
index 0000000..d342eef
--- /dev/null
+++ b/resources/assets/vendor/libs/dropzone/dropzone.scss
@@ -0,0 +1,460 @@
+// Dropzone
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+$dz-box-padding: 1.25rem !default;
+$dz-icon-size: 1.875rem !default;
+$dz-thumbnail-width: 10rem !default;
+$dz-thumbnail-height: 7.5rem !default;
+$dz-preview-padding: 0.625rem !default;
+$dz-progress-height: 0.5rem !default;
+$dz-icon-block-size: 3.75rem !default;
+
+// common styles
+.dropzone {
+ width: 100%;
+ position: relative;
+ cursor: pointer;
+ border-radius: light.$border-radius-lg;
+
+ // Disabled
+ &:not(.dz-clickable) {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+
+ // Hover
+ &.dz-drag-hover {
+ border-style: solid;
+
+ .dz-message {
+ opacity: 0.5;
+ }
+ }
+}
+
+.dz-message {
+ font-size: light.$h4-font-size;
+ &:before {
+ content: '';
+ border-radius: 6px;
+ position: absolute;
+ top: 5rem;
+ left: calc(50% - 23px);
+ display: inline-block;
+ height: 40px;
+ width: 40px;
+ background-repeat: no-repeat !important;
+ background-position: center !important;
+ }
+
+ .note {
+ font-size: light.$font-size-base;
+ }
+}
+
+// Fallback
+.dz-browser-not-supported {
+ &.dropzone-box {
+ min-height: auto !important;
+ border: none !important;
+ border-radius: 0 !important;
+ padding: 0 !important;
+ width: auto !important;
+ cursor: default !important;
+ transition: none;
+ }
+
+ .dz-message {
+ display: none !important;
+ }
+}
+
+// Default message
+
+.dz-started .dz-message {
+ display: none;
+}
+
+.dz-message {
+ margin: 8rem 0 3rem;
+ font-weight: 500;
+ text-align: center;
+
+ .note {
+ display: block;
+ margin-top: 0.5rem;
+ }
+}
+
+// styles for dropzone in ecommerce
+.app-ecommerce {
+ .dz-message {
+ margin-top: 5rem;
+ &::before {
+ top: 3rem;
+ }
+ }
+}
+
+// Preview
+.dz-preview {
+ position: relative;
+ vertical-align: top;
+ background: #fff;
+ font-size: 0.8125rem;
+ margin: 1rem;
+ margin-right: $dz-box-padding - 1;
+ box-sizing: content-box;
+ cursor: default;
+ @include light.media-breakpoint-down(sm) {
+ margin: $dz-box-padding - 0.5;
+ }
+}
+
+// File information
+.dz-filename {
+ position: absolute;
+ width: 100%;
+ overflow: hidden;
+ padding: $dz-preview-padding $dz-preview-padding 0 $dz-preview-padding;
+ background: light.$white;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+
+ &:hover {
+ white-space: normal;
+ text-overflow: inherit;
+ }
+}
+
+.dz-size {
+ padding: 1.875rem $dz-preview-padding $dz-preview-padding $dz-preview-padding;
+ font-size: 0.6875rem;
+ font-style: italic;
+}
+
+// Progressbar
+.dz-preview .progress,
+.dz-preview .progess-bar {
+ height: $dz-progress-height;
+}
+
+.dz-preview .progress {
+ position: absolute;
+ left: 1.25rem;
+ right: 1.25rem;
+ top: 50%;
+ margin-top: -$dz-progress-height * 0.5;
+ z-index: 30;
+}
+
+.dz-complete .progress {
+ display: none;
+}
+
+// Thumbnail
+.dz-thumbnail {
+ position: relative;
+ padding: $dz-preview-padding;
+ height: $dz-thumbnail-height;
+ text-align: center;
+ box-sizing: content-box;
+
+ > img,
+ .dz-nopreview {
+ top: 50%;
+ position: relative;
+ transform: translateY(-50%) scale(1);
+ margin: 0 auto;
+ display: block;
+ }
+
+ > img {
+ max-height: 100%;
+ max-width: 100%;
+ }
+}
+
+.dz-nopreview {
+ font-weight: light.$font-weight-medium;
+ text-transform: uppercase;
+ font-size: 0.6875rem;
+}
+
+.dz-thumbnail img[src] ~ .dz-nopreview {
+ display: none;
+}
+
+// Remove link
+.dz-remove {
+ display: block;
+ text-align: center;
+ padding: 0.375rem 0;
+ font-size: 0.75rem;
+
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ border-top-color: transparent;
+ }
+}
+
+// error/success states
+.dz-error-mark,
+.dz-success-mark {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ display: none;
+ margin-left: -$dz-icon-block-size * 0.5;
+ margin-top: -$dz-icon-block-size * 0.5;
+ height: $dz-icon-block-size;
+ width: $dz-icon-block-size;
+ border-radius: 50%;
+ background-position: center center;
+ background-size: $dz-icon-size $dz-icon-size;
+ background-repeat: no-repeat;
+ box-shadow: 0 0 1.25rem rgba(0, 0, 0, 0.06);
+}
+
+.dz-success-mark {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
+}
+
+.dz-error-mark {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
+}
+
+.dz-error-message {
+ position: absolute;
+ top: -1px;
+ left: -1px;
+ bottom: -1px;
+ right: -1px;
+ display: none;
+ color: light.$white;
+ z-index: 40;
+ padding: 0.75rem;
+ text-align: left;
+ overflow: auto;
+ font-weight: light.$font-weight-medium;
+
+ @include app-rtl {
+ text-align: right;
+ }
+}
+
+// Error state
+.dz-error {
+ .dz-error-message {
+ display: none;
+ }
+
+ .dz-error-mark {
+ display: block;
+ }
+
+ &:hover {
+ .dz-error-message {
+ display: block;
+ }
+
+ .dz-error-mark {
+ display: none;
+ }
+ }
+}
+
+// Success state
+.dz-success .dz-success-mark {
+ display: block;
+}
+
+// RTL
+@include app-rtl(false) {
+ .dz-hidden-input {
+ left: auto !important;
+ right: 0 !important;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ $dz-overlay-bg: light.$dark;
+ $dz-thumbnail-bg: light.$gray-25;
+ $dz-border-color: light.$card-border-color;
+
+ .dropzone {
+ border: 2px dashed $dz-border-color;
+ }
+
+ .dz-preview {
+ border: light.$card-border-width solid $dz-border-color;
+ border-radius: light.$border-radius;
+ box-shadow: light.$card-box-shadow;
+ }
+
+ .dz-message {
+ color: light.$headings-color;
+ &:before {
+ background-image: light.str-replace(
+ light.str-replace(light.$upload-icon, 'currentColor', light.$headings-color),
+ '#',
+ '%23'
+ ) !important;
+ background: #eeedf0;
+ }
+ .note {
+ color: light.$body-color;
+ font-weight: light.$font-weight-normal;
+ }
+ }
+
+ .dz-thumbnail {
+ border-bottom: 1px solid light.rgba-to-hex($dz-border-color);
+ background: $dz-thumbnail-bg;
+
+ @include light.border-top-radius(if(light.$border-radius, calc(#{light.$border-radius} - 1px), 0));
+ }
+
+ .dz-size {
+ color: light.$text-muted;
+ }
+
+ .dz-remove {
+ color: light.$body-color;
+ border-top: 1px solid light.rgba-to-hex($dz-border-color);
+
+ @include light.border-bottom-radius(if(light.$border-radius, calc(#{light.$border-radius} - 1px), 0));
+
+ &:hover,
+ &:focus {
+ color: light.$body-color;
+ background: light.$gray-100;
+ }
+ }
+
+ .dz-nopreview {
+ color: light.$text-muted;
+ }
+
+ .dz-error-mark,
+ .dz-success-mark {
+ background-color: rgba($dz-overlay-bg, 0.5);
+ }
+
+ .dz-error-message {
+ background: rgba(map-get(light.$theme-colors, danger), 0.8);
+
+ @include light.border-top-radius(light.$border-radius);
+ }
+
+ @include light.media-breakpoint-up(sm) {
+ .dz-preview {
+ display: inline-block;
+ width: $dz-thumbnail-width + ($dz-preview-padding * 2);
+ }
+
+ .dz-thumbnail {
+ width: $dz-thumbnail-width;
+ }
+ }
+ }
+}
+
+// dark style
+@if $enable-dark-style {
+ .dark-style {
+ $dz-overlay-bg: dark.$dark;
+ $dz-thumbnail-bg: dark.$gray-25;
+ $dz-border-color: dark.$card-border-color;
+
+ .dropzone {
+ border: 2px dashed $dz-border-color;
+ }
+
+ .dz-preview {
+ background: dark.$card-bg;
+ border: dark.$card-border-width solid $dz-border-color;
+ border-radius: dark.$border-radius;
+ box-shadow: dark.$card-box-shadow;
+ }
+
+ .dz-message {
+ color: dark.$headings-color;
+ &:before {
+ background-image: light.str-replace(
+ light.str-replace(light.$upload-icon, 'currentColor', dark.$headings-color),
+ '#',
+ '%23'
+ ) !important;
+ background: #373b50;
+ }
+ .note {
+ color: dark.$body-color;
+ font-weight: dark.$font-weight-normal;
+ }
+ }
+
+ .dz-filename {
+ background: dark.$card-bg;
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ border-bottom: dark.$card-border-width solid $dz-border-color;
+ }
+
+ .dz-size {
+ color: dark.$text-muted;
+ }
+
+ .dz-thumbnail {
+ border-bottom: 1px solid $dz-border-color;
+ background: $dz-thumbnail-bg;
+
+ @include dark.border-top-radius(if(dark.$border-radius, calc(#{dark.$border-radius} - 1px), 0));
+ }
+
+ .dz-nopreview {
+ color: dark.$text-muted;
+ }
+
+ .dz-remove {
+ color: dark.$body-color;
+ border-top: 1px solid $dz-border-color;
+
+ @include dark.border-bottom-radius(if(dark.$border-radius, calc(#{dark.$border-radius} - 1px), 0));
+
+ &:hover,
+ &:focus {
+ color: dark.$body-color;
+ background: dark.$gray-100;
+ }
+ }
+
+ .dz-error-mark,
+ .dz-success-mark {
+ background-color: rgba($dz-overlay-bg, 0.5);
+ }
+
+ .dz-error-message {
+ background: rgba(map-get(dark.$theme-colors, danger), 0.8);
+
+ @include dark.border-top-radius(dark.$border-radius);
+ }
+
+ @include dark.media-breakpoint-up(sm) {
+ .dz-preview {
+ display: inline-block;
+ width: $dz-thumbnail-width + ($dz-preview-padding * 2);
+ }
+
+ .dz-thumbnail {
+ width: $dz-thumbnail-width;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/flatpickr/_mixins.scss b/resources/assets/vendor/libs/flatpickr/_mixins.scss
new file mode 100644
index 0000000..8fdfa7c
--- /dev/null
+++ b/resources/assets/vendor/libs/flatpickr/_mixins.scss
@@ -0,0 +1,114 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin flatpickr-theme($background, $color: null) {
+ $in-range-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ $color: if($color, $color, color-contrast($background));
+ $in-range-color: $background;
+
+ .flatpickr-day {
+ &.today,
+ &.today:hover {
+ color: $background !important;
+ border-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
+ }
+
+ &.inRange,
+ &.nextMonthDay.inRange,
+ &.prevMonthDay.inRange,
+ &.today.inRange,
+ &.prevMonthDay.today.inRange,
+ &.nextMonthDay.today.inRange {
+ color: $background !important;
+ background: $in-range-bg !important;
+ border-color: $in-range-bg !important;
+ }
+
+ &.selected,
+ &.selected.inRange,
+ &.selected:focus,
+ &.selected:hover,
+ &.selected.nextMonthDay,
+ &.selected.prevMonthDay,
+ &.startRange,
+ &.startRange.inRange,
+ &.startRange:focus,
+ &.startRange:hover,
+ &.startRange.nextMonthDay,
+ &.startRange.prevMonthDay,
+ &.endRange,
+ &.endRange.inRange,
+ &.endRange:focus,
+ &.endRange:hover,
+ &.endRange.nextMonthDay,
+ &.endRange.prevMonthDay,
+ &.week.selected {
+ color: $color !important;
+ background: $background !important;
+ border-color: $background !important;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+ }
+}
+
+@mixin flatpickr-dark-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+ $in-range-bg: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ $in-range-color: $background;
+
+ .flatpickr-calendar .numInputWrapper span {
+ &.arrowUp:after {
+ border-bottom-color: $color;
+ }
+
+ &.arrowDown:after {
+ border-top-color: $color;
+ }
+ }
+
+ .flatpickr-day {
+ &.today,
+ &.today:hover,
+ &.inRange {
+ color: $background !important;
+ border-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
+ }
+
+ &.inRange,
+ &.nextMonthDay.inRange,
+ &.prevMonthDay.inRange,
+ &.today.inRange,
+ &.nextMonthDay.today.inRange,
+ &.prevMonthDay.today.inRange {
+ border-color: $in-range-bg !important;
+ background: $in-range-bg !important;
+ color: $background !important;
+ }
+
+ &.selected,
+ &.selected.inRange,
+ &.selected:focus,
+ &.selected:hover,
+ &.selected.prevMonthDay,
+ &.selected.nextMonthDay,
+ &.startRange,
+ &.startRange.inRange,
+ &.startRange:focus,
+ &.startRange:hover,
+ &.startRange.prevMonthDay,
+ &.startRange.nextMonthDay,
+ &.endRange,
+ &.endRange.inRange,
+ &.endRange:focus,
+ &.endRange:hover,
+ &.endRange.nextMonthDay,
+ &.endRange.prevMonthDay,
+ &.week.selected {
+ background: $background !important;
+ border-color: $background !important;
+ color: $color !important;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/flatpickr/flatpickr.js b/resources/assets/vendor/libs/flatpickr/flatpickr.js
new file mode 100644
index 0000000..0c13982
--- /dev/null
+++ b/resources/assets/vendor/libs/flatpickr/flatpickr.js
@@ -0,0 +1,7 @@
+import flatpickr from 'flatpickr/dist/flatpickr';
+
+try {
+ window.flatpickr = flatpickr;
+} catch (e) {}
+
+export { flatpickr };
diff --git a/resources/assets/vendor/libs/flatpickr/flatpickr.scss b/resources/assets/vendor/libs/flatpickr/flatpickr.scss
new file mode 100644
index 0000000..43ef2fc
--- /dev/null
+++ b/resources/assets/vendor/libs/flatpickr/flatpickr.scss
@@ -0,0 +1,1172 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+$flatpickr-content-padding-x: 0.5rem !default;
+$flatpickr-content-padding-y: 0.25rem !default;
+$flatpickr-cell-size: 2.25rem !default;
+$flatpickr-animation-duration: 400ms !default;
+$flatpickr-time-picker-height: 40px !default;
+$flatpickr-week-height: 2.25rem !default;
+$flatpickr-month-height: 2.5rem !default;
+$flatpickr-year-height: 1.2rem !default;
+$flatpickr-width: ($flatpickr-cell-size * 7)+ ($flatpickr-content-padding-x * 2) !default;
+
+@mixin keyframes($name) {
+ @-webkit-keyframes #{$name} {
+ @content;
+ }
+
+ @-moz-keyframes #{$name} {
+ @content;
+ }
+
+ @keyframes #{$name} {
+ @content;
+ }
+}
+
+.flatpickr-calendar {
+ position: absolute;
+ visibility: hidden;
+ overflow: hidden;
+ box-sizing: border-box;
+ padding: 0;
+ padding-bottom: 2px;
+ max-height: 0;
+ border: 0;
+ text-align: center;
+ opacity: 0;
+ animation: none;
+ outline: 0;
+ touch-action: manipulation;
+ line-height: light.$line-height-base;
+ font-size: light.$font-size-base;
+ @include light.border-radius(light.$border-radius !important);
+
+ &.open,
+ &.inline {
+ visibility: visible;
+ overflow: visible;
+ max-height: 640px;
+ opacity: 1;
+ }
+
+ &.open {
+ display: inline-block;
+ }
+
+ &.animate.open {
+ animation: fpFadeInDown 300ms cubic-bezier(0.23, 1, 0.32, 1);
+ }
+
+ &:not(.inline):not(.open) {
+ display: none !important;
+ }
+
+ &.inline {
+ position: relative;
+ top: 2px;
+ display: block;
+ }
+
+ &.static {
+ position: absolute;
+ top: calc(100% + 2px);
+ }
+
+ &.static.open {
+ z-index: 999;
+ display: block;
+ }
+
+ &.hasWeeks {
+ width: auto;
+ }
+
+ @include app-ltr {
+ &.hasWeeks .flatpickr-days {
+ border-bottom-left-radius: 0 !important;
+ }
+ }
+
+ @include app-rtl {
+ &.hasWeeks .flatpickr-days {
+ border-bottom-right-radius: 0 !important;
+ }
+ }
+
+ &.hasTime {
+ padding-bottom: 0;
+ .flatpickr-time {
+ height: $flatpickr-time-picker-height;
+ }
+ }
+
+ &.noCalendar.hasTime {
+ .flatpickr-time {
+ height: auto;
+ }
+ }
+
+ input[type='number'] {
+ -moz-appearance: textfield;
+ }
+ input[type='number']::-webkit-inner-spin-button,
+ input[type='number']::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+}
+
+.flatpickr-wrapper {
+ position: relative;
+ display: inline-block;
+}
+
+.flatpickr-month {
+ position: relative;
+ overflow: hidden;
+ height: $flatpickr-month-height + 0.5;
+ text-align: center;
+ line-height: 1;
+ user-select: none;
+}
+
+.flatpickr-prev-month,
+.flatpickr-next-month {
+ position: absolute;
+ top: 0.75rem;
+ z-index: 3;
+ padding: 0 0.41rem;
+ height: 1.875rem;
+ width: 1.875rem;
+ text-decoration: none;
+ cursor: pointer;
+ border-radius: 50rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ svg {
+ vertical-align: middle;
+ }
+}
+
+.flatpickr-prev-month i,
+.flatpickr-next-month i {
+ position: relative;
+}
+
+.flatpickr-prev-month {
+ &.flatpickr-prev-month {
+ right: 3.5rem;
+ }
+
+ @include app-rtl {
+ left: 3.5rem;
+ right: auto;
+ transform: scaleX(-1);
+ }
+}
+
+.flatpickr-next-month {
+ &.flatpickr-prev-month {
+ right: 0;
+ left: 0;
+ }
+
+ &.flatpickr-next-month {
+ right: 1rem;
+ }
+
+ @include app-rtl {
+ right: auto;
+ left: 1rem;
+ transform: scaleX(-1);
+ }
+}
+
+.flatpickr-prev-month:hover,
+.flatpickr-next-month:hover {
+ opacity: 1;
+}
+
+.flatpickr-prev-month svg,
+.flatpickr-next-month svg {
+ width: 0.6rem;
+}
+
+.flatpickr-prev-month svg path,
+.flatpickr-next-month svg path {
+ transition: fill 0.1s;
+ fill: inherit;
+}
+
+.numInputWrapper {
+ position: relative;
+ height: auto;
+
+ input,
+ span {
+ display: inline-block;
+ }
+
+ input {
+ width: 100%;
+ }
+
+ span {
+ position: absolute;
+ right: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ width: 14px;
+ height: 50%;
+ line-height: 1;
+ opacity: 0;
+ cursor: pointer;
+
+ @include app-rtl {
+ right: auto;
+ left: 0;
+ }
+
+ &:hover {
+ background: rgba(0, 0, 0, 0.1);
+ }
+
+ &:active {
+ background: rgba(0, 0, 0, 0.2);
+ }
+
+ &:after {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ }
+
+ &.arrowUp {
+ top: 0;
+ }
+
+ &.arrowUp:after {
+ border-right: 4px solid transparent;
+ border-bottom: 4px solid rgba(72, 72, 72, 0.6);
+ border-left: 4px solid transparent;
+ }
+
+ &.arrowDown {
+ top: 50%;
+ }
+
+ &.arrowDown:after {
+ border-top: 4px solid rgba(72, 72, 72, 0.6);
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+ }
+
+ svg {
+ width: inherit;
+ height: auto;
+ }
+
+ svg path {
+ fill: rgba(255, 255, 255, 0.5);
+ }
+ }
+
+ &:hover {
+ background: rgba(0, 0, 0, 0.05);
+ }
+
+ &:hover span {
+ opacity: 1;
+ }
+}
+
+.flatpickr-current-month {
+ position: absolute;
+ inset-inline-start: 4%;
+ display: flex;
+ align-items: center;
+ gap: 0.25rem;
+ width: 75%;
+ height: $flatpickr-month-height + 0.5;
+ text-align: center;
+ line-height: 1;
+ padding: 0.5rem 0 0 0;
+ transform: translate3d(0px, 0px, 0px);
+ &:has(.cur-month) {
+ inset-inline-start: 5%;
+ }
+
+ .flatpickr-monthDropdown-months,
+ input.cur-year {
+ outline: none;
+ vertical-align: middle !important;
+ font-weight: 400;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: inherit;
+ color: inherit;
+ display: inline-block;
+ box-sizing: border-box;
+ background: transparent;
+ border: 0;
+ border-radius: 0;
+ &:not(:first-child) {
+ padding: 0 0 0 0.5ch;
+ }
+ }
+
+ .numInputWrapper {
+ display: inline-block;
+ width: 6ch;
+ }
+
+ .flatpickr-monthDropdown-months {
+ appearance: menulist;
+ cursor: pointer;
+ height: $flatpickr-month-height - 0.25rem;
+ // margin: -1px 0 0 0;
+ position: relative;
+ width: auto;
+ font-size: light.$font-size-base;
+ }
+
+ input.cur-year {
+ margin: 0;
+ height: $flatpickr-year-height;
+ cursor: default;
+
+ @include app-rtl {
+ padding-right: 0.5ch;
+ padding-left: 0;
+ }
+
+ &:focus {
+ outline: 0;
+ }
+
+ &[disabled],
+ &[disabled]:hover {
+ background: transparent;
+ pointer-events: none;
+ }
+
+ &[disabled] {
+ opacity: 0.5;
+ }
+ }
+}
+
+.flatpickr-weekdaycontainer {
+ display: flex;
+ width: 100%;
+ padding: $flatpickr-content-padding-y $flatpickr-content-padding-x;
+}
+
+.flatpickr-weekdays {
+ display: flex;
+ overflow: hidden;
+ align-items: center;
+ max-width: 17.5rem;
+ width: 100%;
+ height: $flatpickr-week-height;
+ text-align: center;
+ margin-bottom: 0.125rem;
+}
+
+span.flatpickr-weekday {
+ display: block;
+ flex: 1;
+ margin: 0;
+ text-align: center;
+ line-height: 1;
+ cursor: default;
+}
+
+.dayContainer,
+.flatpickr-weeks {
+ padding: 1px 0 0 0;
+}
+
+.flatpickr-days {
+ position: relative;
+ display: flex;
+ overflow: hidden;
+ width: auto !important;
+
+ &:focus {
+ outline: 0;
+ }
+
+ .flatpickr-calendar.hasTime & {
+ border-bottom: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ }
+}
+
+.dayContainer {
+ display: inline-block;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-around;
+ box-sizing: border-box;
+ padding: 0;
+ min-width: $flatpickr-cell-size * 7;
+ max-width: $flatpickr-cell-size * 7;
+ width: $flatpickr-cell-size * 7;
+ outline: 0;
+ opacity: 1;
+ transform: translate3d(0px, 0px, 0px);
+}
+
+.flatpickr-day {
+ position: relative;
+ display: inline-block;
+ flex-basis: 14.2857143%;
+ justify-content: center;
+ box-sizing: border-box;
+ margin: 0;
+ max-width: $flatpickr-cell-size;
+ width: 15.2857143%;
+ height: $flatpickr-cell-size;
+ border: 1px solid transparent;
+ background: none;
+ text-align: center;
+ font-weight: 400;
+ line-height: calc(#{$flatpickr-cell-size} - 2px);
+ cursor: pointer;
+
+ &.inRange,
+ &.prevMonthDay.inRange,
+ &.nextMonthDay.inRange,
+ &.today.inRange,
+ &.prevMonthDay.today.inRange,
+ &.nextMonthDay.today.inRange,
+ &:hover,
+ &.prevMonthDay:hover,
+ &.nextMonthDay:hover,
+ &:focus,
+ &.prevMonthDay:focus,
+ &.nextMonthDay:focus {
+ outline: 0;
+ cursor: pointer;
+ }
+
+ &.inRange:not(.startRange):not(.endRange) {
+ border-radius: 0 !important;
+ }
+
+ &.disabled,
+ &.flatpickr-disabled,
+ &.flatpickr-disabled.today,
+ &.disabled:hover,
+ &.flatpickr-disabled:hover,
+ &.flatpickr-disabled.today:hover {
+ border-color: transparent;
+ background: transparent !important;
+ cursor: default;
+ pointer-events: none;
+ }
+
+ &.prevMonthDay,
+ &.nextMonthDay {
+ border-color: transparent;
+ background: transparent;
+ cursor: default;
+ }
+
+ &.notAllowed,
+ &.notAllowed.prevMonthDay,
+ &.notAllowed.nextMonthDay {
+ border-color: transparent;
+ background: transparent;
+ cursor: default;
+ }
+
+ &.week.selected {
+ border-radius: 0;
+ }
+
+ @include app-ltr {
+ &.selected.startRange,
+ &.startRange.startRange,
+ &.endRange.startRange {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+
+ &.selected.endRange,
+ &.startRange.endRange,
+ &.endRange.endRange {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ }
+
+ @include app-rtl {
+ &.selected.startRange,
+ &.startRange.startRange,
+ &.endRange.startRange {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+
+ &.selected.endRange,
+ &.startRange.endRange,
+ &.endRange.endRange {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ }
+}
+
+.flatpickr-weekwrapper {
+ display: inline-block;
+ float: left;
+
+ .flatpickr-weeks {
+ background-clip: padding-box !important;
+
+ @include app-ltr {
+ .flatpickr-weeks {
+ border-bottom-right-radius: 0 !important;
+ }
+ }
+
+ @include app-rtl {
+ .flatpickr-weeks {
+ border-bottom-left-radius: 0 !important;
+ }
+ }
+ .flatpickr-day {
+ font-size: light.$font-size-sm;
+ }
+ }
+
+ .flatpickr-calendar.hasTime .flatpickr-weeks {
+ border-bottom: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ }
+
+ .flatpickr-weekday {
+ float: none;
+ width: 100%;
+ line-height: $flatpickr-week-height;
+ position: relative;
+ top: 1px;
+ margin-bottom: 0.4rem;
+ }
+
+ span.flatpickr-day {
+ display: block;
+ max-width: none;
+ width: $flatpickr-cell-size;
+ background: none !important;
+ }
+}
+
+.flatpickr-calendar.hasTime .flatpickr-weeks {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+.flatpickr-innerContainer {
+ display: block;
+ display: flex;
+ overflow: hidden;
+ box-sizing: border-box;
+ &:has(.flatpickr-weeks) {
+ .flatpickr-weeks {
+ @include app-ltr {
+ padding-left: 0.445rem;
+ }
+ @include app-rtl {
+ padding-left: 0.445rem;
+ }
+ }
+ .flatpickr-weekdaycontainer {
+ @include app-rtl {
+ padding-left: $flatpickr-content-padding-x * 1.25;
+ }
+ }
+ .flatpickr-weekwrapper .flatpickr-weekday {
+ padding-left: 0.445rem;
+ }
+ .flatpickr-weekwrapper {
+ @include app-rtl {
+ padding-right: 0.5rem;
+ }
+ }
+ }
+}
+
+.flatpickr-rContainer {
+ display: inline-block;
+ box-sizing: border-box;
+ padding: 0;
+}
+
+.flatpickr-time {
+ display: block;
+ display: flex;
+ overflow: hidden;
+ box-sizing: border-box;
+ max-height: $flatpickr-time-picker-height;
+ height: 0;
+ outline: 0;
+ background-clip: padding-box !important;
+ text-align: center;
+ line-height: $flatpickr-time-picker-height;
+
+ &:after {
+ content: '';
+ display: table;
+ clear: both;
+ }
+
+ .numInputWrapper {
+ float: left;
+ flex: 1;
+ width: 40%;
+ height: $flatpickr-time-picker-height;
+ }
+
+ &.hasSeconds .numInputWrapper {
+ width: 26%;
+ }
+
+ &.time24hr .numInputWrapper {
+ width: 49%;
+ }
+
+ input {
+ position: relative;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ height: inherit;
+ border: 0;
+ border-radius: 0;
+ background: transparent;
+ box-shadow: none;
+ text-align: center;
+ line-height: inherit;
+ cursor: pointer;
+ font-size: light.$font-size-base;
+
+ &.flatpickr-hour,
+ &.flatpickr-minute,
+ &.flatpickr-second {
+ font-weight: light.$font-weight-normal;
+ }
+
+ &:focus {
+ outline: 0;
+ border: 0;
+ }
+ }
+
+ .flatpickr-time-separator,
+ .flatpickr-am-pm {
+ display: inline-block;
+ float: left;
+ align-self: center;
+ width: 2%;
+ height: inherit;
+ line-height: inherit;
+ user-select: none;
+ }
+
+ .flatpickr-am-pm {
+ width: 18%;
+ outline: 0;
+ text-align: center;
+ font-weight: normal;
+ cursor: pointer;
+
+ &:hover {
+ background: rgba(0, 0, 0, 0.05);
+ }
+ }
+
+ .flatpickr-calendar.noCalendar & {
+ box-shadow: none !important;
+ }
+
+ .flatpickr-calendar:not(.noCalendar) & {
+ border-top: 0;
+ border-top-left-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+ }
+}
+
+.flatpickr-input[readonly] {
+ cursor: pointer;
+}
+
+// Animations
+//
+
+@include keyframes(fpFadeInDown) {
+ from {
+ opacity: 0;
+ transform: translate3d(0, -20px, 0);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate3d(0, 0, 0);
+ }
+}
+// Light layout
+@if $enable-light-style {
+ .light-style {
+ .flatpickr-calendar {
+ background: light.$dropdown-bg;
+ }
+ .flatpickr-prev-month,
+ .flatpickr-next-month {
+ background-color: light.rgba-to-hex(rgba(light.$black, 0.08), light.$card-bg);
+ svg {
+ fill: light.$body-color;
+ stroke: light.$body-color;
+ }
+ }
+ // Dimensions
+ .flatpickr-calendar,
+ .flatpickr-days {
+ width: calc(#{$flatpickr-width} + calc(#{light.$dropdown-border-width} * 2px)) !important;
+ }
+ .flatpickr-calendar {
+ background-color: light.$card-bg;
+ border-radius: light.$border-radius !important;
+ }
+
+ @include app-ltr-style {
+ .flatpickr-calendar.hasWeeks {
+ width: calc(
+ #{$flatpickr-width + $flatpickr-cell-size} + calc(#{light.$dropdown-border-width} * 3px) + 0.35rem
+ ) !important;
+ }
+ }
+ @include app-rtl-style {
+ .flatpickr-calendar.hasWeeks {
+ width: calc(
+ #{$flatpickr-width + $flatpickr-cell-size} + calc(#{light.$dropdown-border-width} * 3px) + 1rem
+ ) !important;
+ }
+ }
+
+ .flatpickr-calendar.open {
+ z-index: light.$zindex-popover;
+ }
+ //! Flatpickr provide default input as readonly, applying default input style to readonly
+ .flatpickr-input[readonly],
+ .flatpickr-input ~ .form-control[readonly] {
+ background: #{light.$input-bg};
+ }
+
+ .flatpickr-days {
+ background: #{light.$dropdown-bg};
+ padding: $flatpickr-content-padding-y $flatpickr-content-padding-x $flatpickr-content-padding-x;
+ border: light.$dropdown-border-width solid opacify(light.$dropdown-border-color, 0.05);
+ border-top: 0;
+ background-clip: padding-box;
+
+ @include light.border-bottom-radius(light.$border-radius);
+ }
+
+ @include app-ltr-style {
+ .flatpickr-calendar.hasWeeks .flatpickr-days {
+ border-left: 0;
+ padding-left: calc(#{$flatpickr-content-padding-x} + #{light.$dropdown-border-width}px);
+ box-shadow: light.$dropdown-border-width 0 0 opacify(light.$dropdown-border-color, 0.05) inset;
+ }
+ }
+
+ @include app-rtl-style {
+ .flatpickr-calendar.hasWeeks .flatpickr-days {
+ border-right: 0;
+ padding-right: calc(#{$flatpickr-content-padding-x} + #{light.$dropdown-border-width}px);
+ box-shadow: -(light.$dropdown-border-width) 0 0 opacify(light.$dropdown-border-color, 0.05) inset;
+ }
+ }
+
+ .flatpickr-calendar {
+ line-height: light.$line-height-base;
+ font-size: light.$font-size-base;
+ box-shadow: light.$card-box-shadow;
+
+ @include light.border-radius(light.$border-radius);
+
+ &.hasTime:not(.noCalendar):not(.hasTime) .flatpickr-time {
+ display: none !important;
+ }
+
+ &.hasTime .flatpickr-time {
+ box-shadow: 0 1px 0 light.$border-color inset;
+ }
+ }
+ .flatpickr-monthDropdown-months {
+ color: light.$headings-color;
+ }
+ .flatpickr-current-month {
+ font-size: light.$big-font-size;
+ color: light.$headings-color;
+ .cur-month,
+ .cur-year {
+ font-size: light.$font-size-base;
+ font-weight: 400;
+ color: light.$headings-color;
+ }
+ }
+
+ .flatpickr-month,
+ span.flatpickr-weekday,
+ .flatpickr-weekdays {
+ background: light.$dropdown-bg;
+ }
+ .flatpickr-month {
+ @include light.border-top-radius(light.$border-radius);
+ // ! FIX: OS Windows and Linux Browsers DD Option color
+ option.flatpickr-monthDropdown-month {
+ color: light.$body-color;
+ background: #{light.$input-bg};
+ }
+ }
+
+ span.flatpickr-weekday {
+ color: light.$headings-color;
+ font-size: light.$font-size-sm;
+ }
+
+ .flatpickr-day {
+ color: light.$headings-color;
+ @include light.border-radius(light.$border-radius-pill);
+
+ &:hover,
+ &:focus,
+ &.prevMonthDay:hover,
+ &.nextMonthDay:hover,
+ &.today:hover,
+ &.prevMonthDay:focus,
+ &.nextMonthDay:focus,
+ &.today:focus {
+ color: light.$body-color;
+ background: light.rgba-to-hex(rgba(light.$black, 0.06), light.$rgba-to-hex-bg);
+ &:not(.today) {
+ border-color: transparent;
+ }
+ }
+
+ &.prevMonthDay,
+ &.nextMonthDay,
+ &.flatpickr-disabled {
+ color: light.$text-muted !important;
+
+ &.today {
+ border: none;
+ }
+ }
+
+ &.disabled {
+ color: light.$text-muted !important;
+ }
+
+ &.selected.startRange.endRange {
+ border-radius: light.$border-radius-pill !important;
+ }
+ }
+
+ .flatpickr-weeks {
+ border-bottom: light.$dropdown-border-width solid opacify(light.$dropdown-border-color, 0.05);
+ border-left: light.$dropdown-border-width solid opacify(light.$dropdown-border-color, 0.05);
+ background: light.$card-bg;
+
+ @include light.border-bottom-radius(light.$border-radius);
+ border-bottom-right-radius: 0;
+ .flatpickr-day {
+ color: light.$headings-color;
+ }
+ }
+
+ @include app-rtl-style {
+ .flatpickr-weeks {
+ border-right: light.$dropdown-border-width solid opacify(light.$dropdown-border-color, 0.05);
+ border-left: 0;
+
+ @include light.border-bottom-radius(light.$border-radius);
+ border-bottom-left-radius: 0;
+ }
+ }
+
+ .flatpickr-time {
+ border: light.$dropdown-border-width solid opacify(light.$dropdown-border-color, 0.05);
+ background: #{light.$dropdown-bg};
+
+ @include light.border-radius(light.$border-radius);
+
+ input {
+ color: light.$body-color;
+ font-size: light.$font-size-base;
+
+ &.flatpickr-hour {
+ font-weight: light.$font-weight-medium;
+ }
+
+ &.flatpickr-minute,
+ &.flatpickr-second {
+ font-weight: light.$font-weight-medium;
+ }
+ }
+
+ .numInputWrapper span {
+ &.arrowUp:after {
+ border-bottom-color: light.$text-muted;
+ }
+
+ &.arrowDown:after {
+ border-top-color: light.$text-muted;
+ }
+ }
+
+ .flatpickr-am-pm {
+ color: light.$body-color;
+ }
+
+ .flatpickr-time-separator {
+ color: light.$body-color;
+ font-weight: light.$font-weight-medium;
+ }
+ }
+ }
+}
+
+// Dark layout
+@if $enable-dark-style {
+ .dark-style {
+ .flatpickr-calendar {
+ background: dark.$dropdown-bg;
+ }
+ .flatpickr-prev-month,
+ .flatpickr-next-month {
+ background-color: dark.rgba-to-hex(rgba(dark.$base, 0.08), dark.$card-bg);
+ svg {
+ fill: dark.$body-color;
+ stroke: dark.$body-color;
+ }
+ }
+ .flatpickr-calendar,
+ .flatpickr-days {
+ width: calc(#{$flatpickr-width} + calc(#{dark.$dropdown-border-width} * 2px)) !important;
+ }
+ @include app-ltr-style {
+ .flatpickr-calendar.hasWeeks {
+ width: calc(
+ #{$flatpickr-width + $flatpickr-cell-size} + calc(#{dark.$dropdown-border-width} * 3px) + 0.355rem
+ ) !important;
+ }
+ }
+ @include app-rtl-style {
+ .flatpickr-calendar.hasWeeks {
+ width: calc(
+ #{$flatpickr-width + $flatpickr-cell-size} + calc(#{dark.$dropdown-border-width} * 3px) + 1rem
+ ) !important;
+ }
+ }
+ .flatpickr-calendar.open {
+ z-index: light.$zindex-popover;
+ }
+
+ //! Flatpickr provide default input as readonly, applying default input style to readonly
+ .flatpickr-input:not(.is-invalid):not(.is-valid) ~ .form-control:disabled,
+ .flatpickr-input:not(.is-invalid):not(.is-valid)[readonly],
+ .flatpickr-input:not(.is-invalid):not(.is-valid) ~ .form-control[readonly] {
+ background-color: #{dark.$input-bg};
+ }
+
+ .flatpickr-days {
+ border: dark.$dropdown-border-width solid opacify(dark.$dropdown-border-color, 0.05);
+ border-top: 0;
+ padding: $flatpickr-content-padding-y $flatpickr-content-padding-x;
+ padding-bottom: $flatpickr-content-padding-x;
+ background: #{dark.$dropdown-bg};
+ background-clip: padding-box;
+
+ @include dark.border-bottom-radius(dark.$border-radius);
+ }
+
+ @include app-ltr-style {
+ .flatpickr-calendar.hasWeeks .flatpickr-days {
+ border-left: 0;
+ padding-left: calc(#{$flatpickr-content-padding-x} + #{dark.$dropdown-border-width}px);
+ box-shadow: dark.$dropdown-border-width 0 0 opacify(dark.$dropdown-border-color, 0.05) inset;
+ }
+ }
+
+ @include app-rtl-style {
+ .flatpickr-calendar.hasWeeks .flatpickr-days {
+ border-right: 0;
+ padding-right: calc(#{$flatpickr-content-padding-x} + #{dark.$dropdown-border-width}px);
+ box-shadow: -(dark.$dropdown-border-width) 0 0 opacify(dark.$dropdown-border-color, 0.05) inset;
+ }
+ }
+ .flatpickr-calendar {
+ line-height: dark.$line-height-base;
+ font-size: dark.$font-size-base;
+ box-shadow: dark.$card-box-shadow;
+ background-color: dark.$card-bg;
+
+ @include dark.border-radius(dark.$border-radius-lg);
+
+ &.hasTime:not(.noCalendar):not(.hasTime) .flatpickr-time {
+ display: none !important;
+ }
+
+ &.hasTime .flatpickr-time {
+ box-shadow: 0 1px 0 dark.$border-color inset;
+ }
+ }
+
+ .flatpickr-month,
+ span.flatpickr-weekday,
+ .flatpickr-weekdays {
+ background: dark.$dropdown-bg;
+ }
+
+ .flatpickr-month {
+ @include dark.border-top-radius(dark.$border-radius);
+ // ! FIX: OS Windows and Linux Browsers DD Option color
+ option.flatpickr-monthDropdown-month {
+ color: dark.$body-color;
+ background: #{dark.$card-bg};
+ }
+ }
+
+ .flatpickr-monthDropdown-months {
+ color: dark.$headings-color;
+ }
+ .flatpickr-current-month {
+ font-size: dark.$big-font-size;
+ color: dark.$headings-color;
+ .cur-month,
+ .cur-year {
+ font-size: dark.$font-size-base;
+ font-weight: 400;
+ color: dark.$headings-color;
+ }
+ }
+
+ span.flatpickr-weekday {
+ font-size: dark.$font-size-sm;
+ color: dark.$headings-color;
+ }
+
+ .flatpickr-day {
+ color: dark.$headings-color;
+ font-weight: dark.$font-weight-medium;
+ @include dark.border-radius(dark.$border-radius-pill);
+
+ &:hover,
+ &:focus,
+ &.nextMonthDay:hover,
+ &.prevMonthDay:hover,
+ &.today:hover,
+ &.nextMonthDay:focus,
+ &.prevMonthDay:focus,
+ &.today:focus {
+ border-color: transparent;
+ background: dark.rgba-to-hex(rgba(dark.$base, 0.08), dark.$card-bg);
+ }
+
+ &.nextMonthDay,
+ &.prevMonthDay,
+ &.flatpickr-disabled {
+ color: dark.$text-muted !important;
+
+ &.today {
+ border: 0;
+ }
+ }
+
+ &.selected.startRange.endRange {
+ border-radius: dark.$border-radius-pill !important;
+ }
+
+ &.disabled {
+ color: dark.$text-muted !important;
+ }
+ &.selected {
+ box-shadow: dark.$box-shadow-sm;
+ }
+ }
+
+ .flatpickr-weeks {
+ border-bottom: dark.$dropdown-border-width solid opacify(dark.$dropdown-border-color, 0.05);
+ border-left: dark.$dropdown-border-width solid opacify(dark.$dropdown-border-color, 0.05);
+ background: dark.$dropdown-bg;
+
+ @include dark.border-bottom-radius(dark.$border-radius);
+ border-bottom-right-radius: 0;
+ .flatpickr-day {
+ color: dark.$headings-color;
+ }
+ }
+
+ @include app-rtl-style {
+ .flatpickr-weeks {
+ border-right: dark.$dropdown-border-width solid opacify(dark.$dropdown-border-color, 0.05);
+ border-left: 0;
+ }
+ }
+
+ .flatpickr-time {
+ border: dark.$dropdown-border-width solid opacify(dark.$dropdown-border-color, 0.05);
+ background: #{dark.$dropdown-bg};
+
+ @include dark.border-radius(dark.$border-radius);
+
+ input {
+ color: dark.$body-color;
+
+ &.flatpickr-hour {
+ font-weight: dark.$font-weight-medium;
+ }
+
+ &.flatpickr-minute,
+ &.flatpickr-second {
+ font-weight: dark.$font-weight-medium;
+ }
+ }
+
+ .numInputWrapper span {
+ &.arrowUp:after {
+ border-bottom-color: dark.$text-muted;
+ }
+
+ &.arrowDown:after {
+ border-top-color: dark.$text-muted;
+ }
+ }
+
+ .flatpickr-am-pm {
+ color: dark.$body-color;
+ }
+
+ .flatpickr-time-separator {
+ color: dark.$body-color;
+ font-weight: dark.$font-weight-medium;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/fullcalendar/_mixins.scss b/resources/assets/vendor/libs/fullcalendar/_mixins.scss
new file mode 100644
index 0000000..4c40892
--- /dev/null
+++ b/resources/assets/vendor/libs/fullcalendar/_mixins.scss
@@ -0,0 +1,23 @@
+@mixin fullcalendar-theme($background, $color) {
+ .fc {
+ // FC event
+ @include bg-label-variant('.fc-event-primary:not(.fc-list-event)', $background);
+ // FC list event
+ .fc-event-primary.fc-list-event {
+ .fc-list-event-dot {
+ border-color: $background !important;
+ }
+ }
+
+ .fc-button-primary:not(.fc-prev-button):not(.fc-next-button) {
+ background-color: rgba($background, 0.16) !important;
+ border: 0;
+ color: $background;
+ &.fc-button-active,
+ &:hover {
+ background-color: rgba($background, 0.24) !important;
+ color: $background;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/fullcalendar/fullcalendar.js b/resources/assets/vendor/libs/fullcalendar/fullcalendar.js
new file mode 100644
index 0000000..64caa33
--- /dev/null
+++ b/resources/assets/vendor/libs/fullcalendar/fullcalendar.js
@@ -0,0 +1,22 @@
+import { Calendar } from '@fullcalendar/core';
+import dayGridPlugin from '@fullcalendar/daygrid';
+import interactionPlugin from '@fullcalendar/interaction';
+import listPlugin from '@fullcalendar/list';
+import timegridPlugin from '@fullcalendar/timegrid';
+
+const calendarPlugins = {
+ dayGrid: dayGridPlugin,
+ interaction: interactionPlugin,
+ list: listPlugin,
+ timeGrid: timegridPlugin
+};
+
+try {
+ window.Calendar = Calendar;
+ window.dayGridPlugin = dayGridPlugin;
+ window.interactionPlugin = interactionPlugin;
+ window.listPlugin = listPlugin;
+ window.timegridPlugin = timegridPlugin;
+} catch (e) {}
+
+export { Calendar, dayGridPlugin, interactionPlugin, listPlugin, timegridPlugin };
diff --git a/resources/assets/vendor/libs/fullcalendar/fullcalendar.scss b/resources/assets/vendor/libs/fullcalendar/fullcalendar.scss
new file mode 100644
index 0000000..3224c44
--- /dev/null
+++ b/resources/assets/vendor/libs/fullcalendar/fullcalendar.scss
@@ -0,0 +1,535 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'mixins';
+
+$fullcalendar-event-padding-y: 0.25rem !default;
+$fullcalendar-event-padding-x: 0.75rem !default;
+$fullcalendar-event-margin-top: 0.625rem !default;
+$fullcalendar-event-font-size: light.$font-size-base !default;
+$fullcalendar-event-font-weight: light.$font-weight-medium !default;
+$fullcalendar-toolbar-btn-padding: light.$input-btn-padding-y - 0.115 light.$input-btn-padding-x !default;
+$fullcalendar-fc-popover-z-index: 1090 !default;
+$fullcalendar-event-border-radius: light.$border-radius-sm !default;
+$fullcalendar-today-background-light: light.rgba-to-hex(light.$gray-50, light.$rgba-to-hex-bg) !default;
+$fullcalendar-today-background-dark: dark.rgba-to-hex(dark.$gray-50, dark.$rgba-to-hex-bg) !default;
+
+// Calendar
+.fc {
+ .fc-scrollgrid-section {
+ height: 0px;
+ }
+ a[data-navlink]:hover {
+ text-decoration: none;
+ }
+ .fc-timegrid-slot {
+ height: 4em !important;
+ }
+ .fc-timeGridWeek-view {
+ .fc-timegrid-slot-minor {
+ border-top-style: none;
+ }
+ }
+ .fc-timeGridDay-view {
+ .fc-timegrid-slot-minor {
+ border-top-style: solid;
+ }
+ }
+
+ .fc-col-header-cell-cushion {
+ padding-top: 8.7px !important;
+ padding-bottom: 8.7px !important;
+ }
+ .fc-toolbar {
+ flex-wrap: wrap;
+ .fc-prev-button,
+ .fc-next-button {
+ display: inline-block;
+ background-color: transparent;
+ border-color: transparent;
+
+ &:hover,
+ &:active,
+ &:focus {
+ background-color: transparent !important;
+ border-color: transparent !important;
+ box-shadow: none !important;
+ }
+ }
+ .fc-button {
+ border-radius: light.$border-radius;
+ &:not(.fc-next-button):not(.fc-prev-button) {
+ padding: $fullcalendar-toolbar-btn-padding;
+ &:active,
+ &:focus {
+ box-shadow: none !important ;
+ }
+ }
+ }
+ > * > :not(:first-child) {
+ margin-left: 0 !important;
+ @include app-rtl(true) {
+ margin-right: 0 !important;
+ }
+ }
+
+ .fc-toolbar-chunk {
+ display: flex;
+ align-items: center;
+ }
+
+ .fc-button-group {
+ .fc-button {
+ text-transform: capitalize;
+ }
+
+ & + div {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ }
+ }
+ .fc--button:empty,
+ .fc-toolbar-chunk:empty {
+ display: none;
+ }
+ .fc-sidebarToggle-button + div {
+ margin-left: 0;
+ }
+ }
+ table.fc-scrollgrid {
+ .fc-col-header {
+ .fc-col-header-cell {
+ border-left: none;
+ }
+ }
+ }
+ .fc-view-harness {
+ min-height: 650px;
+ .fc-col-header-cell-cushion {
+ padding-bottom: 3px;
+ padding-top: 3px;
+ }
+
+ // To remove border on weekday row
+ .fc-scrollgrid-section-header > * {
+ @include app-ltr(true) {
+ border-inline-end-width: 0px;
+ }
+ @include app-rtl(true) {
+ border-inline-start-width: 0px;
+ }
+ }
+
+ .fc-timegrid-event .fc-event-time {
+ font-size: 0.6875rem;
+ }
+
+ .fc-v-event .fc-event-title {
+ font-size: $fullcalendar-event-font-size;
+ padding-top: 0.2rem;
+ font-weight: $fullcalendar-event-font-weight;
+ }
+
+ .fc-timegrid-event .fc-event-main {
+ padding: $fullcalendar-event-padding-y $fullcalendar-event-padding-x 0;
+ }
+ }
+
+ .fc-daygrid-day-events {
+ .fc-event,
+ .fc-more-link {
+ margin-inline: 0.5rem !important;
+ }
+ }
+
+ // To fix firefox thead border issue
+ .fc-day-today {
+ background-clip: padding-box;
+ }
+
+ //! Fix: white color issue of event text
+ .fc-h-event .fc-event-main,
+ .fc-v-event .fc-event-main {
+ color: inherit !important;
+ }
+
+ .fc-daygrid-block-event .fc-event-time,
+ .fc-daygrid-dot-event .fc-event-title {
+ font-weight: $fullcalendar-event-font-weight;
+ }
+
+ .fc-daygrid-body-natural {
+ .fc-daygrid-day-events {
+ margin-top: 0.94rem !important;
+ margin-bottom: 0.94rem !important;
+ }
+ }
+
+ .fc-view-harness {
+ margin: 0 -1.5rem;
+ .fc-daygrid-body {
+ .fc-daygrid-day {
+ .fc-daygrid-day-top {
+ flex-direction: row;
+ .fc-daygrid-day-number {
+ float: left;
+ padding: 0.5rem;
+ }
+ }
+ .fc-daygrid-day-bottom .fc-daygrid-more-link {
+ margin-top: 0.625rem;
+ }
+ }
+ }
+ .fc-event {
+ font-size: $fullcalendar-event-font-size;
+ font-weight: $fullcalendar-event-font-weight;
+ padding: $fullcalendar-event-padding-y $fullcalendar-event-padding-x;
+ border-radius: $fullcalendar-event-border-radius;
+ border: 0;
+ .fc-event-title {
+ font-weight: light.$font-weight-medium;
+ }
+ }
+ .fc-daygrid-event-harness {
+ // ! week & day events are using this style for all day only, not for other events
+ .fc-event {
+ &.private-event {
+ background-color: transparent !important;
+ border-color: transparent !important;
+ }
+ }
+ }
+ .fc-event .fc-daygrid-event-dot {
+ display: none;
+ }
+ }
+ .fc-daygrid-event-harness + .fc-daygrid-event-harness .fc-daygrid-event {
+ margin-top: $fullcalendar-event-margin-top !important;
+ }
+ .fc-timegrid {
+ .fc-timegrid-divider {
+ display: none;
+ }
+ .fc-timegrid-event {
+ border-radius: 0px;
+ box-shadow: none;
+ padding-top: $fullcalendar-event-padding-x;
+ .fc-event-time {
+ font-size: inherit;
+ }
+ }
+ }
+ .fc-daygrid-event-harness-abs .fc-event {
+ margin-bottom: 0.625rem;
+ }
+ .fc-timegrid-slot-label-frame {
+ text-align: center;
+ }
+ .fc-timegrid-axis-cushion,
+ .fc-timegrid-slot-label-cushion {
+ font-size: light.$font-size-sm;
+ }
+ .fc-timegrid-axis-cushion {
+ text-transform: capitalize;
+ padding: 0.5rem 0.4375rem;
+ }
+ .fc-timegrid-slot-label-cushion {
+ text-transform: uppercase;
+ padding: $fullcalendar-event-padding-x !important;
+ }
+ .fc-list-day-cushion,
+ .fc-list-table td {
+ padding-inline: 1rem;
+ }
+ .fc-popover {
+ z-index: $fullcalendar-fc-popover-z-index !important;
+ .fc-popover-header {
+ padding: 0.566rem;
+ }
+ }
+ .fc-list {
+ .fc-list-table {
+ border-bottom: 1px solid;
+ }
+ }
+ &.fc-theme-standard {
+ .fc-list {
+ border: none;
+ }
+ }
+ .fc-day-other {
+ .fc-daygrid-day-top {
+ opacity: 1;
+ }
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .fc {
+ .fc-toolbar {
+ .fc-prev-button,
+ .fc-next-button {
+ .fc-icon {
+ color: light.$headings-color;
+ }
+ }
+ }
+ .fc-col-header-cell-cushion {
+ color: light.$headings-color;
+ }
+ &.fc-theme-standard .fc-list-day-cushion {
+ background-color: $fullcalendar-today-background-light !important;
+ }
+ table.fc-scrollgrid {
+ border-color: light.$border-color;
+ .fc-col-header {
+ tbody {
+ border: none;
+ }
+ .fc-col-header-cell {
+ border-color: light.$border-color;
+ }
+ }
+ td {
+ border-color: light.$border-color;
+ }
+ }
+ .fc-timegrid-axis-cushion {
+ color: light.$text-muted;
+ }
+ .fc-timegrid-slot-label-cushion {
+ color: light.$headings-color;
+ }
+ .private-event {
+ .fc-event-time,
+ .fc-event-title {
+ color: light.$danger;
+ }
+ }
+ .fc-day-today:not(.fc-col-header-cell) {
+ background-color: $fullcalendar-today-background-light !important;
+ .fc-popover-body {
+ background-color: light.$card-bg !important;
+ }
+ }
+
+ .fc-popover {
+ .fc-popover-header {
+ background: light.$body-bg;
+ }
+ }
+ .fc-list {
+ .fc-list-table {
+ th {
+ border: 0;
+ background: light.$body-bg;
+ }
+ .fc-list-event {
+ cursor: pointer;
+ &:hover {
+ td {
+ background-color: light.$gray-25;
+ }
+ }
+ td {
+ border-color: light.$border-color;
+ color: light.$body-color;
+ }
+ }
+ .fc-list-day {
+ th {
+ color: light.$headings-color;
+ }
+ }
+ tbody > tr:first-child th {
+ border-top: 1px solid light.$border-color;
+ }
+ }
+ .fc-list-empty {
+ background-color: light.$body-bg;
+ }
+ }
+
+ // Border color
+ table,
+ tbody,
+ thead,
+ tbody td {
+ border-color: light.$border-color;
+ }
+ .fc-day-other {
+ .fc-daygrid-day-top {
+ color: light.$text-muted;
+ }
+ }
+ }
+
+ // ? Style event here
+ @each $color, $value in light.$theme-colors {
+ // FC event
+ @include light.bg-label-variant('.fc-event-#{$color}:not(.fc-list-event)', $value);
+
+ // FC list event
+ .fc-event-#{$color}.fc-list-event {
+ .fc-list-event-dot {
+ border-color: $value !important;
+ }
+ }
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ .fc {
+ .fc-toolbar {
+ .fc-prev-button,
+ .fc-next-button {
+ .fc-icon {
+ color: dark.$headings-color;
+ }
+ }
+ .fc-sidebarToggle-button {
+ color: dark.$white;
+ }
+ }
+ .fc-col-header-cell-cushion {
+ color: dark.$headings-color;
+ }
+ &.fc-theme-standard .fc-list-day-cushion {
+ background-color: $fullcalendar-today-background-dark !important;
+ }
+ .fc-timegrid-axis-cushion {
+ color: dark.$text-muted;
+ }
+ .fc-timegrid-slot-label-cushion {
+ color: dark.$headings-color;
+ }
+
+ table.fc-scrollgrid {
+ border-color: dark.$border-color;
+ .fc-col-header {
+ tbody {
+ border: none;
+ }
+ .fc-col-header-cell {
+ border-color: dark.$border-color;
+ }
+ }
+ td {
+ border-color: dark.$border-color;
+ }
+ }
+ .private-event {
+ .fc-event-time,
+ .fc-event-title {
+ color: dark.$danger;
+ }
+ }
+
+ .fc-day-today:not(.fc-col-header-cell) {
+ background-color: $fullcalendar-today-background-dark !important;
+ .fc-popover-body {
+ background-color: dark.$card-bg !important;
+ }
+ }
+ .fc-divider {
+ background: dark.$border-color;
+ border-color: dark.$border-color;
+ }
+ .fc-popover {
+ background-color: dark.$body-bg;
+ border: 0;
+
+ .fc-popover-header {
+ background-color: dark.$light;
+ }
+ }
+
+ .fc-list {
+ .fc-list-table {
+ th {
+ border: 0;
+ background: dark.$body-bg;
+ }
+ .fc-list-event {
+ cursor: pointer;
+ &:hover {
+ td {
+ background-color: dark.$gray-50;
+ }
+ }
+ td {
+ border-color: dark.$border-color;
+ color: dark.$body-color;
+ }
+ }
+ .fc-list-day {
+ th {
+ color: dark.$headings-color;
+ }
+ }
+ tbody > tr:first-child th {
+ border-top: 1px solid dark.$border-color;
+ }
+ }
+ .fc-list-empty {
+ background-color: dark.$body-bg;
+ }
+ }
+ table,
+ .fc-timegrid-axis,
+ tbody,
+ thead,
+ tbody td {
+ border-color: dark.$border-color;
+ }
+
+ // FC day
+ .fc-timegrid-axis-cushion.fc-scrollgrid-shrink-cushion {
+ color: dark.$text-muted;
+ }
+
+ // FC table list disabled bg
+ .fc-day-disabled {
+ background-color: rgba(dark.$base, 0.16);
+ }
+ .fc-day-other {
+ .fc-daygrid-day-top {
+ color: dark.$text-muted;
+ }
+ }
+ }
+ // ? Style event here
+ @each $color, $value in dark.$theme-colors {
+ // FC event
+ @include dark.bg-label-variant('.fc-event-#{$color}:not(.fc-list-event)', $value);
+ .fc-event-#{$color}:not(.fc-list-event) {
+ box-shadow: none;
+ }
+
+ // FC list event
+ .fc-event-#{$color}.fc-list-event {
+ .fc-list-event-dot {
+ border-color: $value !important;
+ }
+ }
+ }
+ }
+}
+
+// Media Queries
+@include light.media-breakpoint-down(sm) {
+ .fc {
+ .fc-header-toolbar {
+ .fc-toolbar-chunk + .fc-toolbar-chunk {
+ margin-top: 1rem;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/hammer/hammer.js b/resources/assets/vendor/libs/hammer/hammer.js
new file mode 100644
index 0000000..b358dd4
--- /dev/null
+++ b/resources/assets/vendor/libs/hammer/hammer.js
@@ -0,0 +1 @@
+import 'hammerjs/hammer.js';
diff --git a/resources/assets/vendor/libs/jquery-timepicker/_mixins.scss b/resources/assets/vendor/libs/jquery-timepicker/_mixins.scss
new file mode 100644
index 0000000..19d71bb
--- /dev/null
+++ b/resources/assets/vendor/libs/jquery-timepicker/_mixins.scss
@@ -0,0 +1,11 @@
+@import '../../scss/_bootstrap-extended/_functions';
+
+@mixin timepicker-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ li.ui-timepicker-selected,
+ .ui-timepicker-list .ui-timepicker-selected:hover {
+ color: $color !important;
+ background: $background !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js b/resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js
new file mode 100644
index 0000000..3b42569
--- /dev/null
+++ b/resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js
@@ -0,0 +1 @@
+import 'timepicker/jquery.timepicker';
diff --git a/resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss b/resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss
new file mode 100644
index 0000000..5b8e917
--- /dev/null
+++ b/resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss
@@ -0,0 +1,116 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+.ui-timepicker-wrapper {
+ max-height: 10rem;
+ overflow-y: auto;
+ margin: 0.125rem 0;
+ background: light.$white;
+ background-clip: padding-box;
+ outline: none;
+}
+
+.ui-timepicker-list {
+ list-style: none;
+ padding: 0.125rem 0;
+ margin: 0;
+}
+
+.ui-timepicker-duration {
+ margin-left: 0.25rem;
+
+ @include app-rtl {
+ margin-left: 0;
+ margin-right: 0.25rem;
+ }
+}
+
+.ui-timepicker-list li {
+ padding: 0.25rem 0.75rem;
+ margin: 0.125rem 0.875rem;
+ white-space: nowrap;
+ cursor: pointer;
+ list-style: none;
+ border-radius: light.$dropdown-border-radius;
+
+ &.ui-timepicker-disabled,
+ &.ui-timepicker-selected.ui-timepicker-disabled {
+ background: light.$white !important;
+ cursor: default !important;
+ }
+}
+
+@if $enable-light-style {
+ .light-style {
+ .ui-timepicker-wrapper {
+ padding: light.$dropdown-padding-y;
+ z-index: light.$zindex-popover;
+ background: light.$dropdown-bg;
+ box-shadow: light.$card-box-shadow;
+ border: light.$dropdown-border-width solid light.$dropdown-border-color;
+
+ @include light.border-radius(light.$border-radius);
+ }
+
+ .ui-timepicker-list li {
+ color: light.$dropdown-link-color;
+
+ &:hover {
+ background: light.$dropdown-link-hover-bg;
+ }
+ &:not(.ui-timepicker-selected) {
+ .ui-timepicker-duration {
+ color: light.$text-muted;
+
+ .ui-timepicker-list:hover & {
+ color: light.$text-muted;
+ }
+ }
+ }
+ }
+
+ .ui-timepicker-list li.ui-timepicker-disabled,
+ .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
+ background: light.$dropdown-bg !important;
+ color: light.$dropdown-link-disabled-color !important;
+ }
+ }
+}
+
+@if $enable-dark-style {
+ .dark-style {
+ .ui-timepicker-wrapper {
+ border: dark.$dropdown-border-width solid dark.$dropdown-border-color;
+ padding: dark.$dropdown-padding-y 0;
+ z-index: dark.$zindex-popover;
+ background: dark.$dropdown-bg;
+ box-shadow: dark.$card-box-shadow;
+
+ @include dark.border-radius(dark.$border-radius);
+ }
+
+ .ui-timepicker-list li {
+ color: dark.$dropdown-link-color;
+
+ &:hover {
+ background: dark.$dropdown-link-hover-bg;
+ }
+ &:not(.ui-timepicker-selected) {
+ .ui-timepicker-duration {
+ color: dark.$text-muted;
+
+ .ui-timepicker-list:hover & {
+ color: dark.$text-muted;
+ }
+ }
+ }
+ }
+
+ .ui-timepicker-list li.ui-timepicker-disabled,
+ .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
+ color: dark.$dropdown-link-disabled-color !important;
+ background: dark.$dropdown-bg !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/jquery/jquery.js b/resources/assets/vendor/libs/jquery/jquery.js
new file mode 100644
index 0000000..2df0597
--- /dev/null
+++ b/resources/assets/vendor/libs/jquery/jquery.js
@@ -0,0 +1,8 @@
+import jQuery from 'jquery/dist/jquery';
+
+const $ = jQuery;
+try {
+ window.jQuery = window.$ = jQuery;
+} catch (e) {}
+
+export { jQuery, $ };
diff --git a/resources/assets/vendor/libs/leaflet/images/layers-2x.png b/resources/assets/vendor/libs/leaflet/images/layers-2x.png
new file mode 100644
index 0000000..200c333
Binary files /dev/null and b/resources/assets/vendor/libs/leaflet/images/layers-2x.png differ
diff --git a/resources/assets/vendor/libs/leaflet/images/layers.png b/resources/assets/vendor/libs/leaflet/images/layers.png
new file mode 100644
index 0000000..1a72e57
Binary files /dev/null and b/resources/assets/vendor/libs/leaflet/images/layers.png differ
diff --git a/resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png b/resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png
new file mode 100644
index 0000000..88f9e50
Binary files /dev/null and b/resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png differ
diff --git a/resources/assets/vendor/libs/leaflet/images/marker-icon.png b/resources/assets/vendor/libs/leaflet/images/marker-icon.png
new file mode 100644
index 0000000..950edf2
Binary files /dev/null and b/resources/assets/vendor/libs/leaflet/images/marker-icon.png differ
diff --git a/resources/assets/vendor/libs/leaflet/images/marker-shadow.png b/resources/assets/vendor/libs/leaflet/images/marker-shadow.png
new file mode 100644
index 0000000..9fd2979
Binary files /dev/null and b/resources/assets/vendor/libs/leaflet/images/marker-shadow.png differ
diff --git a/resources/assets/vendor/libs/leaflet/leaflet.js b/resources/assets/vendor/libs/leaflet/leaflet.js
new file mode 100644
index 0000000..6d76387
--- /dev/null
+++ b/resources/assets/vendor/libs/leaflet/leaflet.js
@@ -0,0 +1,19 @@
+import leaFlet from 'leaflet';
+
+import markerIcon2x from 'leaflet/dist/images/marker-icon-2x.png';
+import markerIcon from 'leaflet/dist/images/marker-icon.png';
+import markerShadow from 'leaflet/dist/images/marker-shadow.png';
+
+delete leaFlet.Icon.Default.prototype._getIconUrl;
+
+leaFlet.Icon.Default.mergeOptions({
+ iconRetinaUrl: markerIcon2x,
+ iconUrl: markerIcon,
+ shadowUrl: markerShadow
+});
+
+try {
+ window.leaFlet = leaFlet;
+} catch (e) {}
+
+export { leaFlet };
diff --git a/resources/assets/vendor/libs/leaflet/leaflet.scss b/resources/assets/vendor/libs/leaflet/leaflet.scss
new file mode 100644
index 0000000..a8ee3e3
--- /dev/null
+++ b/resources/assets/vendor/libs/leaflet/leaflet.scss
@@ -0,0 +1,46 @@
+@import '../../scss/_bootstrap-extended/include';
+@import '../../scss/_custom-variables/libs';
+@import 'leaflet/dist/leaflet';
+
+.leaflet-map {
+ height: 400px;
+}
+
+.leaflet-pane {
+ z-index: 1;
+}
+
+// RTL
+
+@include app-rtl(false) {
+ .leaflet-map {
+ .leaflet-control-container {
+ .leaflet-left {
+ right: 0;
+ left: unset;
+ .leaflet-control-zoom,
+ .leaflet-control-layers {
+ margin-left: 0;
+ margin-right: 10px;
+ }
+ }
+ .leaflet-right {
+ left: 0;
+ right: unset;
+ .leaflet-control-zoom,
+ .leaflet-control-layers {
+ margin-left: 10px;
+ margin-right: 0px;
+ }
+ }
+ }
+ }
+}
+
+//Map tooltip border radius
+
+.leaflet-popup {
+ .leaflet-popup-content-wrapper {
+ border-radius: $border-radius;
+ }
+}
diff --git a/resources/assets/vendor/libs/moment/moment.js b/resources/assets/vendor/libs/moment/moment.js
new file mode 100644
index 0000000..7ab3937
--- /dev/null
+++ b/resources/assets/vendor/libs/moment/moment.js
@@ -0,0 +1,7 @@
+import moment from 'moment/moment';
+
+try {
+ window.moment = moment;
+} catch (e) {}
+
+export { moment };
diff --git a/resources/assets/vendor/libs/node-waves/node-waves.js b/resources/assets/vendor/libs/node-waves/node-waves.js
new file mode 100644
index 0000000..4fcc263
--- /dev/null
+++ b/resources/assets/vendor/libs/node-waves/node-waves.js
@@ -0,0 +1,3 @@
+import nodeWaves from 'node-waves/src/js/waves';
+
+window.Waves = nodeWaves;
diff --git a/resources/assets/vendor/libs/node-waves/node-waves.scss b/resources/assets/vendor/libs/node-waves/node-waves.scss
new file mode 100644
index 0000000..ba09b71
--- /dev/null
+++ b/resources/assets/vendor/libs/node-waves/node-waves.scss
@@ -0,0 +1,4 @@
+// Waves
+// *******************************************************************************
+
+@import 'node-waves/src/scss/waves';
diff --git a/resources/assets/vendor/libs/nouislider/_mixins.scss b/resources/assets/vendor/libs/nouislider/_mixins.scss
new file mode 100644
index 0000000..db7d2cf
--- /dev/null
+++ b/resources/assets/vendor/libs/nouislider/_mixins.scss
@@ -0,0 +1,26 @@
+@mixin nouislider-variant($parent, $background) {
+ #{$parent}.noUi-target {
+ // If slider is not disabled
+ &:not([disabled]) {
+ background: rgba($background, 0.16);
+ .noUi-connect {
+ background: $background;
+ }
+
+ .noUi-handle {
+ border-color: $background;
+ &:hover {
+ box-shadow: 0 0 0 8px rgba($background, 0.16);
+ }
+ &:active,
+ &:focus {
+ box-shadow: 0 0 0 13px rgba($background, 0.16);
+ }
+ }
+ }
+ }
+}
+
+@mixin nouislider-theme($background) {
+ @include nouislider-variant('', $background);
+}
diff --git a/resources/assets/vendor/libs/nouislider/nouislider.js b/resources/assets/vendor/libs/nouislider/nouislider.js
new file mode 100644
index 0000000..73b3a45
--- /dev/null
+++ b/resources/assets/vendor/libs/nouislider/nouislider.js
@@ -0,0 +1,7 @@
+import noUiSlider from 'nouislider';
+
+try {
+ window.noUiSlider = noUiSlider;
+} catch (e) {}
+
+export { noUiSlider };
diff --git a/resources/assets/vendor/libs/nouislider/nouislider.scss b/resources/assets/vendor/libs/nouislider/nouislider.scss
new file mode 100644
index 0000000..99588ce
--- /dev/null
+++ b/resources/assets/vendor/libs/nouislider/nouislider.scss
@@ -0,0 +1,398 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import 'nouislider/dist/nouislider';
+@import '../../scss/_custom-variables/libs';
+@import 'mixins';
+
+$noUiSlider-handle-color: #fff !default;
+$noUiSlider-handle-width: 1.375rem !default;
+$noUiSlider-handle-height: 1.375rem !default;
+$noUiSlider-bar-height: 0.375rem !default;
+$noUiSlider-vertical-height: 13.125rem !default;
+$noUiSlider-tick-size: 0.5rem !default;
+$noUiSlider-tick-label-font-size: light.$font-size-sm !default;
+
+.noUi-target {
+ direction: ltr !important;
+ position: relative;
+ border-width: 0;
+ box-shadow: none;
+}
+
+.noUi-target,
+.noUi-target * {
+ touch-action: none;
+ user-select: none;
+ box-sizing: border-box;
+}
+
+.noUi-connects {
+ height: $noUiSlider-bar-height;
+ border-radius: light.$border-radius-pill;
+}
+
+.noUi-base,
+.noUi-connects {
+ z-index: 1;
+ position: relative;
+ height: 100%;
+ width: 100%;
+}
+
+.noUi-horizontal .noUi-origin {
+ height: 0;
+
+ @include app-ltr {
+ left: auto;
+ right: 0;
+ }
+}
+
+.noUi-vertical .noUi-origin {
+ width: 0;
+}
+
+.noUi-handle {
+ backface-visibility: hidden;
+ outline: none !important;
+ position: absolute;
+ box-shadow: none;
+ border: none;
+ transition: all 0.2s;
+ border: 4px solid;
+ background: #fff;
+ &:before,
+ &:after {
+ display: none;
+ }
+}
+
+.noUi-touch-area {
+ height: 100%;
+ width: 100%;
+}
+
+.noUi-state-tap .noUi-connect,
+.noUi-state-tap .noUi-origin {
+ transition:
+ top 0.3s,
+ right 0.3s,
+ bottom 0.3s,
+ left 0.3s;
+}
+
+.noUi-state-drag * {
+ cursor: inherit !important;
+}
+
+// Slider size and handle placement
+
+.noUi-horizontal {
+ height: $noUiSlider-bar-height;
+ margin-bottom: 3rem;
+ margin-top: 1.5rem;
+}
+
+.noUi-horizontal .noUi-handle {
+ left: -($noUiSlider-handle-width * 0.5);
+ width: $noUiSlider-handle-width;
+ height: $noUiSlider-handle-height;
+ top: ($noUiSlider-bar-height - $noUiSlider-handle-height) * 0.5;
+
+ @include app-ltr {
+ right: -($noUiSlider-handle-width * 0.5);
+ left: auto;
+ }
+}
+
+.noUi-vertical {
+ width: $noUiSlider-bar-height;
+}
+
+.noUi-vertical .noUi-handle {
+ bottom: -($noUiSlider-handle-height);
+ width: $noUiSlider-handle-height;
+ height: $noUiSlider-handle-width;
+ right: ($noUiSlider-bar-height - $noUiSlider-handle-height) * 0.5;
+}
+
+// Styling
+.noUi-target {
+ border-radius: 10rem;
+}
+
+// Handles and cursors
+.noUi-draggable {
+ cursor: ew-resize;
+}
+
+.noUi-vertical .noUi-draggable {
+ cursor: ns-resize;
+}
+
+.noUi-handle {
+ border-radius: 10rem;
+ background: $noUiSlider-handle-color;
+ cursor: pointer;
+}
+
+// Disabled state
+.noUi-target[disabled] {
+ opacity: 0.45;
+}
+
+[disabled] .noUi-handle {
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05);
+}
+
+[disabled].noUi-target,
+[disabled].noUi-handle,
+[disabled] .noUi-handle {
+ cursor: not-allowed;
+}
+
+// Base
+.noUi-pips,
+.noUi-pips * {
+ box-sizing: border-box;
+}
+
+.noUi-pips {
+ color: #999;
+ position: absolute;
+}
+
+// Values
+.noUi-value {
+ position: absolute;
+ white-space: nowrap;
+ text-align: center;
+ font-size: $noUiSlider-tick-label-font-size;
+}
+
+// Markings
+.noUi-marker {
+ position: absolute;
+}
+
+// Horizontal layout
+.noUi-pips-horizontal {
+ left: 0;
+ top: 100%;
+ padding: (($noUiSlider-handle-height - $noUiSlider-bar-height) * 0.5 + 0.375rem) 0 0 0;
+ height: 5rem;
+ width: 100%;
+}
+
+.noUi-value-horizontal {
+ padding-top: 0.125rem;
+ transform: translate(-50%, 50%);
+
+ @include app-rtl {
+ transform: translate(50%, 50%);
+ }
+}
+
+.noUi-marker-horizontal.noUi-marker {
+ height: $noUiSlider-tick-size;
+ width: 1px;
+}
+
+@include app-rtl(false) {
+ .noUi-horizontal {
+ .noUi-origin {
+ left: 0;
+ }
+ }
+}
+
+// Vertical layout
+.noUi-pips-vertical {
+ top: 0;
+ left: 100%;
+ padding: 0 0 0 (($noUiSlider-handle-height - $noUiSlider-bar-height) * 0.5 + 0.375rem);
+ height: 100%;
+
+ @include app-rtl {
+ right: 100%;
+ left: auto;
+ }
+}
+
+.noUi-value-vertical {
+ padding-left: $noUiSlider-tick-size + 0.375rem;
+ transform: translate(0, 50%);
+
+ @include app-rtl {
+ right: 100%;
+ padding-right: $noUiSlider-tick-size + 0.375rem;
+ padding-left: 0;
+ }
+}
+
+@include app-rtl(false) {
+ .noUi-marker-vertical {
+ right: 100%;
+ }
+}
+
+.noUi-marker-vertical.noUi-marker {
+ width: $noUiSlider-tick-size;
+ height: 1px;
+}
+
+// Tooltips
+.noUi-tooltip {
+ position: absolute;
+ display: block;
+ padding: 0.25rem 0.5rem;
+ border-radius: 0.25rem;
+ text-align: center;
+ line-height: 1;
+ transition: transform 0.2s;
+ &::after {
+ content: '';
+ position: absolute;
+ width: 0;
+ height: 0;
+ clear: both;
+ }
+}
+
+.noUi-horizontal .noUi-tooltip {
+ bottom: 125%;
+ left: 50%;
+ transform: translate(-50%, -45%);
+ &::after {
+ content: '';
+ left: 50%;
+ transform: translateX(-50%);
+ top: 1.25rem;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ }
+}
+
+.noUi-vertical .noUi-tooltip {
+ top: 50%;
+ right: 125%;
+ transform: translate(-15%, -52%);
+
+ &::after {
+ content: '';
+ top: 14%;
+ right: -5px;
+ border-top: 8px solid transparent;
+ border-bottom: 8px solid transparent;
+ @include app-rtl {
+ left: -14px;
+ right: auto;
+ }
+ }
+
+ @include app-rtl {
+ right: auto;
+ left: 125%;
+ transform: translate(15%, -52%);
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ $noUiSlider-default-bg: light.$gray-400;
+ $noUiSlider-tick-label-color: light.$text-light;
+ .noUi-target {
+ .noUi-handle {
+ box-shadow: light.$form-range-thumb-box-shadow;
+ }
+ }
+
+ .noUi-value {
+ color: $noUiSlider-tick-label-color;
+ }
+ .noUi-marker {
+ background: $noUiSlider-tick-label-color;
+ }
+
+ .noUi-tooltip {
+ font-size: light.$small-font-size;
+ color: light.$tooltip-color;
+ border: none;
+ background: light.$tooltip-bg;
+ }
+ .noUi-horizontal .noUi-tooltip {
+ &::after {
+ border-top: 8px solid light.$tooltip-bg;
+ }
+ }
+ .noUi-vertical .noUi-tooltip {
+ &::after {
+ border-left: 8px solid light.$tooltip-bg;
+ }
+ }
+ @include app-rtl-style {
+ .noUi-vertical .noUi-tooltip {
+ &::after {
+ border-right: 8px solid light.$tooltip-bg;
+ border-left: 8px solid transparent;
+ }
+ }
+ }
+
+ @each $color, $value in light.$theme-colors {
+ @if $color !=primary {
+ @include nouislider-variant('.noUi-#{$color}', $value);
+ }
+ }
+ }
+}
+
+@if $enable-dark-style {
+ .dark-style {
+ $noUiSlider-default-bg: dark.$gray-400;
+ $noUiSlider-tick-label-color: dark.$text-light;
+ .noUi-target {
+ .noUi-handle {
+ box-shadow: dark.$form-range-thumb-box-shadow;
+ }
+ }
+
+ .noUi-value {
+ color: $noUiSlider-tick-label-color;
+ }
+ .noUi-marker {
+ background: $noUiSlider-tick-label-color;
+ }
+
+ .noUi-tooltip {
+ font-size: dark.$small-font-size;
+ color: dark.$tooltip-color;
+ border: none;
+ background: dark.$tooltip-bg;
+ }
+ .noUi-horizontal .noUi-tooltip {
+ &::after {
+ border-top: 8px solid dark.$tooltip-bg;
+ }
+ }
+ .noUi-vertical .noUi-tooltip {
+ &::after {
+ border-left: 8px solid dark.$tooltip-bg;
+ }
+ }
+ @include app-rtl-style {
+ .noUi-vertical .noUi-tooltip {
+ &::after {
+ border-right: 8px solid dark.$tooltip-bg;
+ border-left: 8px solid transparent;
+ }
+ }
+ }
+ @each $color, $value in dark.$theme-colors {
+ @if $color !=primary {
+ @include nouislider-variant('.noUi-#{$color}', $value);
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js b/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js
new file mode 100644
index 0000000..80556c6
--- /dev/null
+++ b/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js
@@ -0,0 +1,7 @@
+import PerfectScrollbar from 'perfect-scrollbar/dist/perfect-scrollbar';
+
+try {
+ window.PerfectScrollbar = PerfectScrollbar;
+} catch (e) {}
+
+export { PerfectScrollbar };
diff --git a/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.scss b/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.scss
new file mode 100644
index 0000000..da4a4a8
--- /dev/null
+++ b/resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.scss
@@ -0,0 +1,177 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'perfect-scrollbar/css/perfect-scrollbar';
+
+$ps-width: 0.25rem !default;
+$ps-hover-width: 0.375rem !default;
+
+.ps {
+ position: relative;
+}
+
+.ps__rail-x {
+ height: $ps-width;
+}
+
+.ps__rail-y {
+ width: $ps-width;
+ z-index: 3;
+}
+
+.ps__rail-x,
+.ps__rail-y,
+.ps__thumb-x,
+.ps__thumb-y {
+ border-radius: 10rem;
+}
+.ps__rail-x:hover,
+.ps__rail-x:focus,
+.ps__rail-x.ps--clicking,
+.ps__rail-x:hover > .ps__thumb-x,
+.ps__rail-x:focus > .ps__thumb-x,
+.ps__rail-x.ps--clicking > .ps__thumb-x {
+ height: $ps-hover-width;
+}
+
+.ps__rail-y:hover,
+.ps__rail-y:focus,
+.ps__rail-y.ps--clicking,
+.ps__rail-y:hover > .ps__thumb-y,
+.ps__rail-y:focus > .ps__thumb-y,
+.ps__rail-y.ps--clicking > .ps__thumb-y {
+ width: $ps-hover-width;
+}
+
+.ps__thumb-x {
+ height: $ps-width;
+ bottom: 0;
+}
+
+.ps__thumb-y {
+ width: $ps-width;
+ right: 0;
+}
+
+// Light layout
+@if $enable-light-style {
+ .light-style {
+ .ps__thumb-x,
+ .ps__thumb-y {
+ background-color: light.$gray-400;
+ }
+
+ .ps__rail-x:hover,
+ .ps__rail-y:hover,
+ .ps__rail-x:focus,
+ .ps__rail-y:focus,
+ .ps__rail-x.ps--clicking,
+ .ps__rail-y.ps--clicking {
+ background-color: light.$gray-200;
+ }
+
+ .ps__rail-x:hover > .ps__thumb-x,
+ .ps__rail-y:hover > .ps__thumb-y,
+ .ps__rail-x:focus > .ps__thumb-x,
+ .ps__rail-y:focus > .ps__thumb-y,
+ .ps__rail-x.ps--clicking > .ps__thumb-x,
+ .ps__rail-y.ps--clicking > .ps__thumb-y {
+ background-color: light.$gray-700;
+ }
+
+ .ps-inverted {
+ .ps__rail-x:hover,
+ .ps__rail-y:hover,
+ .ps__rail-x:focus,
+ .ps__rail-y:focus,
+ .ps__rail-x.ps--clicking,
+ .ps__rail-y.ps--clicking {
+ background-color: rgba(light.$white, 0.5);
+ }
+
+ .ps__thumb-x,
+ .ps__thumb-y {
+ background-color: rgba(light.$white, 0.7);
+ }
+
+ .ps__rail-x:hover > .ps__thumb-x,
+ .ps__rail-y:hover > .ps__thumb-y,
+ .ps__rail-x:focus > .ps__thumb-x,
+ .ps__rail-y:focus > .ps__thumb-y,
+ .ps__rail-x.ps--clicking > .ps__thumb-x,
+ .ps__rail-y.ps--clicking > .ps__thumb-y {
+ background-color: light.$white;
+ }
+ }
+ }
+}
+
+// Firefox width issue fixed
+@supports (-moz-appearance: none) {
+ #both-scrollbars-example {
+ max-width: 1080px;
+ margin: 0 auto;
+ padding-left: 0;
+ padding-right: 0;
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ .ps__thumb-x,
+ .ps__thumb-y {
+ background-color: rgba(255, 255, 255, 0.438133) !important;
+ }
+
+ .ps__rail-x:hover,
+ .ps__rail-y:hover,
+ .ps__rail-x:focus,
+ .ps__rail-y:focus,
+ .ps__rail-x.ps--clicking,
+ .ps__rail-y.ps--clicking {
+ background-color: rgba(255, 255, 255, 0.438133) !important;
+ }
+
+ .ps__rail-x:hover > .ps__thumb-x,
+ .ps__rail-y:hover > .ps__thumb-y,
+ .ps__rail-x:focus > .ps__thumb-x,
+ .ps__rail-y:focus > .ps__thumb-y,
+ .ps__rail-x.ps--clicking > .ps__thumb-x,
+ .ps__rail-y.ps--clicking > .ps__thumb-y {
+ background-color: dark.$gray-700;
+ }
+
+ .ps-inverted {
+ .ps__rail-x:hover,
+ .ps__rail-y:hover,
+ .ps__rail-x:focus,
+ .ps__rail-y:focus,
+ .ps__rail-x.ps--clicking,
+ .ps__rail-y.ps--clicking {
+ background-color: rgba(light.$white, 0.5);
+ }
+
+ .ps__thumb-x,
+ .ps__thumb-y {
+ background-color: rgba(light.$white, 0.7);
+ }
+
+ .ps__rail-x:hover > .ps__thumb-x,
+ .ps__rail-y:hover > .ps__thumb-y,
+ .ps__rail-x:focus > .ps__thumb-x,
+ .ps__rail-y:focus > .ps__thumb-y,
+ .ps__rail-x.ps--clicking > .ps__thumb-x,
+ .ps__rail-y.ps--clicking > .ps__thumb-y {
+ background-color: light.$white;
+ }
+ }
+ }
+}
+// RTL rail-y position
+.ps--active-y > .ps__rail-y {
+ @include app-rtl {
+ left: 0;
+ right: unset !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/pickr/_mixins.scss b/resources/assets/vendor/libs/pickr/_mixins.scss
new file mode 100644
index 0000000..8da073b
--- /dev/null
+++ b/resources/assets/vendor/libs/pickr/_mixins.scss
@@ -0,0 +1,11 @@
+@import '../../scss/_custom-variables/libs';
+
+// Background & Primary color for picker
+@mixin colorPicker-theme($background) {
+ .pcr-app {
+ .pcr-type.active,
+ .pcr-save {
+ background: $background !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/pickr/_pickr-classic.scss b/resources/assets/vendor/libs/pickr/_pickr-classic.scss
new file mode 100644
index 0000000..68d7429
--- /dev/null
+++ b/resources/assets/vendor/libs/pickr/_pickr-classic.scss
@@ -0,0 +1,15 @@
+@import '@simonwep/pickr/dist/themes/classic.min';
+@import '../../scss/_custom-variables/libs';
+
+@include app-rtl(false) {
+ .pcr-app[data-theme='classic'] .pcr-selection .pcr-color-preview {
+ margin-right: inherit;
+ margin-left: 0.75em;
+ }
+
+ .pcr-app[data-theme='classic'] .pcr-selection .pcr-color-chooser,
+ .pcr-app[data-theme='classic'] .pcr-selection .pcr-color-opacity {
+ margin-left: inherit;
+ margin-right: 0.75em;
+ }
+}
diff --git a/resources/assets/vendor/libs/pickr/_pickr-monolith.scss b/resources/assets/vendor/libs/pickr/_pickr-monolith.scss
new file mode 100644
index 0000000..63ecab7
--- /dev/null
+++ b/resources/assets/vendor/libs/pickr/_pickr-monolith.scss
@@ -0,0 +1,10 @@
+@import '@simonwep/pickr/dist/themes/monolith.min';
+
+@include app-rtl(false) {
+ .pcr-app[data-theme='monolith'] .pcr-selection .pcr-color-preview .pcr-last-color {
+ border-radius: 0 0.15em 0.15em 0;
+ }
+ .pcr-app[data-theme='monolith'] .pcr-selection .pcr-color-preview .pcr-current-color {
+ border-radius: 0.15em 0 0 0.15em;
+ }
+}
diff --git a/resources/assets/vendor/libs/pickr/_pickr-nano.scss b/resources/assets/vendor/libs/pickr/_pickr-nano.scss
new file mode 100644
index 0000000..c03bed5
--- /dev/null
+++ b/resources/assets/vendor/libs/pickr/_pickr-nano.scss
@@ -0,0 +1,7 @@
+@import '@simonwep/pickr/dist/themes/nano.min';
+
+@include app-rtl(false) {
+ .pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview {
+ margin-right: 0.6em;
+ }
+}
diff --git a/resources/assets/vendor/libs/pickr/pickr-themes.scss b/resources/assets/vendor/libs/pickr/pickr-themes.scss
new file mode 100644
index 0000000..aeb2034
--- /dev/null
+++ b/resources/assets/vendor/libs/pickr/pickr-themes.scss
@@ -0,0 +1,39 @@
+// Pickr
+// *******************************************************************************
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+@import 'pickr-classic';
+@import 'pickr-monolith';
+@import 'pickr-nano';
+@import 'mixins';
+
+@if $enable-light-style {
+ .light-style {
+ .pcr-app {
+ .pcr-interaction input:focus {
+ box-shadow: light.$box-shadow;
+ }
+ }
+ }
+}
+
+// Dark style for pickr
+@if $enable-dark-style {
+ .dark-style {
+ .pcr-app {
+ background: dark.$card-bg !important;
+
+ .pcr-type:not(.active),
+ .pcr-result {
+ background: dark.$dropdown-bg !important;
+ color: dark.$white !important;
+ }
+ .pcr-interaction input:focus {
+ box-shadow: dark.$box-shadow;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/pickr/pickr.js b/resources/assets/vendor/libs/pickr/pickr.js
new file mode 100644
index 0000000..fb3b52f
--- /dev/null
+++ b/resources/assets/vendor/libs/pickr/pickr.js
@@ -0,0 +1,7 @@
+import pickr from '@simonwep/pickr/dist/pickr.es5.min';
+
+try {
+ window.pickr = pickr;
+} catch (e) {}
+
+export { pickr };
diff --git a/resources/assets/vendor/libs/plyr/_mixins.scss b/resources/assets/vendor/libs/plyr/_mixins.scss
new file mode 100644
index 0000000..c4aa97e
--- /dev/null
+++ b/resources/assets/vendor/libs/plyr/_mixins.scss
@@ -0,0 +1,52 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+// Light style
+@mixin plyr-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .plyr input[type='range']::-ms-fill-lower {
+ background: $background !important;
+ }
+
+ .plyr input[type='range']:active {
+ &::-webkit-slider-thumb {
+ background: $background !important;
+ }
+ &::-moz-range-thumb {
+ background: $background !important;
+ }
+ &::-ms-thumb {
+ background: $background !important;
+ }
+ }
+ .plyr--video .plyr__control.plyr__control--overlaid,
+ .plyr--video .plyr__controls button.tab-focus:focus,
+ .plyr--video .plyr__control[aria-expanded='true'],
+ .plyr--video .plyr__controls button:hover {
+ background: $background !important;
+ color: $color !important;
+ }
+
+ .plyr--audio .plyr__controls button.tab-focus:focus,
+ .plyr--audio .plyr__control[aria-expanded='true'],
+ .plyr--audio .plyr__controls button:hover {
+ background: $background !important;
+ color: $color !important;
+ }
+
+ .plyr__play-large {
+ background: $background !important;
+ color: $color !important;
+ }
+
+ .plyr__progress--played,
+ .plyr__volume--display {
+ color: $background !important;
+ }
+ .plyr--full-ui input[type='range'] {
+ color: $background !important;
+ }
+ .plyr__menu__container .plyr__control[role='menuitemradio'][aria-checked='true']::before {
+ background: $background !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/plyr/plyr.js b/resources/assets/vendor/libs/plyr/plyr.js
new file mode 100644
index 0000000..018283e
--- /dev/null
+++ b/resources/assets/vendor/libs/plyr/plyr.js
@@ -0,0 +1,7 @@
+import Plyr from 'plyr';
+
+try {
+ window.Plyr = Plyr;
+} catch (e) {}
+
+export { Plyr };
diff --git a/resources/assets/vendor/libs/plyr/plyr.scss b/resources/assets/vendor/libs/plyr/plyr.scss
new file mode 100644
index 0000000..441d93a
--- /dev/null
+++ b/resources/assets/vendor/libs/plyr/plyr.scss
@@ -0,0 +1,132 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+// Variables
+@import 'plyr/src/sass/settings/breakpoints';
+@import 'plyr/src/sass/settings/colors';
+@import 'plyr/src/sass/settings/cosmetics';
+@import 'plyr/src/sass/settings/type';
+@import 'plyr/src/sass/settings/badges';
+@import 'plyr/src/sass/settings/captions';
+@import 'plyr/src/sass/settings/controls';
+@import 'plyr/src/sass/settings/helpers';
+@import 'plyr/src/sass/settings/menus';
+@import 'plyr/src/sass/settings/progress';
+@import 'plyr/src/sass/settings/sliders';
+@import 'plyr/src/sass/settings/tooltips';
+@import 'plyr/src/sass/lib/animation';
+@import 'plyr/src/sass/lib/functions';
+@import 'plyr/src/sass/lib/mixins';
+
+// Components
+@import 'plyr/src/sass/base';
+@import 'plyr/src/sass/components/badges';
+@import 'plyr/src/sass/components/captions';
+@import 'plyr/src/sass/components/control';
+@import 'plyr/src/sass/components/controls';
+@import 'plyr/src/sass/components/menus';
+@import 'plyr/src/sass/components/sliders';
+@import 'plyr/src/sass/components/poster';
+@import 'plyr/src/sass/components/times';
+@import 'plyr/src/sass/components/tooltips';
+@import 'plyr/src/sass/components/progress';
+@import 'plyr/src/sass/components/volume';
+@import 'plyr/src/sass/types/audio';
+@import 'plyr/src/sass/types/video';
+@import 'plyr/src/sass/states/fullscreen';
+@import 'plyr/src/sass/plugins/ads';
+@import 'plyr/src/sass/plugins/preview-thumbnails';
+@import 'plyr/src/sass/utils/animation';
+@import 'plyr/src/sass/utils/hidden';
+
+.plyr__progress__container,
+.plyr__volume input[type='range'] {
+ flex: 0 1 auto;
+}
+.plyr--audio .plyr__controls {
+ padding: 0;
+}
+
+.plyr__menu__container {
+ @include app-rtl {
+ direction: rtl;
+ text-align: right;
+
+ .plyr__control--forward {
+ &::after {
+ left: 5px;
+ right: auto;
+ border-right-color: rgba($plyr-menu-color, 0.8);
+ border-left-color: transparent;
+ }
+
+ &.plyr__tab-focus::after,
+ &:hover::after {
+ border-right-color: currentColor;
+ }
+ }
+
+ .plyr__menu__value {
+ padding-left: 1rem;
+ padding-right: calc(calc(var(--plyr-control-spacing, 10px) * 0.7) * 1.5);
+ }
+
+ .plyr__control[role='menuitemradio'] {
+ .plyr__menu__value {
+ margin-right: auto;
+ padding-left: 0;
+ }
+ &::before {
+ margin-left: $plyr-control-spacing;
+ margin-right: 0;
+ }
+
+ &::after {
+ right: 15px;
+ left: auto;
+ }
+ }
+ }
+}
+
+@if $enable-light-style {
+ .light-style {
+ .plyr__tooltip {
+ line-height: light.$line-height-sm;
+ font-size: light.$font-size-sm;
+ }
+ }
+}
+
+@if $enable-dark-style {
+ .dark-style {
+ .plyr__tooltip {
+ line-height: dark.$line-height-sm;
+ font-size: dark.$font-size-sm;
+ }
+
+ .plyr--audio .plyr__controls {
+ color: dark.$body-color;
+ background-color: dark.$card-bg;
+ }
+
+ .plyr--full-ui.plyr--audio input[type='range'] {
+ &::-webkit-slider-runnable-track {
+ background-color: dark.$gray-100;
+ }
+
+ &::-moz-range-track {
+ background-color: dark.$gray-100;
+ }
+
+ &::-ms-track {
+ background-color: dark.$gray-100;
+ }
+ }
+
+ .plyr--audio .plyr__progress__buffer {
+ color: dark.$gray-200;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/popper/popper.js b/resources/assets/vendor/libs/popper/popper.js
new file mode 100644
index 0000000..a7b487d
--- /dev/null
+++ b/resources/assets/vendor/libs/popper/popper.js
@@ -0,0 +1,10 @@
+import Popper from '@popperjs/core/dist/umd/popper.min';
+
+// Required to enable animations on dropdowns/tooltips/popovers
+// Popper.Defaults.modifiers.computeStyle.gpuAcceleration = false
+
+try {
+ window.Popper = Popper;
+} catch (e) {}
+
+export { Popper };
diff --git a/resources/assets/vendor/libs/quill/_mixins.scss b/resources/assets/vendor/libs/quill/_mixins.scss
new file mode 100644
index 0000000..df48b30
--- /dev/null
+++ b/resources/assets/vendor/libs/quill/_mixins.scss
@@ -0,0 +1,115 @@
+@mixin quill-generate-lists($indent) {
+ $quill-list-types: (
+ 1: lower-alpha,
+ 2: lower-roman,
+ 3: decimal,
+ 4: lower-alpha,
+ 5: lower-roman,
+ 6: decimal,
+ 7: lower-alpha,
+ 8: lower-roman,
+ 9: decimal
+ );
+
+ @for $i from 1 through 9 {
+ ol li.ql-indent-#{$i} {
+ counter-increment: list-#{$i};
+
+ @if $i < 9 {
+ $lists: '';
+
+ @for $l from $i + 1 through 9 {
+ $lists: '#{$lists} list-#{$l}';
+ }
+
+ counter-reset: #{$lists};
+ }
+
+ &::before {
+ content: counter(list-#{$i}, map-get($quill-list-types, $i)) '. ';
+ }
+ }
+
+ .ql-indent-#{$i}:not(.ql-direction-rtl) {
+ padding-left: $indent * $i;
+
+ [dir='rtl'] & {
+ padding-right: $indent * $i;
+ padding-left: 0;
+ }
+ }
+ li.ql-indent-#{$i}:not(.ql-direction-rtl) {
+ padding-left: $indent * ($i + 1);
+
+ [dir='rtl'] & {
+ padding-right: $indent * ($i + 1);
+ padding-left: 0;
+ }
+ }
+ .ql-indent-#{$i}.ql-direction-rtl.ql-align-right {
+ padding-right: $indent * $i;
+
+ [dir='rtl'] & {
+ padding-right: 0;
+ padding-left: $indent * $i;
+ }
+ }
+ li.ql-indent-#{$i}.ql-direction-rtl.ql-align-right {
+ padding-right: $indent * ($i + 1);
+
+ [dir='rtl'] & {
+ padding-right: 0;
+ padding-left: $indent * ($i + 1);
+ }
+ }
+ }
+}
+
+@mixin quill-theme($color) {
+ .ql-snow.ql-toolbar,
+ .ql-snow .ql-toolbar {
+ button:hover,
+ button:focus,
+ button.ql-active,
+ .ql-picker-label:hover,
+ .ql-picker-label.ql-active,
+ .ql-picker-item:hover,
+ .ql-picker-item.ql-selected {
+ color: $color !important;
+ }
+
+ button:hover .ql-fill,
+ button:focus .ql-fill,
+ button.ql-active .ql-fill,
+ .ql-picker-label:hover .ql-fill,
+ .ql-picker-label.ql-active .ql-fill,
+ .ql-picker-item:hover .ql-fill,
+ .ql-picker-item.ql-selected .ql-fill,
+ button:hover .ql-stroke.ql-fill,
+ button:focus .ql-stroke.ql-fill,
+ button.ql-active .ql-stroke.ql-fill,
+ .ql-picker-label:hover .ql-stroke.ql-fill,
+ .ql-picker-label.ql-active .ql-stroke.ql-fill,
+ .ql-picker-item:hover .ql-stroke.ql-fill,
+ .ql-picker-item.ql-selected .ql-stroke.ql-fill {
+ fill: $color !important;
+ }
+
+ button:hover .ql-stroke,
+ button:focus .ql-stroke,
+ button.ql-active .ql-stroke,
+ .ql-picker-label:hover .ql-stroke,
+ .ql-picker-label.ql-active .ql-stroke,
+ .ql-picker-item:hover .ql-stroke,
+ .ql-picker-item.ql-selected .ql-stroke,
+ button:hover .ql-stroke-miter,
+ button:focus .ql-stroke-miter,
+ button.ql-active .ql-stroke-miter,
+ .ql-picker-label:hover .ql-stroke-miter,
+ .ql-picker-label.ql-active .ql-stroke-miter,
+ .ql-picker-item:hover .ql-stroke-miter,
+ .ql-picker-item.ql-selected .ql-stroke-miter {
+ stroke: $color !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/quill/editor.scss b/resources/assets/vendor/libs/quill/editor.scss
new file mode 100644
index 0000000..b75b2ef
--- /dev/null
+++ b/resources/assets/vendor/libs/quill/editor.scss
@@ -0,0 +1,1115 @@
+// Editor
+// *******************************************************************************
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+// common styles
+.ql-container {
+ display: block;
+ margin: 0;
+ position: relative;
+
+ &.ql-disabled .ql-editor ul[data-checked] > li::before {
+ pointer-events: none;
+ }
+
+ &.ql-disabled .ql-tooltip {
+ visibility: hidden;
+ }
+}
+
+.ql-clipboard {
+ position: absolute;
+ overflow-y: hidden;
+ left: -6250rem;
+ height: 0.0625rem;
+ top: 50%;
+
+ @include app-rtl {
+ left: auto;
+ right: -6250rem;
+ }
+}
+
+.ql-editor {
+ overflow-y: auto;
+ height: 100%;
+ tab-size: 4;
+ -moz-tab-size: 4;
+ box-sizing: border-box;
+ display: block;
+ outline: none;
+ word-wrap: break-word;
+ white-space: pre-wrap;
+
+ > * {
+ cursor: text;
+ }
+
+ &.ql-blank::before {
+ font-size: light.$font-size-root;
+ font-style: italic;
+ position: absolute;
+ content: attr(data-placeholder);
+ left: 0;
+ right: 0;
+ pointer-events: none;
+ }
+}
+
+// Themes
+.ql-snow,
+.ql-bubble {
+ box-sizing: border-box;
+
+ * {
+ box-sizing: border-box;
+ }
+
+ .ql-out-bottom,
+ .ql-out-top {
+ visibility: hidden;
+ }
+
+ .ql-hidden {
+ display: none !important;
+ }
+
+ .ql-even {
+ fill-rule: evenodd;
+ }
+
+ .ql-empty {
+ fill: none;
+ }
+
+ .ql-transparent {
+ opacity: 0.4;
+ }
+
+ .ql-thin,
+ .ql-stroke.ql-thin {
+ stroke-width: 1;
+ }
+
+ .ql-editor a {
+ text-decoration: underline;
+ }
+
+ .ql-direction.ql-active {
+ svg:last-child {
+ display: inline;
+ }
+
+ svg:first-child {
+ display: none;
+ }
+ }
+
+ .ql-direction svg:last-child {
+ display: none;
+ }
+
+ &.ql-toolbar,
+ & .ql-toolbar {
+ border-top-left-radius: light.$border-radius;
+ border-top-right-radius: light.$border-radius;
+ box-sizing: border-box;
+ padding: 0.5rem;
+
+ &::after {
+ clear: both;
+ content: '';
+ display: table;
+ }
+
+ button {
+ float: left;
+ display: inline-block;
+ padding: 0.1875rem 0.3125rem;
+ height: 1.5rem;
+ width: 1.75rem;
+ background: none;
+ border: none;
+ cursor: pointer;
+
+ &:active:hover {
+ outline: none;
+ }
+
+ @include app-rtl {
+ float: right;
+ }
+
+ svg {
+ height: 100%;
+ float: left;
+
+ @include app-rtl {
+ float: right;
+ }
+ }
+ }
+
+ input.ql-image[type='file'] {
+ display: none;
+ }
+ }
+
+ .ql-tooltip {
+ transform: translateY(0.625rem);
+ position: absolute;
+
+ &.ql-flip {
+ transform: translateY(-0.625rem);
+ }
+
+ a {
+ cursor: pointer;
+ text-decoration: none;
+ }
+ }
+
+ .ql-formats {
+ display: inline-block;
+ margin-right: 0.9375rem;
+ vertical-align: middle;
+
+ @include app-rtl {
+ margin-right: 0;
+ margin-left: 0.9375rem;
+ }
+
+ &::after {
+ content: '';
+ display: table;
+ clear: both;
+ }
+ }
+
+ .ql-picker {
+ vertical-align: middle;
+ position: relative;
+ height: 1.5rem;
+ display: inline-block;
+ float: left;
+
+ @include app-rtl {
+ float: right;
+ }
+
+ &.ql-expanded .ql-picker-options {
+ top: 100%;
+ display: block;
+ z-index: 1;
+ margin-top: -0.0625rem;
+ }
+
+ &.ql-header,
+ &.ql-font,
+ &.ql-size {
+ .ql-picker-label[data-label]:not([data-label=''])::before,
+ .ql-picker-item[data-label]:not([data-label=''])::before {
+ content: attr(data-label);
+ }
+ }
+
+ &.ql-header {
+ width: 6.125rem;
+
+ .ql-picker-label,
+ .ql-picker-item {
+ &::before {
+ content: 'Normal';
+ }
+
+ &[data-value='1']::before {
+ content: 'Heading 1';
+ }
+
+ &[data-value='2']::before {
+ content: 'Heading 2';
+ }
+
+ &[data-value='3']::before {
+ content: 'Heading 3';
+ }
+
+ &[data-value='4']::before {
+ content: 'Heading 4';
+ }
+
+ &[data-value='5']::before {
+ content: 'Heading 5';
+ }
+
+ &[data-value='6']::before {
+ content: 'Heading 6';
+ }
+ }
+ }
+
+ &.ql-font {
+ width: 6.75rem;
+
+ .ql-picker-label,
+ .ql-picker-item {
+ &::before {
+ content: 'Sans Serif';
+ }
+
+ &[data-value='serif']::before {
+ content: 'Serif';
+ }
+
+ &[data-value='monospace']::before {
+ content: 'Monospace';
+ }
+ }
+ }
+
+ &.ql-size {
+ width: 6.125rem;
+
+ .ql-picker-label,
+ .ql-picker-item {
+ &::before {
+ content: 'Normal';
+ }
+
+ &[data-value='small']::before {
+ content: 'Small';
+ }
+
+ &[data-value='large']::before {
+ content: 'Large';
+ }
+
+ &[data-value='huge']::before {
+ content: 'Huge';
+ }
+ }
+ }
+
+ &:not(.ql-color-picker):not(.ql-icon-picker) svg {
+ position: absolute;
+ top: 50%;
+ right: 0;
+ margin-top: -0.5625rem;
+ width: 1.125rem;
+
+ @include app-rtl {
+ right: auto;
+ left: 0;
+ }
+ }
+ }
+
+ .ql-picker-label {
+ position: relative;
+ display: inline-block;
+ padding-right: 0.125rem;
+ padding-left: 0.5rem;
+ height: 100%;
+ width: 100%;
+ border: 0.0625rem solid transparent;
+ cursor: pointer;
+
+ &::before {
+ line-height: 1.375rem;
+ display: inline-block;
+ }
+ }
+
+ .ql-picker-options {
+ padding: 0.25rem 0.5rem;
+ min-width: 100%;
+ position: absolute;
+ display: none;
+ white-space: nowrap;
+
+ .ql-picker-item {
+ padding-bottom: 0.3125rem;
+ padding-top: 0.3125rem;
+ display: block;
+ cursor: pointer;
+ }
+ }
+
+ .ql-color-picker,
+ .ql-icon-picker {
+ width: 1.75rem;
+
+ .ql-picker-label {
+ padding: 0.125rem 0.25rem;
+ }
+ }
+
+ .ql-icon-picker {
+ .ql-picker-options {
+ padding: 0.25rem 0;
+ }
+
+ .ql-picker-item {
+ padding: 0.125rem 0.25rem;
+ width: 1.5rem;
+ height: 1.5rem;
+ }
+ }
+
+ .ql-color-picker {
+ .ql-picker-options {
+ padding: 0.1875rem 0.3125rem;
+ width: 9.5rem;
+ }
+
+ .ql-picker-item {
+ float: left;
+ margin: 0.125rem;
+ padding: 0;
+ width: 1rem;
+ height: 1rem;
+ border: 0.0625rem solid transparent;
+
+ @include app-rtl {
+ float: right;
+ }
+ }
+
+ &.ql-background .ql-picker-item {
+ background-color: light.$white;
+ }
+
+ &.ql-color .ql-picker-item {
+ background-color: #000;
+ }
+ }
+
+ @include app-rtl {
+ .ql-italic svg,
+ .ql-list svg,
+ .ql-indent svg,
+ .ql-direction svg,
+ .ql-align svg,
+ .ql-link svg,
+ .ql-image svg,
+ .ql-clean svg {
+ transform: scaleX(-1);
+ }
+ }
+}
+
+.ql-snow {
+ &.ql-toolbar,
+ .ql-toolbar {
+ background: light.$white;
+ background-clip: padding-box;
+ }
+
+ .ql-editor {
+ min-height: 15rem;
+ background: light.$white;
+ }
+
+ .ql-picker.ql-expanded .ql-picker-label {
+ z-index: 2;
+ color: #ccc !important;
+
+ .ql-fill {
+ fill: #ccc !important;
+ }
+
+ .ql-stroke {
+ stroke: #ccc !important;
+ }
+ }
+
+ .ql-stroke {
+ fill: none;
+ stroke-width: 2;
+ stroke-linejoin: round;
+ stroke-linecap: round;
+ }
+
+ .ql-stroke-miter {
+ fill: none;
+ stroke-width: 2;
+ stroke-miterlimit: 10;
+ }
+
+ .ql-picker-label {
+ border: 0.0625rem solid transparent;
+ }
+
+ .ql-picker-options {
+ border: 0.0625rem solid transparent;
+ background-color: light.$white;
+ background-clip: padding-box;
+ }
+
+ .ql-color-picker .ql-picker-item.ql-selected,
+ .ql-color-picker .ql-picker-item:hover {
+ border-color: #000;
+ }
+
+ .ql-tooltip {
+ display: flex;
+ padding: 0.3125rem 0.75rem;
+ background-color: light.$white;
+ background-clip: padding-box;
+ white-space: nowrap;
+
+ &::before {
+ content: 'Visit URL:';
+ margin-right: 0.5rem;
+ line-height: 1.625rem;
+
+ @include app-rtl {
+ margin-right: 0;
+ margin-left: 0.5rem;
+ }
+ }
+
+ input[type='text'] {
+ display: none;
+ margin: 0;
+ padding: 0.1875rem 0.3125rem;
+ width: 10.625rem;
+ height: 1.625rem;
+ font-size: 0.8125rem;
+ }
+
+ a.ql-preview {
+ display: inline-block;
+ vertical-align: top;
+ max-width: 12.5rem;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ }
+
+ a.ql-action::after {
+ content: 'Edit';
+ margin-left: 1rem;
+ padding-right: 0.5rem;
+ border-right: 0.0625rem solid #ccc;
+
+ @include app-rtl {
+ margin-left: 0;
+ margin-right: 1rem;
+ padding-left: 0.5rem;
+ padding-right: 0;
+ border-right: 0;
+ border-left: 0.0625rem solid #ccc;
+ }
+ }
+
+ a.ql-remove::before {
+ content: 'Remove';
+ margin-left: 0.5rem;
+
+ @include app-rtl {
+ margin-right: 0.5rem;
+ margin-left: 0;
+ }
+ }
+
+ a {
+ line-height: 1.625rem;
+ }
+
+ &.ql-editing a.ql-preview,
+ &.ql-editing a.ql-remove {
+ display: none;
+ }
+
+ &.ql-editing input[type='text'] {
+ display: inline-block;
+ }
+
+ &.ql-editing a.ql-action::after {
+ content: 'Save';
+ border-right: 0;
+ padding-right: 0;
+
+ @include app-rtl {
+ border-left: 0;
+ padding-left: 0;
+ }
+ }
+
+ &[data-mode='link']::before {
+ content: 'Enter link:';
+ }
+
+ &[data-mode='formula']::before {
+ content: 'Enter formula:';
+ }
+
+ &[data-mode='video']::before {
+ content: 'Enter video:';
+ }
+ }
+}
+
+.ql-bubble {
+ &.ql-toolbar,
+ .ql-toolbar {
+ button:hover,
+ button:focus,
+ button.ql-active,
+ .ql-picker-label:hover,
+ .ql-picker-label.ql-active,
+ .ql-picker-item:hover,
+ .ql-picker-item.ql-selected {
+ color: light.$white;
+ }
+
+ button:hover .ql-stroke,
+ button:focus .ql-stroke,
+ button.ql-active .ql-stroke,
+ .ql-picker-label:hover .ql-stroke,
+ .ql-picker-label.ql-active .ql-stroke,
+ .ql-picker-item:hover .ql-stroke,
+ .ql-picker-item.ql-selected .ql-stroke,
+ button:hover .ql-stroke-miter,
+ button:focus .ql-stroke-miter,
+ button.ql-active .ql-stroke-miter,
+ .ql-picker-label:hover .ql-stroke-miter,
+ .ql-picker-label.ql-active .ql-stroke-miter,
+ .ql-picker-item:hover .ql-stroke-miter,
+ .ql-picker-item.ql-selected .ql-stroke-miter {
+ stroke: light.$white;
+ }
+ button:hover .ql-fill,
+ button:focus .ql-fill,
+ button.ql-active .ql-fill,
+ .ql-picker-label:hover .ql-fill,
+ .ql-picker-label.ql-active .ql-fill,
+ .ql-picker-item:hover .ql-fill,
+ .ql-picker-item.ql-selected .ql-fill,
+ button:hover .ql-stroke.ql-fill,
+ button:focus .ql-stroke.ql-fill,
+ button.ql-active .ql-stroke.ql-fill,
+ .ql-picker-label:hover .ql-stroke.ql-fill,
+ .ql-picker-label.ql-active .ql-stroke.ql-fill,
+ .ql-picker-item:hover .ql-stroke.ql-fill,
+ .ql-picker-item.ql-selected .ql-stroke.ql-fill {
+ fill: light.$white;
+ }
+
+ @media (pointer: coarse) {
+ button:hover:not(.ql-active) {
+ color: #ccc;
+ }
+ button:hover:not(.ql-active) .ql-fill,
+ button:hover:not(.ql-active) .ql-stroke.ql-fill {
+ fill: #ccc;
+ }
+ button:hover:not(.ql-active) .ql-stroke,
+ button:hover:not(.ql-active) .ql-stroke-miter {
+ stroke: #ccc;
+ }
+ }
+ }
+
+ .ql-stroke {
+ fill: none;
+ stroke: #ccc;
+ stroke-linejoin: round;
+ stroke-linecap: round;
+ stroke-width: 2;
+ }
+
+ .ql-stroke-miter {
+ fill: none;
+ stroke: #ccc;
+ stroke-miterlimit: 10;
+ stroke-width: 2;
+ }
+
+ .ql-fill,
+ .ql-stroke.ql-fill {
+ fill: #ccc;
+ }
+
+ .ql-picker {
+ color: #ccc;
+
+ &.ql-expanded .ql-picker-label {
+ z-index: 2;
+ color: #777;
+
+ .ql-fill {
+ fill: #777;
+ }
+
+ .ql-stroke {
+ stroke: #777;
+ }
+ }
+ }
+
+ .ql-picker-options {
+ background-color: #444;
+ }
+
+ .ql-color-picker .ql-picker-label svg,
+ .ql-icon-picker .ql-picker-label svg {
+ right: 0.25rem;
+
+ @include app-rtl {
+ right: auto;
+ left: 0.25rem;
+ }
+ }
+
+ .ql-color-picker {
+ .ql-color-picker svg {
+ margin: 0.0625rem;
+ }
+
+ .ql-picker-item.ql-selected,
+ .ql-picker-item:hover {
+ border-color: light.$white;
+ }
+ }
+
+ .ql-toolbar .ql-formats {
+ margin: 0.5rem 0.75rem 0.5rem 0;
+
+ @include app-rtl {
+ margin: 0.5rem 0 0.5rem 0.75rem;
+ }
+
+ &:first-child {
+ margin-left: 0.75rem;
+
+ @include app-rtl {
+ margin-right: 0.75rem;
+ }
+ }
+ }
+
+ .ql-tooltip-arrow {
+ content: ' ';
+ position: absolute;
+ display: block;
+ left: 50%;
+ margin-left: -0.375rem;
+ border-right: 0.375rem solid transparent;
+ border-left: 0.375rem solid transparent;
+ }
+
+ .ql-tooltip {
+ background-color: #444;
+ color: light.$white;
+
+ &:not(.ql-flip) .ql-tooltip-arrow {
+ top: -0.375rem;
+ border-bottom: 0.375rem solid #444;
+ }
+
+ &.ql-flip .ql-tooltip-arrow {
+ bottom: -0.375rem;
+ border-top: 0.375rem solid #444;
+ }
+
+ &.ql-editing {
+ .ql-tooltip-editor {
+ display: block;
+ }
+
+ .ql-formats {
+ visibility: hidden;
+ }
+ }
+ }
+
+ .ql-tooltip-editor {
+ display: none;
+
+ input[type='text'] {
+ position: absolute;
+ padding: 0.625rem 1.25rem;
+ height: 100%;
+ width: 100%;
+ outline: none;
+ background: transparent;
+ border: none;
+ color: light.$white;
+ font-size: 0.8125rem;
+ }
+
+ a {
+ position: absolute;
+ right: 1.25rem;
+ top: 0.625rem;
+
+ @include app-rtl {
+ right: auto;
+ left: 1.25rem;
+ }
+
+ &::before {
+ content: '\D7';
+ color: #ccc;
+ font-size: 1rem;
+ font-weight: light.$font-weight-medium;
+ }
+ }
+ }
+
+ &.ql-container:not(.ql-disabled) a {
+ white-space: nowrap;
+ position: relative;
+
+ &::before,
+ &::after {
+ margin-left: 50%;
+ position: absolute;
+ visibility: hidden;
+ left: 0;
+ transition: visibility 0s ease 200ms;
+ transform: translate(-50%, -100%);
+ }
+
+ &:hover::before,
+ &:hover::after {
+ visibility: visible;
+ }
+
+ &::before {
+ content: attr(href);
+ top: -0.3125rem;
+ z-index: 1;
+ overflow: hidden;
+ padding: 0.3125rem 0.9375rem;
+ border-radius: 0.9375rem;
+ background-color: #444;
+ text-decoration: none;
+ color: light.$white;
+ font-weight: normal;
+ font-size: 0.75rem;
+ }
+
+ &::after {
+ content: ' ';
+ top: 0;
+ height: 0;
+ width: 0;
+ border-top: 0.375rem solid #444;
+ border-right: 0.375rem solid transparent;
+ border-left: 0.375rem solid transparent;
+ }
+ }
+}
+
+// Light styles
+@if $enable-light-style {
+ .light-style {
+ .ql-editor.ql-blank:before {
+ color: light.$input-placeholder-color;
+ }
+
+ .ql-snow,
+ .ql-bubble {
+ &.ql-toolbar .ql-picker-options,
+ & .ql-toolbar .ql-picker-options {
+ box-shadow: light.$dropdown-box-shadow;
+ }
+
+ .ql-picker {
+ &.ql-header .ql-picker-item {
+ &[data-value='1']::before {
+ font-size: light.$h1-font-size;
+ }
+
+ &[data-value='2']::before {
+ font-size: light.$h2-font-size;
+ }
+
+ &[data-value='3']::before {
+ font-size: light.$h3-font-size;
+ }
+
+ &[data-value='4']::before {
+ font-size: light.$h4-font-size;
+ }
+
+ &[data-value='5']::before {
+ font-size: light.$h5-font-size;
+ }
+
+ &[data-value='6']::before {
+ font-size: light.$h6-font-size;
+ }
+ }
+
+ &.ql-font .ql-picker-item {
+ &[data-value='serif']::before {
+ font-family: light.$font-family-serif;
+ }
+
+ &[data-value='monospace']::before {
+ font-family: light.$font-family-monospace;
+ }
+ }
+
+ &.ql-size .ql-picker-item {
+ &[data-value='small']::before {
+ font-size: light.$font-size-sm;
+ }
+
+ &[data-value='large']::before {
+ font-size: light.$font-size-lg;
+ }
+
+ &[data-value='huge']::before {
+ font-size: light.$font-size-xl;
+ }
+ }
+ }
+ }
+
+ .ql-snow {
+ .ql-editor.ql-blank::before {
+ padding: 0 light.$input-padding-x;
+ }
+
+ &.ql-container {
+ border: 0.0625rem solid light.$input-border-color;
+ }
+
+ .ql-editor {
+ padding: light.$card-spacer-x-sm * 0.5 light.$input-padding-x;
+ }
+
+ &.ql-toolbar,
+ & .ql-toolbar {
+ border: 0.0625rem solid light.$input-border-color;
+
+ @media (pointer: coarse) {
+ button:hover:not(.ql-active) {
+ color: light.$body-color;
+ }
+ button:hover:not(.ql-active) .ql-stroke,
+ button:hover:not(.ql-active) .ql-stroke-miter {
+ stroke: light.$body-color;
+ }
+ button:hover:not(.ql-active) .ql-fill,
+ button:hover:not(.ql-active) .ql-stroke.ql-fill {
+ fill: light.$body-color;
+ }
+ }
+ }
+
+ &.ql-toolbar + .ql-container.ql-snow {
+ border-top: 0;
+ .ql-editor,
+ & {
+ @include light.border-bottom-radius(light.$border-radius);
+ }
+ }
+
+ .ql-stroke {
+ stroke: light.$body-color;
+ }
+
+ .ql-fill,
+ .ql-stroke.ql-fill {
+ fill: light.$body-color;
+ }
+
+ .ql-stroke-miter {
+ stroke: light.$body-color;
+ }
+ .ql-picker {
+ color: light.$body-color;
+
+ &.ql-expanded .ql-picker-options {
+ border-color: light.$dropdown-border-color;
+ }
+
+ &.ql-expanded .ql-picker-label {
+ border-color: light.$input-border-color;
+ }
+ }
+
+ .ql-tooltip {
+ border: light.$dropdown-border-width solid light.$dropdown-border-color;
+ color: light.$body-color;
+ box-shadow: light.$dropdown-box-shadow;
+
+ input[type='text'] {
+ border: 0.0625rem solid light.$input-border-color;
+ }
+ }
+ }
+
+ .ql-bubble .ql-tooltip {
+ border-radius: light.$border-radius;
+ z-index: light.$zindex-menu-fixed + 10;
+ }
+ }
+}
+
+// dark styles
+@if $enable-dark-style {
+ .dark-style {
+ .ql-editor.ql-blank:before {
+ color: dark.$input-placeholder-color;
+ }
+
+ .ql-snow,
+ .ql-bubble {
+ .ql-tooltip {
+ background: dark.$body-bg;
+ }
+ &.ql-toolbar .ql-picker-options,
+ & .ql-toolbar .ql-picker-options {
+ box-shadow: dark.$dropdown-box-shadow;
+ }
+
+ .ql-picker {
+ &.ql-header .ql-picker-item {
+ &[data-value='1']::before {
+ font-size: dark.$h1-font-size;
+ }
+
+ &[data-value='2']::before {
+ font-size: dark.$h2-font-size;
+ }
+
+ &[data-value='3']::before {
+ font-size: dark.$h3-font-size;
+ }
+
+ &[data-value='4']::before {
+ font-size: dark.$h4-font-size;
+ }
+
+ &[data-value='5']::before {
+ font-size: dark.$h5-font-size;
+ }
+
+ &[data-value='6']::before {
+ font-size: dark.$h6-font-size;
+ }
+ }
+
+ &.ql-font .ql-picker-item {
+ &[data-value='serif']::before {
+ font-family: dark.$font-family-serif;
+ }
+
+ &[data-value='monospace']::before {
+ font-family: dark.$font-family-monospace;
+ }
+ }
+
+ &.ql-size .ql-picker-item {
+ &[data-value='small']::before {
+ font-size: dark.$font-size-sm;
+ }
+
+ &[data-value='large']::before {
+ font-size: dark.$font-size-lg;
+ }
+
+ &[data-value='huge']::before {
+ font-size: dark.$font-size-xl;
+ }
+ }
+ }
+ }
+
+ .ql-snow {
+ .ql-editor.ql-blank::before {
+ padding: 0 dark.$input-padding-x;
+ }
+
+ &.ql-container {
+ border: 0.0625rem solid dark.$input-border-color;
+ }
+
+ .ql-editor {
+ padding: dark.$card-spacer-x-sm * 0.5 dark.$input-padding-x;
+ background: dark.$card-bg;
+ }
+
+ .ql-picker-options {
+ background: dark.$card-bg;
+ }
+
+ &.ql-toolbar,
+ & .ql-toolbar {
+ border: 0.0625rem solid dark.$input-border-color;
+ background: dark.$card-bg;
+
+ @media (pointer: coarse) {
+ button:hover:not(.ql-active) {
+ color: dark.$body-color;
+ }
+ button:hover:not(.ql-active) .ql-stroke,
+ button:hover:not(.ql-active) .ql-stroke-miter {
+ stroke: dark.$body-color;
+ }
+ button:hover:not(.ql-active) .ql-fill,
+ button:hover:not(.ql-active) .ql-stroke.ql-fill {
+ fill: dark.$body-color;
+ }
+ }
+ }
+
+ &.ql-toolbar + .ql-container.ql-snow {
+ border-top: 0;
+ .ql-editor,
+ & {
+ @include dark.border-bottom-radius(dark.$border-radius);
+ }
+ }
+
+ .ql-stroke-miter {
+ stroke: dark.$body-color;
+ }
+
+ .ql-stroke {
+ stroke: dark.$body-color;
+ }
+
+ .ql-fill,
+ .ql-stroke.ql-fill {
+ fill: dark.$body-color;
+ }
+
+ .ql-picker {
+ color: dark.$body-color;
+
+ &.ql-expanded .ql-picker-options {
+ border-color: dark.$dropdown-border-color;
+ }
+
+ &.ql-expanded .ql-picker-label {
+ border-color: dark.$input-border-color;
+ }
+ }
+
+ .ql-tooltip {
+ border: dark.$dropdown-border-width solid dark.$dropdown-border-color;
+ color: dark.$body-color;
+ box-shadow: dark.$dropdown-box-shadow;
+
+ input[type='text'] {
+ border: 0.0625rem solid dark.$input-border-color;
+ }
+ }
+ }
+
+ .ql-bubble .ql-tooltip {
+ border-radius: dark.$border-radius;
+ z-index: dark.$zindex-menu-fixed + 10;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/quill/katex.js b/resources/assets/vendor/libs/quill/katex.js
new file mode 100644
index 0000000..ca9f0aa
--- /dev/null
+++ b/resources/assets/vendor/libs/quill/katex.js
@@ -0,0 +1,7 @@
+import katex from 'katex/dist/katex';
+
+try {
+ window.katex = katex;
+} catch (e) {}
+
+export { katex };
diff --git a/resources/assets/vendor/libs/quill/katex.scss b/resources/assets/vendor/libs/quill/katex.scss
new file mode 100644
index 0000000..c7a85d5
--- /dev/null
+++ b/resources/assets/vendor/libs/quill/katex.scss
@@ -0,0 +1 @@
+@import 'katex/dist/katex';
diff --git a/resources/assets/vendor/libs/quill/quill.js b/resources/assets/vendor/libs/quill/quill.js
new file mode 100644
index 0000000..e1d3937
--- /dev/null
+++ b/resources/assets/vendor/libs/quill/quill.js
@@ -0,0 +1,7 @@
+import Quill from 'quill/dist/quill';
+
+try {
+ window.Quill = Quill;
+} catch (e) {}
+
+export { Quill };
diff --git a/resources/assets/vendor/libs/quill/typography.scss b/resources/assets/vendor/libs/quill/typography.scss
new file mode 100644
index 0000000..5c882f8
--- /dev/null
+++ b/resources/assets/vendor/libs/quill/typography.scss
@@ -0,0 +1,289 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'mixins';
+
+.ql-editor,
+.ql-content {
+ $quill-indent: 2rem;
+
+ p,
+ ol,
+ ul,
+ pre,
+ blockquote,
+ h1,
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+ }
+
+ ol,
+ ul {
+ margin-right: 0;
+ margin-left: 0;
+ padding-right: 0;
+ padding-left: 0;
+ }
+
+ ol > li,
+ ul > li {
+ list-style-type: none;
+
+ &:not(.ql-direction-rtl) {
+ padding-left: $quill-indent;
+
+ @include app-rtl {
+ padding-right: $quill-indent;
+ padding-left: 0;
+ }
+ }
+
+ &.ql-direction-rtl {
+ padding-right: $quill-indent;
+
+ @include app-rtl {
+ padding-right: 0;
+ padding-left: $quill-indent;
+ }
+ }
+ }
+
+ ul > li::before {
+ content: '\2022';
+ }
+
+ ul[data-checked='true'],
+ ul[data-checked='false'] {
+ pointer-events: none;
+
+ > li * {
+ pointer-events: all;
+
+ &::before {
+ pointer-events: all;
+ cursor: pointer;
+ color: #777;
+ }
+ }
+ }
+
+ ul[data-checked='false'] > li::before {
+ content: '\2610';
+ }
+
+ ul[data-checked='true'] > li::before {
+ content: '\2611';
+ }
+
+ li::before {
+ display: inline-block;
+ width: calc(#{$quill-indent} - 0.3em);
+ white-space: nowrap;
+ }
+
+ li.ql-direction-rtl::before {
+ margin-right: -$quill-indent;
+ margin-left: 0.3em;
+ text-align: left;
+
+ @include app-rtl {
+ margin-right: 0.3em;
+ margin-left: -$quill-indent;
+ text-align: right;
+ }
+ }
+
+ li:not(.ql-direction-rtl)::before {
+ text-align: right;
+ margin-left: -$quill-indent;
+ margin-right: 0.3em;
+
+ @include app-rtl {
+ text-align: left;
+ margin-left: 0.3em;
+ margin-right: -$quill-indent;
+ }
+ }
+
+ ol li {
+ counter-increment: list-0;
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+
+ &::before {
+ content: counter(list-0, decimal) '. ';
+ }
+ }
+
+ @include quill-generate-lists($quill-indent);
+
+ .ql-video {
+ max-width: 100%;
+ display: block;
+
+ &.ql-align-right {
+ margin: 0 0 0 auto;
+
+ @include app-rtl {
+ margin: 0 auto 0 0;
+ }
+ }
+
+ &.ql-align-center {
+ margin: 0 auto;
+ }
+ }
+
+ .ql-bg-red {
+ background-color: #e60000;
+ }
+
+ .ql-bg-black {
+ background-color: #000;
+ }
+
+ .ql-bg-yellow {
+ background-color: #ff0;
+ }
+
+ .ql-bg-orange {
+ background-color: #f90;
+ }
+
+ .ql-bg-purple {
+ background-color: #93f;
+ }
+
+ .ql-bg-blue {
+ background-color: #06c;
+ }
+
+ .ql-bg-green {
+ background-color: #008a00;
+ }
+
+ .ql-color-red {
+ color: #e60000;
+ }
+ .ql-color-white {
+ color: #fff;
+ }
+
+ .ql-color-yellow {
+ color: #ff0;
+ }
+
+ .ql-color-orange {
+ color: #f90;
+ }
+
+ .ql-color-purple {
+ color: #93f;
+ }
+
+ .ql-color-blue {
+ color: #06c;
+ }
+
+ .ql-color-green {
+ color: #008a00;
+ }
+
+ .ql-direction-rtl {
+ direction: rtl;
+ text-align: inherit;
+
+ @include app-rtl {
+ direction: ltr;
+ text-align: inherit;
+ }
+ }
+
+ .ql-align-center {
+ text-align: center;
+ }
+
+ .ql-align-justify {
+ text-align: justify;
+ }
+
+ .ql-align-right {
+ text-align: right;
+
+ @include app-rtl {
+ text-align: left;
+ }
+ }
+
+ img {
+ max-width: 100%;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .ql-editor,
+ .ql-content {
+ blockquote {
+ font-size: light.$blockquote-font-size;
+ margin-bottom: light.$spacer;
+ }
+
+ .ql-font-serif {
+ font-family: light.$font-family-serif;
+ }
+
+ .ql-font-monospace {
+ font-family: light.$font-family-monospace;
+ }
+
+ .ql-size-large {
+ font-size: light.$font-size-lg;
+ }
+ .ql-size-huge {
+ font-size: light.$font-size-xl;
+ }
+
+ .ql-size-small {
+ font-size: light.$font-size-sm;
+ }
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ .ql-editor,
+ .ql-content {
+ blockquote {
+ font-size: dark.$blockquote-font-size;
+ margin-bottom: dark.$spacer;
+ }
+
+ .ql-font-monospace {
+ font-family: dark.$font-family-monospace;
+ }
+
+ .ql-font-serif {
+ font-family: dark.$font-family-serif;
+ }
+
+ .ql-size-huge {
+ font-size: dark.$font-size-xl;
+ }
+
+ .ql-size-large {
+ font-size: dark.$font-size-lg;
+ }
+
+ .ql-size-small {
+ font-size: dark.$font-size-sm;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/select2/_mixins.scss b/resources/assets/vendor/libs/select2/_mixins.scss
new file mode 100644
index 0000000..d9796b1
--- /dev/null
+++ b/resources/assets/vendor/libs/select2/_mixins.scss
@@ -0,0 +1,38 @@
+@import '../../scss/_bootstrap-extended/include';
+@mixin select2-variant($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .select2-container--default .select2-selection--multiple .select2-selection__choice {
+ background: rgba($background, 0.16) !important;
+ color: $background !important;
+ }
+}
+
+@mixin select2-validation-state($state, $border) {
+ .is-#{$state} .select2-container--default .select2-selection,
+ .is-#{$state}.select2-container--default .select2-selection {
+ border-width: $input-focus-border-width;
+ border-color: $border !important;
+ }
+}
+
+@mixin select2-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .select2-container--default {
+ .select2-results__option--highlighted[aria-selected] {
+ background-color: $background !important;
+ color: $color !important;
+ }
+
+ &.select2-container--focus .select2-selection,
+ &.select2-container--open .select2-selection {
+ border-width: $input-focus-border-width;
+ border-color: $background !important;
+ }
+ }
+
+ .select2-primary {
+ @include select2-variant($background, $color);
+ }
+}
diff --git a/resources/assets/vendor/libs/select2/es.js b/resources/assets/vendor/libs/select2/es.js
new file mode 100644
index 0000000..68afd6d
--- /dev/null
+++ b/resources/assets/vendor/libs/select2/es.js
@@ -0,0 +1,3 @@
+/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
+
+!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}();
\ No newline at end of file
diff --git a/resources/assets/vendor/libs/select2/select2.js b/resources/assets/vendor/libs/select2/select2.js
new file mode 100644
index 0000000..19e8c38
--- /dev/null
+++ b/resources/assets/vendor/libs/select2/select2.js
@@ -0,0 +1,8 @@
+import select2 from 'select2/dist/js/select2.full';
+
+try {
+ window.select2 = select2;
+} catch (e) {}
+select2();
+
+export { select2 };
diff --git a/resources/assets/vendor/libs/select2/select2.scss b/resources/assets/vendor/libs/select2/select2.scss
new file mode 100644
index 0000000..f4200e6
--- /dev/null
+++ b/resources/assets/vendor/libs/select2/select2.scss
@@ -0,0 +1,890 @@
+// Select2
+// *******************************************************************************
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'mixins';
+
+$select2-arrow-wrapper-width: 2.25rem !default;
+$select2-multiple-selection-line-height: 1.5rem !default;
+
+.select2-container {
+ margin: 0;
+ width: 100% !important;
+ display: inline-block;
+ position: relative;
+ vertical-align: middle;
+ box-sizing: border-box;
+
+ @import 'select2/src/scss/single';
+ @import 'select2/src/scss/multiple';
+ .select2-search--inline {
+ .select2-search__field {
+ margin-top: 6px;
+ }
+ }
+}
+
+@import 'select2/src/scss/dropdown';
+
+.select2-results__option {
+ &[role='option'] {
+ margin: 0.125rem 0.5rem;
+ }
+ &[role='option'] {
+ border-radius: light.$border-radius;
+ padding: 0.543rem light.$spacer;
+
+ &[aria-selected='true'] {
+ background-color: light.$primary;
+ color: light.$component-active-color;
+ }
+ }
+}
+.select2-container--default .select2-results__option--highlighted:not([aria-selected='true']) {
+ background-color: light.$component-hover-bg !important;
+ color: light.$component-hover-color !important;
+}
+.select2-hidden-accessible {
+ clip: rect(0 0 0 0) !important;
+ overflow: hidden !important;
+ position: absolute !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ border: 0 !important;
+ height: 1px !important;
+ width: 1px !important;
+}
+
+.select2-close-mask {
+ display: block;
+ padding: 0;
+ margin: 0;
+ position: fixed;
+ left: 0;
+ top: 0;
+ min-width: 100%;
+ min-height: 100%;
+ z-index: 99;
+ width: auto;
+ opacity: 0;
+ border: 0;
+ height: auto;
+}
+
+.select2-dropdown {
+ border: 0;
+ border-radius: light.$input-border-radius;
+}
+.select2-container--default {
+ // Single Selection
+
+ .select2-selection--single {
+ .select2-selection__rendered {
+ padding-right: $select2-arrow-wrapper-width - 0.0625rem;
+ }
+
+ .select2-selection__clear {
+ cursor: pointer;
+ font-weight: light.$font-weight-medium;
+ float: right;
+ }
+
+ .select2-selection__arrow {
+ width: $select2-arrow-wrapper-width;
+ position: absolute;
+ right: 1px;
+ top: 1px;
+
+ b {
+ position: absolute;
+ height: 18px;
+ width: 20px;
+ top: 24%;
+ background-repeat: no-repeat;
+ background-size: 20px 19px;
+ transform-origin: center;
+ transition: transform 0.3s ease;
+ }
+ }
+ }
+ &.select2-container--above.select2-container--open .select2-selection__arrow b {
+ transform: rotate(180deg);
+ }
+
+ // Remove outlines
+ &,
+ * {
+ outline: 0 !important;
+ }
+ &.select2-container--disabled {
+ pointer-events: none;
+ }
+
+ &.select2-container--disabled .select2-selection--single {
+ cursor: not-allowed;
+
+ .select2-selection__clear {
+ display: none;
+ }
+ }
+
+ @include app-rtl-style {
+ .select2-selection__clear {
+ float: left;
+ }
+
+ .select2-selection__arrow {
+ left: 1px;
+ right: auto;
+ }
+ }
+
+ // search field styles
+ .select2-search--dropdown .select2-search__field {
+ border-radius: light.$input-border-radius;
+ margin: 0.25rem 0.5rem;
+ margin-bottom: 0;
+ width: calc(100% - 1rem);
+ }
+
+ // Multiple Selection
+ .select2-selection--multiple {
+ .select2-selection__rendered {
+ margin: 0;
+ box-sizing: border-box;
+ display: block;
+ list-style: none;
+ width: 100%;
+
+ li {
+ list-style: none;
+ }
+ }
+
+ .select2-selection__placeholder {
+ float: left;
+ }
+
+ .select2-selection__clear {
+ cursor: pointer;
+ font-weight: light.$font-weight-medium;
+ float: right;
+ margin-right: 0.625rem;
+ }
+
+ .select2-search--inline {
+ line-height: $select2-multiple-selection-line-height;
+ }
+
+ .select2-selection__choice {
+ position: relative;
+ font-size: light.$font-size-sm;
+ border-radius: light.$border-radius-sm;
+ padding: 0 0.5rem;
+ cursor: default;
+ line-height: $select2-multiple-selection-line-height;
+ float: left;
+ @include app-ltr {
+ padding-right: 1rem;
+ }
+
+ @include app-rtl {
+ padding-left: 1rem;
+ }
+ }
+
+ .select2-selection__choice__remove {
+ font-weight: light.$font-weight-medium;
+ color: inherit;
+ display: inline-block;
+ position: absolute;
+ cursor: pointer;
+ opacity: 0.5;
+
+ @include app-ltr {
+ right: 0.3rem;
+ }
+
+ @include app-rtl {
+ left: 0.3rem;
+ }
+
+ &:hover {
+ opacity: 0.8;
+ color: inherit;
+ }
+ }
+ }
+
+ &.select2-container--disabled .select2-selection__choice__remove {
+ display: none;
+ }
+
+ &.select2-container--disabled .select2-selection--multiple {
+ cursor: not-allowed;
+ }
+
+ @include app-rtl-style {
+ .select2-selection__choice,
+ .select2-selection__placeholder,
+ .select2-search--inline {
+ float: right;
+ }
+
+ .select2-selection__choice__remove {
+ margin-left: 0;
+ float: left;
+ margin-right: 0.25rem;
+ }
+
+ .select2-selection__clear {
+ margin-left: 0.625rem;
+ float: left;
+ }
+ }
+
+ // Placeholder
+ .select2-search__field::-moz-placeholder {
+ opacity: 1;
+ }
+
+ .select2-search--inline .select2-search__field {
+ box-shadow: none;
+ background: transparent;
+ border: none;
+ outline: 0;
+ -webkit-appearance: textfield;
+ }
+
+ &.select2-container--focus .select2-search--inline .select2-search__field {
+ margin-top: 5px;
+ }
+ .select2-results > .select2-results__options {
+ max-height: 15rem;
+ overflow-y: auto;
+ margin-block: 0.5rem;
+ }
+
+ .select2-results__option {
+ &[role='group'] {
+ padding: 0;
+ }
+ &[aria-disabled='true'] {
+ color: #999;
+ }
+
+ .select2-results__option .select2-results__group {
+ padding-left: 0;
+ }
+ }
+
+ &.select2-container--open {
+ &.select2-container--below .select2-selection {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ }
+ &.select2-container--above .select2-selection {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ }
+ }
+
+ .select2-results__group {
+ cursor: default;
+ display: block;
+ font-weight: light.$font-weight-medium;
+ }
+}
+
+.select2-hidden-accessible {
+ &.is-invalid {
+ + .select2-container--default {
+ &.select2-container--focus {
+ .select2-search--inline {
+ .select2-search__field {
+ margin-top: 6px;
+ }
+ }
+ }
+ }
+ }
+}
+
+@include app-rtl(false) {
+ .select2-container--default .select2-selection--single .select2-selection__rendered {
+ padding-left: $select2-arrow-wrapper-width - 0.0625rem;
+ }
+}
+
+@if $enable-light-style {
+ .light-style {
+ $select2-multiple-choice-spacer: px-to-rem(
+ floor(rem-to-px((light.$input-height-inner - $select2-multiple-selection-line-height) * 0.5))
+ );
+ .select2-hidden-accessible {
+ &.is-invalid {
+ + .select2-container--default {
+ &,
+ &.select2-container--open {
+ .select2-selection--multiple {
+ padding: calc(
+ light.$form-select-padding-y -
+ light.$input-border-width -
+ $select2-multiple-choice-spacer -
+ light.$input-border-width
+ )
+ calc(light.$form-select-padding-x - $input-focus-border-width);
+ }
+ }
+ }
+ }
+ }
+
+ .select2-selection--multiple {
+ .select2-selection__clear {
+ margin-top: $select2-multiple-choice-spacer;
+ }
+ .select2-selection__rendered {
+ padding: 0;
+ }
+
+ .select2-selection__choice {
+ margin-top: calc($select2-multiple-choice-spacer - 1px);
+ margin-right: $select2-multiple-choice-spacer;
+ background-color: light.$gray-75;
+ &:nth-last-child(2) {
+ margin-bottom: calc($select2-multiple-choice-spacer - 1px);
+ }
+ }
+
+ .select2-selection__placeholder {
+ margin-top: $select2-multiple-choice-spacer;
+ }
+ }
+
+ .select2-search__field {
+ color: light.$input-color;
+ }
+
+ .select2-dropdown {
+ background: light.$dropdown-bg;
+ box-shadow: light.$dropdown-box-shadow;
+ background-clip: padding-box;
+ border-color: light.$dropdown-border-color;
+ z-index: light.$zindex-dropdown;
+ &.select2-dropdown--above {
+ box-shadow: 0 -0.2rem 1.25rem rgba(light.rgba-to-hex(light.$gray-500, light.$rgba-to-hex-bg), 0.4) !important;
+ }
+ }
+
+ .select2-container--default {
+ .select2-selection {
+ transition: light.$input-transition;
+ background-color: light.$input-bg;
+ border: 1px solid light.$input-border-color;
+
+ @include light.border-radius(light.$border-radius);
+ &:hover {
+ border-color: light.$input-border-hover-color;
+ }
+ }
+
+ .select2-selection__placeholder {
+ color: light.$input-placeholder-color;
+ }
+
+ // Single Selection
+ // *******************************************************************************
+
+ .select2-selection--single {
+ height: light.$input-height;
+
+ .select2-selection__clear {
+ color: light.$text-muted;
+ }
+
+ .select2-selection__arrow {
+ height: light.$input-height;
+ position: absolute;
+
+ b {
+ background-image: str-replace(
+ str-replace(
+ light.$form-select-indicator,
+ '#{$form-select-indicator-color}',
+ light.$form-select-indicator-color
+ ),
+ '#',
+ '%23'
+ );
+ }
+ }
+ .select2-selection__rendered {
+ line-height: calc(light.$input-height-inner - light.$input-border-width);
+ color: light.$input-color;
+ }
+ }
+ &.select2-container--disabled .select2-selection__arrow {
+ b {
+ background-image: str-replace(
+ str-replace(light.$form-select-disabled-indicator, '#{$text-muted}', light.$text-muted),
+ '#',
+ '%23'
+ );
+ }
+ }
+ @include app-ltr-style {
+ .select2-selection--single .select2-selection__rendered {
+ padding-left: calc(light.$input-padding-x - light.$input-border-width);
+ }
+ }
+
+ @include app-rtl-style {
+ .select2-selection--single .select2-selection__rendered {
+ padding-right: calc(light.$input-padding-x - light.$input-border-width);
+ }
+ }
+
+ &.select2-container--disabled .select2-selection--single {
+ background-color: light.$input-disabled-bg;
+ border-color: light.$input-border-color !important;
+ .select2-selection__rendered {
+ color: light.$text-muted;
+ }
+ }
+
+ // Multiple Selection
+ // *******************************************************************************
+
+ .select2-selection--multiple {
+ min-height: calc(light.$input-height - light.$input-focus-border-width);
+ // TODO: Improve the padding calculation
+ padding: calc(light.$form-select-padding-y - light.$input-border-width - $select2-multiple-choice-spacer)
+ calc(light.$form-select-padding-x - light.$input-border-width);
+ .select2-selection__choice {
+ color: light.$body-color;
+ background-color: light.$gray-75;
+ }
+ }
+ &.select2-container--focus,
+ &.select2-container--open {
+ .select2-selection--single {
+ .select2-selection__rendered {
+ line-height: calc($input-height-inner - $input-border-width - $input-focus-border-width);
+ padding-inline-start: calc(light.$input-padding-x - $input-focus-border-width);
+ padding-inline-end: calc($select2-arrow-wrapper-width - $input-focus-border-width);
+ }
+ }
+ .select2-selection--multiple {
+ padding: calc(
+ light.$form-select-padding-y -
+ light.$input-border-width -
+ $select2-multiple-choice-spacer -
+ light.$input-border-width
+ )
+ calc(light.$form-select-padding-x - $input-focus-border-width);
+ .select2-selection__choice {
+ margin-top: calc($select2-multiple-choice-spacer - light.$input-focus-border-width);
+ &:nth-last-child(2) {
+ margin-bottom: calc($select2-multiple-choice-spacer - light.$input-focus-border-width);
+ }
+ }
+ }
+ }
+
+ &.select2-container--disabled .select2-selection--multiple {
+ border-color: light.$input-border-color !important;
+ background-color: light.$input-disabled-bg;
+ .select2-selection__rendered {
+ color: light.$text-muted;
+ }
+ }
+
+ // Generic
+ // *******************************************************************************
+
+ .select2-search--dropdown .select2-search__field {
+ border: 1px solid light.$input-border-color;
+ }
+
+ // Placeholder
+ .select2-search__field {
+ &::-webkit-input-placeholder {
+ color: light.$input-placeholder-color;
+ }
+
+ &::-moz-placeholder {
+ color: light.$input-placeholder-color;
+ }
+
+ &:-ms-input-placeholder {
+ color: light.$input-placeholder-color;
+ }
+ }
+
+ .select2-results__option {
+ color: light.$headings-color;
+ &[aria-selected='true'] {
+ color: light.$body-color;
+ background-color: light.$gray-100;
+ }
+
+ .select2-results__option[role='option'] {
+ width: calc(#{'100% - #{light.$input-padding-x}'});
+ padding-left: light.$input-padding-x;
+
+ .select2-results__option[role='option'] {
+ padding-left: light.$input-padding-x * 2;
+
+ .select2-results__option[role='option'] {
+ padding-left: light.$input-padding-x * 3;
+
+ .select2-results__option[role='option'] {
+ padding-left: light.$input-padding-x * 4;
+
+ .select2-results__option[role='option'] {
+ padding-left: light.$input-padding-x * 5;
+
+ .select2-results__option[role='option'] {
+ padding-left: light.$input-padding-x;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .select2-results__group {
+ padding: 0.5rem (light.$input-padding-x * 0.5);
+ }
+ }
+
+ @if $enable-rtl-support {
+ .select2-container--default[dir='rtl'] .select2-selection--multiple .select2-selection__choice {
+ margin-left: $select2-multiple-choice-spacer;
+ margin-right: 0;
+ }
+ }
+
+ @include app-rtl-style {
+ .select2-container--default {
+ .select2-results__option .select2-results__option {
+ padding-right: light.$input-padding-x;
+ padding-left: 0 !important;
+ margin-left: 0 !important;
+
+ .select2-results__option[role='option'] {
+ padding-right: light.$input-padding-x * 2;
+
+ .select2-results__option[role='option'] {
+ padding-right: light.$input-padding-x * 3;
+
+ .select2-results__option[role='option'] {
+ padding-right: light.$input-padding-x * 4;
+
+ .select2-results__option[role='option'] {
+ padding-right: light.$input-padding-x * 5;
+
+ .select2-results__option[role='option'] {
+ padding-right: light.$input-padding-x;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @include select2-validation-state('valid', light.$form-feedback-valid-color);
+ @include select2-validation-state('invalid', light.$form-feedback-invalid-color);
+
+ @each $color, $value in light.$theme-colors {
+ @if $color != primary {
+ .select2-#{$color} {
+ @include select2-variant($value);
+ }
+ }
+ }
+ }
+}
+
+@if $enable-dark-style {
+ .dark-style {
+ $select2-multiple-choice-spacer: px-to-rem(
+ floor(rem-to-px((dark.$input-height-inner - $select2-multiple-selection-line-height) * 0.5))
+ );
+
+ .select2-selection--multiple {
+ .select2-selection__choice {
+ margin-top: calc($select2-multiple-choice-spacer - 1px);
+ margin-right: $select2-multiple-choice-spacer;
+ background-color: dark.$gray-75;
+ &:nth-last-child(2) {
+ margin-bottom: calc($select2-multiple-choice-spacer - 1px);
+ }
+ }
+ .select2-selection__clear {
+ margin-top: $select2-multiple-choice-spacer;
+ }
+ .select2-selection__placeholder {
+ margin-top: $select2-multiple-choice-spacer;
+ }
+
+ .select2-selection__rendered {
+ padding: 0;
+ }
+ }
+
+ @if $enable-rtl-support {
+ .select2-container--default[dir='rtl'] .select2-selection--multiple .select2-selection__choice {
+ margin-left: $select2-multiple-choice-spacer;
+ margin-right: 0;
+ }
+ }
+
+ .select2-container--default {
+ .select2-selection {
+ transition: dark.$input-transition;
+ background-color: dark.$input-bg;
+ border: 1px solid dark.$input-border-color;
+
+ @include dark.border-radius(dark.$border-radius);
+ &:hover {
+ border-color: dark.$input-border-hover-color;
+ }
+ }
+
+ .select2-selection__placeholder {
+ color: dark.$input-placeholder-color;
+ }
+
+ // Single Selection
+ // *******************************************************************************
+
+ .select2-selection--single {
+ height: dark.$input-height;
+
+ .select2-selection__arrow {
+ height: dark.$input-height;
+ position: absolute;
+
+ b {
+ background-image: str-replace(
+ str-replace(
+ dark.$form-select-indicator,
+ '#{$form-select-indicator-color}',
+ dark.$form-select-indicator-color
+ ),
+ '#',
+ '%23'
+ );
+ }
+ }
+
+ .select2-selection__rendered {
+ line-height: calc(dark.$input-height-inner - dark.$input-border-width);
+ color: dark.$input-color;
+ }
+
+ .select2-selection__clear {
+ color: dark.$text-muted;
+ }
+ }
+ &.select2-container--disabled .select2-selection__arrow {
+ b {
+ background-image: str-replace(
+ str-replace(dark.$form-select-disabled-indicator, '#{$text-muted}', dark.$text-muted),
+ '#',
+ '%23'
+ );
+ }
+ }
+ @include app-ltr-style {
+ .select2-selection--single .select2-selection__rendered {
+ padding-left: calc(dark.$input-padding-x - dark.$input-border-width);
+ }
+ }
+
+ // Multiple Selection
+
+ .select2-selection--multiple {
+ min-height: calc(dark.$input-height - dark.$input-focus-border-width);
+ // TODO: Improve the padding calculation
+ padding: calc(dark.$form-select-padding-y - dark.$input-border-width - $select2-multiple-choice-spacer)
+ calc(dark.$form-select-padding-x - dark.$input-border-width);
+ .select2-selection__choice {
+ color: dark.$body-color;
+ background-color: dark.$gray-75;
+ }
+ }
+ &.select2-container--focus,
+ &.select2-container--open {
+ .select2-selection--single {
+ .select2-selection__rendered {
+ line-height: calc(dark.$input-height-inner - dark.$input-border-width - dark.$input-focus-border-width);
+ padding-inline-start: calc(dark.$input-padding-x - dark.$input-focus-border-width) !important;
+ padding-inline-end: calc($select2-arrow-wrapper-width - dark.$input-focus-border-width);
+ }
+ }
+ .select2-selection--multiple {
+ padding: calc(
+ dark.$form-select-padding-y -
+ dark.$input-border-width -
+ $select2-multiple-choice-spacer -
+ dark.$input-border-width
+ )
+ calc(dark.$form-select-padding-x - dark.$input-focus-border-width);
+ .select2-selection__choice {
+ margin-top: calc($select2-multiple-choice-spacer - light.$input-focus-border-width);
+ &:nth-last-child(2) {
+ margin-bottom: calc($select2-multiple-choice-spacer - light.$input-focus-border-width);
+ }
+ }
+ }
+ }
+
+ &.select2-container--disabled .select2-selection--multiple {
+ border-color: dark.$input-border-color !important;
+ background-color: dark.$input-disabled-bg;
+ .select2-selection__rendered {
+ color: dark.$text-muted;
+ }
+ }
+
+ @include app-rtl-style {
+ .select2-selection--single .select2-selection__rendered {
+ padding-right: calc(dark.$input-padding-x - dark.$input-border-width);
+ }
+ }
+
+ &.select2-container--open .select2-selection--single .select2-selection__arrow b {
+ border-color: transparent transparent dark.$input-placeholder-color transparent;
+ }
+
+ &.select2-container--disabled .select2-selection--single {
+ background-color: dark.$input-disabled-bg;
+ border-color: dark.$input-border-color !important;
+ .select2-selection__rendered {
+ color: dark.$text-muted;
+ }
+ }
+
+ // Placeholder
+ .select2-search__field {
+ &::-webkit-input-placeholder {
+ color: dark.$input-placeholder-color;
+ }
+ &::-moz-placeholder {
+ color: dark.$input-placeholder-color;
+ }
+
+ &:-ms-input-placeholder {
+ color: dark.$input-placeholder-color;
+ }
+ }
+
+ .select2-search--dropdown .select2-search__field {
+ border: 1px solid dark.$input-border-color;
+ background: dark.$input-bg;
+ }
+
+ .select2-results__option {
+ color: dark.$headings-color;
+ &[aria-selected='true'] {
+ color: dark.$body-color;
+ background-color: dark.$gray-100;
+ }
+
+ .select2-results__option {
+ .select2-results__option[role='option'] {
+ padding-left: dark.$input-padding-x;
+
+ .select2-results__option[role='option'] {
+ padding-left: dark.$input-padding-x * 2;
+
+ .select2-results__option[role='option'] {
+ padding-left: dark.$input-padding-x * 3;
+
+ .select2-results__option[role='option'] {
+ padding-left: dark.$input-padding-x * 4;
+
+ .select2-results__option[role='option'] {
+ padding-left: dark.$input-padding-x * 5;
+
+ .select2-results__option[role='option'] {
+ padding-left: dark.$input-padding-x;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .select2-results__group {
+ padding: 0.5rem (dark.$input-padding-x * 0.5);
+ }
+ }
+
+ .select2-dropdown {
+ z-index: dark.$zindex-dropdown;
+ background: dark.$dropdown-bg;
+ border-color: dark.$dropdown-border-color;
+ background-clip: padding-box;
+ box-shadow: dark.$dropdown-box-shadow;
+ &.select2-dropdown--above {
+ box-shadow: 0 -0.2rem 1.25rem rgba(15, 20, 34, 0.55) !important;
+ }
+ }
+
+ .select2-search__field {
+ color: dark.$input-color;
+ }
+
+ @include app-rtl-style {
+ .select2-container--default {
+ .select2-results__option .select2-results__option {
+ padding-left: 0 !important;
+ padding-right: dark.$input-padding-x;
+ margin-left: 0 !important;
+
+ .select2-results__option[role='option'] {
+ padding-right: dark.$input-padding-x * 2;
+
+ .select2-results__option[role='option'] {
+ padding-right: dark.$input-padding-x * 3;
+
+ .select2-results__option[role='option'] {
+ padding-right: dark.$input-padding-x * 4;
+
+ .select2-results__option[role='option'] {
+ padding-right: dark.$input-padding-x * 5;
+
+ .select2-results__option[role='option'] {
+ padding-right: dark.$input-padding-x;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @include select2-validation-state('valid', dark.$form-feedback-valid-color);
+ @include select2-validation-state('invalid', dark.$form-feedback-invalid-color);
+
+ @each $color, $value in dark.$theme-colors {
+ @if $color != primary {
+ .select2-#{$color} {
+ @include select2-variant($value);
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/shepherd/_mixins.scss b/resources/assets/vendor/libs/shepherd/_mixins.scss
new file mode 100644
index 0000000..7b247b5
--- /dev/null
+++ b/resources/assets/vendor/libs/shepherd/_mixins.scss
@@ -0,0 +1,8 @@
+@import '../../scss/_bootstrap-extended/include';
+@mixin tour-theme($background) {
+ // ! Note: If we remove this mixin, the background-color of label button in dark mode will not work properly.
+ .shepherd-element {
+ @include template-button-variant('.shepherd-button:not(:disabled).btn-primary', $background);
+ @include template-button-label-variant('.shepherd-button:not(:disabled).btn-label-secondary', $secondary);
+ }
+}
diff --git a/resources/assets/vendor/libs/shepherd/shepherd.js b/resources/assets/vendor/libs/shepherd/shepherd.js
new file mode 100644
index 0000000..a9e4882
--- /dev/null
+++ b/resources/assets/vendor/libs/shepherd/shepherd.js
@@ -0,0 +1,7 @@
+import Shepherd from 'shepherd.js/dist/js/shepherd';
+
+try {
+ window.Shepherd = Shepherd;
+} catch (e) {}
+
+export { Shepherd };
diff --git a/resources/assets/vendor/libs/shepherd/shepherd.scss b/resources/assets/vendor/libs/shepherd/shepherd.scss
new file mode 100644
index 0000000..d1243f6
--- /dev/null
+++ b/resources/assets/vendor/libs/shepherd/shepherd.scss
@@ -0,0 +1,144 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@charset "UTF-8";
+@import '../../scss/_custom-variables/libs';
+@import 'shepherd.js/dist/css/shepherd';
+@import './mixins';
+
+$shepherd-header-content-padding-x: 1.25rem !default;
+$shepherd-header-content-padding-y: 1.25rem !default;
+$shepherd-btn-padding-x: 1.25rem !default;
+$shepherd-container-width: 15rem !default;
+
+.shepherd-element {
+ .shepherd-arrow:before {
+ border-right: 1px solid;
+ border-bottom: 1px solid;
+ }
+ .shepherd-content {
+ min-width: $shepherd-container-width;
+ border-radius: light.$border-radius !important;
+ .shepherd-header {
+ padding: $shepherd-header-content-padding-y $shepherd-header-content-padding-x 0;
+ .shepherd-title {
+ font-weight: light.$font-weight-medium !important;
+ font-size: light.$h5-font-size !important;
+ }
+
+ .shepherd-cancel-icon {
+ font-size: 1.85rem !important;
+ &:focus {
+ outline: 0;
+ }
+ }
+ }
+ .shepherd-text {
+ font-size: light.$font-size-base !important;
+ padding: 1rem $shepherd-header-content-padding-x !important;
+ }
+
+ .shepherd-footer {
+ .shepherd-button {
+ &:not(:last-child) {
+ margin-right: 0.75rem !important;
+ }
+ }
+ padding: 0 $shepherd-header-content-padding-x $shepherd-header-content-padding-y !important;
+ }
+ }
+ // Ask before submit
+ &[data-popper-placement='bottom'] {
+ margin-top: 0.8rem !important;
+ }
+ &[data-popper-placement='top'] {
+ margin-top: -0.8rem !important;
+ }
+ &[data-popper-placement='left'] {
+ margin-left: -0.8rem !important;
+ .shepherd-arrow:before {
+ border-bottom: 0;
+ border-top: 1px solid;
+ }
+ }
+ &[data-popper-placement='right'] {
+ margin-left: 0.8rem !important;
+ .shepherd-arrow:before {
+ border-right: 0;
+ border-left: 1px solid;
+ }
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .shepherd-element {
+ box-shadow: light.$box-shadow;
+ background-color: light.$card-bg !important;
+ .shepherd-content {
+ .shepherd-header {
+ background: light.$card-bg !important;
+ .shepherd-title {
+ color: light.$headings-color !important;
+ }
+ .shepherd-cancel-icon {
+ color: light.$text-muted !important;
+ }
+ }
+ .shepherd-text {
+ color: light.$body-color !important;
+ }
+ }
+ .shepherd-arrow:before {
+ background-color: light.$card-bg !important;
+ border-color: light.$card-bg !important;
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ .shepherd-element {
+ box-shadow: dark.$box-shadow;
+ background: dark.$card-bg !important;
+ .shepherd-content {
+ .shepherd-header {
+ background: dark.$card-bg !important;
+ .shepherd-title {
+ color: dark.$headings-color !important;
+ }
+ .shepherd-cancel-icon {
+ color: dark.$text-muted !important;
+ }
+ }
+ .shepherd-text {
+ color: dark.$body-color !important;
+ }
+ }
+ }
+ .shepherd-arrow:before {
+ background-color: dark.$card-bg !important;
+ border-color: dark.$card-bg !important;
+ }
+ }
+}
+
+// RTL
+@if $enable-rtl-support {
+ [dir='rtl'] {
+ .shepherd-element {
+ .btn-next {
+ margin-right: 0.75rem;
+ }
+ &[data-popper-placement='left'] {
+ margin-left: -0.8rem !important;
+ }
+ }
+ }
+}
+
+@include light.media-breakpoint-down(sm) {
+ .shepherd-element {
+ max-width: 300px !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/spinkit/_mixins.scss b/resources/assets/vendor/libs/spinkit/_mixins.scss
new file mode 100644
index 0000000..612206b
--- /dev/null
+++ b/resources/assets/vendor/libs/spinkit/_mixins.scss
@@ -0,0 +1,14 @@
+@mixin spinkit-theme($background) {
+ .sk-primary.sk-plane,
+ .sk-primary .sk-chase-dot:before,
+ .sk-primary .sk-bounce-dot,
+ .sk-primary .sk-wave-rect,
+ .sk-primary.sk-pulse,
+ .sk-primary .sk-swing-dot,
+ .sk-primary .sk-circle-dot:before,
+ .sk-primary .sk-circle-fade-dot:before,
+ .sk-primary .sk-grid-cube,
+ .sk-primary .sk-fold-cube:before {
+ background-color: $background;
+ }
+}
diff --git a/resources/assets/vendor/libs/spinkit/spinkit.scss b/resources/assets/vendor/libs/spinkit/spinkit.scss
new file mode 100644
index 0000000..622912c
--- /dev/null
+++ b/resources/assets/vendor/libs/spinkit/spinkit.scss
@@ -0,0 +1,25 @@
+@import 'spinkit/spinkit';
+:root {
+ --sk-size: 30px;
+ --sk-color: #fff;
+}
+
+.sk-wave {
+ width: 40px;
+ white-space: nowrap;
+}
+
+.sk-fading-circle .sk-circle {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.sk-wave {
+ width: 40px;
+ white-space: nowrap;
+}
+
+.sk-fading-circle .sk-circle {
+ margin-top: 0;
+ margin-bottom: 0;
+}
diff --git a/resources/assets/vendor/libs/sweetalert2/_mixins.scss b/resources/assets/vendor/libs/sweetalert2/_mixins.scss
new file mode 100644
index 0000000..25241f9
--- /dev/null
+++ b/resources/assets/vendor/libs/sweetalert2/_mixins.scss
@@ -0,0 +1,35 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin sweetalert2-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .swal2-progress-steps[class] .swal2-progress-step.swal2-active-progress-step,
+ .swal2-progress-steps[class] .swal2-progress-step-line,
+ .swal2-progress-steps[class] .swal2-active-progress-step,
+ .swal2-progress-steps[class] .swal2-progress-step {
+ background: $background;
+ color: $color;
+ }
+
+ .swal2-progress-steps[class] .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step,
+ .swal2-progress-steps[class] .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line {
+ background: mix($white, $background, 85%);
+ }
+}
+
+@mixin sweetalert2-dark-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .swal2-progress-steps[class] .swal2-progress-step.swal2-active-progress-step,
+ .swal2-progress-steps[class] .swal2-progress-step-line,
+ .swal2-progress-steps[class] .swal2-active-progress-step,
+ .swal2-progress-steps[class] .swal2-progress-step {
+ background: $background;
+ color: $color;
+ }
+
+ .swal2-progress-steps[class] .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step,
+ .swal2-progress-steps[class] .swal2-progress-step.swal2-active-progress-step ~ .swal2-progress-step-line {
+ background: mix($dark, $background, 55%);
+ }
+}
diff --git a/resources/assets/vendor/libs/sweetalert2/sweetalert2.js b/resources/assets/vendor/libs/sweetalert2/sweetalert2.js
new file mode 100644
index 0000000..bb7762e
--- /dev/null
+++ b/resources/assets/vendor/libs/sweetalert2/sweetalert2.js
@@ -0,0 +1,16 @@
+import SwalPlugin from 'sweetalert2/dist/sweetalert2';
+
+const Swal = SwalPlugin.mixin({
+ buttonsStyling: false,
+ customClass: {
+ confirmButton: 'btn btn-primary',
+ cancelButton: 'btn btn-label-danger',
+ denyButton: 'btn btn-label-secondary'
+ }
+});
+
+try {
+ window.Swal = Swal;
+} catch (e) {}
+
+export { Swal };
diff --git a/resources/assets/vendor/libs/sweetalert2/sweetalert2.scss b/resources/assets/vendor/libs/sweetalert2/sweetalert2.scss
new file mode 100644
index 0000000..12b8d56
--- /dev/null
+++ b/resources/assets/vendor/libs/sweetalert2/sweetalert2.scss
@@ -0,0 +1,314 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'sweetalert2/src/sweetalert2';
+
+// Sweet Alert2 Modal
+.swal2-modal.swal2-popup {
+ .swal2-title {
+ margin: 1.875rem 0 1rem 0;
+ max-width: calc(var(--swal2-width) * 0.5);
+ line-height: light.$line-height-base;
+ }
+
+ .swal2-content {
+ margin: 0 0 1rem 0;
+ }
+
+ .swal2-actions {
+ margin-top: 1rem;
+ .btn {
+ align-items: center;
+ }
+ }
+
+ .swal2-actions button + button {
+ margin-left: 0.375rem;
+
+ @include app-rtl {
+ margin-left: 0;
+ margin-right: 0.375rem;
+ }
+ }
+
+ .swal2-input,
+ .swal2-file,
+ .swal2-textarea {
+ box-shadow: none !important;
+ }
+
+ .swal2-icon {
+ margin-bottom: 0;
+ }
+
+ .swal2-checkbox input,
+ .swal2-radio input {
+ margin-right: 0.375rem;
+
+ @include app-rtl {
+ margin-right: 0;
+ margin-left: 0.375rem;
+ }
+ }
+ .swal2-close:focus {
+ box-shadow: none;
+ }
+}
+
+// RTL Specific
+@include app-rtl(false) {
+ .swal2-close {
+ right: auto;
+ left: 0.5rem;
+ }
+
+ .swal2-range input {
+ float: right;
+ }
+
+ .swal2-range output {
+ float: left;
+ }
+
+ .swal2-radio label:not(:first-child) {
+ margin-left: 0;
+ margin-right: 1.25rem;
+ }
+
+ .swal2-validationerror::before {
+ margin-left: 0.625rem;
+ margin-right: 0;
+ }
+
+ .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after {
+ margin-left: 0;
+ margin-right: 0.3125rem;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .swal2-container {
+ z-index: light.$zindex-modal;
+
+ .tooltip {
+ z-index: light.$zindex-modal + 2;
+ }
+
+ .popover {
+ z-index: light.$zindex-modal + 1;
+ }
+ }
+
+ .swal2-modal.swal2-popup {
+ font-family: light.$font-family-base;
+ box-shadow: light.$modal-content-box-shadow-xs;
+
+ @include light.border-radius(light.$border-radius);
+ }
+
+ .swal2-container.swal2-shown {
+ background: rgba(light.$modal-backdrop-bg, light.$modal-backdrop-opacity);
+ }
+
+ .swal2-popup .swal2-title {
+ font-size: light.$h2-font-size;
+ font-weight: light.$headings-font-weight;
+ color: light.$body-color;
+ }
+
+ .swal2-popup .swal2-content {
+ color: light.$text-muted;
+ line-height: light.$line-height-base;
+ font-size: light.$lead-font-size;
+ font-weight: light.$lead-font-weight;
+ }
+
+ .swal2-popup .swal2-input,
+ .swal2-popup .swal2-file,
+ .swal2-popup .swal2-textarea {
+ border: light.$input-border-width solid light.$input-border-color !important;
+ font-size: light.$font-size-lg;
+ color: light.$body-color;
+
+ @include light.border-radius(light.$border-radius-lg);
+ }
+
+ .swal2-popup .swal2-validationerror {
+ color: light.$body-color;
+ background: light.$gray-100;
+ }
+
+ // Colors
+ .swal2-popup .swal2-icon.swal2-success {
+ border-color: light.$success;
+
+ .swal2-success-ring {
+ border-color: rgba(light.$success, 0.2);
+ }
+
+ [class^='swal2-success-line'] {
+ background-color: light.$success;
+ }
+ }
+
+ .swal2-popup .swal2-icon.swal2-question {
+ border-color: rgba(light.$secondary, 0.4);
+ color: light.$secondary;
+ }
+
+ .swal2-popup .swal2-icon.swal2-info {
+ border-color: rgba(light.$info, 0.4);
+ color: light.$info;
+ }
+
+ .swal2-popup .swal2-icon.swal2-warning {
+ border-color: rgba(light.$warning, 0.8);
+ color: light.$warning;
+ }
+
+ .swal2-popup .swal2-icon.swal2-error {
+ border-color: rgba(light.$danger, 0.6);
+
+ [class^='swal2-x-mark-line'] {
+ border-color: light.$danger;
+ }
+ }
+ }
+}
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ .swal2-container {
+ z-index: dark.$zindex-modal;
+
+ .tooltip {
+ z-index: dark.$zindex-modal + 2;
+ }
+
+ .popover {
+ z-index: dark.$zindex-modal + 1;
+ }
+ }
+
+ .swal2-modal.swal2-popup {
+ background: dark.$modal-content-bg;
+ font-family: dark.$font-family-base;
+ box-shadow: dark.$modal-content-box-shadow-xs;
+
+ @include dark.border-radius(dark.$border-radius);
+ }
+
+ .swal2-container.swal2-shown {
+ background: rgba(dark.$modal-backdrop-bg, dark.$modal-backdrop-opacity);
+ }
+
+ .swal2-popup .swal2-title {
+ font-size: dark.$h2-font-size;
+ font-weight: dark.$headings-font-weight;
+ color: dark.$body-color;
+ }
+
+ .swal2-popup .swal2-content {
+ font-weight: dark.$lead-font-weight;
+ color: dark.$text-muted;
+ line-height: dark.$line-height-base;
+ font-size: dark.$lead-font-size;
+ pre {
+ color: dark.$body-color;
+ }
+ }
+ .swal2-popup .swal2-footer {
+ border-top: 1px solid dark.$border-color;
+ }
+
+ .swal2-popup .swal2-html-container {
+ color: dark.$body-color;
+ }
+
+ .swal2-popup .swal2-input,
+ .swal2-popup .swal2-file,
+ .swal2-popup .swal2-textarea {
+ color: dark.$body-color;
+ border: dark.$input-border-width solid dark.$input-border-color !important;
+ font-size: dark.$font-size-lg;
+
+ @include dark.border-radius(dark.$border-radius-lg);
+ }
+
+ .swal2-popup .swal2-validationerror {
+ color: dark.$body-color;
+ background: dark.$gray-100;
+ }
+
+ // Colors
+ .swal2-popup .swal2-icon.swal2-success {
+ border-color: dark.$success;
+
+ .swal2-success-ring {
+ border-color: rgba(dark.$success, 0.2);
+ }
+
+ [class^='swal2-success-line'] {
+ background-color: dark.$success;
+ }
+ }
+
+ .swal2-popup .swal2-icon.swal2-question {
+ border-color: rgba(dark.$secondary, 0.4);
+ color: dark.$secondary;
+ }
+
+ .swal2-popup .swal2-icon.swal2-info {
+ border-color: rgba(dark.$info, 0.4);
+ color: dark.$info;
+ }
+
+ .swal2-popup .swal2-icon.swal2-warning {
+ border-color: rgba(dark.$warning, 0.8);
+ color: dark.$warning;
+ }
+
+ .swal2-popup .swal2-icon.swal2-error {
+ border-color: rgba(dark.$danger, 0.6);
+
+ [class^='swal2-x-mark-line'] {
+ border-color: dark.$danger;
+ }
+ }
+ }
+}
+
+.swal2-popup .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after {
+ display: block;
+ width: 1em;
+ height: 1em;
+ margin-left: 0.2rem;
+ border: 0.15em solid currentColor;
+ border-right-color: transparent;
+ box-shadow: none;
+
+ @include app-rtl {
+ margin-left: 0;
+ margin-right: 0.5em;
+ }
+}
+
+// IE Specific
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ .swal2-modal:not([style='display: none;']),
+ .swal2-icon:not([style='display: none;']),
+ .swal2-actions:not([style='display: none;']),
+ .swal2-image:not([style='display: none;']),
+ .swal2-input:not([style='display: none;']),
+ .swal2-file:not([style='display: none;']),
+ .swal2-range:not([style='display: none;']),
+ .swal2-select:not([style='display: none;']),
+ .swal2-radio:not([style='display: none;']),
+ .swal2-checkbox:not([style='display: none;']),
+ .swal2-textarea:not([style='display: none;']),
+ .swal2-footer:not([style='display: none;']) {
+ display: flex;
+ }
+}
diff --git a/resources/assets/vendor/libs/swiper/_mixins.scss b/resources/assets/vendor/libs/swiper/_mixins.scss
new file mode 100644
index 0000000..66c841f
--- /dev/null
+++ b/resources/assets/vendor/libs/swiper/_mixins.scss
@@ -0,0 +1,6 @@
+@mixin swiper-theme($background) {
+ .swiper-pagination-bullet.swiper-pagination-bullet-active,
+ .swiper-pagination.swiper-pagination-progressbar .swiper-pagination-progressbar-fill {
+ background: $background !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/swiper/swiper.js b/resources/assets/vendor/libs/swiper/swiper.js
new file mode 100644
index 0000000..ff6e4b1
--- /dev/null
+++ b/resources/assets/vendor/libs/swiper/swiper.js
@@ -0,0 +1,7 @@
+import Swiper from 'swiper/bundle';
+
+try {
+ window.Swiper = Swiper;
+} catch (e) {}
+
+export { Swiper };
diff --git a/resources/assets/vendor/libs/swiper/swiper.scss b/resources/assets/vendor/libs/swiper/swiper.scss
new file mode 100644
index 0000000..8f92171
--- /dev/null
+++ b/resources/assets/vendor/libs/swiper/swiper.scss
@@ -0,0 +1,113 @@
+@import '../../scss/_bootstrap-extended/include';
+@import '../../scss/_custom-variables/libs';
+@import 'swiper/css/bundle';
+
+.swiper {
+ width: 100%;
+ overflow: hidden !important;
+ .swiper-slide {
+ color: $white;
+ }
+ .swiper-pagination-bullet.swiper-pagination-bullet-active.bg-transparent {
+ background: transparent !important;
+ }
+}
+
+.swiper-button-prev,
+.swiper-button-next {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ &.swiper-button-white {
+ color: $white;
+ }
+
+ &.custom-icon {
+ background-image: none;
+ line-height: 1;
+ &::after {
+ font-size: 2rem;
+ }
+ @include app-rtl {
+ transform: scaleX(-1) rotate(180deg);
+ }
+ }
+}
+
+.swiper-pagination-bullet {
+ background: rgba(0, 0, 0, 0.7);
+}
+
+.swiper-pagination-progressbar,
+.swiper-scrollbar {
+ background: rgba(0, 0, 0, 0.08);
+}
+
+.swiper-scrollbar-drag {
+ background: rgba(0, 0, 0, 0.3);
+}
+
+.swiper-pagination-white {
+ .swiper-pagination-bullet {
+ background: $white !important;
+ }
+
+ .swiper-pagination-bullet-active {
+ background: $white !important;
+ }
+}
+
+.swiper-scrollbar-white {
+ background: rgba(255, 255, 255, 0.2) !important;
+
+ .swiper-scrollbar-drag {
+ background: $white !important;
+ }
+}
+
+// black arrows for 3d style
+@if $enable-dark-style {
+ .dark-style {
+ .swiper-3d {
+ .swiper-pagination-bullet {
+ background-color: $white;
+ }
+ .swiper-button-prev,
+ .swiper-button-next {
+ &.swiper-button-black {
+ --swiper-navigation-color: $white;
+ }
+ }
+ }
+ }
+}
+
+@include app-rtl(false) {
+ .swiper-button-next {
+ right: auto;
+ left: 10px;
+ }
+
+ .swiper-button-prev {
+ right: 10px;
+ left: auto;
+ }
+
+ .swiper-vertical {
+ > .swiper-pagination-bullets {
+ right: auto;
+ left: 10px;
+ }
+
+ > .swiper-pagination-progressbar {
+ right: 0;
+ left: auto;
+ }
+
+ > .swiper-scrollbar {
+ right: auto;
+ left: 3px;
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/tagify/_mixins.scss b/resources/assets/vendor/libs/tagify/_mixins.scss
new file mode 100644
index 0000000..57a2912
--- /dev/null
+++ b/resources/assets/vendor/libs/tagify/_mixins.scss
@@ -0,0 +1,8 @@
+@mixin tagify-theme($color) {
+ .tagify--focus {
+ border-color: $color !important;
+ }
+ .tagify__dropdown__item--active {
+ background: $color !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/tagify/_tagify-email-list.scss b/resources/assets/vendor/libs/tagify/_tagify-email-list.scss
new file mode 100644
index 0000000..5cf2047
--- /dev/null
+++ b/resources/assets/vendor/libs/tagify/_tagify-email-list.scss
@@ -0,0 +1,105 @@
+.tagify-email-list {
+ display: inline-block;
+ min-width: 0;
+ border: none;
+ &.tagify {
+ padding: 0 !important;
+ padding-bottom: calc($tag-spacer - light.$input-border-width) !important;
+ }
+
+ &.tagify {
+ padding: 0 !important;
+ padding-bottom: calc($tag-spacer - light.$input-border-width) !important;
+ }
+
+ &.tagify.tagify--focus {
+ padding-left: 0 !important;
+ }
+ .tagify__tag {
+ margin: 0;
+ margin-inline-start: 0 !important;
+ margin-inline-end: $tag-spacer !important;
+ margin-bottom: $tag-spacer !important;
+ > div {
+ padding: $tag-spacer * 0.5 $tag-spacer !important;
+ padding-inline: $tag-spacer * 2 !important;
+ }
+ &:only-of-type {
+ > div {
+ padding-inline: $tag-spacer !important;
+ }
+ }
+ }
+
+ /* Do not show the "remove tag" (x) button when only a single tag remains */
+ .tagify__tag:only-of-type .tagify__tag__removeBtn {
+ display: none;
+ }
+
+ .tagify__tag__removeBtn {
+ opacity: 0;
+ transform: translateX(-6px) scale(0.5);
+ margin-left: -3ch;
+ transition: 0.12s;
+ position: absolute;
+ inset-inline-end: 0;
+ }
+
+ .tagify__tag:hover .tagify__tag__removeBtn {
+ transform: none;
+ opacity: 1;
+ margin-left: -1ch;
+ }
+
+ .tagify__input {
+ display: none;
+ }
+}
+
+.tagify__tag > div {
+ border-radius: light.$border-radius-pill;
+}
+
+//RTL
+@include app-rtl(false) {
+ .tagify-email-list {
+ .tagify__tag {
+ margin: 0 $tag-spacer $tag-spacer 0;
+ &:hover .tagify__tag__removeBtn {
+ margin-left: auto;
+ margin-right: -1ch;
+ }
+ }
+ .tagify__tag__removeBtn {
+ transform: translateX(6px) scale(0.5);
+ margin-left: auto;
+ margin-right: -3ch;
+ }
+ }
+}
+
+// Light styles
+@if $enable-light-style {
+ .light-style {
+ .tagify-email-list {
+ .tagify__tag {
+ &--editable:not(.tagify--invalid) > div::before {
+ box-shadow: 0 0 0 2px light.$border-color inset !important;
+ }
+ }
+ }
+ }
+}
+
+// Dark styles
+@if $enable-dark-style {
+ .dark-style {
+ .tagify-email-list {
+ .tagify__tag {
+ &--editable:not(.tagify--invalid) > div::before {
+ box-shadow: 0 0 0 2px dark.$border-color inset !important;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/tagify/_tagify-inline-suggestion.scss b/resources/assets/vendor/libs/tagify/_tagify-inline-suggestion.scss
new file mode 100644
index 0000000..75a2685
--- /dev/null
+++ b/resources/assets/vendor/libs/tagify/_tagify-inline-suggestion.scss
@@ -0,0 +1,67 @@
+.tags-inline {
+ .tagify__dropdown__wrapper {
+ padding: 0 $tag-spacer $tag-spacer $tag-spacer;
+ border: none;
+ box-shadow: none;
+ }
+ .tagify__dropdown__item {
+ display: inline-block;
+ border-radius: 3px;
+ padding: 0.3em 0.5em;
+ margin: $tag-spacer $tag-spacer 0 0;
+ font-size: 0.85em;
+ transition: 0s;
+ }
+}
+
+//RTL
+@include app-rtl(false) {
+ .tags-inline {
+ .tagify__dropdown__item {
+ margin: $tag-spacer 0 0 $tag-spacer;
+ }
+ }
+}
+
+// Light styles
+@if $enable-light-style {
+ .light-style {
+ .tags-inline {
+ .tagify__dropdown__item {
+ border: 1px solid light.$border-color;
+ background: light.rgba-to-hex(light.$gray-100);
+
+ color: light.$body-color;
+
+ &--active {
+ color: light.$white !important;
+ }
+
+ &:hover {
+ color: light.$white !important;
+ }
+ }
+ }
+ }
+}
+
+// Dark styles
+@if $enable-dark-style {
+ .dark-style {
+ .tags-inline {
+ .tagify__dropdown__item {
+ border: 1px solid dark.$border-color;
+ background: dark.$body-bg;
+ color: dark.$body-color;
+
+ &--active {
+ color: dark.$white !important;
+ }
+
+ &:hover {
+ color: dark.$white !important;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/tagify/_tagify-users-list.scss b/resources/assets/vendor/libs/tagify/_tagify-users-list.scss
new file mode 100644
index 0000000..d8b01e3
--- /dev/null
+++ b/resources/assets/vendor/libs/tagify/_tagify-users-list.scss
@@ -0,0 +1,124 @@
+/* Suggestions items */
+.tagify__dropdown.users-list {
+ font-size: 1rem;
+ .addAll {
+ display: block !important;
+ }
+
+ .tagify__dropdown__item {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ gap: 0 1em;
+ grid-template-areas:
+ 'avatar name'
+ 'avatar email';
+
+ &__avatar-wrap {
+ grid-area: avatar;
+ width: $tag-avatar-select-size;
+ height: $tag-avatar-select-size;
+ border-radius: 50%;
+ overflow: hidden;
+
+ transition: 0.1s ease-out;
+ }
+ }
+
+ img {
+ width: 100%;
+ vertical-align: top;
+ }
+
+ strong {
+ grid-area: name;
+ width: 100%;
+ align-self: center;
+ font-weight: 500;
+ }
+
+ span {
+ grid-area: email;
+ width: 100%;
+ font-size: 0.9em;
+ opacity: 0.6;
+ }
+}
+
+/* Tags items */
+.tagify__tag {
+ white-space: nowrap;
+
+ .tagify__tag__avatar-wrap {
+ width: $tag-avatar-size;
+ height: $tag-avatar-size;
+ white-space: normal;
+
+ border-radius: 50%;
+ margin-right: 5px;
+ transition: 0.12s ease-out;
+ vertical-align: middle;
+ }
+
+ img {
+ width: 100%;
+ vertical-align: top;
+ }
+}
+
+//RTL
+@include app-rtl(false) {
+ .tagify__tag {
+ .tagify__tag__avatar-wrap {
+ margin-left: 5px;
+ margin-right: auto;
+ }
+ }
+}
+
+// Light styles
+@if $enable-light-style {
+ .light-style {
+ .tagify {
+ &__dropdown.users-list {
+ .tagify__dropdown__item__avatar-wrap {
+ background: light.$body-bg;
+ }
+ }
+
+ &__tag {
+ .tagify__tag__avatar-wrap {
+ background: light.$body-bg;
+ }
+ }
+ &__dropdown.users-list {
+ .addAll {
+ border-bottom: 1px solid light.$border-color;
+ }
+ }
+ }
+ }
+}
+
+// Dark styles
+@if $enable-dark-style {
+ .dark-style {
+ .tagify {
+ &__dropdown.users-list {
+ .tagify__dropdown__item__avatar-wrap {
+ background: dark.$body-bg;
+ }
+ }
+
+ &__tag {
+ .tagify__tag__avatar-wrap {
+ background: dark.$body-bg;
+ }
+ }
+ &__dropdown.users-list {
+ .addAll {
+ border-bottom: 1px solid dark.$border-color;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/tagify/tagify.js b/resources/assets/vendor/libs/tagify/tagify.js
new file mode 100644
index 0000000..6d94510
--- /dev/null
+++ b/resources/assets/vendor/libs/tagify/tagify.js
@@ -0,0 +1,7 @@
+import Tagify from '@yaireo/tagify';
+
+try {
+ window.Tagify = Tagify;
+} catch (e) {}
+
+export { Tagify };
diff --git a/resources/assets/vendor/libs/tagify/tagify.scss b/resources/assets/vendor/libs/tagify/tagify.scss
new file mode 100644
index 0000000..14c72a3
--- /dev/null
+++ b/resources/assets/vendor/libs/tagify/tagify.scss
@@ -0,0 +1,246 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+@import 'mixins';
+
+// Height clac to match form-control height
+$tag-line-height: 1.5rem !default;
+$tag-spacer: light.px-to-rem(floor(light.rem-to-px((light.$input-height-inner - $tag-line-height) * 0.6))) !default;
+
+// Override tagify vars
+$tag-remove: light.$danger !default;
+$tag-remove-btn-bg--hover: darken($tag-remove, 5) !default;
+$tag-invalid-color: $tag-remove !default;
+$tag-inset-shadow-size: 2em !default;
+$tag-remove-btn-color: light.rgba-to-hex(light.$gray-600, light.$rgba-to-hex-bg) !default;
+$tag-invalid-bg: rgba($tag-remove, 0.5) !default;
+
+$tag-avatar-size: 22px !default;
+$tag-avatar-select-size: 36px !default;
+
+$tag-max-width: auto !default;
+
+$tag-inset-shadow-size: 2em !default;
+
+//! Tagify $tag-bg custom color to match with dark and light layout
+$tag-bg: rgb(light.$text-light, 0.5) !default;
+
+@import '@yaireo/tagify/src/tagify';
+
+@import 'tagify-users-list';
+@import 'tagify-inline-suggestion';
+@import 'tagify-email-list';
+
+.tagify {
+ &.form-control {
+ transition: none;
+ display: flex;
+ align-items: flex-end;
+ padding: calc(light.$input-focus-border-width - light.$input-border-width) $tag-spacer $tag-spacer - 0.1875rem !important;
+ .fv-plugins-bootstrap5-row-invalid & {
+ padding: 0 calc($tag-spacer - light.$input-border-width) calc($tag-spacer - light.$input-focus-border-width) !important;
+ }
+ }
+
+ &.tagify--focus,
+ &.form-control:focus {
+ padding: 0 calc($tag-spacer - light.$input-border-width)
+ calc($tag-spacer - calc(light.$input-focus-border-width * 2)) !important;
+ border-width: light.$input-focus-border-width;
+ }
+ &__tag,
+ &__input {
+ margin: $tag-spacer - 0.25rem $tag-spacer 0 0 !important;
+ line-height: 1;
+ }
+ &__input {
+ line-height: $tag-line-height;
+ &:empty::before {
+ top: 4px;
+ }
+ }
+ &__tag {
+ > div {
+ line-height: $tag-line-height;
+ padding: 0 0 0 $tag-spacer;
+ }
+ &__removeBtn {
+ margin-right: $tag-spacer - 0.3rem;
+ margin-left: $tag-spacer * 0.5;
+ font-family: 'tabler-icons';
+ opacity: 0.7;
+ &:hover {
+ background: none;
+ color: $tag-remove-btn-bg--hover !important;
+ }
+ &::after {
+ content: '\f739';
+ }
+ }
+ &:hover:not([readonly]),
+ &:focus {
+ div::before {
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ left: 0px;
+ }
+ }
+ }
+ &__dropdown {
+ transform: translateY(0);
+ }
+ &[readonly]:not(.tagify--mix) .tagify__tag > div {
+ padding: 0 $tag-spacer 0 $tag-spacer !important;
+ }
+ &__input {
+ padding: 0;
+ }
+ &__tag-text {
+ font-size: light.$font-size-sm;
+ font-weight: light.$font-weight-medium;
+ }
+}
+.tagify {
+ &.form-control {
+ padding-top: calc(light.$input-padding-y - $tag-spacer) !important;
+ }
+ &.tagify--focus,
+ &.form-control:focus {
+ padding-top: calc(light.$input-padding-y - $tag-spacer - 1px) !important;
+ }
+}
+
+//RTL
+@include app-rtl(false) {
+ .tagify {
+ &__tag,
+ &__input {
+ margin: $tag-spacer 0 0 $tag-spacer;
+ }
+
+ + input,
+ + textarea {
+ left: 0;
+ right: -9999em !important;
+ }
+
+ &__tag {
+ > div {
+ padding: 0 $tag-spacer + 0.25rem 0 0;
+ }
+ &__removeBtn {
+ margin-left: $tag-spacer;
+ margin-right: $tag-spacer * 0.5;
+ }
+ }
+ }
+}
+
+// Light styles
+@if $enable-light-style {
+ .light-style {
+ .tagify {
+ &__tag {
+ > div::before {
+ box-shadow: 0 0 0 1.3em light.$gray-75 inset;
+ }
+ .tagify__tag-text {
+ color: light.$headings-color;
+ }
+ &:hover:not([readonly]),
+ &:focus {
+ div::before {
+ box-shadow: 0 0 0 1.3em light.$gray-200 inset;
+ }
+ }
+ &__removeBtn {
+ color: light.rgba-to-hex(light.$gray-600, light.$rgba-to-hex-bg);
+ &:hover + div::before {
+ background: rgba($tag-remove, 0.3);
+ }
+ }
+ }
+ &:hover:not([readonly]) {
+ border-color: light.$input-border-color;
+ }
+ &__input::before {
+ color: light.$input-placeholder-color !important;
+ }
+ &__dropdown {
+ box-shadow: light.$dropdown-box-shadow;
+ border-top-color: light.$dropdown-border-color;
+ &__wrapper {
+ background: light.$dropdown-bg;
+ border-color: light.$dropdown-border-color;
+ }
+ }
+ }
+ }
+}
+
+// Dark styles
+@if $enable-dark-style {
+ .dark-style {
+ .tagify {
+ &__tag {
+ > div {
+ &::before {
+ box-shadow: 0 0 0 1.3em dark.$gray-75 inset;
+ }
+ .tagify__tag-text {
+ color: dark.$headings-color;
+ }
+ }
+ &:hover:not([readonly]),
+ &:focus {
+ div::before {
+ box-shadow: 0 0 0 1.3em dark.$gray-200 inset;
+ }
+ }
+ &__removeBtn {
+ color: dark.rgba-to-hex(dark.$gray-600, dark.$rgba-to-hex-bg);
+ &:hover + div::before {
+ background: rgba($tag-remove, 0.3);
+ }
+ }
+ }
+ &:hover:not([readonly]) {
+ border-color: dark.$input-border-color;
+ }
+ &__input::before {
+ color: dark.$input-placeholder-color !important;
+ }
+ &[readonly]:not(.tagify--mix) {
+ .tagify__tag > div::before {
+ background: linear-gradient(
+ 45deg,
+ dark.$input-border-color 25%,
+ transparent 25%,
+ transparent 50%,
+ dark.$input-border-color 50%,
+ dark.$input-border-color 75%,
+ transparent 75%,
+ transparent
+ )
+ 0/5px
+ 5px;
+ }
+ &:not(.tagify--select) .tagify__tag > div::before {
+ animation: none;
+ box-shadow: none;
+ }
+ }
+ &__dropdown {
+ box-shadow: dark.$dropdown-box-shadow;
+ border-top-color: dark.$dropdown-border-color;
+ &__wrapper {
+ box-shadow: dark.$dropdown-box-shadow;
+ background: dark.$dropdown-bg;
+ border-color: dark.$dropdown-border-color;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/libs/typeahead-js/_mixins.scss b/resources/assets/vendor/libs/typeahead-js/_mixins.scss
new file mode 100644
index 0000000..7a0263a
--- /dev/null
+++ b/resources/assets/vendor/libs/typeahead-js/_mixins.scss
@@ -0,0 +1,11 @@
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin typeahead-theme($background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ .tt-suggestion:active,
+ .tt-cursor {
+ background: $background !important;
+ color: $color !important;
+ }
+}
diff --git a/resources/assets/vendor/libs/typeahead-js/typeahead.js b/resources/assets/vendor/libs/typeahead-js/typeahead.js
new file mode 100644
index 0000000..bd1e169
--- /dev/null
+++ b/resources/assets/vendor/libs/typeahead-js/typeahead.js
@@ -0,0 +1,7 @@
+import 'typeahead.js/dist/typeahead.bundle';
+
+// try {
+// window.typeahead = typeahead;
+// } catch (e) {}
+
+// export { typeahead };
diff --git a/resources/assets/vendor/libs/typeahead-js/typeahead.scss b/resources/assets/vendor/libs/typeahead-js/typeahead.scss
new file mode 100644
index 0000000..4fa9556
--- /dev/null
+++ b/resources/assets/vendor/libs/typeahead-js/typeahead.scss
@@ -0,0 +1,144 @@
+// Typeahead
+// *******************************************************************************
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+
+.twitter-typeahead {
+ display: block !important;
+
+ .tt-menu {
+ float: left;
+ position: absolute;
+ left: 0;
+ top: 100%;
+ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
+ list-style: none;
+ background-clip: padding-box;
+ display: none;
+
+ @include app-rtl {
+ float: right;
+ left: auto !important;
+ right: 0 !important;
+ text-align: right;
+ }
+
+ .tt-suggestion {
+ text-align: inherit;
+ border: 0;
+ width: 100%;
+ display: block;
+ white-space: nowrap;
+ background: none;
+ clear: both;
+ cursor: pointer;
+
+ p {
+ margin: 0;
+ }
+ .tt-highlight {
+ font-weight: light.$font-weight-medium;
+ }
+ }
+ }
+ .tt-hint {
+ color: #999;
+ }
+ .tt-input {
+ @include app-rtl {
+ direction: rtl;
+ }
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .twitter-typeahead {
+ .tt-menu {
+ min-width: light.$dropdown-min-width;
+ padding: light.$dropdown-padding-y 0;
+ font-size: light.$font-size-base;
+ // border: light.$dropdown-border-width solid light.$dropdown-border-color;
+ z-index: light.$zindex-dropdown;
+ margin: calc(light.$dropdown-spacer + light.$dropdown-spacer) 0;
+ color: light.$body-color;
+ box-shadow: light.$dropdown-box-shadow;
+ background-color: light.$dropdown-bg;
+ @include light.border-radius(light.$border-radius);
+ }
+ .tt-hint {
+ color: light.$input-placeholder-color;
+ }
+ .tt-suggestion {
+ font-weight: light.$font-weight-normal;
+ color: light.$dropdown-link-color;
+ padding: light.$dropdown-item-padding-y light.$dropdown-item-padding-x;
+
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: light.$dropdown-link-hover-color;
+ background-color: light.$dropdown-link-hover-bg;
+ }
+ }
+ }
+ .tt-menu {
+ .suggestion {
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: light.$dropdown-link-hover-color;
+ background-color: light.$dropdown-link-hover-bg;
+ }
+ }
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ .twitter-typeahead {
+ .tt-menu {
+ color: dark.$body-color;
+ min-width: dark.$dropdown-min-width;
+ padding: dark.$dropdown-padding-y 0;
+ margin: calc(dark.$dropdown-spacer + dark.$dropdown-spacer) 0;
+ box-shadow: dark.$dropdown-box-shadow;
+ // border: dark.$dropdown-border-width solid dark.$dropdown-border-color;
+ font-size: dark.$font-size-base;
+ background-color: dark.$dropdown-bg;
+ z-index: dark.$zindex-dropdown;
+ @include dark.border-radius(dark.$border-radius);
+ .tt-suggestion {
+ font-weight: dark.$font-weight-normal;
+ color: dark.$dropdown-link-color;
+ padding: dark.$dropdown-item-padding-y dark.$dropdown-item-padding-x;
+
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: dark.$dropdown-link-hover-color;
+ background-color: dark.$dropdown-link-hover-bg;
+ }
+ }
+ }
+ .tt-hint {
+ color: dark.$input-placeholder-color;
+ }
+ }
+ .tt-menu {
+ .suggestion {
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ color: dark.$dropdown-link-hover-color;
+ background-color: dark.$dropdown-link-hover-bg;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-dark.scss b/resources/assets/vendor/scss/_bootstrap-dark.scss
new file mode 100644
index 0000000..2071652
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-dark.scss
@@ -0,0 +1,39 @@
+@import '_bootstrap-extended/include-dark';
+
+// Import bootstrap core scss from node_module
+// ! Utilities are customized and added in bootstrap-extended
+
+// Layout & components
+@import 'bootstrap/scss/root';
+@import 'bootstrap/scss/reboot';
+@import 'bootstrap/scss/type';
+@import 'bootstrap/scss/images';
+@import 'bootstrap/scss/containers';
+@import 'bootstrap/scss/grid';
+@import 'bootstrap/scss/tables';
+@import 'bootstrap/scss/forms';
+@import 'bootstrap/scss/buttons';
+@import 'bootstrap/scss/transitions';
+@import 'bootstrap/scss/dropdown';
+@import 'bootstrap/scss/button-group';
+@import 'bootstrap/scss/nav';
+@import 'bootstrap/scss/navbar';
+@import 'bootstrap/scss/card';
+@import 'bootstrap/scss/accordion';
+@import 'bootstrap/scss/breadcrumb';
+@import 'bootstrap/scss/pagination';
+@import 'bootstrap/scss/badge';
+@import 'bootstrap/scss/alert';
+@import 'bootstrap/scss/progress';
+@import 'bootstrap/scss/list-group';
+@import 'bootstrap/scss/close';
+@import 'bootstrap/scss/toasts';
+@import 'bootstrap/scss/modal';
+@import 'bootstrap/scss/tooltip';
+@import 'bootstrap/scss/popover';
+@import 'bootstrap/scss/carousel';
+@import 'bootstrap/scss/spinners';
+@import 'bootstrap/scss/offcanvas';
+
+// Helpers
+@import 'bootstrap/scss/helpers';
diff --git a/resources/assets/vendor/scss/_bootstrap-extended-dark.scss b/resources/assets/vendor/scss/_bootstrap-extended-dark.scss
new file mode 100644
index 0000000..32a032d
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended-dark.scss
@@ -0,0 +1,40 @@
+@import '_bootstrap-extended/include-dark';
+
+// Import bootstrap extended scss
+@import '_bootstrap-extended/root';
+@import '_bootstrap-extended/reboot';
+@import '_bootstrap-extended/type';
+@import '_bootstrap-extended/utilities';
+@import '_bootstrap-extended/tables';
+@import '_bootstrap-extended/buttons';
+@import '_bootstrap-extended/button-group';
+@import '_bootstrap-extended/badge';
+@import '_bootstrap-extended/dropdown';
+@import '_bootstrap-extended/nav';
+@import '_bootstrap-extended/pagination';
+@import '_bootstrap-extended/alert';
+@import '_bootstrap-extended/tooltip';
+@import '_bootstrap-extended/popover';
+@import '_bootstrap-extended/forms';
+@import '_bootstrap-extended/modal';
+@import '_bootstrap-extended/progress';
+@import '_bootstrap-extended/breadcrumb';
+@import '_bootstrap-extended/list-group';
+@import '_bootstrap-extended/navbar';
+@import '_bootstrap-extended/card';
+@import '_bootstrap-extended/accordion';
+@import '_bootstrap-extended/close';
+@import '_bootstrap-extended/toasts';
+@import '_bootstrap-extended/carousel';
+@import '_bootstrap-extended/spinners';
+@import '_bootstrap-extended/offcanvas';
+
+// Common Utilities
+@import 'bootstrap/scss/utilities/api';
+
+// LTR Utilities
+
+@include ltr-only {
+ @import '_bootstrap-extended/utilities-ltr';
+ @import 'bootstrap/scss/utilities/api';
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended.scss b/resources/assets/vendor/scss/_bootstrap-extended.scss
new file mode 100644
index 0000000..0d3ba7f
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended.scss
@@ -0,0 +1,39 @@
+@import '_bootstrap-extended/include';
+
+// Import bootstrap extended scss
+@import '_bootstrap-extended/root';
+@import '_bootstrap-extended/reboot';
+@import '_bootstrap-extended/type';
+@import '_bootstrap-extended/utilities';
+@import '_bootstrap-extended/tables';
+@import '_bootstrap-extended/buttons';
+@import '_bootstrap-extended/button-group';
+@import '_bootstrap-extended/badge';
+@import '_bootstrap-extended/dropdown';
+@import '_bootstrap-extended/nav';
+@import '_bootstrap-extended/pagination';
+@import '_bootstrap-extended/alert';
+@import '_bootstrap-extended/tooltip';
+@import '_bootstrap-extended/popover';
+@import '_bootstrap-extended/forms';
+@import '_bootstrap-extended/modal';
+@import '_bootstrap-extended/progress';
+@import '_bootstrap-extended/breadcrumb';
+@import '_bootstrap-extended/list-group';
+@import '_bootstrap-extended/navbar';
+@import '_bootstrap-extended/card';
+@import '_bootstrap-extended/accordion';
+@import '_bootstrap-extended/close';
+@import '_bootstrap-extended/toasts';
+@import '_bootstrap-extended/carousel';
+@import '_bootstrap-extended/spinners';
+@import '_bootstrap-extended/offcanvas';
+
+// Common Utilities
+@import 'bootstrap/scss/utilities/api';
+
+// LTR Utilities
+@include ltr-only {
+ @import '_bootstrap-extended/utilities-ltr';
+ @import 'bootstrap/scss/utilities/api';
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_accordion.scss b/resources/assets/vendor/scss/_bootstrap-extended/_accordion.scss
new file mode 100644
index 0000000..1bd238b
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_accordion.scss
@@ -0,0 +1,250 @@
+// Accordions
+// *******************************************************************************
+
+// arrow left
+
+.accordion-arrow-left {
+ .accordion-button.collapsed:focus {
+ box-shadow: none;
+ }
+ .accordion-item {
+ border: 0;
+ }
+ .accordion-button {
+ padding: var(--#{$prefix}accordion-btn-padding-y) 0;
+ // Accordion icon
+ &::after {
+ content: '';
+ display: none;
+ }
+ &:not(.collapsed) {
+ color: var(--#{$prefix}accordion-active-color);
+ background-color: var(--#{$prefix}accordion-active-bg);
+ box-shadow: none; // stylelint-disable-line function-disallowed-list
+
+ &::before {
+ background-image: var(--#{$prefix}accordion-btn-active-icon);
+ transform: var(--#{$prefix}accordion-btn-icon-transform);
+ }
+ &::after {
+ background-image: none;
+ transform: none;
+ }
+ }
+ &.collapsed::before {
+ transform: rotate(-90deg);
+ }
+ &::before {
+ flex-shrink: 0;
+ width: var(--#{$prefix}accordion-btn-icon-width);
+ height: var(--#{$prefix}accordion-btn-icon-width);
+ margin-left: 0;
+ margin-top: 0.75rem;
+ margin-right: 0.9rem;
+ content: '';
+ background-image: var(--#{$prefix}accordion-btn-icon);
+ background-repeat: no-repeat;
+ background-size: var(--#{$prefix}accordion-btn-icon-width);
+ @include transition(var(--#{$prefix}accordion-btn-icon-transition));
+ }
+ }
+}
+
+// Solid variant icon color
+.accordion[class*='accordion-solid-'] {
+ .accordion-button::after {
+ background-image: str-replace(str-replace($accordion-button-icon, '#{$accordion-icon-color}', $white), '#', '%23');
+ }
+}
+
+// Solid Accordion With Active Border
+.accordion[class*='accordion-border-solid-'] {
+ .accordion-button.collapsed::after {
+ background-image: str-replace(str-replace($accordion-button-icon, '#{$accordion-icon-color}', $white), '#', '%23');
+ }
+}
+
+.accordion-header + .accordion-collapse .accordion-body {
+ padding-top: 0;
+ padding-bottom: 1.25rem;
+}
+
+// accordion without icon
+.accordion {
+ &.accordion-without-arrow {
+ .accordion-button::after {
+ background-image: none !important;
+ }
+ }
+}
+
+.accordion-header {
+ line-height: $line-height-base;
+}
+
+.accordion:not(.accordion-custom-button):not(.accordion-arrow-left) .accordion-item {
+ box-shadow: $box-shadow-xs;
+ border: 0;
+ &:not(:first-child) {
+ margin-top: $spacer * 0.5;
+ }
+ &:last-child {
+ margin-bottom: $spacer * 0.5;
+ }
+ &.active {
+ box-shadow: $box-shadow;
+ & .accordion-button:not(.collapsed) {
+ box-shadow: none;
+ }
+ }
+}
+
+// Accordion border radius
+.accordion-button {
+ font-weight: inherit;
+ align-items: unset;
+ @include border-top-radius($accordion-border-radius);
+ &.collapsed {
+ @include border-radius($accordion-border-radius);
+ }
+ &.collapsed {
+ &::after {
+ transform: rotate(-90deg);
+ }
+ }
+}
+// added box shadow
+.accordion {
+ &:not(.accordion-bordered) > .card.accordion-item {
+ box-shadow: $box-shadow-xs;
+ &.active {
+ box-shadow: $card-box-shadow;
+ }
+ }
+}
+.accordion-header + .accordion-collapse .accordion-body {
+ padding-top: 0;
+}
+
+// Accordion custom button
+
+.accordion-custom-button {
+ .accordion-item {
+ transition: $accordion-transition;
+ transition-property: margin-top, margin-bottom, border-radius, border;
+ box-shadow: none;
+ border: $accordion-border-width solid $accordion-border-color;
+ &:not(:last-child) {
+ border-bottom: 0;
+ }
+ &:not(.active):not(:first-child) {
+ .accordion-header {
+ border: none;
+ }
+ }
+ .accordion-button {
+ border-color: $accordion-border-color;
+ }
+ &.active {
+ margin: 0;
+ box-shadow: none;
+ .accordion-header .accordion-button:focus {
+ border-bottom: $accordion-border-width solid $accordion-border-color;
+ }
+ & + .accordion-item {
+ @include border-top-radius(0);
+ }
+ &:not(:first-child) {
+ @include border-top-radius(0);
+ }
+ &:not(:last-child) {
+ @include border-bottom-radius(0);
+ }
+ }
+ .accordion-body {
+ padding-top: $accordion-body-padding-x;
+ }
+ &.previous-active {
+ @include border-bottom-radius(0);
+ }
+ }
+
+ .accordion-button {
+ border-radius: 0;
+ background-color: #fafafa;
+ &:not(.collapsed) {
+ &::after {
+ background-image: escape-svg($accordion-custom-button-active-icon);
+ transform: rotate(-180deg);
+ }
+ }
+ // Accordion icon
+ &::after {
+ background-image: escape-svg($accordion-custom-button-icon);
+ }
+ }
+
+ &:focus {
+ z-index: 3;
+ border-color: $border-color;
+ outline: 0;
+ box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow);
+ }
+}
+
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .accordion-arrow-left {
+ .accordion-button {
+ &::before {
+ margin-left: 1.1rem;
+ margin-right: 0;
+ transform: rotate(90deg);
+ }
+ &:not(.collapsed)::before {
+ transform: rotate(0deg);
+ }
+ // !- For RTL accordion icon rotation in other templates
+ // &:not(.collapsed)::before {
+ // transform: rotate(90deg);
+ // }
+ }
+ }
+
+ .accordion-button {
+ text-align: right;
+ &::after {
+ margin-left: 0;
+ margin-right: auto;
+ }
+ &.collapsed {
+ &::after {
+ transform: rotate(90deg);
+ }
+ }
+ }
+ .accordion-custom-button {
+ .accordion-button:not(.collapsed)::after {
+ transform: rotate(180deg);
+ }
+ }
+}
+
+//Dark style
+// *******************************************************************************
+
+@include dark-layout-only {
+ .accordion-custom-button {
+ .accordion-button {
+ background-color: #353a52;
+ }
+ }
+ .accordion:not(.accordion-custom-button):not(.accordion-arrow-left) .accordion-item {
+ box-shadow: $box-shadow-xs;
+ &.active {
+ box-shadow: $box-shadow;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_alert.scss b/resources/assets/vendor/scss/_bootstrap-extended/_alert.scss
new file mode 100644
index 0000000..74f2fcf
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_alert.scss
@@ -0,0 +1,53 @@
+// Alerts
+// *******************************************************************************
+
+// Alert mixins
+@each $state, $value in $theme-colors {
+ @if $state != primary and $state != light {
+ @include template-alert-variant('.alert-#{$state}', $value);
+ @include template-alert-outline-variant('.alert-outline-#{$state}', $value);
+ @include template-alert-solid-variant('.alert-solid-#{$state}', $value);
+ }
+}
+
+// Alert and alert-icon styles
+.alert {
+ line-height: 1.375rem;
+ .alert-icon {
+ color: $white;
+ height: $alert-icon-size;
+ width: $alert-icon-size;
+ padding: $spacer * 0.75;
+ margin-right: $spacer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ &[class*='alert-solid-'] {
+ .alert-icon {
+ background-color: $white;
+ box-shadow: $box-shadow-xs;
+ :before {
+ font-size: 1.375rem;
+ }
+ }
+ }
+}
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .alert-dismissible {
+ padding-left: $alert-dismissible-padding-r;
+ padding-right: $alert-padding-x;
+ }
+
+ .alert-dismissible .btn-close {
+ right: auto;
+ left: 0;
+ }
+ .alert .alert-icon {
+ margin-right: 0;
+ margin-left: $spacer;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_badge.scss b/resources/assets/vendor/scss/_bootstrap-extended/_badge.scss
new file mode 100644
index 0000000..44cf65b
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_badge.scss
@@ -0,0 +1,53 @@
+// Badges
+// ? Bootstrap use bg-label-variant and bg color for solid and label style, hence we have not created mixin for that.
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color != primary and $color != light {
+ @include bg-glow-variant('.bg-#{$color}', $value);
+ }
+}
+
+// Badge Center Style
+
+.badge-center {
+ padding: 3px;
+ line-height: 1.375;
+ @include badge-size($badge-height, $badge-width, $badge-center-font-size);
+ i {
+ font-size: 0.875rem;
+ }
+}
+
+// Dots Style
+
+.badge.badge-dot {
+ display: inline-block;
+ margin: 0;
+ padding: 0;
+ width: 0.5rem;
+ height: 0.5rem;
+ border-radius: 50%;
+ vertical-align: middle;
+}
+
+// Notifications
+
+.badge.badge-notifications {
+ position: absolute;
+ top: auto;
+ display: inline-block;
+ margin: 0;
+ transform: translate(-50%, -45%);
+
+ @include rtl-style {
+ transform: translate(50%, -45%);
+ }
+
+ &:not(.badge-dot) {
+ padding: 0.063rem 0.112rem;
+ font-size: 0.75rem;
+ line-height: 0.875rem;
+ @include border-radius(50rem);
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_breadcrumb.scss b/resources/assets/vendor/scss/_bootstrap-extended/_breadcrumb.scss
new file mode 100644
index 0000000..36fbffa
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_breadcrumb.scss
@@ -0,0 +1,62 @@
+// Breadcrumbs
+// *******************************************************************************
+
+.breadcrumb-item,
+.breadcrumb-item a {
+ color: $breadcrumb-color;
+}
+
+.breadcrumb-item.active a {
+ &:hover,
+ &:focus {
+ color: $breadcrumb-color;
+ }
+ &:not(:hover, :focus) {
+ color: $breadcrumb-active-color;
+ }
+}
+
+.breadcrumb-item {
+ + .breadcrumb-item {
+ &::before {
+ width: 26px;
+ height: 10px;
+ }
+ }
+}
+.breadcrumb-style1 .breadcrumb-item + .breadcrumb-item::before {
+ content: '/';
+ color: $breadcrumb-divider-color;
+ width: 1.43rem;
+ font-weight: 500;
+ margin-left: 0.2rem;
+}
+.breadcrumb-style2 .breadcrumb-item + .breadcrumb-item::before {
+ content: $breadcrumb-icon-check-svg;
+ line-height: 1.375rem;
+ width: 26px;
+ height: 10px;
+}
+
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .breadcrumb-item + .breadcrumb-item {
+ padding-right: $breadcrumb-item-padding-x;
+ padding-left: 0;
+
+ &::before {
+ padding-right: 0;
+ padding-left: $breadcrumb-item-padding-x;
+ float: right;
+ }
+ }
+ // Breadcrumb divider style Icons
+ .breadcrumb-style1 .breadcrumb-item + .breadcrumb-item::before {
+ content: '\\';
+ }
+ .breadcrumb-style2 .breadcrumb-item + .breadcrumb-item::before {
+ content: $breadcrumb-icon-check-svg;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_button-group.scss b/resources/assets/vendor/scss/_bootstrap-extended/_button-group.scss
new file mode 100644
index 0000000..614e828
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_button-group.scss
@@ -0,0 +1,161 @@
+// Button groups
+// *******************************************************************************
+
+// * Split button
+// *******************************************************************************
+
+.btn-group,
+.btn-group-vertical {
+ &:disabled,
+ &.disabled {
+ opacity: 0.45;
+ }
+}
+
+.dropdown-toggle-split,
+.btn-lg + .dropdown-toggle-split,
+.btn-group-lg > .btn + .dropdown-toggle-split,
+.input-group-lg .btn + .dropdown-toggle-split,
+.btn-xl + .dropdown-toggle-split,
+.btn-group-xl > .btn + .dropdown-toggle-split {
+ padding: 0.92em;
+}
+
+.btn-sm + .dropdown-toggle-split,
+.btn-group-sm > .btn + .dropdown-toggle-split,
+.input-group-sm .btn + .dropdown-toggle-split {
+ padding: 0.8em;
+}
+
+.btn-xs + .dropdown-toggle-split,
+.btn-group-xs > .btn + .dropdown-toggle-split {
+ padding: 0.7em;
+}
+
+// * Sizing
+// *******************************************************************************
+
+.btn-group-xs > .btn {
+ @extend .btn-xs;
+}
+
+.btn-group-xl > .btn {
+ @extend .btn-xl;
+}
+
+// Button groups border
+
+.btn-group > .btn-group:first-child > .btn:not([class*='btn-outline-']):first-child,
+.input-group > .btn:not([class*='btn-outline-']):first-child,
+:not(.btn-group):not(.input-group) > .btn-group > .btn:not([class*='btn-outline-']):first-child,
+.input-group > .btn-group:first-child > .btn:not([class*='btn-outline-']):first-child {
+ @include ltr-style {
+ border-left-color: transparent !important;
+ }
+ @include rtl-style {
+ border-right-color: transparent !important;
+ }
+}
+
+.btn-group > .btn-group:last-child > .btn:not([class*='btn-outline-']):last-of-type,
+.input-group > .btn:not([class*='btn-outline-']):last-of-type,
+:not(.btn-group):not(.input-group) > .btn-group > .btn:not([class*='btn-outline-']):last-of-type,
+.input-group > .btn-group:last-child > .btn:not([class*='btn-outline-']):last-of-type {
+ @include ltr-style {
+ border-right-color: transparent !important;
+ }
+ @include rtl-style {
+ border-left-color: transparent !important;
+ }
+}
+
+.btn-group-vertical > .btn-group-vertical:first-child > .btn:not([class*='btn-outline-']):first-child,
+:not(.btn-group-vertical):not(.input-group) > .btn-group-vertical > .btn:not([class*='btn-outline-']):first-child {
+ @include ltr-style {
+ border-top-color: transparent !important;
+ }
+}
+
+.btn-group-vertical > .btn-group-vertical:last-child > .btn:not([class*='btn-outline-']):last-child,
+:not(.btn-group-vertical):not(.input-group) > .btn-group-vertical > .btn:not([class*='btn-outline-']):last-child {
+ @include ltr-style {
+ border-bottom-color: transparent !important;
+ }
+}
+
+.btn-group-vertical > .btn-group-vertical:first-child > .btn:not([class*='btn-outline-']):first-child,
+:not(.btn-group-vertical):not(.input-group) > .btn-group-vertical > .btn:not([class*='btn-outline-']):first-child {
+ border-top-color: transparent !important;
+}
+
+.btn-group-vertical > .btn-group-vertical:last-child > .btn:not([class*='btn-outline-']):last-of-type,
+:not(.btn-group-vertical):not(.input-group) > .btn-group-vertical > .btn:not([class*='btn-outline-']):last-of-type {
+ border-bottom-color: transparent !important;
+}
+
+// * RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .btn-group .btn[class] {
+ @include border-radius($border-radius);
+ }
+
+ .btn-group .btn-xs[class],
+ .btn-group-xs .btn[class] {
+ @include border-radius($border-radius-xs);
+ }
+
+ .btn-group .btn-sm[class],
+ .btn-group-sm .btn[class] {
+ @include border-radius($border-radius-sm);
+ }
+
+ .btn-group .btn-lg[class],
+ .btn-group-lg .btn[class] {
+ @include border-radius($border-radius-lg);
+ }
+
+ .btn-group .btn-xl[class],
+ .btn-group-xl .btn[class] {
+ @include border-radius($border-radius-xl);
+ }
+
+ .btn-group {
+ // Prevent double borders when buttons are next to each other
+ > .btn:not(:first-child),
+ > .btn-group:not(:first-child) {
+ margin-left: 0;
+ margin-right: calc(#{$btn-border-width} * -1);
+ }
+
+ // Reset rounded corners
+ > .btn:not(:last-child):not(.dropdown-toggle),
+ > .btn-group:not(:last-child) > .btn {
+ @include border-start-radius(0);
+ }
+
+ // The left radius should be 0 if the button is:
+ // - the "third or more" child
+ // - the second child and the previous element isn't `.btn-check` (making it the first child visually)
+ // - part of a btn-group which isn't the first child
+ > .btn:nth-child(n + 3),
+ > :not(.btn-check) + .btn,
+ > .btn-group:not(:first-child) > .btn {
+ @include border-end-radius(0);
+ }
+ }
+
+ .btn-group-vertical {
+ // Reset rounded corners
+ > .btn:not(:last-child):not(.dropdown-toggle),
+ > .btn-group:not(:last-child) > .btn {
+ @include border-bottom-radius(0);
+ }
+
+ > .btn ~ .btn,
+ > .btn-group:not(:first-child) > .btn {
+ @include border-top-radius(0);
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_buttons.scss b/resources/assets/vendor/scss/_bootstrap-extended/_buttons.scss
new file mode 100644
index 0000000..a01c72b
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_buttons.scss
@@ -0,0 +1,178 @@
+// Buttons
+// *******************************************************************************
+
+.btn {
+ cursor: pointer;
+ display: inline-flex !important;
+ align-items: center;
+ justify-content: center;
+ &:not(.dropdown-toggle):not([class*='btn-text-']) {
+ transition: all 0.135s ease-in-out;
+ transform: scale(1.001);
+ }
+
+ &[class*='btn-outline-'] {
+ &:disabled,
+ &.disabled {
+ background: transparent !important;
+ }
+ }
+ &[class*='btn-text-'] {
+ padding-inline: 0.75rem;
+ &[class*='btn-sm'] {
+ padding-inline: 0.5625rem;
+ }
+ &[class*='btn-lg'] {
+ padding-inline: 1rem;
+ }
+ &:disabled,
+ &.disabled {
+ background: transparent !important;
+ border-color: transparent !important;
+ }
+ }
+
+ .ti {
+ line-height: 0.9;
+ }
+ &.btn-text {
+ background: none;
+ box-shadow: none;
+ border: none;
+ }
+ &.disabled,
+ &:disabled {
+ cursor: default;
+ }
+ &[class*='btn-']:active:not([class*='btn-text']):not(.dropdown-toggle),
+ &[class*='btn-'].active:not([class*='btn-text']):not(.dropdown-toggle) {
+ transform: scale(0.98);
+ transition: all 0.135s ease-in-out;
+ }
+}
+
+// Badge within button
+.btn .badge {
+ @include transition($btn-transition);
+}
+
+label.btn {
+ margin-bottom: 0;
+}
+
+// Button Sizes
+
+.btn-xl {
+ @include button-size($btn-padding-y-xl, $btn-padding-x-xl, $btn-font-size-xl, $btn-border-radius-xl);
+}
+
+.btn-sm {
+ line-height: $btn-line-height-sm;
+}
+
+.btn-xs {
+ @include button-size($btn-padding-y-xs, $btn-padding-x-xs, $btn-font-size-xs, $btn-border-radius-xs);
+}
+
+// Buttons Variant
+
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include template-button-variant('.btn-#{$color}', if($color== 'dark' and $dark-style, $dark, $value));
+ @include template-button-label-variant('.btn-label-#{$color}', if($color== 'dark' and $dark-style, $dark, $value));
+ @include template-button-outline-variant(
+ '.btn-outline-#{$color}',
+ if($color== 'dark' and $dark-style, $dark, $value)
+ );
+ @if $color == secondary {
+ $value: $body-color;
+ }
+ @include template-button-text-variant('.btn-text-#{$color}', $value);
+ }
+}
+
+// Icon button
+
+.btn-icon {
+ $btn-icon-size: ($btn-font-size * $btn-line-height) + ($btn-padding-y * 1.998);
+ $btn-icon-size-xl: ($btn-font-size-xl * $btn-line-height-xl) + ($btn-padding-y-xl * 2);
+ $btn-icon-size-lg: ($btn-font-size-lg * $btn-line-height-lg) + ($btn-padding-y-lg * 2);
+ $btn-icon-size-sm: ($btn-font-size-sm * $btn-line-height-sm) + ($btn-padding-y-sm * 2.785);
+ $btn-icon-size-xs: ($btn-font-size-xs * $btn-line-height-xs) + ($btn-padding-y-xs * 2);
+ $borders-width: calc(#{$btn-border-width} * 2);
+ --#{$prefix}btn-active-border-color: transparent;
+
+ padding: 0;
+ width: calc(#{$btn-icon-size} + #{$borders-width});
+ height: calc(#{$btn-icon-size} + #{$borders-width});
+ display: inline-flex;
+ flex-shrink: 0;
+ justify-content: center;
+ align-items: center;
+
+ &.btn-xl {
+ width: calc(#{$btn-icon-size-xl} + #{$borders-width});
+ height: calc(#{$btn-icon-size-xl} + #{$borders-width});
+ > span {
+ font-size: $btn-font-size-xl;
+ }
+ }
+
+ &.btn-lg {
+ width: calc(#{$btn-icon-size-lg} + #{$borders-width});
+ height: calc(#{$btn-icon-size-lg} + #{$borders-width});
+ font-size: $btn-font-size-lg;
+ }
+
+ &.btn-sm {
+ width: calc(#{$btn-icon-size-sm} + #{$borders-width});
+ height: calc(#{$btn-icon-size-sm} + #{$borders-width});
+ font-size: $btn-font-size-sm;
+ }
+
+ &.btn-xs {
+ width: calc(#{$btn-icon-size-xs} + #{$borders-width});
+ height: calc(#{$btn-icon-size-xs} + #{$borders-width});
+ font-size: $btn-font-size-xs;
+ }
+}
+
+// Without border
+
+.btn.borderless {
+ &:not(.active):not(:active):not(:hover):not(:focus),
+ :not(.show) > &.dropdown-toggle:not(:hover):not(:focus) {
+ border-color: transparent;
+ box-shadow: none;
+ }
+}
+
+// Link buttons
+.btn.btn-link {
+ font-size: inherit;
+}
+
+.btn-pinned {
+ position: absolute;
+ top: 1rem;
+ @include ltr-style {
+ right: 1rem;
+ }
+ @include rtl-style {
+ left: 1rem;
+ }
+}
+
+// Button focus
+button:focus,
+button:focus-visible {
+ outline: none;
+}
+
+// Table Action Dropdown fix
+.btn:not([class*='btn-']):active,
+.btn:not([class*='btn-']).active,
+.btn:not([class*='btn-']).show,
+.btn:not([class*='btn-']) {
+ border: none;
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_card.scss b/resources/assets/vendor/scss/_bootstrap-extended/_card.scss
new file mode 100644
index 0000000..92c13e4
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_card.scss
@@ -0,0 +1,389 @@
+// Cards
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include template-card-border-shadow-variant('.card-border-shadow-#{$color}', $value);
+ @include template-card-hover-border-variant('.card-hover-border-#{$color}', $value);
+ }
+}
+
+.card {
+ background-clip: padding-box;
+ box-shadow: $card-box-shadow;
+
+ .card-link {
+ display: inline-block;
+ }
+ // ! FIX: to remove padding top from first card-body if used with card-header
+ .card-header + .card-body,
+ .card-header + .card-content > .card-body:first-of-type,
+ .card-header + .card-footer,
+ .card-body + .card-footer {
+ padding-top: 0;
+ }
+
+ // color border bottom and shadow in card
+ &[class*='card-border-shadow-'] {
+ position: relative;
+ border-bottom: none;
+ transition: $card-transition;
+ z-index: 1;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border-bottom-width: 2px;
+ border-bottom-style: solid;
+ border-radius: $card-border-radius;
+ transition: $card-transition;
+ z-index: -1;
+ }
+ &:hover {
+ box-shadow: $box-shadow-lg;
+ &::after {
+ border-bottom-width: 3px;
+ }
+ }
+ }
+
+ // card hover border color
+ &[class*='card-hover-border-'] {
+ border-width: 1px;
+ }
+}
+// adding class with card background color
+.bg-card {
+ background-color: $card-bg;
+}
+
+// Card action
+.card-action {
+ // Expand card(fullscreen)
+ &.card-fullscreen {
+ display: block;
+ z-index: 9999;
+ position: fixed;
+ width: 100% !important;
+ height: 100% !important;
+ top: 0;
+ right: 0;
+ left: 0;
+ bottom: 0;
+ overflow: auto;
+ border: none;
+ border-radius: 0;
+ }
+ // Alert
+ .card-alert {
+ position: absolute;
+ width: 100%;
+ z-index: 999;
+ .alert {
+ border-bottom-right-radius: 0px;
+ border-bottom-left-radius: 0px;
+ }
+ }
+ // Collapsed
+ .card-header {
+ &.collapsed {
+ border-bottom: 0;
+ }
+ }
+
+ // Card header
+ .card-header {
+ display: flex;
+ .card-action-title {
+ flex-grow: 1;
+ margin-right: 0.5rem;
+ }
+ .card-action-element {
+ flex-shrink: 0;
+ background-color: inherit;
+ top: 1rem;
+ right: 1.5rem;
+ color: $body-color;
+ a {
+ color: $headings-color;
+ .collapse-icon::after {
+ margin-top: -0.15rem;
+ }
+ }
+ }
+ }
+ // Block UI loader
+ .blockUI {
+ .sk-fold {
+ margin: 0 auto;
+ }
+ h5 {
+ color: $body-color;
+ margin: 1rem 0 0 0;
+ }
+ }
+
+ .collapse > .card-body,
+ .collapsing > .card-body {
+ padding-top: 0;
+ }
+}
+
+// Card inner borders
+.card-header,
+.card-footer {
+ border-color: $card-inner-border-color;
+}
+.card hr {
+ color: $card-inner-border-color;
+}
+
+.card .row-bordered > [class*=' col '],
+.card .row-bordered > [class^='col '],
+.card .row-bordered > [class*=' col-'],
+.card .row-bordered > [class^='col-'],
+.card .row-bordered > [class='col'] {
+ .card .row-bordered > [class$=' col'],
+ &::before,
+ &::after {
+ border-color: $card-inner-border-color;
+ }
+}
+
+//Card header elements
+.card-header.header-elements,
+.card-title.header-elements {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ flex-wrap: wrap;
+}
+
+.card-header {
+ &.card-header-elements {
+ padding-top: $card-spacer-y * 0.5;
+ padding-bottom: $card-spacer-y * 0.5;
+ }
+ .card-header-elements {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ }
+}
+
+.card-header-elements,
+.card-title-elements {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ & + &,
+ > * + * {
+ margin-left: 0.25rem;
+ @include rtl-style {
+ margin-left: 0;
+ margin-right: 0.25rem;
+ }
+ }
+}
+
+.card-title {
+ &:not(:is(h1, h2, h3, h4, h5, h6)) {
+ color: $body-color;
+ }
+}
+
+// * Horizontal card radius issue fix
+.card-img-left {
+ @include border-start-radius($card-inner-border-radius);
+ @include border-end-radius(0);
+ @include media-breakpoint-down(md) {
+ @include border-top-radius($card-inner-border-radius);
+ @include border-bottom-radius(0);
+ }
+}
+
+.card-img-right {
+ @include border-end-radius($card-inner-border-radius);
+ @include border-start-radius(0);
+ @include media-breakpoint-down(md) {
+ @include border-bottom-radius($card-inner-border-radius);
+ @include border-top-radius(0);
+ }
+}
+
+// Card group
+.card-group {
+ box-shadow: $card-box-shadow;
+ background-color: $card-bg;
+ border-radius: $card-border-radius;
+ .card {
+ box-shadow: none;
+ @include media-breakpoint-down(sm) {
+ &:not(:first-child) .card-img-top {
+ @include border-top-radius(0);
+ }
+ }
+ }
+}
+// List groups
+// *******************************************************************************
+
+.card > .list-group .list-group-item {
+ padding-left: $card-spacer-x;
+ padding-right: $card-spacer-x;
+}
+
+// Card Statistics specific separator
+// *******************************************************************************
+.card {
+ .card-separator {
+ @include ltr-style {
+ border-right: $border-width solid $card-border-color;
+ }
+
+ @include rtl-style {
+ border-left: $border-width solid $card-border-color;
+ }
+ }
+}
+
+//Card Widget Separator
+// *******************************************************************************
+
+.card {
+ .card-widget-separator-wrapper {
+ @include media-breakpoint-down(lg) {
+ .card-widget-separator {
+ .card-widget-2.border-end {
+ border-right: none !important;
+ border-left: none !important;
+ }
+ }
+ }
+
+ @include media-breakpoint-down(sm) {
+ .card-widget-separator {
+ .card-widget-1.border-end,
+ .card-widget-2.border-end,
+ .card-widget-3.border-end {
+ border-right: none !important;
+ border-left: none !important;
+ border-bottom: 1px solid $border-color;
+ }
+ }
+ }
+ }
+}
+
+@include media-breakpoint-down(lg) {
+ .card {
+ .card-separator {
+ border-bottom: $border-width solid $card-border-color;
+ padding-bottom: $card-spacer-y;
+
+ @include ltr-style {
+ border-right-width: 0 !important;
+ }
+
+ @include rtl-style {
+ border-left-width: 0 !important;
+ }
+ }
+ }
+}
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .card-link + .card-link {
+ margin-right: $card-spacer-x;
+ margin-left: 0;
+ }
+
+ // Card advance
+ .card-action {
+ .card-header {
+ .card-action-title {
+ margin-left: 0.5rem;
+ margin-right: 0;
+ }
+
+ .card-action-element,
+ .card-action-element-toggle {
+ left: 1.5rem;
+ right: auto;
+ }
+ }
+ }
+
+ // * Horizontal card radius issue fix
+ .card-img-left {
+ @include border-start-radius(0);
+ @include border-end-radius($card-inner-border-radius);
+ @include media-breakpoint-down(md) {
+ @include border-top-radius(0);
+ @include border-bottom-radius($card-inner-border-radius);
+ }
+ }
+ .card-img-right {
+ @include border-end-radius(0);
+ @include border-start-radius($card-inner-border-radius);
+ @include media-breakpoint-down(md) {
+ @include border-bottom-radius(0);
+ @include border-top-radius($card-inner-border-radius);
+ }
+ }
+ // Card group
+ @include media-breakpoint-up(sm) {
+ .card-group > .card {
+ border: $card-border-width solid $card-border-color;
+ border-radius: $card-border-radius;
+
+ .card-img-top,
+ .card-header:first-child {
+ @include border-top-radius($card-inner-border-radius);
+ }
+
+ .card-img-bottom,
+ .card-footer:last-child {
+ @include border-bottom-radius($card-inner-border-radius);
+ }
+
+ + .card {
+ border-right: 0;
+ }
+ }
+
+ // Handle rounded corners
+ @if $enable-rounded {
+ .card-group > .card {
+ &:not(:first-child) {
+ @include border-end-radius(0);
+
+ .card-img-top,
+ .card-header {
+ border-top-right-radius: 0;
+ }
+ .card-img-bottom,
+ .card-footer {
+ border-bottom-right-radius: 0;
+ }
+ }
+ &:not(:last-child) {
+ @include border-start-radius(0);
+
+ .card-img-top,
+ .card-header {
+ border-top-left-radius: 0;
+ }
+ .card-img-bottom,
+ .card-footer {
+ border-bottom-left-radius: 0;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_carousel.scss b/resources/assets/vendor/scss/_bootstrap-extended/_carousel.scss
new file mode 100644
index 0000000..7732751
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_carousel.scss
@@ -0,0 +1,50 @@
+// Carousel
+// *******************************************************************************
+
+//
+.carousel {
+ .carousel-item.active,
+ .carousel-item.carousel-item-start {
+ h1,
+ .h1,
+ h2,
+ .h2,
+ h3,
+ .h3,
+ h4,
+ .h4,
+ h5,
+ .h5,
+ h6,
+ .h6 {
+ color: $carousel-caption-color;
+ }
+ }
+}
+.carousel.carousel-dark {
+ .carousel-item,
+ .carousel-item.active,
+ .carousel-item.carousel-item-start {
+ h1,
+ .h1,
+ h2,
+ .h2,
+ h3,
+ .h3,
+ h4,
+ .h4,
+ h5,
+ .h5,
+ h6,
+ .h6 {
+ color: $carousel-dark-caption-color;
+ }
+ }
+}
+
+.carousel-indicators {
+ margin-bottom: 1.06rem;
+ [data-bs-target] {
+ border-radius: $border-radius;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_close.scss b/resources/assets/vendor/scss/_bootstrap-extended/_close.scss
new file mode 100644
index 0000000..ab45fe6
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_close.scss
@@ -0,0 +1,12 @@
+// Close buttons
+// *******************************************************************************
+
+.close:focus {
+ outline: 0;
+}
+
+@include rtl-only {
+ .close {
+ float: left;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_dropdown.scss b/resources/assets/vendor/scss/_bootstrap-extended/_dropdown.scss
new file mode 100644
index 0000000..e19d7fc
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_dropdown.scss
@@ -0,0 +1,126 @@
+// Dropdowns
+// *****************************************************************
+
+// On hover outline
+[data-trigger='hover'] {
+ outline: 0;
+}
+
+.dropdown-menu {
+ box-shadow: $dropdown-box-shadow;
+
+ // Mega dropdown inside the dropdown menu
+ .mega-dropdown > & {
+ left: 0 !important;
+ right: 0 !important;
+ }
+
+ // Badge within dropdown menu
+ .badge[class^='float-'],
+ .badge[class*=' float-'] {
+ position: relative;
+ top: 0.071em;
+ }
+
+ // Dark style
+ @if $dark-style {
+ .list-group-item {
+ border-color: rgba-to-hex($dropdown-divider-bg, $dropdown-bg);
+ }
+ }
+
+ // For RTL
+ @include rtl-style {
+ text-align: right;
+ }
+}
+// Dropdown item line height
+.dropdown-item {
+ li:not(:first-child) &,
+ .dropdown-menu &:not(:first-child) {
+ margin-top: 2px;
+ }
+ border-radius: $dropdown-border-radius;
+ &.disabled .waves-ripple {
+ display: none;
+ }
+}
+
+// Hidden dropdown toggle arrow
+.dropdown-toggle.hide-arrow,
+.dropdown-toggle-hide-arrow > .dropdown-toggle {
+ &::before,
+ &::after {
+ display: none;
+ }
+}
+
+// Dropdown caret icon
+
+@if $enable-caret {
+ // Dropdown arrow
+ .dropdown-toggle::after {
+ @include caret-down($caret-width);
+ }
+ // Dropend arrow
+ .dropend .dropdown-toggle::after {
+ @include caret-right($caret-width);
+ }
+ // Dropstart arrow
+ .dropstart .dropdown-toggle::before {
+ @include caret-left($caret-width);
+ }
+ // Dropup arrow
+ .dropup .dropdown-toggle::after {
+ @include caret-up($caret-width);
+ }
+
+ .dropstart .dropdown-toggle::before,
+ .dropend .dropdown-toggle::after {
+ vertical-align: $caret-vertical-align;
+ }
+
+ @include rtl-only {
+ .dropdown-toggle:not(.dropdown-toggle-split)::after {
+ margin-left: 0;
+ margin-right: $caret-spacing;
+ }
+ }
+ @include ltr-only {
+ .dropdown-toggle-split:after {
+ margin-left: 0 !important;
+ }
+ }
+ @include rtl-only {
+ .dropdown-toggle-split:after {
+ margin-right: 0 !important;
+ }
+ }
+}
+
+@include rtl-only {
+ // Dropdown menu alignment
+ @each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .dropdown-menu#{$infix}-start {
+ --bs-position: start;
+
+ &[data-bs-popper] {
+ left: auto;
+ right: 0;
+ }
+ }
+
+ .dropdown-menu#{$infix}-end {
+ --bs-position: end;
+
+ &[data-bs-popper] {
+ left: 0;
+ right: auto;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_forms.scss b/resources/assets/vendor/scss/_bootstrap-extended/_forms.scss
new file mode 100644
index 0000000..15bcaa3
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_forms.scss
@@ -0,0 +1,12 @@
+// Forms
+// *****************************************************************
+
+@import 'forms/labels';
+@import 'forms/form-text';
+@import 'forms/form-control';
+@import 'forms/form-select';
+@import 'forms/form-check';
+@import 'forms/form-range';
+@import 'forms/input-group';
+@import 'forms/floating-labels';
+@import 'forms/validation';
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_functions.scss b/resources/assets/vendor/scss/_bootstrap-extended/_functions.scss
new file mode 100644
index 0000000..a5ad1c7
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_functions.scss
@@ -0,0 +1,148 @@
+// Functions
+// *******************************************************************************
+
+// Lists
+// *******************************************************************************
+@function slice-list($list, $start: 1, $end: length($list)) {
+ $result: null;
+
+ @if type-of($start) != number or type-of($end) != number {
+ @warn "Either $start or $end are not a number for `slice`.";
+ } @else if $start > $end {
+ @warn "The start index has to be lesser than or equals to the end index for `slice`.";
+ } @else if $start < 1 or $end < 1 {
+ @warn "List indexes must be non-zero integers for `slice`.";
+ } @else if $start > length($list) {
+ @warn "List index is #{$start} but list is only #{length($list)} item long for `slice`.";
+ } @else if $end > length($list) {
+ @warn "List index is #{$end} but list is only #{length($list)} item long for `slice`.";
+ } @else {
+ $result: ();
+
+ @for $i from $start through $end {
+ $result: append($result, nth($list, $i));
+ }
+ }
+
+ @return $result;
+}
+
+// * Units
+// *******************************************************************************
+
+// Remove the unit of a length
+@function strip-unit($number) {
+ @if type-of($number) == 'number' and not unitless($number) {
+ @return divide($number, ($number * 0 + 1));
+ }
+
+ @return $number;
+}
+
+// Convert size px to rem
+@function px-to-rem($value) {
+ // Assumes the browser default font size = `16px`
+ @return (divide(strip-unit($value), 16)) * 1rem;
+}
+
+// Convert size rem to px
+@function rem-to-px($value) {
+ // Assumes the browser default font size = `16px`
+ @return (strip-unit($value) * 16) * 1px;
+}
+
+// * Colors
+// *******************************************************************************
+
+// ? Override shade, tint and shift function with custom background color option i.e $card-bg to make it similar like design
+// Shade a color: mix a color with background/white
+@function tint-color($color, $weight, $background: null) {
+ $background: if($background, $background, white);
+ @return mix($background, $color, $weight);
+}
+
+// Shade a color: mix a color with background/black
+@function shade-color($color, $weight, $background: null) {
+ $background: if($background, $background, black);
+ @return mix($background, $color, $weight);
+}
+
+// Shade the color if the weight is positive, else tint it
+@function shift-color($color, $weight, $background: null) {
+ @return if($weight > 0, shade-color($color, $weight, $background), tint-color($color, -$weight));
+}
+
+//RGBA to HEX
+@function rgba-to-hex($color, $background: #fff) {
+ @if $color and alpha($color) != 1 {
+ $percent: alpha($color) * 100%;
+ $opaque: opacify($color, 1);
+
+ @return mix($opaque, $background, $percent);
+ } @else {
+ @return $color;
+ }
+}
+
+// Calculating Color Contrast
+@function contrast-value($color) {
+ @if $color == transparent {
+ @return $body-color;
+ } @else if alpha($color) != 1 {
+ $color: rgba-to-hex($color);
+ }
+
+ $r: red($color);
+ $g: green($color);
+ $b: blue($color);
+
+ @return divide((($r * 299) + ($g * 587) + ($b * 114)), 1000);
+}
+
+// * Utilities
+// *******************************************************************************
+
+// Return Nav opacity, contrast-percent, contrast-percent-inverted, bg, color, active-color, disabled-color, muted-color, border
+@function get-navbar-prop($bg, $active-color: null, $inactive-color: null, $border: null, $text-color: null) {
+ $bg: rgba-to-hex($bg);
+
+ $active-color: rgba-to-hex($active-color);
+ $active-color: if($active-color, $active-color, color-contrast($bg));
+
+ $contrast-percent: divide(contrast-value($bg), 255);
+ $contrast-percent-inverted: 1 - $contrast-percent;
+
+ $opacity: if($active-color == #fff, 0.6 + (0.4 * $contrast-percent), 0.6 + (0.4 * (1 - $contrast-percent)));
+
+ $color: if(
+ $inactive-color,
+ rgba-to-hex($inactive-color, $bg),
+ rgba-to-hex(rgba($active-color, if($contrast-percent < 0.25, $opacity + 0.2, $opacity)), $bg)
+ );
+ $disabled-color: rgba-to-hex(rgba($color, 0.6), $bg);
+ $muted-color: rgba-to-hex(rgba($color, 0.4), $bg);
+ $border: if(
+ $border,
+ $border,
+ if(
+ $contrast-percent > 0.75,
+ rgba($active-color, divide($opacity, 8)),
+ if($contrast-percent < 0.25, rgba($active-color, 0.06), rgba($active-color, 0.15))
+ )
+ );
+
+ @return (
+ // Metadata
+ opacity: $opacity,
+ contrast-percent: $contrast-percent,
+ contrast-percent-inverted: $contrast-percent-inverted,
+ // Colors
+ bg: $bg,
+ color: $color,
+ active-color: $active-color,
+ disabled-color: $disabled-color,
+ muted-color: $muted-color,
+ border: $border,
+ text-color: $text-color
+ );
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_include-dark.scss b/resources/assets/vendor/scss/_bootstrap-extended/_include-dark.scss
new file mode 100644
index 0000000..1e086b3
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_include-dark.scss
@@ -0,0 +1,15 @@
+//Functions
+@import 'bootstrap/scss/functions'; // Bootstrap core functions
+@import 'functions'; // Bootstrap extended functions
+
+//Variables
+@import '../_custom-variables/bootstrap-extended-dark'; // Bootstrap extended custom dark variable (for customization purpose)
+@import '../_custom-variables/bootstrap-extended'; // Bootstrap extended custom dark variable (for customization purpose)
+@import 'variables-dark'; // Bootstrap extended dark variable
+@import 'variables'; // Bootstrap extended variable
+@import 'bootstrap/scss/variables'; // Bootstrap core variable
+@import 'bootstrap/scss/maps'; // Bootstrap core variable
+
+//Mixins
+@import 'bootstrap/scss/mixins'; // Bootstrap core mixins
+@import 'mixins'; // Bootstrap extended mixins
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_include.scss b/resources/assets/vendor/scss/_bootstrap-extended/_include.scss
new file mode 100644
index 0000000..23b090d
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_include.scss
@@ -0,0 +1,13 @@
+//Functions
+@import 'bootstrap/scss/functions'; // Bootstrap core functions
+@import 'functions'; // Bootstrap extended functions
+
+//Variables
+@import '../_custom-variables/bootstrap-extended'; // Bootstrap extended custom variable (for customization purpose)
+@import 'variables'; // Bootstrap extended variable
+@import 'bootstrap/scss/variables'; // Bootstrap core variable
+@import 'bootstrap/scss/maps'; // Bootstrap core variable
+
+//Mixins
+@import 'bootstrap/scss/mixins'; // Bootstrap core mixins
+@import 'mixins'; // Bootstrap extended mixins
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_list-group.scss b/resources/assets/vendor/scss/_bootstrap-extended/_list-group.scss
new file mode 100644
index 0000000..2958b1a
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_list-group.scss
@@ -0,0 +1,210 @@
+// List groups
+// *******************************************************************************
+
+// List Group Mixin
+@each $color, $value in $theme-colors {
+ @if $color != primary and $color != light {
+ @include template-list-group-item-variant('.list-group-item-#{$color}', $value);
+ @include template-list-group-timeline-variant('.list-group-timeline-#{$color}', $value);
+ }
+}
+.list-group {
+ .list-group-item-action {
+ &:not(.active) {
+ & :not(.add-btn) > :active {
+ color: $list-group-color;
+ background-color: $list-group-hover-bg !important;
+ }
+ }
+ }
+ .list-group-item {
+ line-height: 1.375rem;
+ padding-bottom: calc($list-group-item-padding-y - 1px);
+ }
+ &:not([class*='list-group-flush']) .list-group-item:first-of-type {
+ padding-top: calc($list-group-item-padding-y - 1px);
+ }
+ &[class*='list-group-flush'] .list-group-item:last-of-type {
+ padding-bottom: $list-group-item-padding-y;
+ }
+ &[class*='list-group-horizontal-md'] .list-group-item {
+ @include media-breakpoint-up(md) {
+ padding-top: calc($list-group-item-padding-y - 1px);
+ }
+ }
+}
+
+.list-group {
+ // Timeline CSS
+ &.list-group-timeline {
+ position: relative;
+ &:before {
+ background-color: $border-color;
+ position: absolute;
+ content: '';
+ width: 1px;
+ height: 100%;
+ top: 0;
+ bottom: 0;
+ left: 0.2rem;
+ }
+ .list-group-item {
+ border: none;
+ padding-left: 1.25rem;
+ &:before {
+ position: absolute;
+ display: block;
+ content: '';
+ width: 7px;
+ height: 7px;
+ left: 0;
+ top: 50%;
+ margin-top: -3.5px;
+ border-radius: 100%;
+ }
+ }
+ }
+
+ .list-group-item.active {
+ h1,
+ .h1,
+ h2,
+ .h2,
+ h3,
+ .h3,
+ h4,
+ .h4,
+ h5,
+ .h5,
+ h6,
+ .h6 {
+ color: $primary;
+ }
+ }
+}
+
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .list-group {
+ padding-right: 0;
+
+ // Timeline RTL List group
+ &.list-group-timeline {
+ &:before {
+ left: auto;
+ right: 0.2rem;
+ }
+ .list-group-item {
+ padding-right: 1.25rem;
+ &:before {
+ left: auto;
+ right: 1px;
+ }
+ }
+ }
+ // List group horizontal RTL style
+
+ &.list-group-horizontal {
+ .list-group-item {
+ &:first-child {
+ border-radius: 0.25rem;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:last-child {
+ border-radius: 0.25rem;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+ }
+ }
+ }
+ @include media-breakpoint-up(sm) {
+ &.list-group-horizontal-sm {
+ .list-group-item {
+ &:first-child {
+ border-radius: 0.25rem;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:last-child {
+ border-radius: 0.25rem;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+ }
+ }
+ }
+ }
+ @include media-breakpoint-up(md) {
+ &.list-group-horizontal-md {
+ .list-group-item {
+ &:first-child {
+ border-radius: 0.25rem;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:last-child {
+ border-radius: 0.25rem;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+ }
+ }
+ }
+ }
+ @include media-breakpoint-up(lg) {
+ &.list-group-horizontal-lg {
+ .list-group-item {
+ &:first-child {
+ border-radius: 0.25rem;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:last-child {
+ border-radius: 0.25rem;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+ }
+ }
+ }
+ }
+ @include media-breakpoint-up(xl) {
+ &.list-group-horizontal-xl {
+ .list-group-item {
+ &:first-child {
+ border-radius: 0.25rem;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:last-child {
+ border-radius: 0.25rem;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+ }
+ }
+ }
+ }
+ @include media-breakpoint-up(xxl) {
+ &.list-group-horizontal-xxl {
+ .list-group-item {
+ &:first-child {
+ border-radius: 0.25rem;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ &:last-child {
+ border-radius: 0.25rem;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_mixins.scss b/resources/assets/vendor/scss/_bootstrap-extended/_mixins.scss
new file mode 100644
index 0000000..7597d2c
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_mixins.scss
@@ -0,0 +1,20 @@
+// Mixins
+//
+// Template mixins (custom and overrides)
+
+@import 'mixins/alert';
+@import 'mixins/badge';
+@import 'mixins/buttons';
+@import 'mixins/list-group';
+@import 'mixins/modal';
+@import 'mixins/navs';
+@import 'mixins/pagination';
+@import 'mixins/progress';
+@import 'mixins/popover';
+@import 'mixins/tooltip';
+@import 'mixins/caret';
+@import 'mixins/dropdown';
+@import 'mixins/forms';
+@import 'mixins/table-variants';
+@import 'mixins/misc';
+@import 'mixins/card'; // layout, text directions & colors
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_modal.scss b/resources/assets/vendor/scss/_bootstrap-extended/_modal.scss
new file mode 100644
index 0000000..3acb312
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_modal.scss
@@ -0,0 +1,390 @@
+// Modals
+// *******************************************************************************
+//modal header btn close style
+.modal {
+ .btn-close {
+ background-color: $card-bg;
+ border-radius: $border-radius-sm;
+ background-image: str-replace(str-replace($btn-close-bg, '#{$btn-close-color}', $text-muted), '#', '%23');
+ opacity: 1;
+ padding: 0.3757rem;
+ box-shadow: $box-shadow-xs;
+ transition: all 0.23s ease 0.1s;
+ @include ltr-style {
+ transform: translate(23px, -25px);
+ }
+
+ @include rtl-style {
+ transform: translate(-31px, -25px);
+ }
+
+ // For hover effect of close btn
+ &:hover,
+ &:focus,
+ &:active {
+ opacity: 1;
+ outline: none;
+
+ @include ltr-style {
+ transform: translate(20px, -20px);
+ }
+
+ @include rtl-style {
+ transform: translate(-26px, -20px);
+ }
+ }
+ }
+
+ .modal-header {
+ position: relative;
+ .btn-close {
+ position: absolute;
+ top: $modal-dialog-margin + 0.1875rem;
+ @include ltr-style() {
+ right: $modal-footer-margin-between - 0.1875rem;
+ }
+ @include rtl-style {
+ left: $modal-footer-margin-between + 0.3;
+ }
+ }
+ }
+}
+//modal footer
+.modal-footer {
+ padding: $modal-footer-padding;
+ > * {
+ margin-block: 0;
+ @include ltr-style {
+ &:last-child {
+ margin-right: 0;
+ }
+ &:first-child {
+ margin-left: 0;
+ }
+ }
+ @include rtl-style {
+ &:last-child {
+ margin-left: 0;
+ }
+ &:first-child {
+ margin-right: 0;
+ }
+ }
+ }
+}
+
+// Modal Shadow
+.modal-content {
+ box-shadow: $modal-content-box-shadow-xs;
+}
+
+// Modal RTL
+// ! remove close button animation & shadow for .modal-dialog-scrollable, .modal-fullscreen, .modal-top modal
+.modal-dialog-scrollable,
+.modal-fullscreen,
+.modal-top {
+ .btn-close {
+ box-shadow: none;
+ @include ltr-style {
+ transform: translate(0, 0) !important;
+ }
+
+ @include rtl-style {
+ transform: translate(0, 0) !important;
+ }
+ &:hover {
+ @include ltr-style {
+ transform: translate(0, 0) !important;
+ }
+
+ @include rtl-style {
+ transform: translate(0, 0) !important;
+ }
+ }
+ }
+}
+
+// Onboarding Modals
+// *******************************************************************************
+
+.modal-onboarding {
+ .close-label {
+ font-size: 0.8rem;
+ position: absolute;
+ top: 0.85rem;
+ opacity: $btn-close-opacity;
+ &:hover {
+ opacity: $btn-close-hover-opacity;
+ }
+ }
+ .modal-header {
+ .btn-close {
+ @include rtl-style {
+ margin-left: 0;
+ margin-right: auto;
+ }
+ }
+ }
+
+ .onboarding-media {
+ margin-bottom: 1rem;
+ img {
+ margin: 0 auto;
+ }
+ }
+ .onboarding-content {
+ margin: 2rem;
+ }
+ form {
+ margin-top: 2rem;
+ text-align: left;
+ }
+
+ // Carousel Inside Modal
+ .carousel-indicators {
+ bottom: -10px;
+ }
+
+ .carousel-control-prev,
+ .carousel-control-next {
+ top: auto;
+ bottom: 0.75rem;
+ opacity: 1;
+ @include rtl-style {
+ flex-direction: row-reverse;
+ }
+ }
+ .carousel-control-prev {
+ left: 1rem;
+ }
+ .onboarding-horizontal {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ .onboarding-media {
+ margin: 2rem;
+ margin-top: 0;
+ }
+ .carousel-control-prev {
+ left: 0;
+ }
+ }
+ // Modal animation
+ &.animated {
+ .onboarding-media {
+ transform: translateY(10px) scale(0.8);
+ transition: all 0.5s cubic-bezier(0.25, 1.1, 0.5, 1.35);
+ transition-delay: 0.3s;
+ opacity: 0;
+ }
+ .onboarding-content {
+ transform: translateY(40px);
+ transition-delay: 0.1s;
+ transition: all 0.4s ease;
+ opacity: 0;
+ }
+ .onboarding-title {
+ opacity: 0;
+ transition-delay: 0.5s;
+ transition: all 0.5s cubic-bezier(0.25, 1.1, 0.5, 1.35);
+ transform: translateY(40px);
+ }
+ .onboarding-info {
+ opacity: 0;
+ transition-delay: 0.6s;
+ transition: all 0.5s cubic-bezier(0.25, 1.1, 0.5, 1.35);
+ transform: translateY(40px);
+ }
+ form {
+ opacity: 0;
+ transition-delay: 0.7s;
+ transition: all 0.5s ease;
+ transform: translateY(40px);
+ }
+ &.show {
+ .onboarding-media {
+ transform: translateY(0) scale(1);
+ opacity: 1;
+ }
+ .onboarding-content {
+ transform: translateY(0);
+ opacity: 1;
+ }
+ .onboarding-title {
+ transform: translateY(0);
+ opacity: 1;
+ }
+ .onboarding-info {
+ opacity: 1;
+ transform: translateY(0px);
+ }
+ form {
+ opacity: 1;
+ transform: translateY(0px);
+ }
+ }
+ }
+}
+
+// Top modals
+// *******************************************************************************
+
+.modal-top {
+ .modal-dialog {
+ margin-top: 0;
+ }
+
+ .modal-content {
+ @include border-top-radius(0);
+ }
+}
+
+// Transparent modals
+// ******************************************************************************
+
+.modal-transparent {
+ .modal-dialog {
+ display: flex;
+ margin: 0 auto;
+ min-height: 100vh;
+ }
+
+ .modal-content {
+ margin: auto;
+ width: 100%;
+ border: 0;
+ background: transparent;
+ box-shadow: none;
+ }
+
+ .btn-close {
+ position: absolute;
+ top: 0;
+ right: $modal-inner-padding;
+ opacity: 1;
+ padding: $btn-close-padding-y $btn-close-padding-x;
+ background-image: str-replace(str-replace($btn-close-bg, '#{$btn-close-color}', $white), '#', '%23');
+ background-color: transparent !important;
+ box-shadow: none;
+ @include rtl-style {
+ right: auto;
+ left: $modal-header-padding-x;
+ }
+ }
+}
+
+// Modal Simple (Modal Examples)
+// ******************************************************************************
+
+.modal-simple {
+ .modal-content {
+ padding: $modal-simple-padding;
+ @include media-breakpoint-down(md) {
+ padding: 1rem;
+ .modal-body {
+ padding: 1rem;
+ }
+ }
+ }
+ .btn-close {
+ position: absolute;
+ top: -($modal-simple-padding - $modal-simple-close-position);
+ @include rtl-style() {
+ left: -($modal-simple-padding - $modal-simple-close-position);
+ }
+ @include ltr-style() {
+ right: -($modal-simple-padding - $modal-simple-close-position);
+ }
+ // For small screen set top, left/right 0 p-3, p-md-5
+ @include media-breakpoint-down(md) {
+ top: 0;
+ @include rtl-style() {
+ left: 0;
+ }
+ @include ltr-style() {
+ right: 0;
+ }
+ }
+ }
+}
+
+// Refer & Earn Modal Example
+.modal-refer-and-earn {
+ .modal-refer-and-earn-step {
+ width: 88px;
+ height: 88px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: $card-border-radius;
+ i {
+ font-size: 2.5rem;
+ }
+ }
+}
+
+// Add new address modal
+.modal-add-new-address {
+ .custom-option-icon:not(.checked) svg {
+ stroke: $headings-color;
+ }
+ .custom-option-icon.checked svg {
+ stroke: $primary;
+ }
+}
+
+// Modal Animations
+// ******************************************************************************
+
+// Slide from Top
+.modal-top.fade .modal-dialog,
+.modal-top .modal.fade .modal-dialog {
+ transform: translateY(-100%);
+}
+
+.modal-top.show .modal-dialog,
+.modal-top .modal.show .modal-dialog {
+ transform: translateY(0);
+}
+
+// Transparent
+.modal-transparent.fade .modal-dialog,
+.modal-transparent .modal.fade .modal-dialog {
+ transform: scale(0.5, 0.5);
+}
+
+.modal-transparent.show .modal-dialog,
+.modal-transparent .modal.show .modal-dialog {
+ transform: scale(1, 1);
+}
+
+// Responsive
+// *******************************************************************************
+
+@include media-breakpoint-down(lg) {
+ .modal-onboarding .onboarding-horizontal {
+ flex-direction: column;
+ }
+}
+@include media-breakpoint-down(md) {
+ .modal {
+ .carousel-control-prev,
+ .carousel-control-next {
+ display: none;
+ }
+ }
+}
+@include media-breakpoint-up(sm) {
+ .modal-content {
+ box-shadow: $modal-content-box-shadow-sm-up;
+ }
+
+ .modal-sm .modal-dialog {
+ max-width: $modal-sm;
+ }
+}
+@include media-breakpoint-up(xl) {
+ .modal-xl .modal-dialog {
+ max-width: $modal-xl;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_nav.scss b/resources/assets/vendor/scss/_bootstrap-extended/_nav.scss
new file mode 100644
index 0000000..c8b4af8
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_nav.scss
@@ -0,0 +1,510 @@
+// Nav
+// *******************************************************************************
+.nav .nav-item,
+.nav .nav-link,
+.tab-pane,
+.tab-pane .card-body {
+ outline: none !important;
+}
+
+// To fix height issue of nav pills
+.nav {
+ flex-wrap: inherit;
+ &.nav-pills:not(.nav-align-right):not(.nav-align-left) {
+ flex-wrap: wrap;
+ }
+ .nav-item {
+ white-space: nowrap;
+ }
+ .nav-tabs {
+ background-color: $card-bg;
+ }
+}
+
+//nav tabs shadow
+.nav-tabs-shadow {
+ box-shadow: $card-box-shadow;
+}
+// Tab and pills style
+.nav-tabs,
+.nav-pills {
+ .nav-link {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ text-transform: capitalize;
+ &.active {
+ background-color: transparent;
+ }
+ }
+
+ &:not(.nav-fill):not(.nav-justified) .nav-link {
+ margin-right: $nav-spacer;
+ width: 100%;
+
+ @include rtl-style {
+ margin-left: $nav-spacer;
+ margin-right: 0;
+ }
+ }
+}
+
+.tab-content:not(.doc-example-content) {
+ padding: $card-spacer-y;
+ .tab-pane {
+ opacity: 0;
+ transition: all linear 0.1s;
+ @include ltr-style {
+ transform: translateX(-30px);
+ }
+ @include rtl-style {
+ transform: translateX(30px);
+ }
+ &.show {
+ opacity: 1;
+ transform: unset !important;
+ transition: all ease-out 0.2s 0.1s;
+ }
+ }
+}
+
+// For scrollable navs/tabs/pills
+.nav-scrollable {
+ display: -webkit-inline-box;
+ display: -moz-inline-box;
+ width: 100%;
+ overflow-y: auto;
+ flex-wrap: nowrap;
+}
+
+// Widget Tabs
+// --------------------------------------------------
+
+.nav-tabs {
+ div:not(.nav-align-left):not(.nav-align-right) > & {
+ display: inline-flex;
+ width: 100%;
+ overflow-x: auto !important;
+ overflow-y: hidden;
+ }
+ &.widget-nav-tabs {
+ border: 0 !important;
+ overflow-x: auto;
+ .nav-link {
+ border: $border-width dashed $border-color;
+ &.active {
+ border: $border-width solid $border-color;
+ }
+ @include media-breakpoint-up(md) {
+ height: 100px !important;
+ width: 110px !important;
+ @include border-radius($border-radius);
+ }
+ @include media-breakpoint-down(md) {
+ border: 0 !important;
+ padding: 0;
+ }
+ &.active {
+ border-color: $primary;
+ box-shadow: none !important;
+ .badge {
+ background-color: $component-hover-bg !important;
+ color: $component-active-bg !important;
+ }
+ }
+ .tab-widget-title {
+ @include media-breakpoint-down(md) {
+ display: none;
+ }
+ }
+ }
+ }
+}
+
+// Todo: remove/ update style for nav with perfect scrollbar
+// ? Not working with fixed width
+// ? if provide width/min-width with %/auto not working
+// ? Also can't use width with PX (as it's required for ps)
+// ? removed JS so need to initialize ps again
+// ? Once done add an example to docs
+
+// .nav-scrollable {
+// display: -webkit-inline-box;
+// display: -moz-inline-box;
+// width: 420px;
+// padding-bottom: 0.5rem;
+// position: relative;
+// // overflow-y: auto;
+// flex-wrap: nowrap;
+// }
+
+// Tab link
+.nav-tabs {
+ position: relative;
+ .tab-slider {
+ height: 2px;
+ position: absolute;
+ .nav-align-left &,
+ .nav-align-right & {
+ width: 2px !important;
+ }
+ }
+ .nav-link {
+ background-clip: padding-box;
+ border-radius: 0;
+ }
+}
+.nav-pills {
+ .nav-link {
+ padding: $nav-pills-padding-y $nav-pills-padding-x;
+ }
+ & .nav-item .nav-link:not(.active):hover {
+ border-bottom: none;
+ padding-bottom: $nav-link-padding-y;
+ background-color: $nav-pills-link-hover-bg;
+ }
+ ~ .tab-content {
+ box-shadow: $box-shadow;
+ }
+}
+
+// Sizing
+// *******************************************************************************
+
+.nav-sm {
+ @include template-nav-size($nav-link-padding-y-sm, $nav-link-padding-x-sm, $font-size-sm, $nav-link-line-height-sm);
+}
+.nav-lg {
+ @include template-nav-size($nav-link-padding-y-lg, $nav-link-padding-x-lg, $font-size-lg, $nav-link-line-height-lg);
+}
+
+// Top, Right, Bottom & Left Tabbed panels
+// *******************************************************************************
+.nav-align-top,
+.nav-align-right,
+.nav-align-bottom,
+.nav-align-left {
+ .nav-tabs {
+ background: $nav-tabs-link-active-bg;
+ }
+ display: flex;
+
+ > .nav,
+ > div > .nav {
+ z-index: 1;
+ position: relative;
+ }
+ &:has(.nav-tabs) {
+ border-radius: $border-radius !important;
+ }
+
+ .row-bordered > [class^='col-'],
+ .row-bordered > [class*=' col-'],
+ .row-bordered > [class^='col '],
+ .row-bordered > [class*=' col '],
+ .row-bordered > [class$=' col'],
+ .row-bordered > [class='col'] {
+ &::before,
+ &::after {
+ border-color: $card-inner-border-color;
+ }
+ }
+}
+
+.nav-align-right,
+.nav-align-left {
+ align-items: stretch;
+
+ > .nav,
+ > div > .nav {
+ flex-grow: 0;
+ flex-direction: column;
+ border-bottom-width: 0;
+ }
+
+ > .nav.nav-pills .nav-item:not(:last-child),
+ > div > .nav.nav-pills .nav-item:not(:last-child) {
+ margin: 0 0 $nav-spacer 0 !important;
+ }
+
+ > .tab-content {
+ flex-grow: 1;
+ .tab-pane {
+ transform: translateY(-30px);
+ &.show {
+ transform: translateY(0px);
+ }
+ }
+ }
+}
+
+// Top tabs
+.nav-align-top {
+ .tab-content {
+ @include border-bottom-radius($border-radius);
+ }
+ flex-direction: column;
+ .nav-tabs {
+ border-bottom: $border-width solid $border-color;
+ @include border-top-radius($border-radius);
+ & .nav-link:not(.active):hover {
+ color: $primary !important;
+ border-bottom: 2px solid $nav-pills-link-hover-bg !important;
+ padding-bottom: calc($nav-link-padding-y - 0.125rem);
+ }
+ &.nav-lg .nav-link:not(.active):hover {
+ padding-bottom: calc($nav-link-padding-y-lg - 0.125rem);
+ }
+ &.nav-sm .nav-link:not(.active):hover {
+ padding-bottom: calc($nav-link-padding-y-sm - 0.125rem);
+ }
+ }
+ .nav-pills ~ .tab-content {
+ @include border-top-radius($border-radius);
+ }
+}
+.nav-align-top,
+.nav-align-bottom {
+ > .tab-content {
+ .tab-pane {
+ @include ltr-style {
+ transform: translateX(-30px);
+ }
+ @include rtl-style {
+ transform: translateX(30px);
+ }
+ &.show {
+ transform: translateX(0px) !important;
+ }
+ }
+ }
+ @include ltr-style {
+ > .nav.nav-pills .nav-item:not(:last-child) {
+ margin-right: $nav-spacer;
+ }
+ }
+
+ @include rtl-style {
+ > .nav.nav-pills .nav-item:not(:last-child) {
+ margin-left: $nav-spacer;
+ }
+ }
+}
+.nav-align-right {
+ .tab-content {
+ @include border-start-radius($border-radius);
+ }
+ flex-direction: row-reverse;
+ .nav-tabs {
+ border-left: $border-width solid $border-color;
+ @include border-end-radius($border-radius);
+ position: relative;
+ .tab-slider {
+ @include ltr-style {
+ left: 0;
+ }
+ @include rtl-style {
+ right: 0;
+ }
+ }
+ ~ .tab-content {
+ .card & {
+ @include ltr-style {
+ border-right: $nav-tabs-border-width solid $nav-tabs-border-color;
+ }
+ @include rtl-style {
+ border-left: $nav-tabs-border-width solid $nav-tabs-border-color;
+ }
+ }
+ }
+ @include ltr-style {
+ & .nav-link:not(.active):hover {
+ color: $primary !important;
+ border-left: 2px solid $nav-pills-link-hover-bg !important;
+ padding-left: calc($nav-link-padding-x - 0.125rem);
+ }
+ }
+
+ @include rtl-style {
+ & .nav-link:not(.active):hover {
+ color: $primary !important;
+ border-right: 2px solid $nav-pills-link-hover-bg !important;
+ padding-right: calc($nav-link-padding-x - 0.125rem);
+ }
+ }
+ }
+
+ > .nav .nav-item,
+ > div > .nav .nav-item {
+ margin-left: 0;
+
+ @include rtl-style {
+ margin-left: 0;
+ margin-right: 0;
+ }
+ }
+ .nav-link {
+ text-align: right;
+ justify-content: end;
+ }
+ .nav-pills ~ .tab-content {
+ @include border-end-radius($border-radius);
+ }
+}
+
+// Bottom tabs
+.nav-align-bottom {
+ .tab-content {
+ @include border-top-radius($border-radius);
+ }
+ flex-direction: column-reverse;
+
+ > .nav .nav-item,
+ > div > .nav .nav-item {
+ margin-bottom: 0;
+ margin-top: 0;
+ }
+
+ > .nav,
+ > div > .nav {
+ border-bottom-width: 0;
+ border-top: $nav-tabs-border-width solid $nav-tabs-border-color;
+ }
+ .nav-tabs {
+ border-top: $border-width solid $border-color;
+ @include border-bottom-radius($border-radius);
+ .tab-slider {
+ bottom: inherit !important;
+ }
+ & .nav-link:not(.active):hover {
+ color: $primary !important;
+ border-top: 2px solid $nav-pills-link-hover-bg !important;
+ padding-top: calc($nav-link-padding-y - 0.125rem);
+ }
+ }
+ .nav-pills ~ .tab-content {
+ @include border-bottom-radius($border-radius);
+ }
+}
+
+// Left tabs
+.nav-align-left {
+ .tab-content {
+ @include border-end-radius($border-radius);
+ }
+ .nav-tabs {
+ border-right: $border-width solid $border-color;
+ @include border-start-radius($border-radius);
+ position: relative;
+ ~ .tab-content {
+ .card & {
+ @include ltr-style {
+ border-left: $nav-tabs-border-width solid $nav-tabs-border-color;
+ }
+ @include rtl-style {
+ border-right: $nav-tabs-border-width solid $nav-tabs-border-color;
+ }
+ }
+ }
+ @include ltr-style {
+ & .nav-link:not(.active):hover {
+ color: $primary !important;
+ border-right: 2px solid $nav-pills-link-hover-bg !important;
+ padding-right: calc($nav-link-padding-x - 0.125rem);
+ }
+ }
+
+ @include rtl-style {
+ & .nav-link:not(.active):hover {
+ color: $primary !important;
+ border-left: 2px solid $nav-pills-link-hover-bg !important;
+ padding-left: calc($nav-link-padding-x - 0.125rem);
+ }
+ }
+ }
+ > .nav .nav-item,
+ > div > .nav .nav-item {
+ margin-right: 0;
+ @include rtl-style {
+ margin-right: 0;
+ margin-left: 0;
+ }
+ }
+ .nav-link {
+ text-align: left;
+ justify-content: start;
+ }
+ .nav-pills ~ .tab-content {
+ @include border-start-radius($border-radius);
+ }
+}
+
+// Tab content
+.nav-align-top > .tab-content,
+.nav-align-right > .tab-content,
+.nav-align-bottom > .tab-content,
+.nav-align-left > .tab-content {
+ flex-shrink: 1;
+ background-clip: padding-box;
+ background: $nav-tabs-link-active-bg;
+ .card & {
+ background: transparent;
+ }
+}
+.card .tab-content {
+ box-shadow: none !important;
+}
+
+// Dark
+@if $dark-style {
+ .nav-tabs {
+ .nav-link.active {
+ border-color: $border-color;
+ border-bottom-color: $nav-tabs-link-active-bg;
+ }
+ }
+ .nav-align-top,
+ .nav-align-bottom,
+ .nav-align-left,
+ .nav-align-right {
+ .nav-tabs {
+ .nav-link.active {
+ border-color: $gray-200;
+ @include rtl-style {
+ border-right-color: $gray-200 !important;
+ }
+ }
+ }
+ }
+ .nav-align-top {
+ .nav-tabs {
+ .nav-link.active {
+ border-bottom-color: $nav-tabs-link-active-bg !important;
+ }
+ }
+ }
+ .nav-align-bottom {
+ .nav-tabs {
+ .nav-link.active {
+ border-top-color: $nav-tabs-link-active-bg !important;
+ }
+ }
+ }
+}
+
+// RTL
+@include rtl-only {
+ .nav {
+ padding-right: 0;
+ }
+ .nav-align-left {
+ .nav-link {
+ text-align: right;
+ }
+ }
+ .nav-align-right {
+ .nav-link {
+ text-align: left;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_navbar.scss b/resources/assets/vendor/scss/_bootstrap-extended/_navbar.scss
new file mode 100644
index 0000000..bd6db22
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_navbar.scss
@@ -0,0 +1,87 @@
+// Navbar
+// *******************************************************************************
+
+.navbar {
+ z-index: 2;
+ // ! Fix: navbar dropdown focus outline
+ .dropdown:focus,
+ .dropdown-toggle:focus {
+ outline: 0;
+ }
+ .navbar-toggler:focus {
+ box-shadow: none;
+ }
+ .list-group-item:hover,
+ .list-group-item:focus {
+ background-color: $navbar-dropdown-hover-bg;
+ color: inherit;
+ }
+}
+
+.fixed-top {
+ z-index: $zindex-fixed;
+}
+
+.navbar.navbar-light {
+ color: $navbar-light-color;
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: $navbar-light-disabled-color !important;
+}
+
+.navbar.navbar-dark {
+ color: $navbar-dark-color;
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: $navbar-dark-disabled-color !important;
+}
+
+// IE fix
+.navbar-collapse,
+.navbar-brand,
+.navbar-text {
+ flex-shrink: 1;
+}
+
+// Icons
+// .navbar-icon {
+// font-size: 130%;
+// }
+
+// Rulers
+.navbar-dark hr {
+ border-color: rgba(255, 255, 255, 0.1);
+}
+
+.navbar-light hr {
+ border-color: $gray-100;
+}
+
+// RTL Style
+// ******************************************************************************
+
+@include rtl-only {
+ .navbar-nav {
+ padding-right: 0;
+ }
+
+ .navbar-brand {
+ margin-right: 0;
+ margin-left: $navbar-padding-x;
+ }
+}
+
+// Mega dropdown
+// ******************************************************************************
+
+.mega-dropdown {
+ .dropdown-toggle {
+ outline: 0;
+ box-shadow: none;
+ }
+ .dropdown-menu {
+ width: 100%;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_offcanvas.scss b/resources/assets/vendor/scss/_bootstrap-extended/_offcanvas.scss
new file mode 100644
index 0000000..d56fa0f
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_offcanvas.scss
@@ -0,0 +1,33 @@
+// Offcanvas
+// *******************************************************************************
+
+.offcanvas {
+ box-shadow: $offcanvas-box-shadow;
+ .offcanvas-header {
+ .btn-close {
+ padding: 0.44rem;
+ margin-right: 0;
+ background-size: 1.5rem;
+ background-image: str-replace(
+ str-replace($btn-close-bg, '#{$offcanvas-btn-close-color}', $headings-color),
+ '#',
+ '%23'
+ );
+ }
+ }
+}
+
+// RTL
+// *******************************************************************************
+@include rtl-only {
+ .offcanvas-start {
+ right: 0;
+ transform: translateX(100%);
+ }
+
+ .offcanvas-end {
+ right: auto;
+ left: 0;
+ transform: translateX(-100%);
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_pagination.scss b/resources/assets/vendor/scss/_bootstrap-extended/_pagination.scss
new file mode 100644
index 0000000..2e913e1
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_pagination.scss
@@ -0,0 +1,226 @@
+// Pagination
+// *******************************************************************************
+
+// Pagination Mixins
+@each $color, $value in $theme-colors {
+ @if $color != primary and $color != light {
+ @include template-pagination-variant('.pagination-#{$color}', $value);
+ @include template-pagination-outline-variant('.pagination-outline-#{$color}', $value);
+ }
+}
+// Pagination next, prev, first & last css padding
+.page-item {
+ &.first,
+ &.last,
+ &.next,
+ &.prev,
+ &.previous {
+ .page-link {
+ padding: $pagination-padding-y - 0.043rem $pagination-padding-x - 0.067rem;
+ }
+ }
+ &.disabled,
+ &[disabled] {
+ .page-link {
+ pointer-events: none;
+ }
+ }
+}
+.pagination {
+ &.disabled,
+ &[disabled] {
+ .page-item .page-link {
+ opacity: $pagination-disabled-opacity;
+ }
+ }
+}
+
+// Pagination basic style
+.page-link,
+.page-link > a {
+ @include border-radius($border-radius);
+
+ text-align: center;
+ min-width: calc(
+ #{'#{($font-size-base * $pagination-line-height) + ($pagination-padding-x * 1.923)} + calc(#{$pagination-border-width} * 2)'}
+ );
+ min-height: calc(
+ #{'#{($font-size-base * $pagination-line-height) + ($pagination-padding-y * 2)} + calc(#{$pagination-border-width} * 2)'}
+ );
+
+ &:focus {
+ color: $pagination-hover-color;
+ }
+ display: inline-flex !important;
+ justify-content: center;
+ align-items: center;
+}
+
+// Add spacing between pagination items
+.page-item + .page-item .page-link,
+.pagination li + li > a:not(.page-link) {
+ .pagination-sm & {
+ margin-left: 0.25rem;
+ }
+ .pagination-lg & {
+ margin-left: 0.5rem;
+ }
+}
+
+// Removed border from default pagination and set line-height of icons
+.pagination {
+ &:not([class*='pagination-outline-']) {
+ .page-link {
+ border-color: transparent;
+ }
+ & .page-item.active .waves-ripple {
+ background: none;
+ }
+ }
+ &[class*='pagination-outline-'] {
+ .page-item.active .page-link {
+ box-shadow: none;
+ }
+ .page-item:not(.active) .page-link,
+ .pagination li > a:not(.page-link) {
+ background-color: transparent;
+ &:hover,
+ &:focus {
+ background-color: rgba-to-hex(rgba($black, 0.06), $rgba-to-hex-bg);
+ border-color: rgba-to-hex(rgba($black, 0.22), $rgba-to-hex-bg);
+ color: $headings-color;
+ }
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($black, 0.3) 0,
+ rgba($black, 0.4) 40%,
+ rgba($black, 0.5) 50%,
+ rgba($black, 0.6) 60%,
+ rgba($black, 0) 70%
+ );
+ }
+ }
+ }
+ }
+}
+
+.page-link.btn-primary {
+ box-shadow: none !important;
+}
+
+// Pagination shape rounded & Square
+.pagination {
+ &.pagination-square .page-item a {
+ @include border-radius(0);
+ }
+ &.pagination-round .page-item a {
+ @include border-radius(50%);
+ }
+ &.pagination-rounded .page-item a {
+ @include border-radius($border-radius);
+ }
+ &.pagination-sm.pagination-rounded .page-item a {
+ @include border-radius($border-radius-sm);
+ }
+ &.pagination-lg.pagination-rounded .page-item a {
+ @include border-radius($border-radius-lg);
+ }
+}
+
+// Sizing
+// *******************************************************************************
+
+// Pagination Large
+.pagination-lg .page-link,
+.pagination-lg > li > a:not(.page-link) {
+ min-width: calc(
+ #{'#{($font-size-base * $pagination-line-height) + ($pagination-padding-x-lg * 1.615)} + calc(#{$pagination-border-width} * 2)'}
+ );
+ min-height: calc(
+ #{'#{($font-size-base * $pagination-line-height) + ($pagination-padding-y-lg * 2.33)} + calc(#{$pagination-border-width} * 2)'}
+ );
+}
+
+// Pagination Small
+.pagination-sm .page-link,
+.pagination-sm > li > a:not(.page-link) {
+ min-width: calc(
+ #{'#{($font-size-sm * $pagination-line-height) + ($pagination-padding-x-sm * 2.356)} + calc(#{$pagination-border-width} * 2)'}
+ );
+ min-height: calc(
+ #{'#{($font-size-sm * $pagination-line-height) + ($pagination-padding-y-sm * 2)} + calc(#{$pagination-border-width} * 2)'}
+ );
+}
+.pagination-sm > .page-item {
+ &.first,
+ &.last,
+ &.next,
+ &.prev,
+ &.previous {
+ .page-link {
+ padding: $pagination-padding-y-sm - 0.1055rem;
+ }
+ }
+}
+
+// RTL pagination
+// *******************************************************************************
+
+@include rtl-only {
+ .pagination {
+ padding-right: 0;
+ }
+
+ // Add spacing between pagination items
+ .page-item + .page-item .page-link,
+ .pagination li + li > a:not(.page-link) {
+ margin-left: 0;
+ margin-right: $pagination-margin-start;
+ .pagination-sm & {
+ margin-right: 0.25rem;
+ }
+ .pagination-lg & {
+ margin-right: 0.5rem;
+ }
+ }
+
+ .page-item {
+ &.first,
+ &.last,
+ &.next,
+ &.prev,
+ &.previous {
+ .page-link {
+ i {
+ transform: rotate(180deg);
+ }
+ }
+ }
+ }
+}
+
+@include dark-layout-only {
+ .pagination[class*='pagination-outline-'] {
+ .page-item .page-link,
+ .pagination li > a:not(.page-link) {
+ background-color: transparent;
+ &:hover,
+ &:focus {
+ background-color: rgba-to-hex(rgba($base, 0.06), $rgba-to-hex-bg);
+ border-color: rgba-to-hex(rgba($base, 0.22), $rgba-to-hex-bg);
+ }
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba(#000, 0.3) 0,
+ rgba(#000, 0.4) 40%,
+ rgba(#000, 0.5) 50%,
+ rgba(#000, 0.6) 60%,
+ rgba(#000, 0) 70%
+ );
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_popover.scss b/resources/assets/vendor/scss/_bootstrap-extended/_popover.scss
new file mode 100644
index 0000000..98294fe
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_popover.scss
@@ -0,0 +1,42 @@
+// Popovers
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color != primary and $color != light {
+ @include template-popover-variant(
+ '.popover-#{$color}, .popover-#{$color} > .popover, .ngb-popover-#{$color} + ngb-popover-window',
+ rgba-to-hex($value, $rgba-to-hex-bg)
+ );
+ }
+}
+
+.modal-open .popover {
+ z-index: $zindex-modal + 1;
+}
+
+.popover {
+ box-shadow: $popover-box-shadow;
+
+ // Popover header padding and font-size
+ .popover-header {
+ padding-bottom: 0;
+ font-size: $h5-font-size;
+ }
+
+ // Popover body padding
+ .popover-body {
+ padding-top: $spacer;
+ }
+ .popover-arrow {
+ z-index: 1;
+ }
+}
+
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .popover {
+ text-align: right;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_progress.scss b/resources/assets/vendor/scss/_bootstrap-extended/_progress.scss
new file mode 100644
index 0000000..c41a774
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_progress.scss
@@ -0,0 +1,44 @@
+// Progress
+// *******************************************************************************
+
+.progress:has(:only-child) {
+ overflow: visible;
+}
+
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include template-progress-shadow-theme('.progress-bar.bg-#{$color}', $value);
+ }
+}
+@include ltr-only {
+ .progress {
+ .progress-bar:last-child {
+ border-top-right-radius: $progress-border-radius;
+ border-bottom-right-radius: $progress-border-radius;
+ }
+ .progress-bar:first-child {
+ border-top-left-radius: $progress-border-radius;
+ border-bottom-left-radius: $progress-border-radius;
+ }
+ }
+}
+
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .progress-bar-animated {
+ animation-direction: reverse;
+ }
+ .progress {
+ // border radius for first and last child
+ .progress-bar:last-child {
+ border-top-left-radius: $progress-border-radius;
+ border-bottom-left-radius: $progress-border-radius;
+ }
+ .progress-bar:first-child {
+ border-top-right-radius: $progress-border-radius;
+ border-bottom-right-radius: $progress-border-radius;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_reboot.scss b/resources/assets/vendor/scss/_bootstrap-extended/_reboot.scss
new file mode 100644
index 0000000..b05d833
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_reboot.scss
@@ -0,0 +1,74 @@
+// Reboot
+//
+
+b,
+strong {
+ font-weight: $font-weight-bold;
+}
+
+// Todo: commenting this style as creating issue on toast select and customizer select in windows
+// @if $dark-style {
+// select:not([multiple]):not([size]),
+// select[size='1'] {
+// option {
+// color: $black;
+// }
+// }
+// }
+
+@include rtl-only {
+ caption {
+ text-align: right;
+ }
+ dd {
+ margin-right: 0;
+ }
+}
+
+a:not([href]) {
+ color: inherit;
+ text-decoration: none;
+
+ &:hover {
+ color: inherit;
+ text-decoration: none;
+ }
+}
+
+//! Fix: Autofill input bg and text color issue on different OS and browsers
+input:-webkit-autofill,
+input:-webkit-autofill:hover,
+input:-webkit-autofill:focus,
+textarea:-webkit-autofill,
+textarea:-webkit-autofill:hover,
+textarea:-webkit-autofill:focus,
+select:-webkit-autofill,
+select:-webkit-autofill:hover,
+select:-webkit-autofill:focus,
+input:-internal-autofill-selected {
+ background-clip: text !important;
+ -webkit-background-clip: text !important;
+}
+
+h1 {
+ line-height: $h1-line-height;
+}
+h2 {
+ line-height: $h2-line-height;
+}
+
+h3 {
+ line-height: $h3-line-height;
+}
+
+h4 {
+ line-height: $h4-line-height;
+}
+
+h5 {
+ line-height: $h5-line-height;
+}
+
+h6 {
+ line-height: $h6-line-height;
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_root.scss b/resources/assets/vendor/scss/_bootstrap-extended/_root.scss
new file mode 100644
index 0000000..4bbd2bd
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_root.scss
@@ -0,0 +1,4 @@
+// The color-scheme CSS property https://web.dev/color-scheme/
+:root {
+ color-scheme: #{$color-scheme};
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_spinners.scss b/resources/assets/vendor/scss/_bootstrap-extended/_spinners.scss
new file mode 100644
index 0000000..72dc9c3
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_spinners.scss
@@ -0,0 +1,44 @@
+// Spinners
+//
+
+//Large size
+.spinner-border-lg {
+ width: $spinner-width-lg;
+ height: $spinner-height-lg;
+ border-width: $spinner-border-width-lg;
+}
+
+.spinner-grow-lg {
+ width: $spinner-width-lg;
+ height: $spinner-height-lg;
+ border-width: $spinner-border-width-lg;
+}
+
+// * Within button
+// *******************************************************************************
+
+.btn {
+ .spinner-border,
+ .spinner-grow {
+ position: relative;
+ top: -0.0625rem;
+ height: 1em;
+ width: 1em;
+ }
+
+ .spinner-border {
+ border-width: 0.15em;
+ }
+}
+
+@include keyframes('spinner-border-rtl') {
+ to {
+ transform: rotate(-360deg);
+ }
+}
+// RTL
+@include rtl-only {
+ .spinner-border {
+ animation-name: spinner-border-rtl;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_tables.scss b/resources/assets/vendor/scss/_bootstrap-extended/_tables.scss
new file mode 100644
index 0000000..e4eb283
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_tables.scss
@@ -0,0 +1,136 @@
+// Tables
+// ********************************************************************************/
+
+@each $color, $value in $table-variants {
+ @if $color != primary {
+ @include template-table-variant($color, $value);
+ }
+}
+
+// Firefox fix for table head border bottom
+.table {
+ > :not(caption) > * > * {
+ background-clip: padding-box;
+ }
+ &:not(.table-borderless):not(.table-dark) > :not(caption) > *:not(.table-dark) > * {
+ border-top-width: 1px;
+ }
+ .dropdown-item {
+ display: flex;
+ gap: 0.25rem;
+ }
+ tr {
+ > td {
+ .dropdown {
+ position: static;
+ }
+ }
+ }
+ caption {
+ padding: $table-cell-padding-y $table-cell-padding-x;
+ }
+ &.table-sm {
+ thead tr th {
+ padding-block: $table-head-padding-y-sm;
+ }
+ }
+ thead tr th {
+ padding-block: $table-head-padding-y;
+ }
+}
+
+// Style for table inside card
+.card {
+ .table {
+ margin-bottom: 0;
+ }
+}
+@supports (-moz-appearance: none) {
+ .table {
+ .dropdown-menu.show {
+ display: inline-table;
+ }
+ }
+}
+// Table heading style
+.table th {
+ text-transform: uppercase;
+ font-size: $font-size-sm;
+ letter-spacing: 0.2px;
+ color: $table-th-color;
+}
+.table-dark th {
+ color: var(--#{$prefix}table-color);
+ border-top: 1px solid $table-border-color;
+}
+@if $dark-style {
+ .table-light th {
+ color: var(--#{$prefix}table-color);
+ }
+}
+
+// Dark Table icon button
+.table.table-dark .btn.btn-icon {
+ color: $table-border-color;
+}
+
+// class for to remove table border bottom
+.table-border-bottom-0 {
+ tr:last-child {
+ td,
+ th {
+ border-bottom-width: 0;
+ }
+ }
+}
+
+// Dark Table icon button color
+.table.table-dark {
+ .btn {
+ i {
+ color: $component-active-color;
+ }
+ }
+}
+
+// Flush spacing of left from first column ans right from last column
+.table.table-flush-spacing {
+ thead,
+ tbody {
+ tr > td:first-child {
+ padding-left: 0;
+ }
+ tr > td:last-child {
+ padding-right: 0;
+ }
+ }
+}
+
+// * Table inside card
+// *******************************************************************************
+
+// .card,
+.nav-align-top,
+.nav-align-right,
+.nav-align-bottom,
+.nav-align-left {
+ .table:not(.table-dark),
+ .table:not(.table-dark) thead:not(.table-dark) th,
+ .table:not(.table-dark) tfoot:not(.table-dark) th,
+ .table:not(.table-dark) td {
+ border-color: $border-color;
+ }
+}
+
+// Dark styles
+
+// Dark Table icon button color
+@if $dark-style {
+ .table.table-dark {
+ .btn {
+ i {
+ color: $card-bg;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_toasts.scss b/resources/assets/vendor/scss/_bootstrap-extended/_toasts.scss
new file mode 100644
index 0000000..c033faf
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_toasts.scss
@@ -0,0 +1,51 @@
+// Toasts
+// *******************************************************************************
+
+.toast.bs-toast {
+ z-index: $zindex-toast;
+}
+
+//btn close
+.toast-header {
+ border-bottom: $border-width solid $toast-header-border-color;
+ .btn-close {
+ background-image: str-replace(str-replace($btn-close-bg, '#{$btn-close-color}', $text-muted), '#', '%23');
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-left: 0.875rem;
+ background-size: 0.875rem;
+ }
+}
+
+// Toast body font size and padding override
+.toast-body {
+ font-size: 0.8125rem;
+ padding-top: 0.684rem;
+ padding-bottom: 0.684rem;
+}
+.toast-container {
+ --#{$prefix}toast-zindex: 9;
+}
+// RTL close btn style
+@include rtl-only {
+ .toast-header {
+ .btn-close {
+ margin-left: $toast-padding-x * -0.5;
+ margin-right: $toast-padding-x + 0.125;
+ }
+ }
+}
+// Bootstrap Toasts Example
+.toast-ex {
+ position: fixed;
+ top: 4.1rem;
+ right: 0.5rem;
+ @include rtl-style {
+ left: 0.5rem;
+ right: auto;
+ }
+}
+// Placement Toast example
+.toast-placement-ex {
+ position: fixed;
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_tooltip.scss b/resources/assets/vendor/scss/_bootstrap-extended/_tooltip.scss
new file mode 100644
index 0000000..78c5e17
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_tooltip.scss
@@ -0,0 +1,58 @@
+// Tooltips
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color != primary and $color != light {
+ @include template-tooltip-variant(
+ '.tooltip-#{$color}, .tooltip-#{$color} > .tooltip, .ngb-tooltip-#{$color} + ngb-tooltip-window',
+ rgba-to-hex($value, $rgba-to-hex-bg)
+ );
+ }
+}
+
+// Open modal tooltip z-index
+.modal-open .tooltip {
+ z-index: $zindex-modal + 2;
+}
+
+.tooltip-inner {
+ box-shadow: $tooltip-box-shadow;
+ font-weight: $font-weight-medium;
+}
+
+// Tooltip line height override
+.tooltip {
+ line-height: $line-height-lg;
+}
+// RTL
+// *******************************************************************************
+
+@include rtl-only {
+ .tooltip {
+ text-align: right;
+ }
+ &.bs-tooltip-auto {
+ &[data-popper-placement='right'] {
+ .tooltip-arrow {
+ right: 0;
+ left: inherit;
+ &::before {
+ left: -1px;
+ border-width: ($tooltip-arrow-width * 0.5) 0 ($tooltip-arrow-width * 0.5) $tooltip-arrow-height;
+ border-left-color: $tooltip-arrow-color;
+ }
+ }
+ }
+ &[data-popper-placement='left'] {
+ .tooltip-arrow {
+ left: 0;
+ right: inherit;
+ &::before {
+ right: -1px;
+ border-width: ($tooltip-arrow-width * 0.5) $tooltip-arrow-height ($tooltip-arrow-width * 0.5) 0;
+ border-right-color: $tooltip-arrow-color;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_type.scss b/resources/assets/vendor/scss/_bootstrap-extended/_type.scss
new file mode 100644
index 0000000..2001fd4
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_type.scss
@@ -0,0 +1,13 @@
+// Type
+//
+
+@include rtl-only {
+ .list-inline,
+ .list-unstyled {
+ padding-right: 0;
+ }
+ .list-inline-item:not(:last-child) {
+ margin-right: 0;
+ margin-left: $list-inline-padding;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_utilities-ltr.scss b/resources/assets/vendor/scss/_bootstrap-extended/_utilities-ltr.scss
new file mode 100644
index 0000000..a055e24
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_utilities-ltr.scss
@@ -0,0 +1,299 @@
+// stylelint-disable indentation
+
+// Utilities
+
+// stylelint-disable-next-line scss/dollar-variable-default
+$utilities: map-merge(
+ $utilities,
+ (
+ 'align': null,
+ 'overflow': null,
+ 'display': null,
+ 'shadow': null,
+ 'position': null,
+ 'top': null,
+ 'bottom': null,
+ 'border': null,
+ 'border-top': null,
+ 'border-bottom': null,
+ 'border-color': null,
+ 'border-width': null,
+ 'border-bottom-dashed': null,
+ 'border-top-dashed': null,
+ 'width': null,
+ 'max-width': null,
+ 'viewport-width': null,
+ 'min-viewport-width': null,
+ 'height': null,
+ 'max-height': null,
+ 'viewport-height': null,
+ 'min-viewport-height': null,
+ 'flex': null,
+ 'flex-direction': null,
+ 'flex-grow': null,
+ 'flex-shrink': null,
+ 'flex-wrap': null,
+ 'gap': null,
+ 'justify-content': null,
+ 'align-items': null,
+ 'align-content': null,
+ 'align-self': null,
+ 'order': null,
+ 'margin': null,
+ 'margin-x': null,
+ 'margin-y': null,
+ 'margin-top': null,
+ 'margin-bottom': null,
+ 'negative-margin': null,
+ 'negative-margin-x': null,
+ 'negative-margin-y': null,
+ 'negative-margin-top': null,
+ 'negative-margin-bottom': null,
+ 'padding': null,
+ 'padding-x': null,
+ 'padding-y': null,
+ 'padding-top': null,
+ 'padding-bottom': null,
+ 'font-family': null,
+ 'font-size': null,
+ 'font-style': null,
+ 'font-weight': null,
+ 'line-height': null,
+ 'text-decoration': null,
+ 'text-transform': null,
+ 'white-space': null,
+ 'word-wrap': null,
+ 'color': null,
+ 'background-color': null,
+ 'transparent': null,
+ 'gradient': null,
+ 'user-select': null,
+ 'pointer-events': null,
+ 'rounded': null,
+ 'rounded-top': null,
+ 'rounded-bottom': null,
+ 'visibility': null,
+ 'opacity': null,
+ 'flex-basis': null,
+ 'cursor': null,
+ // scss-docs-start utils-float
+ 'float':
+ (
+ responsive: true,
+ property: float,
+ values: (
+ start: left,
+ end: right,
+ none: none
+ )
+ ),
+ // scss-docs-end utils-float
+ // scss-docs-start utils-position
+ 'end':
+ (
+ property: right,
+ class: end,
+ values: $position-values
+ ),
+ 'start': (
+ property: left,
+ class: start,
+ values: $position-values
+ ),
+ 'translate-middle': (
+ property: transform,
+ class: translate-middle,
+ values: (
+ null: translate(-50%, -50%),
+ x: translateX(-50%),
+ y: translateY(-50%)
+ )
+ ),
+ // scss-docs-end utils-position
+ // scss-docs-start utils-borders
+ 'border-end':
+ (
+ property: border-right,
+ class: border-end,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-start': (
+ property: border-left,
+ class: border-start,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-left-dashed': (
+ property: border-left-style,
+ class: border-left-dashed,
+ values: (
+ null: dashed
+ )
+ ),
+ 'border-right-dashed': (
+ property: border-right-style,
+ class: border-right-dashed,
+ values: (
+ null: dashed
+ )
+ ),
+ // scss-docs-end utils-borders
+ // scss-docs-start utils-text
+ 'text-align':
+ (
+ responsive: true,
+ property: text-align,
+ class: text,
+ values: (
+ start: left,
+ end: right,
+ center: center
+ )
+ ),
+ // scss-docs-end utils-text
+ // scss-docs-start utils-border-radius
+ 'rounded-end':
+ (
+ property: border-top-right-radius border-bottom-right-radius,
+ class: rounded-end,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-start': (
+ property: border-bottom-left-radius border-top-left-radius,
+ class: rounded-start,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-start-top': (
+ property: border-top-left-radius,
+ class: rounded-start-top,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-start-bottom': (
+ property: border-bottom-left-radius,
+ class: rounded-start-bottom,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-end-top': (
+ property: border-top-right-radius,
+ class: rounded-end-top,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-end-bottom': (
+ property: border-bottom-right-radius,
+ class: rounded-end-bottom,
+ values: (
+ null: $border-radius
+ )
+ ),
+ // scss-docs-end utils-border-radius
+ // Margin utilities
+ // scss-docs-start utils-spacing
+ 'margin-end':
+ (
+ responsive: true,
+ property: margin-right,
+ class: me,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ 'margin-start': (
+ responsive: true,
+ property: margin-left,
+ class: ms,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ // Negative margin utilities
+ 'negative-margin-end':
+ (
+ responsive: true,
+ property: margin-right,
+ class: me,
+ values: $negative-spacers
+ ),
+ 'negative-margin-start': (
+ responsive: true,
+ property: margin-left,
+ class: ms,
+ values: $negative-spacers
+ ),
+ // Padding utilities
+ 'padding-end':
+ (
+ responsive: true,
+ property: padding-right,
+ class: pe,
+ values: $spacers
+ ),
+ 'padding-start': (
+ responsive: true,
+ property: padding-left,
+ class: ps,
+ values: $spacers
+ ),
+ // scss-docs-end utils-spacing
+ // Custom Utilities
+ // *******************************************************************************
+ // scss-docs-start utils-rotate
+ 'rotate':
+ (
+ property: transform,
+ class: rotate,
+ values: (
+ 0: rotate(0deg),
+ 90: rotate(90deg),
+ 180: rotate(180deg),
+ 270: rotate(270deg),
+ n90: rotate(-90deg),
+ n180: rotate(-180deg),
+ n270: rotate(-270deg)
+ )
+ ),
+ // scss-docs-end utils-rotate
+ // scss-docs-start utils-scaleX
+ 'scaleX':
+ (
+ property: transform,
+ class: scaleX,
+ values: (
+ n1: scaleX(-1)
+ )
+ ),
+ // scss-docs-end utils-scaleX
+ // scss-docs-start utils-scaleY
+ 'scaleY':
+ (
+ property: transform,
+ class: scaleY,
+ values: (
+ n1: scaleY(-1)
+ )
+ )
+ // scss-docs-end utils-scaleY
+ )
+);
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_utilities-rtl.scss b/resources/assets/vendor/scss/_bootstrap-extended/_utilities-rtl.scss
new file mode 100644
index 0000000..0193ad7
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_utilities-rtl.scss
@@ -0,0 +1,301 @@
+// stylelint-disable indentation
+
+// Utilities
+
+// stylelint-disable-next-line scss/dollar-variable-default
+$utilities: map-merge(
+ $utilities,
+ (
+ 'align': null,
+ 'overflow': null,
+ 'display': null,
+ 'shadow': null,
+ 'position': null,
+ 'top': null,
+ 'bottom': null,
+ 'border': null,
+ 'border-top': null,
+ 'border-bottom': null,
+ 'border-color': null,
+ 'border-width': null,
+ 'border-bottom-dashed': null,
+ 'border-top-dashed': null,
+ 'width': null,
+ 'max-width': null,
+ 'viewport-width': null,
+ 'min-viewport-width': null,
+ 'height': null,
+ 'max-height': null,
+ 'viewport-height': null,
+ 'min-viewport-height': null,
+ 'flex': null,
+ 'flex-direction': null,
+ 'flex-grow': null,
+ 'flex-shrink': null,
+ 'flex-wrap': null,
+ 'gap': null,
+ 'justify-content': null,
+ 'align-items': null,
+ 'align-content': null,
+ 'align-self': null,
+ 'order': null,
+ 'margin': null,
+ 'margin-x': null,
+ 'margin-y': null,
+ 'margin-top': null,
+ 'margin-bottom': null,
+ 'negative-margin': null,
+ 'negative-margin-x': null,
+ 'negative-margin-y': null,
+ 'negative-margin-top': null,
+ 'negative-margin-bottom': null,
+ 'padding': null,
+ 'padding-x': null,
+ 'padding-y': null,
+ 'padding-top': null,
+ 'padding-bottom': null,
+ 'font-family': null,
+ 'font-size': null,
+ 'font-style': null,
+ 'font-weight': null,
+ 'line-height': null,
+ 'text-decoration': null,
+ 'text-transform': null,
+ 'white-space': null,
+ 'word-wrap': null,
+ 'color': null,
+ 'background-color': null,
+ 'transparent': null,
+ 'gradient': null,
+ 'user-select': null,
+ 'pointer-events': null,
+ 'rounded': null,
+ 'rounded-top': null,
+ 'rounded-bottom': null,
+ 'visibility': null,
+ 'opacity': null,
+ 'flex-basis': null,
+ 'cursor': null,
+ // scss-docs-start utils-float
+ 'float':
+ (
+ responsive: true,
+ property: float,
+ values: (
+ start: right,
+ end: left,
+ none: none
+ )
+ ),
+ // scss-docs-end utils-float
+ // scss-docs-start utils-position
+ 'end':
+ (
+ property: left,
+ class: end,
+ values: $position-values
+ ),
+ 'start': (
+ property: right,
+ class: start,
+ values: $position-values
+ ),
+ 'translate-middle': (
+ property: transform,
+ class: translate-middle,
+ values: (
+ null: translate(50%, -50%),
+ x: translateX(50%),
+ y: translateY(-50%)
+ )
+ ),
+ // scss-docs-end utils-position
+ // scss-docs-start utils-borders
+ 'border-end':
+ (
+ property: border-left,
+ class: border-end,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-start': (
+ property: border-right,
+ class: border-start,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-left-dashed': (
+ property: border-right-style,
+ class: border-left-dashed,
+ values: (
+ null: dashed
+ )
+ ),
+ 'border-right-dashed': (
+ property: border-left-style,
+ class: border-right-dashed,
+ values: (
+ null: dashed
+ )
+ ),
+ // scss-docs-end utils-borders
+ // scss-docs-start utils-text
+ 'text-align':
+ (
+ responsive: true,
+ property: text-align,
+ class: text,
+ values: (
+ start: right,
+ end: left,
+ center: center
+ )
+ ),
+ // scss-docs-end utils-text
+ // scss-docs-start utils-border-radius
+ 'rounded-end':
+ (
+ property: border-top-left-radius border-bottom-left-radius,
+ class: rounded-end,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-start': (
+ property: border-bottom-right-radius border-top-right-radius,
+ class: rounded-start,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-start-top': (
+ property: border-top-right-radius,
+ class: rounded-start-top,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-start-bottom': (
+ property: border-bottom-right-radius,
+ class: rounded-start-bottom,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-end-top': (
+ property: border-top-left-radius,
+ class: rounded-end-top,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-end-bottom': (
+ property: border-bottom-left-radius,
+ class: rounded-end-bottom,
+ values: (
+ null: $border-radius
+ )
+ ),
+ // scss-docs-end utils-border-radius
+ // Margin utilities
+ // scss-docs-start utils-spacing
+ 'margin-end':
+ (
+ responsive: true,
+ property: margin-left,
+ class: me,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ 'margin-start': (
+ responsive: true,
+ property: margin-right,
+ class: ms,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ // Negative margin utilities
+ 'negative-margin-end':
+ (
+ responsive: true,
+ property: margin-left,
+ class: me,
+ values: $negative-spacers
+ ),
+ 'negative-margin-start': (
+ responsive: true,
+ property: margin-right,
+ class: ms,
+ values: $negative-spacers
+ ),
+ // Padding utilities
+ 'padding-end':
+ (
+ responsive: true,
+ property: padding-left,
+ class: pe,
+ values: $spacers
+ ),
+ 'padding-start': (
+ responsive: true,
+ property: padding-right,
+ class: ps,
+ values: $spacers
+ ),
+ // scss-docs-end utils-spacing
+ // Custom Utilities
+ // *******************************************************************************
+ // scss-docs-start utils-rotate
+ 'rotate':
+ (
+ property: transform,
+ class: rotate,
+ values: (
+ 0: rotate(0deg),
+ 90: rotate(-90deg),
+ 180: rotate(-180deg),
+ 270: rotate(-270deg),
+ n90: rotate(90deg),
+ n180: rotate(180deg),
+ n270: rotate(270deg)
+ )
+ ),
+ // scss-docs-end utils-rotate
+ // scss-docs-start utils-scaleX
+ 'scaleX':
+ (
+ property: transform,
+ class: scaleX,
+ values: (
+ n1: scaleX(1),
+ n1-rtl: scaleX(-1)
+ )
+ ),
+ // scss-docs-end utils-scaleX
+ // scss-docs-start utils-scaleY
+ 'scaleY':
+ (
+ property: transform,
+ class: scaleY,
+ values: (
+ n1: scaleY(1),
+ n1-rtl: scaleY(-1)
+ )
+ )
+ // scss-docs-end utils-scaleY
+ )
+);
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_utilities.scss b/resources/assets/vendor/scss/_bootstrap-extended/_utilities.scss
new file mode 100644
index 0000000..5f2cef1
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_utilities.scss
@@ -0,0 +1,1081 @@
+// Utilities
+// *******************************************************************************
+// stylelint-disable indentation
+
+// Utilities
+
+$utilities: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$utilities: map-merge(
+ (
+ // scss-docs-start utils-vertical-align
+ 'align':
+ (
+ property: vertical-align,
+ class: align,
+ values: baseline top middle bottom text-bottom text-top
+ ),
+ // scss-docs-end utils-vertical-align
+ // Object Fit utilities
+ // scss-docs-start utils-object-fit
+ 'object-fit':
+ (
+ responsive: true,
+ property: object-fit,
+ values: (
+ contain: contain,
+ cover: cover,
+ fill: fill,
+ scale: scale-down,
+ none: none
+ )
+ ),
+ // scss-docs-end utils-object-fit
+ // Opacity utilities
+ // scss-docs-start utils-opacity
+ 'opacity':
+ (
+ property: opacity,
+ values: (
+ 0: 0,
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1
+ )
+ ),
+ // scss-docs-end utils-opacity
+ // scss-docs-start utils-overflow
+ 'overflow':
+ (
+ property: overflow,
+ values: auto hidden visible scroll
+ ),
+ // scss-docs-end utils-overflow
+ // scss-docs-start utils-display
+ 'display':
+ (
+ responsive: true,
+ print: true,
+ property: display,
+ class: d,
+ values: inline inline-block block grid table table-row table-cell flex inline-flex none
+ ),
+ // scss-docs-end utils-display
+ // scss-docs-start utils-shadow
+ 'shadow':
+ (
+ property: box-shadow,
+ class: shadow,
+ values: (
+ null: $box-shadow,
+ xs: $box-shadow-xs,
+ sm: $box-shadow-sm,
+ lg: $box-shadow-lg,
+ xl: $box-shadow-xl,
+ none: none
+ )
+ ),
+ // scss-docs-end utils-shadow
+ // scss-docs-start utils-position
+ 'position':
+ (
+ property: position,
+ values: static relative absolute fixed sticky
+ ),
+ 'top': (
+ property: top,
+ values: $position-values
+ ),
+ 'bottom': (
+ property: bottom,
+ values: $position-values
+ ),
+ // scss-docs-end utils-position
+ // scss-docs-start utils-borders
+ 'border':
+ (
+ property: border,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-style': (
+ property: border-style,
+ class: border,
+ responsive: true,
+ values: (
+ solid: solid,
+ dashed: dashed,
+ none: none
+ )
+ ),
+ 'border-top': (
+ property: border-top,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-bottom': (
+ property: border-bottom,
+ values: (
+ null: $border-width solid $border-color,
+ 0: 0
+ )
+ ),
+ 'border-color': (
+ property: border-color,
+ class: border,
+ values:
+ map-merge(
+ $theme-colors,
+ (
+ 'white': $white,
+ 'light': $gray-100,
+ // (C)
+ 'transparent': transparent // (C)
+ )
+ )
+ ),
+ 'border-label-color': (
+ property: border-color,
+ class: border-label,
+ local-vars: (
+ 'border-opacity': 0.16
+ ),
+ values: $utilities-border-colors
+ ),
+ 'border-width': (
+ property: border-width,
+ class: border,
+ values: $border-widths
+ ),
+ 'border-opacity': (
+ css-var: true,
+ class: border-opacity,
+ values: (
+ 10: 0.1,
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1
+ )
+ ),
+ 'border-top-dashed': (
+ property: border-top-style,
+ class: border-top-dashed,
+ values: (
+ null: dashed
+ )
+ ),
+ 'border-bottom-dashed': (
+ property: border-bottom-style,
+ class: border-bottom-dashed,
+ values: (
+ null: dashed
+ )
+ ),
+ // scss-docs-end utils-borders
+ // Sizing utilities
+ // scss-docs-start utils-sizing
+ 'width':
+ (
+ property: width,
+ class: w,
+ values:
+ map-merge(
+ $sizes-px,
+ (
+ 20: 20%,
+ 25: 25%,
+ 50: 50%,
+ 60: 60%,
+ 75: 75%,
+ 100: 100%,
+ auto: auto
+ )
+ )
+ ),
+ 'max-width': (
+ property: max-width,
+ class: mw,
+ values: (
+ 100: 100%
+ )
+ ),
+ 'viewport-width': (
+ property: width,
+ class: vw,
+ values: (
+ 100: 100vw
+ )
+ ),
+ 'min-viewport-width': (
+ property: min-width,
+ class: min-vw,
+ values: (
+ 100: 100vw
+ )
+ ),
+ 'height': (
+ property: height,
+ class: h,
+ values:
+ map-merge(
+ $sizes-px,
+ (
+ 25: 25%,
+ 50: 50%,
+ 75: 75%,
+ 100: 100%,
+ auto: auto
+ )
+ )
+ ),
+ 'max-height': (
+ property: max-height,
+ class: mh,
+ values: (
+ 100: 100%
+ )
+ ),
+ 'viewport-height': (
+ property: height,
+ class: vh,
+ values: (
+ 100: 100vh
+ )
+ ),
+ 'min-viewport-height': (
+ property: min-height,
+ class: min-vh,
+ values: (
+ 100: 100vh
+ )
+ ),
+ // scss-docs-end utils-sizing
+ // Flex utilities
+ // scss-docs-start utils-flex
+ 'flex':
+ (
+ responsive: true,
+ property: flex,
+ values: (
+ fill: 1 1 auto
+ )
+ ),
+ 'flex-direction': (
+ responsive: true,
+ property: flex-direction,
+ class: flex,
+ values: row column row-reverse column-reverse
+ ),
+ 'flex-grow': (
+ responsive: true,
+ property: flex-grow,
+ class: flex,
+ values: (
+ grow-0: 0,
+ grow-1: 1
+ )
+ ),
+ 'flex-shrink': (
+ responsive: true,
+ property: flex-shrink,
+ class: flex,
+ values: (
+ shrink-0: 0,
+ shrink-1: 1
+ )
+ ),
+ 'flex-wrap': (
+ responsive: true,
+ property: flex-wrap,
+ class: flex,
+ values: wrap nowrap wrap-reverse
+ ),
+ 'justify-content': (
+ responsive: true,
+ property: justify-content,
+ values: (
+ start: flex-start,
+ end: flex-end,
+ center: center,
+ between: space-between,
+ around: space-around,
+ evenly: space-evenly
+ )
+ ),
+ 'align-items': (
+ responsive: true,
+ property: align-items,
+ values: (
+ start: flex-start,
+ end: flex-end,
+ center: center,
+ baseline: baseline,
+ stretch: stretch
+ )
+ ),
+ 'align-content': (
+ responsive: true,
+ property: align-content,
+ values: (
+ start: flex-start,
+ end: flex-end,
+ center: center,
+ between: space-between,
+ around: space-around,
+ stretch: stretch
+ )
+ ),
+ 'align-self': (
+ responsive: true,
+ property: align-self,
+ values: (
+ auto: auto,
+ start: flex-start,
+ end: flex-end,
+ center: center,
+ baseline: baseline,
+ stretch: stretch
+ )
+ ),
+ 'order': (
+ responsive: true,
+ property: order,
+ values: (
+ first: -1,
+ 0: 0,
+ 1: 1,
+ 2: 2,
+ 3: 3,
+ 4: 4,
+ 5: 5,
+ last: 6
+ )
+ ),
+ // scss-docs-end utils-flex
+ // Margin utilities
+ // scss-docs-start utils-spacing
+ 'margin':
+ (
+ responsive: true,
+ property: margin,
+ class: m,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ 'margin-x': (
+ responsive: true,
+ property: margin-right margin-left,
+ class: mx,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ 'margin-y': (
+ responsive: true,
+ property: margin-top margin-bottom,
+ class: my,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ 'margin-top': (
+ responsive: true,
+ property: margin-top,
+ class: mt,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ 'margin-bottom': (
+ responsive: true,
+ property: margin-bottom,
+ class: mb,
+ values:
+ map-merge(
+ $spacers,
+ (
+ auto: auto
+ )
+ )
+ ),
+ // Negative margin utilities
+ 'negative-margin':
+ (
+ responsive: true,
+ property: margin,
+ class: m,
+ values: $negative-spacers
+ ),
+ 'negative-margin-x': (
+ responsive: true,
+ property: margin-right margin-left,
+ class: mx,
+ values: $negative-spacers
+ ),
+ 'negative-margin-y': (
+ responsive: true,
+ property: margin-top margin-bottom,
+ class: my,
+ values: $negative-spacers
+ ),
+ 'negative-margin-top': (
+ responsive: true,
+ property: margin-top,
+ class: mt,
+ values: $negative-spacers
+ ),
+ 'negative-margin-bottom': (
+ responsive: true,
+ property: margin-bottom,
+ class: mb,
+ values: $negative-spacers
+ ),
+ // Padding utilities
+ 'padding':
+ (
+ responsive: true,
+ property: padding,
+ class: p,
+ values: $spacers
+ ),
+ 'padding-x': (
+ responsive: true,
+ property: padding-right padding-left,
+ class: px,
+ values: $spacers
+ ),
+ 'padding-y': (
+ responsive: true,
+ property: padding-top padding-bottom,
+ class: py,
+ values: $spacers
+ ),
+ 'padding-top': (
+ responsive: true,
+ property: padding-top,
+ class: pt,
+ values: $spacers
+ ),
+ 'padding-bottom': (
+ responsive: true,
+ property: padding-bottom,
+ class: pb,
+ values: $spacers
+ ),
+ 'gap': (
+ responsive: true,
+ property: gap,
+ class: gap,
+ values: $spacers
+ ),
+ 'row-gap': (
+ responsive: true,
+ property: row-gap,
+ class: row-gap,
+ values: $spacers
+ ),
+ 'column-gap': (
+ responsive: true,
+ property: column-gap,
+ class: column-gap,
+ values: $spacers
+ ),
+ // scss-docs-end utils-spacing
+ // Text
+ // scss-docs-start utils-text
+ 'font-family':
+ (
+ property: font-family,
+ class: font,
+ values: (
+ monospace: var(--#{$variable-prefix}font-monospace)
+ )
+ ),
+ 'font-size': (
+ rfs: true,
+ property: font-size,
+ class: fs,
+ values:
+ map-merge(
+ $font-sizes,
+ (
+ tiny: $tiny-font-size,
+ //(C)
+ big: $big-font-size,
+ //(C)
+ large: $large-font-size,
+ //(C)
+ xlarge: $xlarge-font-size,
+ //(C)
+ )
+ )
+ ),
+ 'font-style': (
+ property: font-style,
+ class: fst,
+ values: italic normal
+ ),
+ 'font-weight': (
+ property: font-weight,
+ class: fw,
+ values: (
+ lighter: $font-weight-lighter,
+ light: $font-weight-light,
+ normal: $font-weight-normal,
+ medium: $font-weight-medium,
+ semibold: $font-weight-semibold,
+ bold: $font-weight-bold,
+ extrabold: $font-weight-extrabold,
+ bolder: $font-weight-bolder
+ )
+ ),
+ 'line-height': (
+ property: line-height,
+ class: lh,
+ values: (
+ 1: 1,
+ inherit: inherit,
+ //(C)
+ sm: $line-height-sm,
+ base: $line-height-base,
+ lg: $line-height-lg
+ )
+ ),
+ 'text-decoration': (
+ property: text-decoration,
+ values: none underline line-through
+ ),
+ 'text-transform': (
+ property: text-transform,
+ class: text,
+ values: none lowercase uppercase capitalize
+ ),
+ 'white-space': (
+ property: white-space,
+ class: text,
+ values: (
+ wrap: normal,
+ nowrap: nowrap
+ )
+ ),
+ 'word-wrap': (
+ property: word-wrap word-break,
+ class: text,
+ values: (
+ break: break-word
+ ),
+ rtl: false
+ ),
+ // scss-docs-end utils-text
+ // scss-docs-start utils-color
+ 'color':
+ (
+ property: color,
+ class: text,
+ local-vars: (
+ 'text-opacity': 1
+ ),
+ values:
+ map-merge(
+ $utilities-text-colors,
+ (
+ 'white': $white,
+ 'body': $body-color,
+ 'muted': $text-muted,
+ 'black-50': rgba($black, 0.5),
+ // deprecated
+ 'white-50': rgba($white, 0.5),
+ // deprecated
+ 'light': $text-light,
+ // (c)
+ 'heading': $headings-color,
+ // (c)
+ 'reset': inherit
+ )
+ )
+ ),
+ 'text-opacity': (
+ css-var: true,
+ class: text-opacity,
+ values: (
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1
+ )
+ ),
+ // scss-docs-end utils-color
+ // scss-docs-start utils-links
+ 'link-opacity':
+ (
+ css-var: true,
+ class: link-opacity,
+ state: hover,
+ values: (
+ 10: 0.1,
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1
+ )
+ ),
+ 'link-offset': (
+ property: text-underline-offset,
+ class: link-offset,
+ state: hover,
+ values: (
+ 1: 0.125em,
+ 2: 0.25em,
+ 3: 0.375em
+ )
+ ),
+ 'link-underline': (
+ property: text-decoration-color,
+ class: link-underline,
+ local-vars: (
+ 'link-underline-opacity': 1
+ ),
+ values:
+ map-merge(
+ $utilities-links-underline,
+ (
+ null: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-underline-opacity, 1))
+ )
+ )
+ ),
+ 'link-underline-opacity': (
+ css-var: true,
+ class: link-underline-opacity,
+ state: hover,
+ values: (
+ 0: 0,
+ 10: 0.1,
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1
+ )
+ ),
+ // scss-docs-end utils-links
+ // scss-docs-start utils-bg-color
+ 'background-color':
+ (
+ property: background-color,
+ class: bg,
+ local-vars: (
+ 'bg-opacity': 1
+ ),
+ values:
+ map-merge(
+ $utilities-bg-colors,
+ (
+ 'body': $body-bg,
+ 'white': $white,
+ 'transparent': transparent,
+ 'lighter': rgba-to-hex($gray-50, $rgba-to-hex-bg),
+ //(C)
+ 'lightest': rgba-to-hex($gray-25, $rgba-to-hex-bg),
+ //(C)
+ )
+ )
+ ),
+ 'bg-opacity': (
+ css-var: true,
+ class: bg-opacity,
+ values: (
+ 10: 0.1,
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1
+ )
+ ),
+ 'subtle-background-color': (
+ property: background-color,
+ class: bg,
+ values: $utilities-bg-subtle
+ ),
+ // scss-docs-end utils-bg-color
+ 'gradient':
+ (
+ property: background-image,
+ class: bg,
+ values: (
+ gradient: var(--#{$variable-prefix}gradient)
+ )
+ ),
+ // scss-docs-start utils-interaction
+ 'user-select':
+ (
+ property: user-select,
+ values: all auto none
+ ),
+ 'pointer-events': (
+ property: pointer-events,
+ class: pe,
+ values: none auto
+ ),
+ // scss-docs-end utils-interaction
+ // scss-docs-start utils-border-radius
+ 'rounded':
+ (
+ property: border-radius,
+ class: rounded,
+ values: (
+ null: $border-radius,
+ 0: 0,
+ 1: $border-radius-sm,
+ 2: $border-radius,
+ 3: $border-radius-lg,
+ circle: 50%,
+ pill: $border-radius-pill
+ )
+ ),
+ 'rounded-top': (
+ property: border-top-left-radius border-top-right-radius,
+ class: rounded-top,
+ values: (
+ null: $border-radius
+ )
+ ),
+ 'rounded-bottom': (
+ property: border-bottom-right-radius border-bottom-left-radius,
+ class: rounded-bottom,
+ values: (
+ null: $border-radius
+ )
+ ),
+ // scss-docs-end utils-border-radius
+ // scss-docs-start utils-visibility
+ 'visibility':
+ (
+ property: visibility,
+ class: null,
+ values: (
+ visible: visible,
+ invisible: hidden
+ )
+ ),
+ // scss-docs-end utils-visibility
+ // scss-docs-start utils-zindex
+ 'z-index':
+ (
+ property: z-index,
+ class: z,
+ values: $zindex-levels
+ ),
+ // scss-docs-end utils-zindex
+ // Custom Utilities
+ // *******************************************************************************
+ // scss-docs-start utils-flex-basis
+ 'cursor':
+ (
+ property: cursor,
+ class: cursor,
+ values: pointer move grab
+ ),
+ // scss-docs-end utils-flex-basis
+ ),
+ $utilities
+);
+
+// Borders
+// *******************************************************************************
+
+// Bordered rows
+.row-bordered {
+ overflow: hidden;
+
+ > .col,
+ > [class^='col-'],
+ > [class*=' col-'],
+ > [class^='col '],
+ > [class*=' col '],
+ > [class$=' col'],
+ > [class='col'] {
+ position: relative;
+ padding-top: 1px;
+
+ &::before {
+ content: '';
+ position: absolute;
+ right: 0;
+ bottom: -1px;
+ left: 0;
+ display: block;
+ height: 0;
+ border-top: 1px solid $bordered-row-border-color;
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: -1px;
+ display: block;
+ width: 0;
+ border-left: 1px solid $bordered-row-border-color;
+ }
+ }
+
+ &.row-border-light {
+ > .col,
+ > [class^='col-'],
+ > [class*=' col-'],
+ > [class^='col '],
+ > [class*=' col '],
+ > [class$=' col'],
+ > [class='col'] {
+ &::before,
+ &::after {
+ border-color: $gray-100;
+ }
+ }
+ }
+}
+
+@include rtl-only {
+ .row-bordered > .col::after,
+ .row-bordered > [class^='col-']::after,
+ .row-bordered > [class*=' col-']::after,
+ .row-bordered > [class^='col ']::after,
+ .row-bordered > [class*=' col ']::after,
+ .row-bordered > [class$=' col']::after,
+ .row-bordered > [class='col']::after {
+ left: auto;
+ right: -1px;
+ }
+}
+
+// Color
+// *******************************************************************************
+
+// Bg Label variant (Not able to include this in utils due to custom style)
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include bg-label-variant('.bg-label-#{$color}', $value);
+ }
+}
+// BG hover: label to solid variant
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include bg-label-hover-variant('.bg-label-hover-#{$color}', $value);
+ }
+}
+// Bg- Gradient variant
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include bg-gradient-variant('.bg-gradient-#{$color}', $value);
+ }
+}
+
+// ! FIX: .bg-dark & .bg-label-dark color in dark mode
+@if $dark-style {
+ .bg-dark {
+ color: color-contrast($dark);
+ }
+}
+
+// Anchor hover/focus bg colors
+a.bg-dark {
+ &:hover,
+ &:focus {
+ background-color: $gray-900 !important;
+ }
+}
+
+a.bg-light {
+ &:hover,
+ &:focus {
+ background-color: $gray-200 !important;
+ }
+}
+
+a.bg-lighter {
+ &:hover,
+ &:focus {
+ background-color: $gray-100 !important;
+ }
+}
+
+a.bg-lightest {
+ &:hover,
+ &:focus {
+ background-color: $gray-50 !important;
+ }
+}
+
+.text-muted[href] {
+ &:hover,
+ &:focus {
+ color: $text-muted-hover !important;
+ }
+}
+
+.text-light {
+ color: $text-light !important;
+
+ &[href] {
+ &:hover,
+ &:focus {
+ color: $text-muted-hover !important;
+ }
+ }
+}
+
+.text-lighter {
+ color: $text-lighter !important;
+
+ &[href] {
+ &:hover,
+ &:focus {
+ color: $text-muted-hover !important;
+ }
+ }
+}
+
+.text-lightest {
+ color: $text-lightest !important;
+
+ &[href] {
+ &:hover,
+ &:focus {
+ color: $text-muted-hover !important;
+ }
+ }
+}
+
+.text-paper {
+ color: $card-bg !important;
+
+ &[href] {
+ &:hover,
+ &:focus {
+ color: $primary !important;
+ }
+ }
+}
+
+// Invertible colors
+
+.invert-text-white {
+ color: if(not $dark-style, $white, $body-bg) !important;
+}
+.invert-text-white[href]:hover {
+ &:hover,
+ &:focus {
+ color: if(not $dark-style, $white, $body-bg) !important;
+ }
+}
+
+.invert-text-dark {
+ color: if(not $dark-style, $black, $white) !important;
+}
+.invert-text-dark[href]:hover {
+ &:hover,
+ &:focus {
+ color: if(not $dark-style, $black, $white) !important;
+ }
+}
+
+.invert-bg-white {
+ background-color: if(not $dark-style, $white, $body-bg) !important;
+}
+a.invert-bg-white {
+ &:hover,
+ &:focus {
+ background-color: if(not $dark-style, $white, $body-bg) !important;
+ }
+}
+
+.invert-bg-dark {
+ background-color: if(not $dark-style, $gray-900, $white) !important;
+}
+a.invert-bg-dark {
+ &:hover,
+ &:focus {
+ background-color: if(not $dark-style, $gray-900, $white) !important;
+ }
+}
+
+.invert-border-dark {
+ border-color: if(not $dark-style, $dark, $white) !important;
+}
+
+.invert-border-white {
+ border-color: if(not $dark-style, $white, $body-bg) !important;
+}
+
+// Misc
+// *******************************************************************************
+
+// Layout containers
+.container-p-x {
+ padding-right: $container-padding-x-sm !important;
+ padding-left: $container-padding-x-sm !important;
+
+ @include media-breakpoint-up(lg) {
+ padding-right: $container-padding-x !important;
+ padding-left: $container-padding-x !important;
+ }
+}
+
+.container-m-nx {
+ margin-right: -$container-padding-x-sm !important;
+ margin-left: -$container-padding-x-sm !important;
+
+ @include media-breakpoint-up(lg) {
+ margin-right: -$container-padding-x !important;
+ margin-left: -$container-padding-x !important;
+ }
+}
+
+.container-p-y {
+ &:not([class^='pt-']):not([class*=' pt-']) {
+ padding-top: $container-padding-y !important;
+ }
+
+ &:not([class^='pb-']):not([class*=' pb-']) {
+ padding-bottom: $container-padding-y !important;
+ }
+}
+
+.container-m-ny {
+ &:not([class^='mt-']):not([class*=' mt-']) {
+ margin-top: -$container-padding-y !important;
+ }
+
+ &:not([class^='mb-']):not([class*=' mb-']) {
+ margin-bottom: -$container-padding-y !important;
+ }
+}
+
+// Table cell
+.cell-fit {
+ width: 0.1%;
+ white-space: nowrap;
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_variables-dark.scss b/resources/assets/vendor/scss/_bootstrap-extended/_variables-dark.scss
new file mode 100644
index 0000000..079a183
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_variables-dark.scss
@@ -0,0 +1,236 @@
+// Variables
+//
+// Variables should follow the `$component-state-property-size` formula for
+// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
+//
+// (C) Custom variables for extended components of bootstrap only
+
+// ! _variable-dark.scss file overrides _variable.scss file.
+
+// * Colors
+// *******************************************************************************
+
+// scss-docs-start gray-color-variables
+$white: #fff !default;
+$black: #2f3349 !default;
+
+$base: #e1def5 !default;
+$gray-25: rgba($base, 0.025) !default; // (C)
+$gray-50: rgba($base, 0.06) !default; // (C)
+$gray-75: rgba($base, 0.08) !default; // (C)
+$gray-100: rgba($base, 0.1) !default;
+$gray-200: rgba($base, 0.12) !default;
+$gray-300: rgba($base, 0.3) !default;
+$gray-400: rgba($base, 0.4) !default;
+$gray-500: rgba($base, 0.5) !default;
+$gray-600: rgba($base, 0.6) !default;
+$gray-700: rgba($base, 0.7) !default;
+$gray-800: rgba($base, 0.8) !default;
+$gray-900: rgba($base, 0.9) !default;
+// scss-docs-end gray-color-variables
+
+// scss-docs-start gray-colors-map
+$grays: (
+ '25': $gray-25,
+ '50': $gray-50
+) !default;
+// scss-docs-end gray-colors-map
+
+// scss-docs-start color-variables
+$blue: #007bff !default;
+$indigo: #6610f2 !default;
+$purple: #7367f0 !default;
+$pink: #e83e8c !default;
+$red: #ff4c51 !default;
+$orange: #fd7e14 !default;
+$yellow: #ff9f43 !default;
+$green: #28c76f !default;
+$teal: #20c997 !default;
+$cyan: #00bad1 !default;
+// scss-docs-end color-variables
+
+// scss-docs-start theme-color-variables
+$primary: $purple !default;
+$secondary: #808390 !default;
+$success: $green !default;
+$info: $cyan !default;
+$warning: $yellow !default;
+$danger: $red !default;
+$light: #44475b !default;
+$dark: #d7d8de !default;
+$gray: $gray-500 !default; // (C)
+// scss-docs-end theme-color-variables
+
+// scss-docs-start theme-colors-map
+$theme-colors: (
+ 'primary': $primary,
+ 'secondary': $secondary,
+ 'success': $success,
+ 'info': $info,
+ 'warning': $warning,
+ 'danger': $danger,
+ 'light': $light,
+ 'dark': $dark,
+ 'gray': $gray
+) !default;
+// scss-docs-end theme-colors-map
+
+$color-scheme: 'dark' !default; // (C)
+
+// * Body
+// *******************************************************************************
+
+$body-bg: #25293c !default;
+$rgba-to-hex-bg: $black !default; // (C)
+$body-color: rgba-to-hex($gray-700, $rgba-to-hex-bg) !default;
+$rgba-to-hex-bg-inverted: rgb(160, 149, 149) !default; // (C)
+
+// * Components
+// *******************************************************************************
+
+$alert-border-scale: -84% !default;
+$alert-color-scale: 0% !default;
+
+$border-color: rgba-to-hex($gray-200, $rgba-to-hex-bg) !default;
+
+// scss-docs-start box-shadow-variables
+$shadow-bg: #131120 !default; // (C)
+$box-shadow: 0 0.1875rem 0.75rem 0 rgba($shadow-bg, 0.2) !default;
+$box-shadow-xs: 0 0.0625rem 0.375rem 0 rgba($shadow-bg, 0.16) !default;
+$box-shadow-sm: 0 0.125rem 0.5rem 0 rgba($shadow-bg, 0.18) !default;
+$box-shadow-lg: 0 0.25rem 1.125rem 0 rgba($shadow-bg, 0.22) !default;
+$box-shadow-xl: 0 0.3125rem 1.875rem 0 rgba($shadow-bg, 0.24) !default;
+// scss-docs-end box-shadow-variables
+
+$floating-component-border-color: rgba($white, 0.05) !default; // (C)
+$floating-component-shadow: 0 0.31rem 1.25rem 0 rgba($black, 0.4) !default; // (C)
+
+// * Typography
+// *******************************************************************************
+
+$text-muted: rgba-to-hex($gray-400, $rgba-to-hex-bg) !default;
+$text-muted-hover: rgba-to-hex($white, $rgba-to-hex-bg) !default; // (C)
+
+$text-light: rgba-to-hex($gray-500, $rgba-to-hex-bg) !default; // (C)
+$text-lighter: rgba-to-hex($gray-400, $rgba-to-hex-bg) !default; // (C)
+$text-lightest: rgba-to-hex($gray-300, $rgba-to-hex-bg) !default; // (C)
+
+$headings-color: rgba-to-hex($gray-900, $rgba-to-hex-bg) !default;
+
+// * Cards
+// *******************************************************************************
+
+$card-bg: #2f3349 !default;
+$card-subtitle-color: rgba-to-hex(rgba($base, 0.55), $rgba-to-hex-bg) !default;
+
+// * Tables
+// *******************************************************************************
+
+$table-bg-scale: -84% !default;
+$table-hover-bg-factor: 0.06 !default;
+$table-hover-bg: rgba($base, $table-hover-bg-factor) !default;
+
+$table-striped-bg-factor: 0.06 !default;
+$table-striped-bg: rgba-to-hex(rgba($base, $table-striped-bg-factor), $rgba-to-hex-bg) !default;
+
+$table-active-color: $body-color !default;
+$table-active-bg-factor: 0.08 !default;
+$table-active-bg: rgba($primary, $table-active-bg-factor) !default;
+
+$table-hover-bg-factor: 0.06 !default;
+$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;
+
+$table-border-color: $border-color !default;
+$table-group-separator-color: $table-border-color !default;
+
+// * Accordion
+// *******************************************************************************
+$accordion-bg: $card-bg !default;
+$accordion-border-color: $border-color !default;
+
+$accordion-button-color: $headings-color !default;
+
+// * Tooltips
+// *******************************************************************************
+$tooltip-bg: #f7f4ff !default;
+$tooltip-color: $black !default;
+
+// Buttons
+// *******************************************************************************
+
+$btn-box-shadow: 0px 2px 4px rgba(15, 20, 34, 0.4) !default;
+
+// * Forms
+// *******************************************************************************
+
+$input-bg: transparent !default;
+
+$input-disabled-border-color: rgba-to-hex(rgba($base, 0.23), $rgba-to-hex-bg) !default;
+
+$input-border-hover-color: rgba-to-hex($gray-600, $rgba-to-hex-bg) !default; // (C)
+
+$input-border-color: rgba-to-hex(rgba($base, 0.22), $rgba-to-hex-bg) !default;
+
+$form-select-bg: $input-bg !default;
+$form-select-indicator: url('data:image/svg+xml, ') !default;
+
+$form-range-thumb-bg: $primary !default;
+
+// * Navs
+// *******************************************************************************
+
+$nav-tabs-link-active-bg: $card-bg !default;
+$nav-tabs-link-active-border-color: $nav-tabs-link-active-bg !default;
+$nav-pills-link-hover-bg: rgba-to-hex(rgba($primary, 0.16), $card-bg) !default; // (C)
+
+// * Navbar
+// *******************************************************************************
+
+$navbar-light-hover-color: #4e5155 !default;
+$navbar-light-active-color: #4e5155 !default;
+$navbar-light-disabled-color: rgba($black, 0.2) !default;
+$navbar-dropdown-hover-bg: rgba-to-hex(rgba($base, 0.06), $rgba-to-hex-bg) !default; // (C)
+$navbar-dropdown-icon-bg: rgba-to-hex(rgba($base, 0.08), $rgba-to-hex-bg) !default; // (C)
+
+// * Dropdowns
+// *******************************************************************************
+
+$dropdown-bg: $card-bg !default;
+$dropdown-divider-bg: $border-color !default;
+
+$dropdown-link-hover-bg: $gray-50 !default;
+
+// * Pagination
+// *******************************************************************************
+
+$pagination-bg: $gray-75 !default;
+$pagination-border-color: rgba-to-hex(rgba($base, 0.22), $rgba-to-hex-bg) !default;
+$pagination-disabled-border-color: rgba-to-hex(rgba($base, 0.22), $rgba-to-hex-bg) !default;
+
+// * Modal
+// *******************************************************************************
+$modal-content-bg: $card-bg !default;
+$modal-backdrop-bg: #171925 !default;
+$modal-backdrop-opacity: 0.6 !default;
+
+// * Progress bars
+// *******************************************************************************
+$progress-bg: $gray-75 !default;
+
+// * List group
+// *******************************************************************************
+
+$list-group-border-color: $border-color !default;
+$list-group-item-bg-hover-scale: 6% !default; // (c)
+$list-group-active-bg: rgba-to-hex(rgba($primary, 0.16), $rgba-to-hex-bg) !default;
+$list-group-hover-bg: rgba-to-hex($gray-50, $rgba-to-hex-bg) !default;
+
+// * Close
+// *******************************************************************************
+$btn-close-color: $white !default;
+
+$kbd-color: $dark !default;
+
+// * Config
+$rtl-support: false !default;
+$dark-style: true !default;
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/_variables.scss b/resources/assets/vendor/scss/_bootstrap-extended/_variables.scss
new file mode 100644
index 0000000..7dc629d
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/_variables.scss
@@ -0,0 +1,1090 @@
+// Variables
+//
+// Variables should follow the `$component-state-property-size` formula for
+// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
+//
+// (C) Custom variables for extended components of bootstrap only
+
+// * Color system
+// *******************************************************************************
+
+// scss-docs-start gray-color-variables
+$white: #fff !default;
+$black: #2f2b3d !default;
+$gray-25: rgba($black, 0.015) !default; // (C)
+$gray-50: rgba($black, 0.06) !default; // (C)
+$gray-75: rgba($black, 0.08) !default; // (C)
+$gray-100: rgba($black, 0.1) !default;
+$gray-200: rgba($black, 0.12) !default;
+$gray-300: rgba($black, 0.3) !default;
+$gray-400: rgba($black, 0.4) !default;
+$gray-500: rgba($black, 0.5) !default;
+$gray-600: rgba($black, 0.6) !default;
+$gray-700: rgba($black, 0.7) !default;
+$gray-800: rgba($black, 0.8) !default;
+$gray-900: rgba($black, 0.9) !default;
+// scss-docs-end gray-color-variables
+
+// scss-docs-start gray-colors-map
+$grays: (
+ '25': $gray-25,
+ '50': $gray-50
+) !default;
+// scss-docs-end gray-colors-map
+
+// scss-docs-start color-variables
+$blue: #007bff !default;
+$indigo: #6610f2 !default;
+$purple: #7367f0 !default;
+$pink: #e83e8c !default;
+$red: #ff4c51 !default;
+$orange: #fd7e14 !default;
+$yellow: #ff9f43 !default;
+$green: #28c76f !default;
+$teal: #20c997 !default;
+$cyan: #00bad1 !default;
+// scss-docs-end color-variables
+
+// scss-docs-start theme-color-variables
+$primary: $purple !default;
+$secondary: #808390 !default;
+$success: $green !default;
+$info: $cyan !default;
+$warning: $yellow !default;
+$danger: $red !default;
+$light: #dfdfe3 !default;
+$dark: #4b4b4b !default;
+$gray: $gray-500 !default; // (C)
+// scss-docs-end theme-color-variables
+
+// scss-docs-start theme-colors-map
+$theme-colors: (
+ 'primary': $primary,
+ 'secondary': $secondary,
+ 'success': $success,
+ 'info': $info,
+ 'warning': $warning,
+ 'danger': $danger,
+ 'light': $light,
+ 'dark': $dark,
+ 'gray': $gray
+) !default;
+// scss-docs-end theme-colors-map
+
+$color-scheme: 'light' !default; // (C)
+// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.
+// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast
+$min-contrast-ratio: 1.7 !default;
+
+// Characters which are escaped by the escape-svg function
+$escaped-characters: (('<', '%3c'), ('>', '%3e'), ('#', '%23'), ('(', '%28'), (')', '%29')) !default;
+
+// * Options
+// *******************************************************************************
+
+$enable-negative-margins: true !default;
+$enable-validation-icons: false !default;
+$enable-dark-mode: false !default;
+
+// Prefix for :root CSS variables
+$variable-prefix: bs- !default;
+$prefix: $variable-prefix !default;
+
+// * Spacing
+// *******************************************************************************
+
+$spacer: 1rem !default;
+$spacers: (
+ 0: 0,
+ 50: $spacer * 0.125,
+ 1: $spacer * 0.25,
+ 1_5: $spacer * 0.375,
+ 2: $spacer * 0.5,
+ 3: $spacer * 0.75,
+ 4: $spacer,
+ 5: $spacer * 1.25,
+ 6: $spacer * 1.5,
+ 7: $spacer * 1.75,
+ 8: $spacer * 2,
+ 9: $spacer * 2.25,
+ 10: $spacer * 2.5,
+ 11: $spacer * 2.75,
+ 12: $spacer * 3
+) !default;
+
+$sizes-px: (
+ px-14: 14px,
+ px-18: 18px,
+ px-20: 20px,
+ px-30: 30px,
+ px-40: 40px,
+ px-50: 50px,
+ px-52: 52px,
+ px-75: 75px,
+ px-100: 100px,
+ px-120: 120px,
+ px-150: 150px,
+ px-200: 200px,
+ px-250: 250px,
+ px-300: 300px,
+ px-350: 350px,
+ px-400: 400px,
+ px-500: 500px,
+ px-600: 600px,
+ px-700: 700px,
+ px-800: 800px,
+ auto: auto
+) !default; // (C)
+
+// * Body
+// *******************************************************************************
+
+$body-bg: #f8f7fa !default;
+$rgba-to-hex-bg: #fff !default; // (C)
+$body-color: rgba-to-hex($gray-700, $rgba-to-hex-bg) !default;
+$rgba-to-hex-bg-inverted: #000 !default; // (C)
+
+// * Links
+// *******************************************************************************
+
+$link-color: $primary !default;
+$link-decoration: none !default;
+$link-shade-percentage: 10% !default;
+$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;
+$link-hover-decoration: null !default;
+
+// * Grid
+// *******************************************************************************
+
+// Grid containers
+
+// scss-docs-start container-max-widths
+$container-max-widths: (
+ sm: 540px,
+ md: 720px,
+ lg: 960px,
+ xl: 1140px,
+ xxl: 1440px // Custom xxl size
+) !default;
+// scss-docs-end container-max-widths
+
+$grid-gutter-width: 1.5rem !default;
+$container-padding-x: 1.5rem !default; // (C)
+$container-padding-x-sm: 1rem !default; // (C)
+$container-padding-y: 1.5rem !default; // (C)
+
+// * Components
+// *******************************************************************************
+
+// scss-docs-start border-variables
+$border-width: 1px !default;
+$border-color: rgba-to-hex($gray-200, $rgba-to-hex-bg) !default;
+// scss-docs-end border-variables
+
+// scss-docs-start border-radius-variables
+$border-radius: 0.375rem !default;
+$border-radius-xl: 0.625rem !default; // (C)
+$border-radius-lg: 0.5rem !default;
+$border-radius-sm: 0.25rem !default;
+$border-radius-xs: 0.125rem !default; // (C)
+$border-radius-pill: 50rem !default;
+// scss-docs-end border-radius-variables
+
+// scss-docs-start box-shadow-variables
+$box-shadow: 0 0.1875rem 0.75rem 0 rgba($black, 0.14) !default;
+$box-shadow-xs: 0 0.0625rem 0.375rem 0 rgba($black, 0.1) !default;
+$box-shadow-sm: 0 0.125rem 0.5rem 0 rgba($black, 0.12) !default;
+$box-shadow-lg: 0 0.25rem 1.125rem 0 rgba($black, 0.16) !default;
+$box-shadow-xl: 0 0.3125rem 1.875rem 0 rgba($black, 0.18) !default;
+// scss-docs-end box-shadow-variables
+
+$component-active-color: $white !default;
+$component-active-bg: $primary !default;
+
+$component-hover-color: $primary !default; // (C)
+$component-hover-bg: rgba($primary, 0.16) !default; // (C)
+
+$component-line-height: 1.54 !default; // (C)
+$component-focus-shadow-width: 2px !default; // (C)
+
+$floating-component-border-color: rgba($black, 0.05) !default; // (C)
+$floating-component-shadow: 0 0.31rem 1.25rem 0 $gray-400 !default; // (C) used for modal and range
+
+$hr-color: $border-color !default;
+$hr-opacity: 1 !default;
+$bordered-row-border-color: $hr-color !default; // (C)
+
+$focus-ring-width: 0.15rem !default;
+$focus-ring-opacity: 0.75 !default;
+$focus-ring-color: rgba($gray-700, $focus-ring-opacity) !default;
+
+// scss-docs-start caret-variables
+$caret-width: 0.55em !default;
+$caret-vertical-align: middle !default;
+$caret-spacing: 0.5em !default;
+// scss-docs-end caret-variables
+
+// * Typography
+// *******************************************************************************
+
+// scss-docs-start font-variables
+$font-family-sans-serif:
+ 'Public Sans',
+ -apple-system,
+ BlinkMacSystemFont,
+ 'Segoe UI',
+ 'Oxygen',
+ 'Ubuntu',
+ 'Cantarell',
+ 'Fira Sans',
+ 'Droid Sans',
+ 'Helvetica Neue',
+ sans-serif !default;
+$font-family-serif: Georgia, 'Times New Roman', serif !default; // (C)
+$font-family-monospace: 'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !default;
+// stylelint-enable value-keyword-case
+$font-family-base: var(--#{$variable-prefix}font-sans-serif) !default;
+$font-family-code: var(--#{$variable-prefix}font-monospace) !default;
+
+// $font-size-root effects the value of `rem`, which is used for as well font sizes, paddings and margins
+// $font-size-base effects the font size of the body text
+$font-size-root: 16px !default;
+$font-size-base: 0.9375rem !default; // Assumes the browser default, typically `16px`
+$font-size-xl: 1.1875rem !default; // (C)
+$font-size-lg: 1rem !default;
+$font-size-sm: 0.8125rem !default;
+$font-size-xs: 0.6875rem !default; // (C)
+
+$font-weight-lighter: lighter !default;
+$font-weight-light: 300 !default;
+$font-weight-normal: 400 !default;
+$font-weight-medium: 500 !default;
+$font-weight-semibold: 600 !default;
+$font-weight-bold: 700 !default;
+$font-weight-extrabold: 800 !default;
+$font-weight-bolder: bolder !default;
+
+$line-height-base: 1.375 !default;
+$line-height-xl: 1.75 !default; // (C)
+$line-height-lg: 1.625 !default;
+$line-height-sm: 1.125 !default;
+$line-height-xs: 1 !default; // (C)
+
+$h1-font-size: 2.875rem !default;
+$h2-font-size: 2.375rem !default;
+$h3-font-size: 1.75rem !default;
+$h4-font-size: 1.5rem !default;
+$h5-font-size: 1.125rem !default;
+$h6-font-size: $font-size-base !default;
+
+$h1-line-height: 4.25rem !default;
+$h2-line-height: 3.5rem !default;
+$h3-line-height: 2.625rem !default;
+$h4-line-height: 2.375rem !default;
+$h5-line-height: 1.75rem !default;
+$h6-line-height: 1.375rem !default;
+// scss-docs-end font-variables
+
+// scss-docs-start headings-variables
+$headings-margin-bottom: $spacer !default;
+$headings-font-weight: $font-weight-medium !default;
+$headings-line-height: 1.37 !default;
+$headings-color: rgba-to-hex($gray-900, $rgba-to-hex-bg) !default;
+// scss-docs-end headings-variables
+
+// scss-docs-start display-headings
+$display-font-sizes: (
+ 1: 4.75rem,
+ 2: 4.375rem,
+ 3: 3.875rem,
+ 4: 3.375rem,
+ 5: 3rem,
+ 6: 2.625rem
+) !default;
+
+$display-font-weight: 500 !default;
+
+// scss-docs-end display-headings
+
+// scss-docs-start type-variables
+
+$lead-font-size: $spacer * 1.125 !default;
+
+$tiny-font-size: 70% !default; // (C)
+$small-font-size: 0.8125rem !default;
+$big-font-size: 112% !default; // (C)
+$large-font-size: 150% !default; // (C)
+$xlarge-font-size: 170% !default; // (C)
+
+$text-muted: rgba-to-hex($gray-400, $rgba-to-hex-bg) !default;
+$text-muted-hover: rgba-to-hex($gray-600, $rgba-to-hex-bg) !default; // (C)
+
+$blockquote-font-size: $font-size-base !default;
+
+$text-light: rgba-to-hex($gray-400, $rgba-to-hex-bg) !default; // (C)
+$text-lighter: rgba-to-hex($gray-300, $rgba-to-hex-bg) !default; // (C)
+$text-lightest: rgba-to-hex($gray-200, $rgba-to-hex-bg) !default; // (C)
+
+$dt-font-weight: $font-weight-medium !default;
+// scss-docs-end type-variables
+
+// * Z-index master list
+// *******************************************************************************
+
+$zindex-menu-fixed: 1080 !default;
+$zindex-modal: 1090 !default;
+$zindex-modal-backdrop: $zindex-modal - 1 !default;
+// $zindex-modal-top: 1090 !default; // (C)
+$zindex-offcanvas: 1090 !default;
+$zindex-offcanvas-backdrop: $zindex-offcanvas - 1 !default;
+$zindex-layout-mobile: 1100 !default; // (C)
+$zindex-popover: 1091 !default;
+$zindex-toast: 1095 !default; // (C)
+$zindex-tooltip: 1099 !default;
+$zindex-notification: 999999 !default; // (C)
+
+// scss-docs-start zindex-levels-map
+$zindex-levels: (
+ n1: -1,
+ 0: 0,
+ 1: 1,
+ 2: 2,
+ 3: 3,
+ 4: 4,
+ 5: 5
+) !default;
+// scss-docs-end zindex-levels-map
+
+// * Tables
+// *******************************************************************************
+
+// scss-docs-start table-variables
+$table-head-padding-y: 1.161rem !default; // (C)
+$table-head-padding-y-sm: 1.114rem !default; // (C)
+$table-cell-padding-y: 0.782rem !default;
+$table-cell-padding-x: 1.25rem !default;
+$table-cell-padding-y-sm: 0.594rem !default;
+$table-cell-padding-x-sm: $table-cell-padding-x !default;
+
+$table-cell-vertical-align: middle !default;
+
+$table-th-color: $headings-color !default; // (C)
+$table-color: var(--#{$prefix}body-color) !default;
+$table-bg: transparent !default;
+
+$table-th-font-weight: $font-weight-medium !default;
+
+$table-striped-bg-factor: 0.06 !default;
+$table-striped-bg: rgba-to-hex(rgba($black, $table-striped-bg-factor), $rgba-to-hex-bg) !default;
+
+$table-active-color: $body-color !default;
+$table-active-bg-factor: 0.08 !default;
+$table-active-bg: rgba($primary, $table-active-bg-factor) !default;
+
+$table-hover-bg-factor: 0.06 !default;
+$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;
+
+$table-border-factor: 0.12 !default;
+$table-border-color: rgba-to-hex(rgba($black, $table-border-factor), $rgba-to-hex-bg) !default;
+
+$table-striped-order: even !default;
+
+$table-group-separator-color: $table-border-color !default;
+
+$table-caption-color: $text-muted !default;
+
+$table-bg-scale: -84% !default;
+
+// scss-docs-start table-loop
+$table-variants: (
+ 'primary': shift-color($primary, $table-bg-scale),
+ 'secondary': shift-color($secondary, $table-bg-scale),
+ 'success': shift-color($success, $table-bg-scale),
+ 'info': shift-color($info, $table-bg-scale),
+ 'warning': shift-color($warning, $table-bg-scale),
+ 'danger': shift-color($danger, $table-bg-scale),
+ 'light': rgba-to-hex($gray-100, $rgba-to-hex-bg),
+ 'dark': $dark
+) !default;
+// scss-docs-end table-loop
+// * Buttons + Forms
+// *******************************************************************************
+
+$input-btn-padding-y: 0.6rem !default;
+$input-btn-padding-x: 1.25rem !default;
+$input-btn-font-size: $font-size-base !default;
+$input-btn-line-height: $line-height-base !default;
+
+$input-btn-focus-width: 0.05rem !default;
+$input-btn-focus-color-opacity: 0.1 !default;
+$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;
+$input-btn-focus-blur: 0.25rem !default;
+$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;
+
+$input-btn-padding-y-xs: 0.175rem !default; // (C)
+$input-btn-padding-x-xs: 0.75rem !default; // (C)
+$input-btn-font-size-xs: $font-size-xs !default; // (C)
+$input-btn-line-height-xs: $line-height-xs !default; // (C)
+
+$input-btn-padding-y-sm: 0.41rem !default;
+$input-btn-padding-x-sm: 0.875rem !default;
+$input-btn-font-size-sm: 0.8125rem !default;
+$input-btn-line-height-sm: $line-height-sm !default;
+
+$input-btn-padding-y-lg: 0.84rem !default;
+$input-btn-padding-x-lg: 1.625rem !default;
+$input-btn-font-size-lg: 1.0625rem !default;
+$input-btn-line-height-lg: $line-height-lg !default;
+
+$input-btn-padding-y-xl: 0.875rem !default; // (C)
+$input-btn-padding-x-xl: 1.75rem !default; // (C)
+$input-btn-font-size-xl: $font-size-xl !default; // (C)
+$input-btn-line-height-xl: $line-height-lg !default; // (C)
+
+// * Buttons
+// *******************************************************************************
+
+$btn-padding-y: 0.4812rem !default;
+$btn-padding-x: 1.25rem !default;
+
+$btn-padding-y-sm: 0.317rem !default;
+$btn-padding-x-sm: 0.875rem !default;
+
+$btn-padding-y-lg: 0.708rem !default;
+$btn-padding-x-lg: 1.625rem !default;
+
+$btn-padding-y-xs: 0.153rem !default; // (C)
+$btn-padding-x-xs: $input-btn-padding-x-xs !default; // (C)
+$btn-font-size-xs: $font-size-xs !default; // (C)
+
+$btn-padding-y-xl: 0.809rem !default; // (C)
+$btn-padding-x-xl: 1.75rem !default; // (C)
+$btn-font-size-xl: $font-size-xl !default; // (C)
+
+$btn-line-height-xs: $line-height-base !default; // (C)
+$btn-line-height-sm: $line-height-base !default; // (C)
+$btn-line-height-lg: $line-height-base !default; // (C)
+$btn-line-height-xl: $line-height-base !default; // (C)
+
+$btn-font-weight: 500 !default;
+$btn-box-shadow: none !default;
+$btn-focus-box-shadow: none !default;
+$btn-disabled-opacity: 0.45 !default;
+$btn-active-box-shadow: none !default;
+
+$btn-border-radius-xs: $border-radius-xs !default; // (C)
+$btn-border-radius-xl: $border-radius-xl !default; // (C)
+
+$btn-transition: all 0.2s ease-in-out !default;
+
+$btn-label-bg-shade-amount: 84% !default; // (C)
+$btn-label-bg-tint-amount: 84% !default; // (C)
+$btn-label-hover-shade-amount: 76% !default; // (C)
+$btn-label-hover-tint-amount: 76% !default; // (C)
+$btn-label-disabled-bg-shade-amount: 84% !default; // (C)
+$btn-label-disabled-bg-tint-amount: 85% !default; // (C)
+$btn-label-border-tint-amount: 68% !default; // (C)
+$btn-label-border-shade-amount: 68% !default; // (C)
+
+$btn-hover-bg-shade-amount: 10% !default;
+$btn-hover-bg-tint-amount: 25% !default;
+$btn-hover-border-shade-amount: 10% !default;
+$btn-hover-border-tint-amount: 10% !default;
+$btn-active-bg-shade-amount: 10% !default;
+$btn-active-bg-tint-amount: 20% !default;
+$btn-active-border-shade-amount: 10% !default;
+$btn-active-border-tint-amount: 10% !default;
+
+// Outline buttons
+$btn-outline-hover-bg-shade-amount: 8% !default; // (C)
+$btn-outline-hover-bg-tint-amount: 92% !default; // (C)
+$btn-outline-active-bg-shade-amount: 8% !default; // (C)
+$btn-outline-active-bg-tint-amount: 92% !default; // (C)
+
+// text buttons
+$btn-text-hover-shade-amount: 8% !default; // (C)
+$btn-text-hover-tint-amount: 92% !default; // (C)
+$btn-text-focus-shade-amount: 8% !default; // (C)
+$btn-text-focus-tint-amount: 92% !default; // (C)
+$btn-text-active-shade-amount: 8% !default; // (C)
+$btn-text-active-tint-amount: 92% !default; // (C)
+
+// * Forms
+// *******************************************************************************
+
+// scss-docs-start form-text-variables
+$form-text-font-size: $input-btn-font-size-sm !default;
+$form-text-color: $body-color !default;
+// scss-docs-end form-text-variables
+
+// scss-docs-start form-label-variables
+$form-label-margin-bottom: 0.25rem !default;
+$form-label-font-size: $input-btn-font-size-sm !default;
+$form-label-color: $headings-color !default;
+$form-label-letter-spacing: inherit !default; //(C)
+$form-label-text-transform: inherit !default; //(C)
+// scss-docs-end form-label-variables
+
+// scss-docs-start form-input-variables
+$input-padding-y: 0.426rem !default;
+$input-padding-x: 0.9375rem !default;
+$input-line-height: $line-height-lg !default;
+$input-font-size: $input-btn-font-size !default;
+
+$input-padding-y-sm: 0.215rem !default;
+$input-padding-x-sm: 0.75rem !default;
+
+$input-padding-y-lg: 0.575rem !default;
+$input-padding-x-lg: $spacer !default;
+$input-font-size-lg: 1.0625rem !default;
+
+$input-bg: transparent !default;
+$input-disabled-color: $text-muted !default;
+$input-disabled-bg: rgba-to-hex($gray-50, $rgba-to-hex-bg) !default;
+$input-disabled-border-color: rgba-to-hex(rgba($black, 0.24), $rgba-to-hex-bg) !default;
+
+$input-color: $headings-color !default;
+$input-border-color: rgba-to-hex(rgba($black, 0.22), $rgba-to-hex-bg) !default;
+$input-border-hover-color: rgba-to-hex($gray-600, $rgba-to-hex-bg) !default; // (C)
+
+$input-focus-border-width: 2px !default; //(C)
+$input-focus-border-color: $component-active-bg !default;
+$input-focus-box-shadow: 0 2px 6px 0 rgba($component-active-bg, 0.3) !default;
+
+$input-placeholder-color: $text-muted !default;
+$input-plaintext-color: $headings-color !default;
+
+$input-height-inner: px-to-rem(
+ floor(rem-to-px(($input-btn-font-size * $input-btn-line-height) + ($input-btn-padding-y * 2)))
+) !default;
+$input-height-inner-sm: px-to-rem(
+ floor(rem-to-px(($input-btn-font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2)))
+) !default; // (C)
+$input-height-inner-lg: px-to-rem(
+ floor(rem-to-px(($font-size-lg * $line-height-lg) + ($input-btn-padding-y-lg * 2)))
+) !default; // (C)
+// scss-docs-end form-input-variables
+
+// scss-docs-start form-check-variables
+$form-check-input-width: 1.2em !default;
+$form-datatables-check-input-size: 18px !default; // (C) For datatables with checkbox- update according to $form-check-input-width
+$form-check-min-height: $font-size-base * $line-height-base * 1.067 !default;
+$form-check-padding-start: $form-check-input-width + 0.6em !default;
+$form-check-margin-bottom: 0.5rem !default;
+$form-check-input-border: $input-focus-border-width solid $text-muted !default;
+$form-check-label-color: $headings-color !default;
+$form-check-input-focus-box-shadow: none !default;
+
+$form-check-label-cursor: pointer !default;
+
+$form-check-input-border-radius: 0.267em !default;
+$form-check-input-focus-border: $body-color !default;
+$form-check-input-checked-color: $component-active-color !default;
+$form-check-input-checked-bg-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='15' height='17' viewBox='0 0 15 14' fill='none'%3E%3Cpath d='M3.41667 7L6.33333 9.91667L12.1667 4.08333' stroke='#{$form-check-input-checked-color}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !default;
+
+$form-check-radio-checked-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='1.6' fill='#{$form-check-input-checked-color}' /%3e%3c/svg%3e") !default;
+
+$form-check-input-indeterminate-color: $component-active-color !default;
+$form-check-input-indeterminate-bg-image: url("data:image/svg+xml, ") !default;
+
+$form-check-input-disabled-opacity: 0.45 !default;
+$form-check-input-disabled-bg: rgba-to-hex($gray-300, $rgba-to-hex-bg) !default; // (C)
+$form-check-label-disabled-color: $text-muted !default; // (C)
+
+// scss-docs-end form-check-variables
+
+// scss-docs-start form-switch-variables
+$form-switch-color: $component-active-color !default;
+$form-switch-width: 2em !default;
+$form-switch-padding-start: $form-switch-width + 0.667em !default;
+$form-switch-focus-color: $component-active-color;
+$form-switch-bg-image: url("data:image/svg+xml,%3csvg width='22' height='22' viewBox='0 0 22 22' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cg filter='url(%23a)'%3e%3ccircle cx='12' cy='11' r='8.5' fill='#{$form-switch-color}'/%3e%3c/g%3e%3cdefs%3e%3cfilter id='a' x='0' y='0' width='22' height='22' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3e%3cfeFlood flood-opacity='0' result='BackgroundImageFix'/%3e%3cfeColorMatrix in='SourceAlpha' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3e%3cfeOffset dy='2'/%3e%3cfeGaussianBlur stdDeviation='2'/%3e%3cfeColorMatrix values='0 0 0 0 0.180392 0 0 0 0 0.14902 0 0 0 0 0.239216 0 0 0 0.16 0'/%3e%3cfeBlend in2='BackgroundImageFix' result='effect1_dropShadow_6488_3264'/%3e%3cfeBlend in='SourceGraphic' in2='effect1_dropShadow_6488_3264' result='shape'/%3e%3c/filter%3e%3c/defs%3e%3c/svg%3e") !default;
+
+$form-switch-focus-bg-image: url("data:image/svg+xml,%3csvg width='22' height='22' viewBox='0 0 22 22' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cg filter='url(%23a)'%3e%3ccircle cx='12' cy='11' r='8.5' fill='#{$form-switch-color}'/%3e%3c/g%3e%3cdefs%3e%3cfilter id='a' x='0' y='0' width='22' height='22' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3e%3cfeFlood flood-opacity='0' result='BackgroundImageFix'/%3e%3cfeColorMatrix in='SourceAlpha' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3e%3cfeOffset dy='2'/%3e%3cfeGaussianBlur stdDeviation='2'/%3e%3cfeColorMatrix values='0 0 0 0 0.180392 0 0 0 0 0.14902 0 0 0 0 0.239216 0 0 0 0.16 0'/%3e%3cfeBlend in2='BackgroundImageFix' result='effect1_dropShadow_6488_3264'/%3e%3cfeBlend in='SourceGraphic' in2='effect1_dropShadow_6488_3264' result='shape'/%3e%3c/filter%3e%3c/defs%3e%3c/svg%3e") !default;
+$form-switch-checked-bg-image: url("data:image/svg+xml,%3csvg width='22' height='22' viewBox='0 0 22 22' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cg filter='url(%23a)'%3e%3ccircle cx='12' cy='11' r='8.5' fill='#{$form-switch-color}'/%3e%3c/g%3e%3cdefs%3e%3cfilter id='a' x='0' y='0' width='22' height='22' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3e%3cfeFlood flood-opacity='0' result='BackgroundImageFix'/%3e%3cfeColorMatrix in='SourceAlpha' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3e%3cfeOffset dy='2'/%3e%3cfeGaussianBlur stdDeviation='2'/%3e%3cfeColorMatrix values='0 0 0 0 0.180392 0 0 0 0 0.14902 0 0 0 0 0.239216 0 0 0 0.16 0'/%3e%3cfeBlend in2='BackgroundImageFix' result='effect1_dropShadow_6488_3264'/%3e%3cfeBlend in='SourceGraphic' in2='effect1_dropShadow_6488_3264' result='shape'/%3e%3c/filter%3e%3c/defs%3e%3c/svg%3e") !default;
+$form-switch-checked-bg-position: 95% center !default;
+$form-switch-checked-bg-position-rtl: 4% center !default; // (C)
+$form-switch-bg: rgba-to-hex($gray-100, $rgba-to-hex-bg) !default; // (C)
+$form-switch-box-shadow: 0 0 0.25rem 0 rgba(0, 0, 0, 0.16) inset !default; // (C)
+// scss-docs-end form-switch-variables
+
+//input-group-variables
+$input-group-addon-color: $headings-color !default;
+$input-group-addon-bg: $input-bg !default;
+// scss-docs-end input-group-variables
+
+// scss-docs-start form-select-variables
+$form-select-padding-y: $input-padding-y !default;
+$form-select-padding-x: $input-padding-x !default;
+$form-select-indicator-padding: $form-select-padding-x * 2.8 !default;
+$form-select-disabled-color: $text-muted !default;
+$form-select-disabled-bg: $input-disabled-bg !default;
+$form-select-bg-size: 22px 24px !default;
+$form-select-indicator: url('data:image/svg+xml, ') !default;
+$form-select-disabled-indicator: url('data:image/svg+xml, ') !default; // (C)
+$form-select-indicator-rtl: escape-svg($form-select-indicator) !default; // (C)
+
+$form-select-focus-box-shadow: $input-focus-box-shadow !default;
+
+$form-select-padding-y-sm: $input-padding-y-sm !default;
+$form-select-padding-x-sm: $input-padding-x-sm !default;
+
+$form-select-padding-y-lg: $input-padding-y-lg !default;
+$form-select-padding-x-lg: $input-padding-x-lg !default;
+// scss-docs-end form-select-variables
+
+// scss-docs-start form-range-variables
+$form-range-track-height: 0.375rem !default;
+$form-range-track-box-shadow: none !default;
+$form-range-track-disabled-bg: rgba-to-hex($gray-400, $rgba-to-hex-bg) !default; // (C)
+$form-range-thumb-width: 1.375rem !default;
+$form-range-thumb-height: $form-range-thumb-width !default;
+$form-range-thumb-box-shadow: $box-shadow-sm !default;
+$form-range-thumb-bg: $primary !default;
+$form-range-thumb-active-bg: $primary !default;
+$form-range-thumb-disabled-bg: rgba-to-hex($gray-400, $rgba-to-hex-bg) !default;
+// scss-docs-end form-range-variables
+
+// scss-docs-start form-file-variables
+$form-file-button-bg: $input-group-addon-bg !default;
+$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;
+// scss-docs-end form-file-variables
+
+// scss-docs-start form-floating-variables
+$form-floating-label-opacity: 0.75 !default;
+$form-floating-transition:
+ opacity 0.2s ease-in-out,
+ transform 0.2s ease-in-out !default;
+$form-floating-label-transform-rtl: scale(0.85) translateY(-0.5rem) translateX(-0.15rem) !default; // (C)
+// scss-docs-end form-floating-variables
+
+// Form validation
+
+// scss-docs-start form-feedback-variables
+$form-feedback-valid-color: $success !default;
+$form-feedback-invalid-color: $danger !default;
+
+$form-select-feedback-icon-padding: $form-select-indicator-padding + $input-height-inner !default; // (C)
+$form-select-feedback-icon-padding-sm: $form-select-indicator-padding + $input-height-inner-sm !default; // (C)
+$form-select-feedback-icon-padding-lg: $form-select-indicator-padding + $input-height-inner-lg !default; // (C)
+// scss-docs-end form-feedback-variables
+
+// * Navs
+// *******************************************************************************
+
+$nav-spacer: 0.25rem !default; // (C)
+
+$nav-link-padding-y: 0.5435rem !default;
+$nav-link-padding-x: 1.375rem !default;
+$nav-link-font-size: $font-size-base !default;
+$nav-link-font-weight: $font-weight-medium !default;
+$nav-link-color: $headings-color !default;
+$nav-link-disabled-color: $text-lighter !default;
+$nav-link-line-height: $line-height-base !default; // (C)
+
+$nav-link-padding-y-lg: 0.6rem !default; // (C)
+$nav-link-padding-x-lg: 1.5rem !default; // (C)
+$nav-link-line-height-lg: $line-height-lg !default; // (C)
+
+$nav-link-padding-y-sm: 0.376rem !default; // (C)
+$nav-link-padding-x-sm: 1rem !default; // (C)
+$nav-link-line-height-sm: $line-height-sm !default; // (C)
+
+$nav-tabs-border-color: $border-color !default;
+$nav-tabs-border-width: 0 !default;
+// $nav-tabs-link-hover-border-color: null !default;
+$nav-tabs-link-active-color: $component-active-bg !default;
+$nav-tabs-link-active-bg: $white !default;
+$nav-tabs-link-active-border-color: $component-active-bg !default;
+
+$nav-pills-padding-y: $nav-link-padding-y !default; // (C)
+$nav-pills-padding-x: $nav-link-padding-x !default; // (C)
+
+$nav-pills-link-hover-bg: rgba-to-hex(rgba($primary, 0.16), $rgba-to-hex-bg) !default; // (C)
+
+$nav-pills-link-active-color: $white !default;
+$nav-pills-link-active-bg: transparent !default;
+
+// * Navbar
+// *******************************************************************************
+
+$navbar-toggler-padding-y: 0.5rem !default;
+$navbar-toggler-padding-x: 0.7rem !default;
+$navbar-toggler-font-size: 0.625rem !default;
+
+$navbar-dark-color: rgba($white, 0.8) !default;
+$navbar-dark-hover-color: $white !default;
+$navbar-dark-active-color: $white !default;
+$navbar-dark-disabled-color: rgba($white, 0.4) !default;
+$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,%3Csvg width='14px' height='11px' viewBox='0 0 14 11' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M0,0 L14,0 L14,1.75 L0,1.75 L0,0 Z M0,4.375 L14,4.375 L14,6.125 L0,6.125 L0,4.375 Z M0,8.75 L14,8.75 L14,10.5 L0,10.5 L0,8.75 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='💎-UI-Elements' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='12)-Navbar' transform='translate(-1174.000000, -1290.000000)'%3E%3Cg id='Group' transform='translate(1174.000000, 1288.000000)'%3E%3Cg id='Icon-Color' transform='translate(0.000000, 2.000000)'%3E%3Cuse fill='#{$navbar-dark-color}' xlink:href='%23path-1'%3E%3C/use%3E%3Cuse fill-opacity='0.1' fill='#{$navbar-dark-color}' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E") !default;
+
+$navbar-light-color: $gray-500 !default;
+$navbar-light-hover-color: $body-color !default;
+$navbar-light-active-color: $body-color !default;
+$navbar-light-disabled-color: $gray-300 !default;
+$navbar-light-toggler-icon-bg: url("data:image/svg+xml,%3Csvg width='14px' height='11px' viewBox='0 0 14 11' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M0,0 L14,0 L14,1.75 L0,1.75 L0,0 Z M0,4.375 L14,4.375 L14,6.125 L0,6.125 L0,4.375 Z M0,8.75 L14,8.75 L14,10.5 L0,10.5 L0,8.75 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='💎-UI-Elements' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='12)-Navbar' transform='translate(-1174.000000, -1290.000000)'%3E%3Cg id='Group' transform='translate(1174.000000, 1288.000000)'%3E%3Cg id='Icon-Color' transform='translate(0.000000, 2.000000)'%3E%3Cuse fill='#{$navbar-light-color}' xlink:href='%23path-1'%3E%3C/use%3E%3Cuse fill-opacity='0.1' fill='#{$navbar-light-color}' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E") !default;
+
+$navbar-light-toggler-border-color: rgba($black, 0.06) !default;
+$navbar-dropdown-hover-bg: rgba-to-hex(rgba($black, 0.06), $rgba-to-hex-bg) !default; // (C)
+$navbar-dropdown-icon-bg: rgba-to-hex(rgba($black, 0.08), $rgba-to-hex-bg) !default; // (C)
+
+// * Dropdowns
+// *******************************************************************************
+
+$dropdown-padding-x: 0.5rem !default;
+$dropdown-bg: $white !default;
+$dropdown-border-color: $border-color !default;
+$dropdown-border-width: 0 !default;
+$dropdown-box-shadow: $box-shadow-lg !default;
+
+$dropdown-inner-border-radius: 0px !default;
+
+$dropdown-link-color: $headings-color !default;
+$dropdown-link-hover-bg: rgba-to-hex($gray-50, $rgba-to-hex-bg) !default;
+$dropdown-link-line-height: $line-height-base !default; // (C)
+
+$dropdown-link-active-color: $primary !default;
+$dropdown-link-active-bg: rgba-to-hex(rgba($primary, 0.16), $rgba-to-hex-bg) !default;
+
+$dropdown-item-padding-y: 0.543rem !default;
+$dropdown-item-padding-x: 1rem !default;
+
+$dropdown-link-disabled-color: $text-muted !default;
+$dropdown-header-color: $text-muted !default;
+
+// * Pagination
+// *******************************************************************************
+
+$pagination-padding-y: 0.4809rem !default;
+$pagination-padding-x: 0.5rem !default;
+$pagination-padding-y-sm: 0.3165rem !default;
+$pagination-padding-x-sm: 0.269rem !default;
+$pagination-padding-y-lg: 0.681rem !default;
+$pagination-padding-x-lg: 0.9826rem !default;
+
+$pagination-font-size: $font-size-base !default;
+
+$pagination-line-height: $line-height-base !default; // (c)
+
+$pagination-color: $headings-color !default;
+$pagination-bg: $gray-75 !default;
+$pagination-border-radius: 50% !default;
+$pagination-border-width: $border-width !default;
+$pagination-margin-start: 0.375rem !default;
+$pagination-border-color: rgba-to-hex(rgba($black, 0.22), $rgba-to-hex-bg) !default;
+
+$pagination-focus-color: $pagination-color !default;
+$pagination-focus-bg: rgba-to-hex($gray-50, $rgba-to-hex-bg) !default;
+$pagination-focus-box-shadow: none !default;
+
+$pagination-hover-color: $pagination-color !default;
+$pagination-hover-bg: $pagination-focus-bg !default;
+$pagination-hover-border-color: $pagination-border-color !default;
+$pagination-hover-bg-scale: 84% !default; // (c)
+
+$pagination-active-color: $component-active-color !default;
+$pagination-active-bg: $primary !default;
+$pagination-active-border-color: $pagination-active-bg !default;
+
+$pagination-disabled-color: $text-muted !default;
+$pagination-disabled-bg: $pagination-bg !default;
+$pagination-disabled-border-color: $pagination-border-color !default;
+$pagination-disabled-opacity: $btn-disabled-opacity !default; // (c)
+
+$pagination-border-radius-sm: $pagination-border-radius !default;
+$pagination-border-radius-lg: $pagination-border-radius-sm !default;
+
+// * Cards
+// *******************************************************************************
+
+$card-title-color: $headings-color !default;
+$card-spacer-y: $spacer * 1.5 !default;
+$card-spacer-x: $spacer * 1.5 !default;
+$card-title-spacer-y: $spacer * 0.5 !default;
+$card-subtitle-color: rgba-to-hex(rgba($black, 0.55), $rgba-to-hex-bg) !default;
+$card-spacer-x-sm: 1rem !default; // (C)
+$card-border-width: 0 !default;
+$card-border-color: $border-color !default;
+$card-border-radius: 0.375rem !default;
+$card-inner-border-color: $border-color !default; // (C)
+$card-cap-padding-y: $card-spacer-y !default;
+$card-bg: $white !default;
+$card-cap-bg: transparent !default;
+$card-cap-color: $headings-color !default;
+$card-img-overlay-padding: 1.5rem !default;
+$card-box-shadow: $box-shadow !default;
+$card-group-margin: $grid-gutter-width !default;
+$card-transition: all 0.2s ease-in-out !default; // (C)
+$card-border-color-scale: 61% !default; // (C)
+$card-hover-border-scale: 62% !default; // (C)
+$card-inner-border-radius: $border-radius !default;
+
+// * Accordion
+// *******************************************************************************
+
+$accordion-padding-y: 0.793rem !default;
+$accordion-padding-x: 1.25rem !default;
+$accordion-color: $body-color !default;
+$accordion-bg: $card-bg !default;
+$accordion-border-radius: $border-radius !default;
+$accordion-border-color: $border-color !default;
+$accordion-inner-border-radius: $accordion-border-radius !default;
+$accordion-button-color: $headings-color !default;
+
+$accordion-border-color: $card-bg !default;
+$accordion-button-active-bg: $accordion-bg !default;
+$accordion-button-active-color: $accordion-button-color !default;
+
+$accordion-icon-width: 1.25rem !default;
+$accordion-icon-color: $accordion-button-color !default;
+$accordion-icon-active-color: $accordion-button-active-color !default;
+
+$accordion-icon-transform: rotate(0deg) !default;
+
+$accordion-button-icon: url("data:image/svg+xml,%3csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5 7.5L10 12.5L15 7.5' stroke='#{$accordion-icon-active-color}' stroke-opacity='0.9' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e") !default;
+$accordion-button-active-icon: $accordion-button-icon !default;
+
+$accordion-custom-button-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$accordion-icon-active-color}' viewBox='0 0 24 24'%3E%3Cpath d='M19 11h-6V5h-2v6H5v2h6v6h2v-6h6z'%3E%3C/path%3E%3C/svg%3E") !default;
+$accordion-custom-button-active-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$accordion-icon-active-color}' viewBox='0 0 24 24'%3E%3Cpath d='M5 11h14v2H5z'%3E%3C/path%3E%3C/svg%3E") !default;
+
+// * Tooltips
+// *******************************************************************************
+$tooltip-font-size: $font-size-sm !default;
+$tooltip-bg: #2f2b3d !default;
+$tooltip-color: $white !default;
+$tooltip-border-radius: $border-radius-sm !default;
+$tooltip-opacity: 1 !default;
+$tooltip-padding-y: $spacer * 0.278 !default;
+$tooltip-padding-x: $spacer * 0.75 !default;
+
+$tooltip-arrow-height: 0.375rem !default;
+$tooltip-arrow-width: 0.75rem !default;
+
+$tooltip-box-shadow: none !default; // (C)
+
+// * Popovers
+// *******************************************************************************
+$popover-font-size: $font-size-base !default;
+$popover-bg: $card-bg !default;
+$popover-border-width: 0px !default;
+$popover-border-radius: $border-radius !default;
+$popover-box-shadow: $box-shadow-lg !default;
+
+$popover-header-bg: $card-bg !default;
+$popover-header-color: $headings-color !default;
+$popover-header-padding-y: $spacer !default;
+$popover-header-padding-x: 1.125rem !default;
+
+$popover-body-color: $body-color !default;
+$popover-body-padding-y: 1.125rem !default;
+$popover-body-padding-x: 1.125rem !default;
+
+// * Toasts
+// *******************************************************************************
+$toast-background-color: rgba($white, 0.85) !default;
+$toast-padding-y: 0.406rem !default;
+$toast-font-size: $font-size-base !default;
+$toast-color: $body-color !default;
+$toast-background-color: rgba($card-bg, 0.85);
+$toast-border-width: 0px !default;
+$toast-box-shadow: $box-shadow-lg !default;
+$toast-header-border-color: rgba($border-color, 0.3) !default;
+$toast-spacing: 1rem !default;
+
+$toast-header-color: $headings-color !default;
+$toast-header-background-color: $card-bg !default;
+
+// * Badges
+// *******************************************************************************
+
+$badge-font-size: 0.8667em !default;
+$badge-font-weight: $font-weight-medium !default;
+$badge-padding-y: 0.4235em !default;
+$badge-padding-x: 0.77em !default;
+$badge-border-radius: 0.25rem !default;
+
+$badge-pill-padding-x: 0.583em !default;
+$badge-pill-border-radius: 10rem !default;
+
+$badge-height: 1.5rem !default; // (C)
+$badge-width: 1.5rem !default; // (C)
+$badge-center-font-size: 0.812rem !default; // (C)
+
+// * Modals
+// *******************************************************************************
+
+$modal-inner-padding: 1.5rem !default;
+
+$modal-footer-margin-between: 1rem !default;
+
+$modal-dialog-margin: $modal-inner-padding !default;
+$modal-content-color: null !default;
+$modal-content-bg: $white !default;
+$modal-content-border-color: $border-color;
+$modal-content-border-width: 0px !default;
+$modal-content-border-radius: $border-radius-lg !default;
+$modal-content-box-shadow-xs: $box-shadow-lg !default;
+$modal-content-box-shadow-sm-up: $box-shadow-lg !default;
+$modal-backdrop-bg: #97959e !default;
+$modal-backdrop-opacity: 0.5 !default;
+$modal-header-border-width: 0px !default;
+$modal-header-padding-y: 1.5rem !default;
+$modal-header-padding-x: 0rem !default;
+$modal-header-padding: $modal-header-padding-y $modal-inner-padding $modal-header-padding-x !default;
+$modal-footer-padding: $modal-header-padding-x $modal-inner-padding $modal-header-padding-y !default; // (C)
+
+$modal-lg: 50rem !default;
+$modal-md: 35rem !default;
+$modal-sm: 22.5rem !default;
+
+$modal-fade-transform: translateY(-100px) scale(0.8) !default;
+$modal-show-transform: translateY(0) scale(1) !default;
+
+$modal-transition-duration: 0.15s !default; // (C)
+$modal-transition: transform $modal-transition-duration ease-out !default;
+
+$modal-simple-padding: 3rem !default; // (C)
+$modal-simple-close-position: 1rem !default; // (C)
+
+// * Alerts
+// *******************************************************************************
+
+$alert-padding-y: 0.6875rem !default;
+$alert-padding-x: 0.9375rem !default;
+$alert-bg-scale: 84% !default;
+$alert-bg-tint-scale: 84% !default; // (c)
+$alert-border-scale: -84% !default;
+$alert-color-scale: 40% !default;
+$alert-icon-size: 1.875rem !default; // (c)
+
+// * Progress bars
+// *******************************************************************************
+
+$progress-height: 0.375rem !default;
+$progress-font-size: $font-size-sm !default;
+$progress-bg: $gray-75 !default;
+$progress-border-radius: 3.125rem !default;
+$progress-bar-color: $white !default;
+
+// List group
+// *******************************************************************************
+
+// scss-docs-start list-group-variables
+$list-group-color: $headings-color !default;
+$list-group-bg: transparent !default;
+$list-group-border-color: $border-color !default;
+$list-group-border-radius: $border-radius !default;
+
+$list-group-item-padding-y: 0.5rem !default;
+$list-group-item-padding-x: 1.25rem !default;
+
+$list-group-item-bg-scale: -84% !default;
+$list-group-item-border-scale: -84% !default; // (C)
+$list-group-item-color-scale: 0% !default;
+$list-group-item-bg-hover-scale: 6% !default; // (c)
+
+$list-group-hover-bg: rgba-to-hex($gray-50, $rgba-to-hex-bg) !default;
+$list-group-active-color: $headings-color !default;
+$list-group-active-bg: rgba-to-hex(rgba($primary, 0.16), $rgba-to-hex-bg) !default;
+$list-group-active-border-color: $list-group-border-color !default;
+
+$list-group-disabled-color: $text-muted !default;
+$list-group-disabled-bg: $list-group-bg !default;
+
+$list-group-action-color: $list-group-active-color !default;
+$list-group-action-hover-color: $list-group-action-color !default;
+
+$list-group-action-active-color: $list-group-active-color !default;
+$list-group-action-active-bg: $list-group-hover-bg !default;
+// scss-docs-end list-group-variables
+
+// * Image thumbnails
+// *******************************************************************************
+
+$thumbnail-padding: 0 !default;
+$thumbnail-bg: transparent !default;
+$thumbnail-border-width: 0px !default;
+$thumbnail-border-radius: 0px !default;
+
+// * Figures
+// *******************************************************************************
+
+$figure-caption-color: $text-muted !default;
+
+// * Breadcrumbs
+// *******************************************************************************
+
+$breadcrumb-padding-y: 0 !default;
+$breadcrumb-padding-x: 0 !default;
+$breadcrumb-item-padding-x: 0.5rem !default;
+$breadcrumb-margin-bottom: 1rem !default;
+$breadcrumb-bg: transparent !default;
+$breadcrumb-divider-color: $body-color !default;
+$breadcrumb-active-color: $headings-color !default;
+$breadcrumb-divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-right' width='16' height='24' viewBox='0 0 24 24' stroke-width='1.75' stroke='#{$breadcrumb-divider-color}' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpolyline points='9 6 15 12 9 18'%3E%3C/polyline%3E%3C/svg%3E") !default;
+$breadcrumb-divider-flipped: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-chevron-left' width='16' height='24' viewBox='0 0 24 24' stroke-width='1.75' stroke='#{$breadcrumb-divider-color}' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpolyline points='15 6 9 12 15 18'%3E%3C/polyline%3E%3C/svg%3E") !default;
+$breadcrumb-color: $component-active-bg !default; // (C)
+
+$breadcrumb-divider-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='icon icon-tabler icon-tabler-check' width='16' height='24' viewBox='0 0 24 24' stroke-width='1.75' stroke='#{$breadcrumb-divider-color}' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath stroke='none' d='M0 0h24v24H0z' fill='none'%3E%3C/path%3E%3Cpath d='M5 12l5 5l10 -10'%3E%3C/path%3E%3C/svg%3E");
+
+$breadcrumb-icon-check-svg: str-replace(
+ str-replace($breadcrumb-divider-check, '#{$breadcrumb-divider-color}', $breadcrumb-divider-color),
+ '#',
+ '%23'
+); // (C)
+
+// * Carousel
+// *******************************************************************************
+
+$carousel-control-color: $white !default;
+
+$carousel-indicator-width: 34px !default;
+$carousel-indicator-height: 5px !default;
+$carousel-indicator-hit-area-height: 0 !default;
+$carousel-indicator-spacer: 5px !default;
+$carousel-indicator-opacity: 0.4 !default;
+
+$carousel-caption-spacer: 1.437rem !default;
+
+$carousel-control-icon-width: 2.5rem !default;
+$carousel-control-prev-icon-bg: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.25 4.5L6.75 9L11.25 13.5' stroke='#{$carousel-control-color}' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M11.25 4.5L6.75 9L11.25 13.5' stroke='white' stroke-opacity='0.2' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A") !default;
+
+$carousel-control-next-icon-bg: url("data:image/svg+xml,%3Csvg width='19' height='18' viewBox='0 0 19 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M7.25 4.5L11.75 9L7.25 13.5' stroke='#{$carousel-control-color}' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M7.25 4.5L11.75 9L7.25 13.5' stroke='white' stroke-opacity='0.2' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !default;
+
+// Spinners
+// *******************************************************************************
+
+$spinner-width-lg: 3rem !default; // (C)
+$spinner-height-lg: $spinner-width-lg !default; // (C)
+$spinner-border-width-lg: 0.3em !default; // (C)
+
+// * Close
+// *******************************************************************************
+
+$btn-close-width: 1.125rem !default;
+$btn-close-color: $black !default;
+$btn-close-bg: url("data:image/svg+xml,%3Csvg width='19' height='18' viewBox='0 0 19 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M14 4.5L5 13.5' stroke='#{$btn-close-color}' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M14 4.5L5 13.5' stroke='white' stroke-opacity='0.2' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M5 4.5L14 13.5' stroke='#{$btn-close-color}' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M5 4.5L14 13.5' stroke='white' stroke-opacity='0.2' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A") !default;
+$btn-close-focus-shadow: none !default;
+$btn-close-focus-opacity: 0.75 !default;
+
+$close-font-weight: 300 !default; // (C)
+
+// * Offcanvas
+// *******************************************************************************
+
+// scss-docs-start offcanvas-variables
+$offcanvas-transition-duration: 0.25s !default;
+$offcanvas-bg-color: $modal-content-bg !default;
+$offcanvas-color: $modal-content-color !default;
+$offcanvas-btn-close-color: $body-color !default; // (C)
+// scss-docs-end offcanvas-variables
+
+// Utilities
+$overflows: auto, hidden, scroll, visible !default;
+
+// Config
+$rtl-support: false !default;
+$dark-style: false !default;
+
+// Useful Icons
+$upload-icon: url("data:image/svg+xml,%3csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M4 17V19C4 20.1046 4.89543 21 6 21H18C19.1046 21 20 20.1046 20 19V17' stroke='%23808390' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M7 9L12 4L17 9' stroke='%23808390' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3cpath d='M12 4V16' stroke='%23808390' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_floating-labels.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_floating-labels.scss
new file mode 100644
index 0000000..be2063a
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_floating-labels.scss
@@ -0,0 +1,36 @@
+// Floating Labels
+// *******************************************************************************
+
+// Display placeholder on focus
+.form-floating {
+ > .form-control:focus,
+ > .form-control:not(:placeholder-shown) {
+ &::placeholder {
+ color: $input-placeholder-color;
+ }
+ }
+}
+
+// RTL
+@include rtl-only {
+ .form-floating {
+ > label {
+ right: 0;
+ transform-origin: 100% 0;
+ }
+
+ > .form-control:focus,
+ > .form-control:not(:placeholder-shown),
+ > .form-select {
+ ~ label {
+ transform: $form-floating-label-transform-rtl;
+ }
+ }
+
+ > .form-control:-webkit-autofill {
+ ~ label {
+ transform: $form-floating-label-transform-rtl;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-check.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-check.scss
new file mode 100644
index 0000000..120f50b
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-check.scss
@@ -0,0 +1,79 @@
+// Checkboxes and Radios
+// *******************************************************************************
+.form-check-input {
+ cursor: $form-check-label-cursor;
+ &:disabled {
+ background-color: $form-check-input-disabled-bg;
+ border-color: $form-check-input-disabled-bg;
+ }
+ &:checked {
+ box-shadow: $box-shadow-xs;
+ }
+}
+
+.form-check {
+ position: relative;
+}
+
+// Only for checkbox and radio (not for bs default switch)
+//? .dt-checkboxes-cell class is used for DataTables checkboxes
+.form-check:not(.form-switch),
+.dt-checkboxes-cell {
+ .form-check-input[type='radio'] {
+ background-size: 1.3125rem;
+ &:not(:checked) {
+ background-size: 0.75rem;
+ }
+ }
+}
+
+// RTL Style
+@include rtl-only {
+ .form-check {
+ padding-left: 0;
+ padding-right: $form-check-padding-start;
+ }
+ .form-check .form-check-input {
+ float: right;
+ margin-left: 0;
+ margin-right: $form-check-padding-start * -1;
+ }
+}
+
+// Switches
+// *******************************************************************************
+
+.form-switch .form-check-input {
+ background-color: $form-switch-bg;
+ border: none;
+ box-shadow: $form-switch-box-shadow;
+ &:focus {
+ box-shadow: $form-switch-box-shadow;
+ }
+}
+// RTL Style
+@include rtl-only {
+ .form-switch {
+ padding-left: 0;
+ padding-right: $form-switch-padding-start;
+ .form-check-input {
+ margin-left: 0;
+ margin-right: $form-switch-padding-start * -1;
+ background-position: right center;
+ &:checked {
+ background-position: $form-switch-checked-bg-position-rtl;
+ }
+ }
+ }
+ .form-check-inline {
+ margin-right: 0;
+ margin-left: $form-check-inline-margin-end;
+ }
+}
+
+// Contextual colors for form check
+@each $color, $value in $theme-colors {
+ @if $color != primary {
+ @include template-form-check-variant('.form-check-#{$color}', $value);
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-control.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-control.scss
new file mode 100644
index 0000000..15ba127
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-control.scss
@@ -0,0 +1,73 @@
+// Form control
+// *******************************************************************************
+
+//? Form control (all size) padding calc due to border increase on focus
+.form-control {
+ &::placeholder,
+ &:focus::placeholder {
+ transition: all 0.2s ease;
+ }
+ padding: calc($input-padding-y - $input-border-width) calc($input-padding-x - $input-border-width);
+ // border color on hover state
+ &:hover {
+ &:not([disabled]):not([focus]) {
+ border-color: $input-border-hover-color;
+ }
+ }
+ // ! FIX: wizard-ex input type number placeholder align issue
+ &[type='number'] {
+ .input-group & {
+ line-height: 1.375rem;
+ min-height: 2.375rem;
+ }
+ .input-group-lg & {
+ line-height: 1.5rem;
+ min-height: 3rem;
+ }
+ .input-group-sm & {
+ min-height: 1.875rem;
+ }
+ }
+
+ &:focus {
+ border-width: $input-focus-border-width;
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-focus-border-width);
+ }
+ &.form-control-lg {
+ padding: calc($input-padding-y-lg - $input-border-width) calc($input-padding-x-lg - $input-border-width);
+ &:focus {
+ padding: calc($input-padding-y-lg - $input-focus-border-width)
+ calc($input-padding-x-lg - $input-focus-border-width);
+ }
+ }
+ &.form-control-sm {
+ padding: calc($input-padding-y-sm - $input-border-width) calc($input-padding-x-sm - $input-border-width);
+ &:focus {
+ padding: calc($input-padding-y-sm - $input-focus-border-width)
+ calc($input-padding-x-sm - $input-focus-border-width);
+ }
+ }
+}
+.input-group:has(button) .form-control {
+ padding: calc($input-padding-y - $input-border-width) calc($input-padding-x - $input-border-width) !important;
+ border-width: $input-border-width !important;
+}
+// ltr only
+@include ltr-only {
+ .form-control:not([readonly]) {
+ &:focus::placeholder {
+ transform: translateX(4px);
+ }
+ }
+}
+// rtl only
+@include rtl-only {
+ input[type='tel'] {
+ text-align: right;
+ }
+ .form-control:not([readonly]) {
+ &:focus::placeholder {
+ transform: translateX(-4px);
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-range.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-range.scss
new file mode 100644
index 0000000..a1dcc9b
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-range.scss
@@ -0,0 +1,49 @@
+// Range select
+// *******************************************************************************
+
+.form-range {
+ // Chrome specific
+ &::-webkit-slider-thumb {
+ box-shadow: $form-range-thumb-box-shadow;
+
+ &:hover {
+ box-shadow: 0 0 0 8px rgba($primary, 0.16);
+ }
+ &:active,
+ &:focus {
+ box-shadow: 0 0 0 13px rgba($primary, 0.16);
+ background-color: $primary;
+ border-color: $primary;
+ }
+ }
+ &::-webkit-slider-runnable-track {
+ background-color: $primary;
+ }
+
+ // Mozilla specific
+ &::-moz-range-thumb {
+ box-shadow: $form-range-thumb-box-shadow;
+ &:hover {
+ box-shadow: 0 0 0 8px rgba($primary, 0.16);
+ }
+ &:active,
+ &:focus {
+ box-shadow: 0 0 0 13px rgba($primary, 0.16);
+ background-color: $primary;
+ border-color: $primary;
+ }
+ }
+
+ &::-moz-range-track {
+ background-color: $primary;
+ }
+ &:disabled {
+ &::-webkit-slider-runnable-track {
+ background-color: $form-range-track-disabled-bg;
+ }
+
+ &::-moz-range-track {
+ background-color: $form-range-track-disabled-bg;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-select.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-select.scss
new file mode 100644
index 0000000..4ac4473
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-select.scss
@@ -0,0 +1,109 @@
+// Select
+// *******************************************************************************
+
+.form-select {
+ background-clip: padding-box;
+ padding: calc($form-select-padding-y - $input-border-width) calc($form-select-padding-x - $input-border-width);
+ padding-inline-end: calc($form-select-padding-x * 3 - $input-border-width);
+ optgroup {
+ background-color: $card-bg;
+ }
+ &:hover {
+ &:not([disabled]):not([focus]) {
+ border-color: $input-border-hover-color;
+ }
+ }
+ &:disabled {
+ @include ltr-style {
+ background-image: escape-svg($form-select-disabled-indicator);
+ }
+ @include rtl-style {
+ background-image: escape-svg($form-select-disabled-indicator);
+ }
+ }
+ &:focus,
+ .was-validated & {
+ border-width: $input-focus-border-width;
+ @include ltr-style {
+ padding: calc($form-select-padding-y - $input-focus-border-width)
+ calc($form-select-padding-x * 3 - $input-focus-border-width)
+ calc($form-select-padding-y - $input-focus-border-width)
+ calc($form-select-padding-x - $input-focus-border-width);
+ }
+ @include rtl-style {
+ padding: calc($form-select-padding-y - $input-focus-border-width)
+ calc($form-select-padding-x - $input-focus-border-width)
+ calc($form-select-padding-y - $input-focus-border-width)
+ calc($form-select-padding-x * 3 - $input-focus-border-width);
+ }
+ background-position: right calc($form-select-padding-x - 1px) center;
+ }
+ &.form-select-lg {
+ min-height: $input-height-lg;
+ background-size: 24px 24px;
+ padding: calc($form-select-padding-y-lg - $input-border-width) calc($form-select-padding-x-lg - $input-border-width);
+ padding-inline-end: calc($form-select-padding-x-lg * 3 - $input-border-width);
+ &:focus,
+ .was-validated & {
+ @include ltr-style {
+ padding: calc($form-select-padding-y-lg - $input-focus-border-width)
+ calc($form-select-padding-x-lg * 3 - $input-focus-border-width)
+ calc($form-select-padding-y-lg - $input-focus-border-width)
+ calc($form-select-padding-x-lg - $input-focus-border-width);
+ }
+ @include rtl-style {
+ padding: calc($form-select-padding-y-lg - $input-focus-border-width)
+ calc($form-select-padding-x-lg - $input-focus-border-width)
+ calc($form-select-padding-y-lg - $input-focus-border-width)
+ calc($form-select-padding-x-lg * 3 - $input-focus-border-width);
+ }
+ }
+ }
+ &.form-select-sm {
+ min-height: $input-height-sm;
+ background-size: 20px 20px;
+ padding: calc($form-select-padding-y-sm - $input-border-width) calc($form-select-padding-x-sm - $input-border-width);
+ padding-inline-end: calc($form-select-padding-x-sm * 3 - $input-border-width);
+ &:focus,
+ .was-validated & {
+ @include ltr-style {
+ padding: calc($form-select-padding-y-sm - $input-focus-border-width)
+ calc($form-select-padding-x-sm * 3 - $input-focus-border-width)
+ calc($form-select-padding-y-sm - $input-focus-border-width)
+ calc($form-select-padding-x-sm - $input-focus-border-width);
+ }
+ @include rtl-style {
+ padding: calc($form-select-padding-y-sm - $input-focus-border-width)
+ calc($form-select-padding-x-sm - $input-focus-border-width)
+ calc($form-select-padding-y-sm - $input-focus-border-width)
+ calc($form-select-padding-x-sm * 3 - $input-focus-border-width);
+ }
+ }
+ // background-size: 14px 11px;
+ }
+}
+
+// Multiple select RTL Only
+@include rtl-only {
+ .form-select {
+ background-image: $form-select-indicator-rtl;
+ background-position: left $form-select-padding-x center;
+ &:focus {
+ background-position: left calc($form-select-padding-x - 1px) center;
+ }
+ &[multiple],
+ &[size]:not([size='1']) {
+ background-image: none;
+ }
+ }
+ .was-validated .form-select {
+ background-position: left calc($form-select-padding-x - 1px) center;
+ }
+}
+@if $dark-style {
+ select.form-select {
+ option {
+ background-color: $card-bg;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-text.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-text.scss
new file mode 100644
index 0000000..d8a2ac3
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_form-text.scss
@@ -0,0 +1,2 @@
+// Form Text
+// *******************************************************************************
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_input-group.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_input-group.scss
new file mode 100644
index 0000000..287e879
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_input-group.scss
@@ -0,0 +1,393 @@
+// Input groups
+// *******************************************************************************
+
+$validation-messages: '';
+@each $state in map-keys($form-validation-states) {
+ $validation-messages: $validation-messages +
+ ':not(.' +
+ unquote($state) +
+ '-tooltip)' +
+ ':not(.' +
+ unquote($state) +
+ '-feedback)';
+}
+
+// Using :focus-within to apply focus/validation border and shadow to default and merged input-group
+.input-group {
+ border-radius: $input-border-radius;
+ // Input group (Default)
+ .input-group-text {
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-border-width);
+ @include transition($input-transition);
+ }
+
+ //? Info :focus-within to apply focus/validation border and shadow to default and merged input & input-group
+ &:focus-within {
+ .input-group-text {
+ border-width: $input-focus-border-width;
+ padding: calc($input-padding-y - calc($input-focus-border-width + $input-border-width))
+ calc($input-padding-x - $input-focus-border-width);
+ .was-validated &,
+ .fv-plugins-bootstrap5-row-invalid & {
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-border-width);
+ }
+ }
+ .form-control,
+ .form-select {
+ border-width: $input-focus-border-width;
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-border-width);
+ &:first-child {
+ padding-inline-start: calc($input-padding-x - $input-focus-border-width);
+ }
+ }
+ }
+ // Input group (lg)
+ &.input-group-lg {
+ .input-group-text {
+ padding: calc($input-padding-y-lg - $input-border-width) calc($input-padding-x-lg - $input-border-width);
+ }
+ &:focus-within {
+ .input-group-text {
+ padding: calc($input-padding-y-lg - $input-border-width) calc($input-padding-x-lg - $input-focus-border-width);
+ }
+ .form-control:not(:first-child),
+ .form-select:not(:first-child) {
+ padding: calc($input-padding-y-lg - $input-border-width) calc($input-padding-x-lg);
+ }
+ }
+ }
+ // Input group (sm)
+ &.input-group-sm {
+ .form-control,
+ .form-select {
+ padding-inline: calc($input-padding-x-sm - $input-border-width);
+ }
+ .input-group-text {
+ padding: calc($input-padding-y-sm - $input-border-width) calc($input-padding-x-sm - $input-border-width);
+ }
+ &:focus-within {
+ .input-group-text {
+ padding: calc($input-padding-y-sm - $input-focus-border-width)
+ calc($input-padding-x-sm - $input-focus-border-width);
+ }
+ .form-control,
+ .form-select {
+ padding: calc($input-padding-y-sm - $input-border-width) calc($input-padding-x-sm);
+ }
+ }
+ }
+
+ > :not(:first-child):not(.dropdown-menu):not(.btn):not(.dropdown-menu + .form-control):not(
+ .btn + .form-control
+ )#{$validation-messages} {
+ margin-inline-start: calc($input-focus-border-width - 3px);
+ }
+
+ // Input group merge
+ &.input-group-merge {
+ > :not(:first-child):not(.dropdown-menu):not(.btn):not(.dropdown-menu + .form-control):not(
+ .btn + .form-control
+ )#{$validation-messages} {
+ margin-inline-start: calc(($input-focus-border-width + $input-border-width) * -1);
+ }
+ &:focus-within {
+ > .form-control:first-child,
+ > .form-select:first-child {
+ padding-inline: calc($input-padding-x - $input-focus-border-width);
+ }
+ }
+ &.input-group-sm {
+ &:focus-within {
+ > .form-control:first-child,
+ > .form-select:first-child {
+ padding-inline: calc($input-padding-x - $input-focus-border-width);
+ }
+ }
+ }
+ }
+
+ // Input group on focus-within use margin-left same as as focus border width
+ &:focus-within {
+ > :not(:first-child):not(.dropdown-menu):not(.btn):not(.dropdown-menu + .form-control):not(
+ .btn + .form-control
+ )#{$validation-messages} {
+ margin-inline-start: calc($input-focus-border-width * -1);
+ }
+ }
+
+ // Rounded pill option
+ &.rounded-pill {
+ .input-group-text,
+ .form-control {
+ @include border-radius($border-radius-pill);
+ }
+ }
+ &:hover {
+ .input-group-text,
+ .form-control {
+ border-color: $input-border-hover-color;
+ }
+ }
+
+ &:focus-within {
+ box-shadow: $input-focus-box-shadow;
+ .form-control,
+ .input-group-text {
+ box-shadow: none;
+ }
+ }
+ .was-validated & {
+ &:has(.is-invalid),
+ &:has(.is-valid),
+ &:has(:valid),
+ &:has(:invalid) {
+ box-shadow: none;
+ }
+ }
+ &.has-validation,
+ &.is-invalid {
+ &:has(.is-invalid),
+ &:has(.is-valid),
+ &:has(:invalid),
+ &:has(.form-control.is-invalid) {
+ box-shadow: none;
+ }
+ }
+ // For disabled input group
+ &.disabled {
+ .input-group-text {
+ background-color: $input-disabled-bg;
+ }
+ }
+ // ! FIX: Formvalidation border radius issue
+ &.has-validation {
+ > .input-group-text:first-child {
+ @include border-end-radius(0);
+ }
+ > .form-control:first-child {
+ @include border-end-radius(0);
+ }
+ > .form-control:not(:first-child):not(:last-child) {
+ @include border-radius(0);
+ }
+ }
+}
+
+// input-group-text icon size
+.input-group-text {
+ background-clip: padding-box;
+ i {
+ @include font-size(1.25rem);
+ }
+}
+.input-group-lg > .input-group-text {
+ i {
+ @include font-size(1.375rem);
+ }
+}
+.input-group-sm > .input-group-text {
+ i {
+ @include font-size(1.125rem);
+ }
+}
+
+// Merge input
+
+// Input group merge .form-control border & padding
+@include ltr-only {
+ .input-group-merge {
+ .input-group-text {
+ &:first-child {
+ border-right: 0;
+ }
+ &:last-child {
+ border-left: 0;
+ }
+ }
+ &.disabled {
+ > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(
+ .invalid-feedback
+ ) {
+ margin-left: 0 !important;
+ }
+ }
+ .form-control:not(textarea) {
+ &:not(:first-child) {
+ padding-left: 0 !important;
+ border-left: 0;
+ }
+ &:not(:last-child) {
+ padding-right: 0 !important;
+ border-right: 0;
+ }
+ }
+ .form-control:not(textarea) {
+ &:not(:first-child) {
+ padding-left: 0;
+ }
+ &:not(:last-child) {
+ padding-right: 0;
+ }
+ }
+ }
+}
+
+// Adding transition (On focus border color change)
+.input-group-text {
+ @include transition($input-transition);
+}
+
+// RTL Style
+// *******************************************************************************
+
+@include rtl-only {
+ .input-group {
+ // Rounded input field
+ &.rounded-pill {
+ .input-group-text {
+ border-top-right-radius: $border-radius-pill !important;
+ border-bottom-right-radius: $border-radius-pill !important;
+ }
+ .form-control {
+ border-top-left-radius: $border-radius-pill !important;
+ border-bottom-left-radius: $border-radius-pill !important;
+ }
+ }
+
+ // Input group with dropdown rounded corners, while not validate
+ &:not(.has-validation) {
+ > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 3) {
+ @include border-start-radius(0);
+ @include border-end-radius($input-border-radius);
+ }
+ }
+ &.input-group-lg {
+ &:not(.has-validation) {
+ > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 3) {
+ @include border-end-radius($input-border-radius-lg);
+ }
+ }
+ }
+ &.input-group-sm {
+ &:not(.has-validation) {
+ > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 3) {
+ @include border-end-radius($input-border-radius-sm);
+ }
+ }
+ }
+
+ // Input group with dropdown rounded corners, while validate
+ &.has-validation {
+ > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 4) {
+ @include border-start-radius(0);
+ @include border-end-radius($input-border-radius);
+ }
+ }
+ &.input-group-lg {
+ > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 4) {
+ @include border-end-radius($input-border-radius-lg);
+ }
+ }
+ &.input-group-sm {
+ > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 4) {
+ @include border-end-radius($input-border-radius-sm);
+ }
+ }
+
+ // Input group border radius
+ $validation-messages: '';
+ @each $state in map-keys($form-validation-states) {
+ $validation-messages: $validation-messages +
+ ':not(.' +
+ unquote($state) +
+ '-tooltip)' +
+ ':not(.' +
+ unquote($state) +
+ '-feedback)';
+ }
+
+ > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {
+ margin-right: calc(#{$input-border-width} * -1);
+ @include border-end-radius(0);
+ margin-left: 0px;
+ @include border-start-radius($input-border-radius);
+ }
+ &.input-group-lg {
+ > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {
+ @include border-start-radius($input-border-radius-lg);
+ }
+ }
+ &.input-group-sm {
+ > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {
+ @include border-start-radius($input-border-radius-sm);
+ }
+ }
+
+ // ? We apply border radius from the above styles
+ // Remove border radius from first and last element
+ > :not(:first-child):not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
+ > .dropdown-toggle:nth-last-child(n + 3):not(:first-child) {
+ @include border-radius(0 !important);
+ }
+
+ // ! FIX: Formvalidation border radius issue
+ &.has-validation {
+ > .input-group-text:first-child {
+ @include border-start-radius(0);
+ @include border-end-radius($input-border-radius);
+ }
+ > .form-control:first-child {
+ @include border-start-radius(0);
+ @include border-end-radius($input-border-radius);
+ }
+ }
+ }
+
+ // Input group merge .input-group-text border & .form-control border & padding
+ // Merge input
+ .input-group-merge {
+ .input-group-text {
+ &:first-child {
+ border-left: 0;
+ }
+ &:last-child {
+ border-right: 0;
+ }
+ }
+ .form-control {
+ &:not(:first-child) {
+ padding-right: 0 !important;
+ border-right: 0;
+ }
+ &:not(:last-child) {
+ padding-left: 0 !important;
+ border-left: 0;
+ }
+ }
+ }
+}
+
+//! FIX: Formvalidation : .input-group-text valid/invalid border color, If .input-group has .input-group-text first.
+.fv-plugins-bootstrap5-row-invalid {
+ .input-group.has-validation,
+ .input-group.has-validation:focus-within {
+ .input-group-text {
+ border-color: $form-feedback-invalid-color !important;
+ }
+ }
+}
+// ? UnComment If eleValidClass is not blank i.e form-validation.js Line no. ~208
+// .fv-plugins-bootstrap5-row-valid {
+// .input-group,
+// .input-group:focus-within {
+// .input-group-text {
+// border-color: $form-feedback-valid-color;
+// }
+// }
+// }
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_labels.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_labels.scss
new file mode 100644
index 0000000..3c284d2
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_labels.scss
@@ -0,0 +1,17 @@
+// Labels
+// *******************************************************************************
+
+.form-label,
+.col-form-label {
+ text-transform: $form-label-text-transform;
+ letter-spacing: $form-label-letter-spacing;
+ color: $headings-color;
+}
+// Default (vertical ) form label size
+.form-label-lg {
+ @include font-size($input-font-size-lg);
+}
+
+.form-label-sm {
+ @include font-size($input-font-size-sm);
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/forms/_validation.scss b/resources/assets/vendor/scss/_bootstrap-extended/forms/_validation.scss
new file mode 100644
index 0000000..40cfe68
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/forms/_validation.scss
@@ -0,0 +1,130 @@
+// Validation states
+// *******************************************************************************
+
+@each $state, $data in $form-validation-states {
+ @include template-form-validation-state($state, $data...);
+}
+
+// Currently supported for form-validation and jq-validation
+form {
+ .error:not(li):not(input) {
+ color: $form-feedback-invalid-color;
+ font-size: 85%;
+ margin-top: 0.25rem;
+ }
+
+ .invalid,
+ .is-invalid .invalid:before,
+ .is-invalid::before {
+ border-width: $input-focus-border-width;
+ border-color: $form-feedback-invalid-color !important;
+ }
+
+ .form-label {
+ &.invalid,
+ &.is-invalid {
+ border-width: $input-focus-border-width;
+ border-color: $form-feedback-invalid-color;
+ box-shadow: 0 0 0 2px rgba($form-feedback-invalid-color, 0.4) !important;
+ }
+ }
+
+ select {
+ &.invalid {
+ & ~ .select2 {
+ .select2-selection {
+ border-width: $input-focus-border-width;
+ border-color: $form-feedback-invalid-color;
+ }
+ }
+ }
+
+ // FormValidation
+
+ //Select2
+ &.is-invalid {
+ & ~ .select2 {
+ .select2-selection {
+ border-width: $input-focus-border-width;
+ border-color: $form-feedback-invalid-color !important;
+ }
+ }
+ }
+ // Bootstrap select
+ &.selectpicker {
+ &.is-invalid {
+ ~ .btn {
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-border-width);
+ border-width: $input-focus-border-width;
+ border-color: $form-feedback-invalid-color !important;
+ }
+ }
+ }
+ }
+}
+
+//!FIX: Input group form floating label .input-group-text border color on validation state
+//? Can't use form-validation-state-selector mixin due to :has selector
+.was-validated .input-group:has(.input-group-text):has(.form-control:invalid) .input-group-text,
+.was-validated .input-group:has(.input-group-text):has(.form-control:valid) .input-group-text,
+.input-group:has(.input-group-text):has(.form-control.is-valid) .input-group-text,
+.input-group:has(.input-group-text):has(.form-control.is-invalid) .input-group-text {
+ border-width: $input-focus-border-width;
+}
+//! FIX: Basic input (without floating) has shake effect due to padding
+.was-validated .form-control:invalid,
+.was-validated .form-control:valid,
+.form-control.is-invalid,
+.form-control.is-valid {
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-border-width);
+ ~ .input-group-text {
+ padding: calc($input-padding-y - $input-focus-border-width) calc($input-padding-x - $input-border-width);
+ }
+}
+.input-group {
+ > :not(:first-child):not(.dropdown-menu):not(.btn):not(.dropdown-menu + .form-control):not(
+ .btn + .form-control
+ )#{$validation-messages}.form-control.is-invalid,
+ > :not(:first-child):not(.dropdown-menu):not(.btn):not(.dropdown-menu + .form-control):not(
+ .btn + .form-control
+ )#{$validation-messages}.form-control.is-valid {
+ margin-inline-start: calc($input-focus-border-width - 4px);
+ }
+ .was-validated & .form-control:invalid,
+ .was-validated & .form-control:valid,
+ .form-control.is-invalid,
+ .form-control.is-valid,
+ .form-select.is-invalid,
+ .form-select.is-valid {
+ &:first-child {
+ padding-inline-start: calc($input-padding-x - $input-focus-border-width);
+ }
+ }
+}
+// ! Fix: FormValidation: Set border color to .form-control in touch devices for HTML5 inputs i.e date picker
+@media (hover: none) {
+ .fv-plugins-bootstrap5-row-invalid {
+ .form-control {
+ &.flatpickr-mobile {
+ border-color: $form-feedback-invalid-color;
+ }
+ }
+ }
+}
+// ! Fix: FormValidation: Validation error message display fix for those inputs where .invalid-feedback/tooltip is not a sibling element
+.fv-plugins-bootstrap5 {
+ .invalid-feedback,
+ .invalid-tooltip {
+ display: block;
+ }
+}
+
+//! Fix: FormValidation: Tagify validation error (border color)
+.fv-plugins-bootstrap5-row-invalid .tagify.tagify--empty {
+ border-width: $input-focus-border-width;
+ border-color: $form-feedback-invalid-color !important;
+}
+// ? Uncomment if required
+// .fv-plugins-bootstrap5-row-valid .tagify:not(.tagify--empty) {
+// border-color: $form-feedback-valid-color;
+// }
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_alert.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_alert.scss
new file mode 100644
index 0000000..4428bf4
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_alert.scss
@@ -0,0 +1,101 @@
+// Alerts
+// *******************************************************************************
+
+@mixin alert-variant($background: null, $border: null, $color: null) {
+}
+
+// Basic Alerts
+@mixin template-alert-variant($parent, $background) {
+ $border: if(
+ $dark-style,
+ shift-color($background, -$alert-border-scale, $card-bg),
+ shift-color($background, $alert-border-scale, $card-bg)
+ );
+ $color: $background;
+ $background: if(
+ $dark-style,
+ shade-color($background, $alert-bg-scale, $card-bg),
+ tint-color($background, $alert-bg-tint-scale, $card-bg)
+ );
+
+ #{$parent} {
+ @include gradient-bg($background);
+ border-color: $border;
+ color: $color;
+ .btn-close {
+ background-image: str-replace(str-replace($btn-close-bg, '#{$btn-close-color}', $color), '#', '%23');
+ }
+
+ .alert-link {
+ color: $color;
+ }
+ }
+
+ #{$parent} {
+ hr {
+ color: $color !important;
+ }
+ .alert-icon {
+ background-color: $color;
+ }
+ }
+}
+
+// Solid Alerts
+@mixin template-alert-solid-variant($parent, $background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ #{$parent} {
+ @include gradient-bg($background);
+ color: $color;
+
+ .btn-close {
+ background-image: str-replace(str-replace($btn-close-bg, '#{$btn-close-color}', $color), '#', '%23');
+ }
+
+ .alert-link {
+ color: $color;
+ }
+ }
+
+ #{$parent} {
+ hr {
+ color: $color !important;
+ }
+ .alert-icon {
+ color: $background !important;
+ }
+ }
+}
+
+// Outline Alerts
+@mixin template-alert-outline-variant($parent, $background, $color: null) {
+ $color: $background;
+ $icon-bg: if(
+ $dark-style,
+ shade-color($background, $alert-bg-scale, $card-bg),
+ tint-color($background, $alert-bg-tint-scale, $card-bg)
+ );
+
+ #{$parent} {
+ border-color: $background;
+ color: $color;
+ .btn-close {
+ background-image: str-replace(str-replace($btn-close-bg, '#{$btn-close-color}', $background), '#', '%23');
+ }
+
+ .alert-link {
+ color: $color;
+ }
+ }
+
+ #{$parent} {
+ hr {
+ color: $color !important;
+ }
+ .alert-icon {
+ color: $color !important;
+ background-color: $icon-bg !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_badge.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_badge.scss
new file mode 100644
index 0000000..d8ec80a
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_badge.scss
@@ -0,0 +1,9 @@
+// Badges
+// *******************************************************************************
+
+// Size
+@mixin badge-size($badge-height, $badge-width, $badge-font-size) {
+ height: $badge-height;
+ width: $badge-width;
+ @include font-size($badge-font-size);
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_buttons.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_buttons.scss
new file mode 100644
index 0000000..13eede1
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_buttons.scss
@@ -0,0 +1,360 @@
+// Buttons
+// *******************************************************************************
+
+// Basic
+@mixin button-variant(
+ $background: null,
+ $border: null,
+ $hover-background: null,
+ $hover-border: null,
+ $active-background: null,
+ $active-border: null
+) {
+}
+@mixin template-button-variant($parent, $background, $color: null, $border: null) {
+ $background: $background;
+ $border: $background;
+ $color: if($color, $color, color-contrast($background));
+ $hover-background: if(
+ $color == $color-contrast-light,
+ shade-color($background, $btn-hover-bg-shade-amount),
+ tint-color($background, $btn-hover-bg-tint-amount)
+ );
+ $hover-border: if(
+ $color == $color-contrast-light,
+ shade-color($border, $btn-hover-border-shade-amount),
+ tint-color($border, $btn-hover-border-tint-amount)
+ );
+ $hover-color: color-contrast($hover-background);
+
+ $active-background: if(
+ $color == $color-contrast-light,
+ shade-color($background, $btn-active-bg-shade-amount),
+ tint-color($background, $btn-active-bg-tint-amount)
+ );
+ $active-border: if(
+ $color == $color-contrast-light,
+ shade-color($border, $btn-active-border-shade-amount),
+ tint-color($border, $btn-active-border-tint-amount)
+ );
+ $active-color: color-contrast($active-background);
+
+ #{$parent} {
+ color: $color;
+ @include gradient-bg($background);
+ border-color: $border;
+ &.btn[class*='btn-']:not([class*='btn-label-']):not([class*='btn-outline-']):not([class*='btn-text-']):not(
+ .btn-icon
+ ):not(:disabled):not(.disabled) {
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+ &:hover {
+ color: $hover-color !important;
+ @include gradient-bg($hover-background !important);
+ border-color: $hover-border !important;
+ }
+
+ .btn-check:focus + &,
+ &:focus,
+ &.focus {
+ color: $hover-color;
+ @include gradient-bg($hover-background);
+ border-color: $hover-border;
+ }
+
+ .btn-check:checked + &,
+ .btn-check:active + &,
+ &:active,
+ &.active,
+ &.show.dropdown-toggle,
+ .show > &.dropdown-toggle {
+ color: $active-color !important;
+ background-color: $active-background !important;
+ // Remove CSS gradients if they're enabled
+ background-image: if($enable-gradients, none !important, null);
+ border-color: $active-border !important;
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $color !important;
+ background-color: $background !important;
+ // Remove CSS gradients if they're enabled
+ background-image: if($enable-gradients, none !important, null);
+ border-color: $border !important;
+ }
+ }
+
+ // Button groups
+ .btn-group #{$parent},
+ .input-group #{$parent} {
+ border-right: $input-btn-border-width solid $active-background;
+ border-left: $input-btn-border-width solid $active-background;
+ }
+ .btn-group-vertical #{$parent} {
+ border-top-color: $active-background;
+ border-bottom-color: $active-background;
+ }
+}
+
+@mixin template-button-text-variant($parent, $background, $color: null, $border: null) {
+ $border: transparent;
+ $label-color: if($color, $color, $background);
+ $hover-color: $background;
+ $hover-background: $background;
+ $hover-background: if(
+ $hover-color == $color-contrast-light,
+ shade-color($background, $btn-text-hover-shade-amount, $card-bg),
+ tint-color($background, $btn-text-hover-tint-amount, $card-bg)
+ );
+
+ $focus-background: if(
+ $hover-color == $color-contrast-light,
+ shade-color($background, $btn-text-focus-shade-amount, $card-bg),
+ tint-color($background, $btn-text-focus-tint-amount, $card-bg)
+ );
+
+ $active-color: $hover-color;
+ $active-background: if(
+ $active-color == $color-contrast-light,
+ shade-color($background, $btn-text-active-shade-amount, $card-bg),
+ tint-color($background, $btn-text-active-tint-amount, $card-bg)
+ );
+
+ #{$parent} {
+ color: $label-color;
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($background, 0.2) 0,
+ rgba($background, 0.3) 40%,
+ rgba($background, 0.4) 50%,
+ rgba($background, 0.5) 60%,
+ rgba($white, 0) 70%
+ );
+ }
+ }
+
+ &:hover {
+ border-color: $border;
+ background: $hover-background;
+ color: $hover-color;
+ }
+
+ &:focus,
+ &.focus {
+ color: $hover-color;
+ background: $focus-background;
+ }
+
+ &:active,
+ &.active,
+ &.show.dropdown-toggle,
+ .show > &.dropdown-toggle {
+ color: $active-color !important;
+ background: $active-background !important;
+ // Remove CSS gradients if they're enabled
+ background-image: if($enable-gradients, none !important, null);
+ border-color: $border !important;
+ }
+ &:disabled,
+ &.disabled {
+ color: $label-color;
+ }
+ }
+
+ // Button groups
+ .btn-group #{$parent},
+ .input-group #{$parent} {
+ border-right: $input-btn-border-width solid $background !important;
+ border-left: $input-btn-border-width solid $background !important;
+ }
+ .btn-group-vertical #{$parent} {
+ border-top: $input-btn-border-width solid $background !important;
+ border-bottom: $input-btn-border-width solid $background !important;
+ }
+}
+
+// Label
+@mixin button-label-variant($background: null, $border: null, $active-background: null, $active-border: null) {
+}
+
+@mixin template-button-label-variant($parent, $background, $color: null, $border: null) {
+ // Using the $dark-style variable for condition as in label style text color can't compare with $color-contrast-light/dark
+ $border: transparent;
+
+ $label-color: if($color, $color, $background);
+ $hover-color: if($color, $color, color-contrast($background));
+
+ $label-background: if(
+ $hover-color == $color-contrast-light,
+ shade-color($background, $btn-label-bg-shade-amount, $card-bg),
+ tint-color($background, $btn-label-bg-tint-amount, $card-bg)
+ );
+
+ $hover-color: $background;
+ $hover-background: $background;
+ $hover-background: if(
+ $hover-color == $color-contrast-light,
+ shade-color($background, $btn-label-hover-shade-amount, $card-bg),
+ tint-color($background, $btn-label-hover-tint-amount, $card-bg)
+ );
+
+ $active-color: $hover-color;
+ $active-background: $hover-background;
+
+ $disabled-background: if(
+ $hover-color == $color-contrast-light,
+ shade-color($background, $btn-label-disabled-bg-shade-amount, $card-bg),
+ tint-color($background, $btn-label-disabled-bg-tint-amount, $card-bg)
+ );
+
+ $border-color: if(
+ $dark-style,
+ shade-color($background, $btn-label-border-shade-amount, $card-bg),
+ tint-color($background, $btn-label-border-tint-amount, $card-bg)
+ );
+
+ #{$parent} {
+ color: $label-color !important;
+ border-color: $border !important;
+ background: $label-background !important;
+ @include box-shadow($btn-box-shadow);
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($background, 0.2) 0,
+ rgba($background, 0.3) 40%,
+ rgba($background, 0.4) 50%,
+ rgba($background, 0.5) 60%,
+ rgba($white, 0) 70%
+ );
+ }
+ }
+
+ &:hover {
+ border-color: $border !important;
+ background: $hover-background !important;
+ color: $hover-color !important;
+ }
+
+ &:focus,
+ &.focus {
+ color: $hover-color;
+ background: $hover-background;
+ }
+
+ &:active,
+ &.active,
+ &.show.dropdown-toggle,
+ .show > &.dropdown-toggle {
+ color: $active-color !important;
+ background-color: $active-background !important;
+ // Remove CSS gradients if they're enabled
+ background-image: if($enable-gradients, none !important, null);
+ border-color: $border !important;
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $label-color !important;
+ border-color: $border !important;
+ background: $label-background !important;
+ }
+ }
+
+ // Button groups
+ .btn-group #{$parent},
+ .input-group #{$parent} {
+ border-right: $input-btn-border-width solid $border-color !important;
+ border-left: $input-btn-border-width solid $border-color !important;
+ }
+ .btn-group-vertical #{$parent} {
+ border-top: $input-btn-border-width solid $border-color !important;
+ border-bottom: $input-btn-border-width solid $border-color !important;
+ }
+}
+
+// Outline
+@mixin button-outline-variant($color: null, $color-hover: null, $hover-color: null) {
+}
+
+@mixin template-button-outline-variant($parent, $color, $hover-color: null) {
+ $color: $color;
+ $color-hover: $color;
+
+ $hover-background: if(
+ $color-hover == $color-contrast-light,
+ shade-color($color, $btn-outline-hover-bg-shade-amount, $card-bg),
+ tint-color($color, $btn-outline-hover-bg-tint-amount, $card-bg)
+ );
+
+ $focus-background: $color;
+ $active-background: if(
+ $color == $color-contrast-light,
+ shade-color($color, $btn-outline-active-bg-shade-amount, $card-bg),
+ tint-color($color, $btn-outline-active-bg-tint-amount, $card-bg)
+ );
+ $active-border: $color;
+ $active-color: $color;
+
+ #{$parent} {
+ color: $color;
+ border-color: $color;
+ background: transparent;
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($color, 0.2) 0,
+ rgba($color, 0.3) 40%,
+ rgba($color, 0.4) 50%,
+ rgba($color, 0.5) 60%,
+ rgba($white, 0) 70%
+ );
+ }
+ }
+
+ &:hover {
+ color: $color-hover !important;
+ background-color: $hover-background !important;
+ border-color: $active-border !important;
+ }
+
+ .btn-check:focus + &,
+ &:focus {
+ color: $color-hover;
+ background-color: $hover-background;
+ border-color: $active-border;
+ }
+
+ .btn-check:checked + &,
+ .btn-check:active + &,
+ &:active,
+ &.active,
+ &.dropdown-toggle.show {
+ color: $active-color !important;
+ background-color: $active-background !important;
+ border-color: $active-border !important;
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $color !important;
+ }
+ }
+
+ #{$parent} .badge {
+ background: $color;
+ border-color: $color;
+ color: color-contrast($color);
+ }
+
+ #{$parent}:hover .badge,
+ #{$parent}:focus:hover .badge,
+ #{$parent}:active .badge,
+ #{$parent}.active .badge,
+ .show > #{$parent}.dropdown-toggle .badge {
+ background: $color-hover;
+ border-color: $color-hover;
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_card.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_card.scss
new file mode 100644
index 0000000..c766c67
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_card.scss
@@ -0,0 +1,32 @@
+// Cards
+// *******************************************************************************
+
+// color border bottom and shadow in card
+@mixin template-card-border-shadow-variant($parent, $background) {
+ $border-color: shade-color($background, $card-border-color-scale, $card-bg);
+ .card {
+ {$parent} {
+ &::after {
+ border-bottom-color: $border-color;
+ }
+ &:hover {
+ &::after {
+ border-bottom-color: $background;
+ }
+ }
+ }
+ }
+}
+
+// card hover border color
+@mixin template-card-hover-border-variant($parent, $background) {
+ $border-color: shade-color($background, $card-hover-border-scale, $card-bg);
+ .card {
+ {$parent},
+ #{$parent} {
+ &:hover {
+ border-color: $border-color;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_caret.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_caret.scss
new file mode 100644
index 0000000..cd4b1df
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_caret.scss
@@ -0,0 +1,64 @@
+// * Carets
+// *******************************************************************************
+
+@mixin caret-up($caret-width) {
+ margin-top: 0.97 * divide($caret-width, 2);
+ margin-left: 0.8em;
+ width: $caret-width;
+ height: $caret-width;
+ border: 2px solid;
+ border-bottom: 0;
+ border-left: 0;
+ transform: rotate(-45deg);
+ @include rtl-style {
+ margin-right: 0.8em !important;
+ margin-left: 0 !important;
+ }
+}
+
+@mixin caret-down($caret-width) {
+ margin-top: -1.08 * divide($caret-width, 2);
+ margin-left: 0.8em;
+ width: $caret-width;
+ height: $caret-width;
+ border: 2px solid;
+ border-top: 0;
+ border-left: 0;
+ transform: rotate(45deg);
+ @include rtl-style {
+ margin-right: 0.8em !important;
+ margin-left: 0 !important;
+ }
+}
+
+@mixin caret-left($caret-width) {
+ margin-top: 0;
+ margin-right: 0.5em;
+ width: $caret-width;
+ height: $caret-width;
+ border: 2px solid;
+ border-top: 0;
+ border-right: 0;
+ transform: rotate(45deg);
+ @include rtl-style {
+ margin-right: 0 !important;
+ margin-left: $caret-spacing !important;
+ transform: rotate(225deg);
+ }
+}
+
+@mixin caret-right($caret-width) {
+ margin-top: 0;
+ margin-right: 0.5em;
+ width: $caret-width;
+ height: $caret-width;
+ border: 2px solid;
+ border-top: 0;
+ border-left: 0;
+ transform: rotate(-45deg);
+ @include rtl-style {
+ margin-left: 0 !important;
+ margin-right: $caret-spacing !important;
+ transform: rotate(135deg);
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_dropdown.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_dropdown.scss
new file mode 100644
index 0000000..05f4c00
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_dropdown.scss
@@ -0,0 +1,33 @@
+// * Dropdowns
+// *******************************************************************************
+
+@mixin template-dropdown-variant($parent, $background, $color: null) {
+ #{$parent} .dropdown-item {
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($color, 0.2) 0,
+ rgba($color, 0.3) 40%,
+ rgba($color, 0.4) 50%,
+ rgba($color, 0.5) 60%,
+ rgba($white, 0) 70%
+ );
+ }
+ }
+ &:not(.disabled).active,
+ &:not(.disabled):active {
+ background-color: $background;
+ color: if($color, $color, color-contrast($background)) !important;
+ }
+ }
+
+ #{$parent}.dropdown-menu > li:not(.disabled) > a:not(.dropdown-item):active,
+ #{$parent}.dropdown-menu > li.active:not(.disabled) > a:not(.dropdown-item) {
+ background-color: $background;
+ color: if($color, $color, color-contrast($background)) !important;
+ }
+}
+
+@mixin template-dropdown-theme($background, $color: null) {
+ @include template-dropdown-variant('', $background, $color);
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_forms.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_forms.scss
new file mode 100644
index 0000000..d5270c0
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_forms.scss
@@ -0,0 +1,361 @@
+// * Form controls
+// *******************************************************************************
+
+// Form control
+@mixin template-form-control-theme($color) {
+ .form-control:focus,
+ .form-select:focus {
+ border-color: $color !important;
+ }
+
+ // Using :focus-within to apply focus border color to default and merged input-group
+ .input-group {
+ &:focus-within {
+ .form-control,
+ .input-group-text {
+ border-color: $color !important;
+ }
+ }
+ }
+}
+
+// Float labels
+@mixin template-float-label-theme($color) {
+ .form-floating {
+ > .form-control:focus,
+ > .form-control:focus:not(:placeholder-shown),
+ > .form-select:focus,
+ > .form-select:focus:not(:placeholder-shown) {
+ ~ label {
+ color: $color;
+ }
+ }
+ }
+}
+
+// Form Switch
+@mixin template-form-switch-theme($background) {
+ $focus-color: $background;
+ $focus-bg-image: str-replace(str-replace($form-switch-focus-bg-image, '#{$form-switch-color}', $white), '#', '%23');
+
+ $checked-color: $component-active-color;
+ $checked-bg-image: str-replace(
+ str-replace($form-switch-checked-bg-image, '#{$form-switch-checked-color}', $checked-color),
+ '#',
+ '%23'
+ );
+
+ .form-switch {
+ .form-check-input {
+ &:focus {
+ background-image: escape-svg($focus-bg-image);
+ }
+
+ &:checked {
+ @if $enable-gradients {
+ background-image: escape-svg($checked-bg-image), var(--#{$variable-prefix}gradient);
+ } @else {
+ background-image: escape-svg($checked-bg-image);
+ }
+ }
+ }
+ }
+}
+
+// File Input
+@mixin template-file-input-theme($color) {
+ .form-control:focus ~ .form-label {
+ border-color: $color;
+
+ &::after {
+ border-color: inherit;
+ }
+ }
+}
+
+// Form Check
+@mixin template-form-check-variant($parent, $background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+ $focus-border: $background;
+ $focus-color: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity);
+
+ #{$parent} .form-check-input {
+ &:checked {
+ background-color: $background;
+ border-color: $background;
+ box-shadow: 0 2px 6px 0 rgba($background, 0.3);
+ }
+
+ &[type='checkbox']:indeterminate {
+ background-color: $background;
+ border-color: $background;
+ box-shadow: 0 2px 6px 0 rgba($background, 0.3);
+ }
+ }
+
+ // Custom options
+ #{$parent}.custom-option {
+ &.checked {
+ border: $input-focus-border-width solid $background !important;
+ margin: 0;
+ .custom-option-body,
+ .custom-option-header {
+ i {
+ color: $background;
+ }
+ }
+ }
+ &.custom-option-label {
+ &.checked {
+ background-color: rgba($background, 0.12);
+ color: $background;
+ .custom-option-header span,
+ .custom-option-title {
+ color: $background;
+ }
+ }
+ }
+ }
+}
+
+@mixin template-form-check-theme($background, $color: null) {
+ @include template-form-check-variant('', $background, $color);
+}
+
+// Form Validation
+
+@mixin form-validation-state(
+ $state: null,
+ $color: null,
+ $icon: null,
+ $tooltip-color: null,
+ $tooltip-bg-color: null,
+ $focus-box-shadow: null,
+ $border-color: null
+) {
+}
+
+@mixin template-form-validation-state(
+ $state,
+ $color,
+ $icon,
+ $tooltip-color: color-contrast($color),
+ $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
+ $focus-box-shadow: none,
+ $border-color: $color
+) {
+ .#{$state}-feedback {
+ display: none;
+ width: 100%;
+ margin-top: $form-feedback-margin-top;
+ @include font-size($form-feedback-font-size);
+ font-style: $form-feedback-font-style;
+ color: $color;
+ }
+
+ .#{$state}-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%; // Contain to parent when possible
+ padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;
+ margin-top: 0.1rem;
+ @include font-size($form-feedback-tooltip-font-size);
+ line-height: $form-feedback-tooltip-line-height;
+ color: $tooltip-color;
+ background-color: $tooltip-bg-color;
+ @include border-radius($form-feedback-tooltip-border-radius);
+ }
+
+ @include form-validation-state-selector($state) {
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+
+ .form-control {
+ @include form-validation-state-selector($state) {
+ border-color: $color !important;
+ border-width: $input-focus-border-width;
+ ~ .input-group-text {
+ border-width: $input-focus-border-width;
+ }
+
+ .dark-style & {
+ border-color: $color !important;
+ }
+
+ @if $enable-validation-icons {
+ background-image: escape-svg($icon);
+ background-repeat: no-repeat;
+ background-size: $input-height-inner-half $input-height-inner-half;
+
+ @include ltr-style {
+ padding-right: $input-height-inner;
+ background-position: right $input-height-inner-quarter center;
+ }
+ @include rtl-style {
+ padding-left: $input-height-inner;
+ background-position: left $input-height-inner-quarter center;
+ }
+ }
+
+ &:focus {
+ border-color: $color !important;
+ box-shadow: $focus-box-shadow;
+ }
+ }
+ }
+
+ // StyleLint-disable-next-line selector-no-qualifying-type
+ textarea.form-control {
+ @include form-validation-state-selector($state) {
+ @if $enable-validation-icons {
+ @include ltr-style {
+ padding-right: $input-height-inner;
+ background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
+ }
+ @include rtl-style {
+ padding-left: $input-height-inner;
+ background-position: top $input-height-inner-quarter left $input-height-inner-quarter;
+ }
+ }
+ }
+ }
+
+ .form-select {
+ @include form-validation-state-selector($state) {
+ border-color: $color !important;
+ background-image: escape-svg($form-select-indicator), escape-svg($icon);
+ border-width: $input-focus-border-width;
+ ~ .input-group-text {
+ border-width: $input-focus-border-width;
+ }
+ @include ltr-style {
+ background-position: $form-select-bg-position, $form-select-feedback-icon-position;
+ }
+ @include rtl-style {
+ background-position:
+ left $form-select-padding-x center,
+ center left $form-select-indicator-padding; // RTL
+ }
+
+ @if $enable-validation-icons {
+ background-size: $form-select-bg-size, $form-select-feedback-icon-size;
+ @include ltr-style {
+ background-image: escape-svg($form-select-indicator), escape-svg($icon);
+ padding-right: $form-select-feedback-icon-padding-end;
+ background-position: $form-select-bg-position, $form-select-feedback-icon-position;
+ }
+ @include rtl-style {
+ background-image: escape-svg($form-select-indicator), escape-svg($icon);
+ padding-left: $form-select-feedback-icon-padding-end;
+ background-position:
+ left $form-select-padding-x center,
+ center left $form-select-indicator-padding; // RTL
+ }
+ }
+
+ &:focus {
+ border-color: $color;
+ box-shadow: $focus-box-shadow;
+ }
+ }
+ }
+ .form-switch .form-check-input {
+ @include form-validation-state-selector($state) {
+ background-color: $color;
+ }
+ }
+ .form-check-input {
+ @include form-validation-state-selector($state) {
+ border-color: $color;
+
+ &:checked {
+ background-color: $color;
+ border-color: $color;
+ }
+
+ &:active {
+ box-shadow: $focus-box-shadow;
+ border-color: $color;
+ }
+
+ ~ .form-check-label {
+ color: $color;
+ }
+ }
+ }
+ .form-check-inline .form-check-input {
+ ~ .#{$state}-feedback {
+ @include ltr-style {
+ margin-left: 0.5em;
+ }
+ @include rtl-style {
+ margin-right: 0.5em;
+ }
+ }
+ }
+ // On validation .input-group & .input-group-merged, setup proper border color & box-shadow
+ .input-group {
+ .form-control {
+ @include form-validation-state-selector($state) {
+ ~ .input-group-text {
+ border-color: $color !important;
+ }
+ &:focus {
+ border-color: $color !important;
+ box-shadow: none;
+ // ? .input-group has .input-group-text last/sibling
+ ~ .input-group-text {
+ border-color: $color !important;
+ }
+ }
+ }
+ }
+ }
+
+ .form-control {
+ @include form-validation-state-selector($state) {
+ &:focus {
+ .input-group & {
+ box-shadow: none;
+ }
+ }
+ }
+ }
+
+ .input-group .form-control,
+ .input-group .form-select {
+ @include form-validation-state-selector($state) {
+ z-index: 3;
+ }
+ }
+
+ @if ($state == 'invalid') {
+ .was-validated .input-group:has(.input-group-text):has(.form-control:invalid) .input-group-text,
+ .input-group:has(.input-group-text):has(.form-control.is-invalid) .input-group-text {
+ border-color: $color;
+ }
+ .was-validated .input-group:has(input:invalid) {
+ .#{$state}-feedback,
+ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+ }
+ @if ($state == 'valid') {
+ .was-validated .input-group:has(.input-group-text):has(.form-control:valid) .input-group-text,
+ .input-group:has(.input-group-text):has(.form-control.is-valid) .input-group-text {
+ border-color: $color;
+ }
+ .was-validated .input-group:has(input:valid) {
+ .#{$state}-feedback,
+ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_list-group.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_list-group.scss
new file mode 100644
index 0000000..50acaf4
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_list-group.scss
@@ -0,0 +1,86 @@
+// List groups
+// *******************************************************************************
+
+@mixin list-group-item-variant($state: null, $background: null, $color: null) {
+}
+
+// Basic List groups
+@mixin template-list-group-item-variant($parent, $background, $color: null) {
+ $border-color: if(
+ $dark-style,
+ shift-color($background, -$list-group-item-border-scale, $card-bg),
+ shift-color($background, $list-group-item-border-scale, $card-bg)
+ );
+ $background-color: if(
+ $dark-style,
+ shift-color($background, -$list-group-item-bg-scale, $card-bg),
+ shift-color($background, $list-group-item-bg-scale, $card-bg)
+ );
+ $border-color: if(
+ $dark-style,
+ if(
+ $parent == '.list-group-item-dark',
+ color-contrast($background),
+ shift-color($background, -$list-group-item-color-scale, $card-bg)
+ ),
+ shift-color($background, $list-group-item-color-scale, $card-bg)
+ );
+ $color: shift-color($background, $list-group-item-color-scale);
+ $hover-background: shade-color($background-color, $list-group-item-bg-hover-scale);
+ #{$parent} {
+ border-color: $border-color;
+ background-color: $background-color;
+ color: $color !important;
+ }
+
+ a#{$parent},
+ button#{$parent} {
+ color: $color;
+ &:hover,
+ &:focus {
+ border-color: $border-color;
+ background-color: $hover-background;
+ color: $color;
+ }
+
+ &.active {
+ border-color: $border-color !important;
+ background-color: $background !important;
+ // color: if($color, $color, color-contrast($background));
+ color: color-contrast($background) !important;
+ }
+ }
+}
+
+@mixin template-list-group-theme($background, $color: null) {
+ @include template-list-group-item-variant('.list-group-item-primary', $background);
+
+ .list-group-item.active {
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg);
+ color: $background;
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($background, 0.2) 0,
+ rgba($background, 0.3) 40%,
+ rgba($background, 0.4) 50%,
+ rgba($background, 0.5) 60%,
+ rgba($black, 0) 70%
+ );
+ }
+ }
+ }
+}
+
+@mixin template-list-group-timeline-variant($parent, $background) {
+ .list-group {
+ &.list-group-timeline {
+ #{$parent} {
+ &:before {
+ border-color: $background;
+ background-color: $background;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_misc.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_misc.scss
new file mode 100644
index 0000000..9c79146
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_misc.scss
@@ -0,0 +1,158 @@
+// * Light/Dark layout
+// *******************************************************************************
+@mixin light-layout-only() {
+ @if $dark-style {
+ html:not(.dark-style) {
+ @content;
+ }
+ } @else {
+ @content;
+ }
+}
+
+@mixin dark-layout-only() {
+ @if $dark-style {
+ .dark-style {
+ @content;
+ }
+ }
+}
+
+// * RTL/LTR
+// *******************************************************************************
+
+@mixin ltr-only() {
+ @if $rtl-support {
+ html:not([dir='rtl']) {
+ @content;
+ }
+ } @else {
+ @content;
+ }
+}
+
+@mixin rtl-only() {
+ @if $rtl-support {
+ [dir='rtl'] {
+ @content;
+ }
+ }
+}
+
+@mixin ltr-style() {
+ @if $rtl-support {
+ html:not([dir='rtl']) & {
+ @content;
+ }
+ } @else {
+ @content;
+ }
+}
+
+@mixin rtl-style() {
+ @if $rtl-support {
+ [dir='rtl'] & {
+ @content;
+ }
+ }
+}
+
+// * Keyframes
+// *******************************************************************************
+
+@mixin keyframes($name) {
+ @-webkit-keyframes #{$name} {
+ @content;
+ }
+
+ @-moz-keyframes #{$name} {
+ @content;
+ }
+
+ @keyframes #{$name} {
+ @content;
+ }
+}
+
+// * Colors
+// *******************************************************************************
+
+@mixin bg-color-variant($parent, $color, $rth-color: #000) {
+ #{$parent} {
+ background-color: $color !important;
+ }
+
+ a#{$parent} {
+ &:hover,
+ &:focus {
+ background-color: rgba-to-hex(rgba($color, 0.95), $background: $rth-color) !important;
+ }
+ }
+
+ //! Fix: Dropdown notification read badge bg color
+ .dropdown-notifications-item:not(.mark-as-read) {
+ .dropdown-notifications-read span {
+ background-color: $color;
+ }
+ }
+}
+
+@mixin bg-variant($parent, $color, $rth-color: #000) {
+ @include bg-color-variant($parent, $color);
+}
+@mixin bg-glow-variant($parent, $color) {
+ #{$parent} {
+ &.bg-glow {
+ box-shadow: 0px 2px 3px 0px rgba($color, 0.3);
+ }
+ }
+}
+
+// BG Label
+@mixin bg-label-variant($parent, $background, $color: $background) {
+ $label-background: if(
+ $dark-style,
+ shade-color($background, $btn-label-bg-shade-amount, $card-bg),
+ tint-color($background, $btn-label-bg-tint-amount, $card-bg)
+ );
+ #{$parent} {
+ background-color: $label-background !important;
+ color: if($color, $color, color-contrast($bg)) !important;
+ }
+}
+
+// BG hover: label to solid
+@mixin bg-label-hover-variant($parent, $background, $color: $background) {
+ $label-background: if(
+ $dark-style,
+ shade-color($background, $btn-label-bg-shade-amount, $card-bg),
+ tint-color($background, $btn-label-bg-tint-amount, $card-bg)
+ );
+ #{$parent} {
+ background-color: $label-background !important;
+ color: if($color, $color, color-contrast($bg)) !important;
+ &:hover {
+ background-color: $background !important;
+ color: $white !important;
+ }
+ }
+}
+
+@mixin bg-gradient-variant($parent, $background, $deg: 45deg) {
+ #{$parent} {
+ background-image: linear-gradient($deg, $background, rgba-to-hex(rgba($background, 0.5))) !important;
+ }
+}
+
+@mixin text-variant($parent, $color) {
+ #{$parent} {
+ color: $color !important;
+ }
+ //! Fix: text-body hover color
+ .text-body,
+ .text-heading {
+ &[href]:hover {
+ color: shift-color($color, $link-shade-percentage) !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_modal.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_modal.scss
new file mode 100644
index 0000000..e838924
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_modal.scss
@@ -0,0 +1,20 @@
+// Modal
+// *******************************************************************************
+
+@mixin template-modal-onboarding-theme($background, $color) {
+ .modal-onboarding {
+ .carousel-indicators {
+ [data-bs-target] {
+ background-color: $background;
+ }
+ }
+ }
+ .carousel-control-prev,
+ .carousel-control-next {
+ color: $background;
+ &:hover,
+ &:focus {
+ color: $background;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_navs.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_navs.scss
new file mode 100644
index 0000000..85900ed
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_navs.scss
@@ -0,0 +1,101 @@
+// Navs
+// *******************************************************************************
+
+@mixin template-nav-size($padding-y, $padding-x, $font-size, $line-height) {
+ > .nav .nav-link,
+ &.nav .nav-link {
+ padding: $padding-y $padding-x;
+ font-size: $font-size;
+ line-height: $line-height;
+ }
+}
+
+@mixin template-nav-variant($parent, $background, $color: null) {
+ $pills-selector: if($parent== '', '.nav-pills', '#{$parent}.nav-pills, #{$parent} > .nav-pills');
+
+ #{$pills-selector} .nav-link.active {
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ &,
+ &:hover,
+ &:focus {
+ background-color: $background;
+ color: if($color, $color, color-contrast($background));
+ }
+ }
+
+ #{$parent}.nav-tabs {
+ .nav-link {
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($background, 0.2) 0,
+ rgba($background, 0.3) 40%,
+ rgba($background, 0.4) 50%,
+ rgba($background, 0.5) 60%,
+ rgba($white, 0) 70%
+ );
+ }
+ }
+ }
+ }
+
+ #{$parent}.nav-tabs .nav-link.active,
+ #{$parent}.nav-tabs .nav-link.active {
+ &,
+ &:hover,
+ &:focus {
+ box-shadow: 0 -2px 0 $background inset;
+ }
+ }
+
+ .nav-align-bottom .nav-tabs .nav-link.active,
+ .nav-align-bottom .nav-tabs .nav-link.active {
+ &,
+ &:hover,
+ &:focus {
+ box-shadow: 0 2px 0 $background inset;
+ }
+ }
+
+ .nav-align-left .nav-tabs .nav-link.active,
+ .nav-align-left .nav-tabs .nav-link.active {
+ &,
+ &:hover,
+ &:focus {
+ box-shadow: -2px 0px 0 $background inset;
+ }
+ }
+
+ .nav-align-right .nav-tabs .nav-link.active,
+ .nav-align-right .nav-tabs .nav-link.active {
+ &,
+ &:hover,
+ &:focus {
+ box-shadow: 2px 0px 0 $background inset;
+ }
+ }
+
+ @include rtl-only {
+ .nav-align-left .nav-tabs .nav-link.active,
+ .nav-align-left .nav-tabs .nav-link.active {
+ &,
+ &:hover,
+ &:focus {
+ box-shadow: 2px 0px 0 $background inset;
+ }
+ }
+
+ .nav-align-right .nav-tabs .nav-link.active,
+ .nav-align-right .nav-tabs .nav-link.active {
+ &,
+ &:hover,
+ &:focus {
+ box-shadow: -2px 0px 0 $background inset;
+ }
+ }
+ }
+}
+
+@mixin template-nav-theme($background, $color: null) {
+ @include template-nav-variant('', $background, $color);
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_pagination.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_pagination.scss
new file mode 100644
index 0000000..f08551a
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_pagination.scss
@@ -0,0 +1,73 @@
+// Pagination
+// *******************************************************************************
+
+// Basic Pagination
+@mixin template-pagination-variant($parent, $background, $color: null) {
+ $hover-background: if(
+ $dark-style,
+ shade-color($background, $pagination-hover-bg-scale, $rgba-to-hex-bg),
+ tint-color($background, $pagination-hover-bg-scale, $rgba-to-hex-bg)
+ );
+ #{$parent} .page-item .page-link,
+ #{$parent}.pagination li > a:not(.page-link) {
+ &:hover,
+ &:focus {
+ background-color: $hover-background;
+ color: $background;
+ }
+ }
+ #{$parent} .page-item.active .page-link,
+ #{$parent}.pagination li.active > a:not(.page-link) {
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ &,
+ &:hover,
+ &:focus {
+ border-color: $background;
+ background-color: $background;
+ color: if($color, $color, color-contrast($background));
+ }
+ }
+ #{$parent} .page-item .page-link,
+ #{$parent}.pagination li > a:not(.page-link) {
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($background, 0.2) 0,
+ rgba($background, 0.3) 40%,
+ rgba($background, 0.4) 50%,
+ rgba($background, 0.5) 60%,
+ rgba($black, 0) 70%
+ );
+ }
+ }
+ }
+}
+
+// Pagination Outline Variant
+@mixin template-pagination-outline-variant($parent, $background, $color: null) {
+ #{$parent} .page-item.active .page-link,
+ #{$parent}.pagination li.active > a:not(.page-link) {
+ &,
+ &:hover,
+ &:focus {
+ border-color: $background !important;
+ color: $background !important;
+ background-color: rgba-to-hex(rgba($background, 0.16), $card-bg) !important;
+ }
+ &.waves-effect {
+ .waves-ripple {
+ background: radial-gradient(
+ rgba($background, 0.2) 0,
+ rgba($background, 0.3) 40%,
+ rgba($background, 0.4) 50%,
+ rgba($background, 0.5) 60%,
+ rgba($black, 0) 70%
+ );
+ }
+ }
+ }
+}
+
+@mixin template-pagination-theme($background, $color: null) {
+ @include template-pagination-variant('', $background, $color);
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_popover.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_popover.scss
new file mode 100644
index 0000000..94b07fd
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_popover.scss
@@ -0,0 +1,53 @@
+// Popovers
+// *******************************************************************************
+
+@mixin template-popover-variant($parent, $background, $color: null) {
+ $color: if($color, $color, color-contrast($background));
+
+ #{$parent} {
+ border-color: transparent;
+ background: $background;
+
+ .popover-header {
+ border-color: $background;
+ background: transparent;
+ color: $color;
+ }
+
+ .popover-body {
+ background: transparent;
+ color: rgba($color, 0.8);
+ }
+
+ > .popover-arrow::before {
+ border-color: transparent;
+ }
+ &.bs-popover-auto {
+ &[data-popper-placement='top'] > .popover-arrow::after {
+ border-top-color: $background !important;
+ }
+
+ &[data-popper-placement='right'] > .popover-arrow::after {
+ border-right-color: $background !important;
+ @include rtl-style {
+ border-left-color: $background !important;
+ }
+ }
+
+ &[data-popper-placement='bottom'] > .popover-arrow::after {
+ border-bottom-color: $background !important;
+ }
+
+ &[data-popper-placement='left'] > .popover-arrow::after {
+ border-left-color: $background !important;
+ @include rtl-style {
+ border-right-color: $background !important;
+ }
+ }
+
+ &[data-popper-placement='bottom'] .popover-header::before {
+ border-bottom: 1px solid transparent !important;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_progress.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_progress.scss
new file mode 100644
index 0000000..02f92f2
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_progress.scss
@@ -0,0 +1,14 @@
+// Progress bars
+// *******************************************************************************
+
+@mixin template-progress-bar-theme($background, $color: null) {
+ .progress-bar {
+ background-color: $background;
+ color: if($color, $color, color-contrast($background));
+ }
+}
+@mixin template-progress-shadow-theme($parent, $background) {
+ #{$parent} {
+ box-shadow: 0 0.125rem 0.375rem 0 rgba($background, 0.3);
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_table-variants.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_table-variants.scss
new file mode 100644
index 0000000..8f94d41
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_table-variants.scss
@@ -0,0 +1,26 @@
+// Tables
+// *******************************************************************************
+
+@mixin template-table-variant($parent, $background, $layout-color: $white) {
+ .table-#{$parent} {
+ $color: color-contrast(opaque($body-bg, $background));
+ $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));
+ $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));
+ $active-bg: mix($color, $background, percentage($table-active-bg-factor));
+
+ --#{$variable-prefix}table-bg: #{$background};
+ --#{$variable-prefix}table-striped-bg: #{$striped-bg};
+ --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};
+ --#{$variable-prefix}table-active-bg: #{$active-bg};
+ --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};
+ --#{$variable-prefix}table-hover-bg: #{$hover-bg};
+ --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};
+
+ color: $color;
+ border-color: mix($color, $background, percentage($table-border-factor));
+ .btn-icon,
+ .btn {
+ color: $color;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap-extended/mixins/_tooltip.scss b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_tooltip.scss
new file mode 100644
index 0000000..93657ba
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap-extended/mixins/_tooltip.scss
@@ -0,0 +1,35 @@
+// Tooltips
+// *******************************************************************************
+
+@mixin template-tooltip-variant($parent, $background, $color: null) {
+ #{$parent} {
+ .tooltip-inner {
+ background: $background;
+ color: if($color, $color, color-contrast($background));
+ }
+
+ &.bs-tooltip-auto {
+ &[data-popper-placement='top'] .tooltip-arrow::before {
+ border-top-color: $background;
+ }
+
+ &[data-popper-placement='left'] .tooltip-arrow::before {
+ border-left-color: $background;
+ @include rtl-style {
+ border-right-color: $background;
+ }
+ }
+
+ &[data-popper-placement='bottom'] .tooltip-arrow::before {
+ border-bottom-color: $background;
+ }
+
+ &[data-popper-placement='right'] .tooltip-arrow::before {
+ border-right-color: $background;
+ @include rtl-style {
+ border-left-color: $background;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_bootstrap.scss b/resources/assets/vendor/scss/_bootstrap.scss
new file mode 100644
index 0000000..cbf6f2a
--- /dev/null
+++ b/resources/assets/vendor/scss/_bootstrap.scss
@@ -0,0 +1,43 @@
+@import 'bootstrap/scss/mixins/banner';
+@include bsBanner('');
+
+@import '_bootstrap-extended/include';
+
+// Import bootstrap core scss from node_module
+// ! Utilities are customized and added in bootstrap-extended
+
+// Layout & components
+@import 'bootstrap/scss/root';
+@import 'bootstrap/scss/reboot';
+@import 'bootstrap/scss/type';
+@import 'bootstrap/scss/images';
+@import 'bootstrap/scss/containers';
+@import 'bootstrap/scss/grid';
+@import 'bootstrap/scss/tables';
+@import 'bootstrap/scss/forms';
+@import 'bootstrap/scss/buttons';
+@import 'bootstrap/scss/transitions';
+@import 'bootstrap/scss/dropdown';
+@import 'bootstrap/scss/button-group';
+@import 'bootstrap/scss/nav';
+@import 'bootstrap/scss/navbar';
+@import 'bootstrap/scss/card';
+@import 'bootstrap/scss/accordion';
+@import 'bootstrap/scss/breadcrumb';
+@import 'bootstrap/scss/pagination';
+@import 'bootstrap/scss/badge';
+@import 'bootstrap/scss/alert';
+@import 'bootstrap/scss/progress';
+@import 'bootstrap/scss/list-group';
+@import 'bootstrap/scss/close';
+@import 'bootstrap/scss/toasts';
+@import 'bootstrap/scss/modal';
+@import 'bootstrap/scss/tooltip';
+@import 'bootstrap/scss/popover';
+@import 'bootstrap/scss/carousel';
+@import 'bootstrap/scss/spinners';
+@import 'bootstrap/scss/offcanvas';
+@import 'bootstrap/scss/placeholders';
+
+// Helpers
+@import 'bootstrap/scss/helpers';
diff --git a/resources/assets/vendor/scss/_colors-dark.scss b/resources/assets/vendor/scss/_colors-dark.scss
new file mode 100644
index 0000000..9af501a
--- /dev/null
+++ b/resources/assets/vendor/scss/_colors-dark.scss
@@ -0,0 +1,136 @@
+@import '_components/include-dark';
+
+// * Custom colors
+// *******************************************************************************
+
+$facebook: #3b5998 !default;
+$twitter: #1da1f2 !default;
+$google-plus: #dd4b39 !default;
+$instagram: #e1306c !default;
+$linkedin: #0077b5 !default;
+$github: #cfcde4 !default;
+$dribbble: #ea4c89 !default;
+$pinterest: #cb2027 !default;
+$slack: #4a154b !default;
+$reddit: #ff4500 !default;
+$youtube: #ff0000 !default;
+$vimeo: #1ab7ea !default;
+
+$custom-colors: (
+ 'facebook': $facebook,
+ 'twitter': $twitter,
+ 'google-plus': $google-plus,
+ 'instagram': $instagram,
+ 'linkedin': $linkedin,
+ 'github': $github,
+ 'dribbble': $dribbble,
+ 'pinterest': $pinterest,
+ 'slack': $slack,
+ 'reddit': $reddit,
+ 'youtube': $youtube,
+ 'vimeo': $vimeo
+) !default;
+
+:root {
+ @each $color, $value in $custom-colors {
+ --#{$prefix}#{$color}: #{$value};
+ }
+}
+
+@each $color-name, $color-value in $custom-colors {
+ @include bg-variant('.bg-#{$color-name}', $color-value);
+ @include bg-label-variant('.bg-label-#{$color-name}', $color-value);
+ @include bg-label-hover-variant('.bg-label-hover-#{$color-name}', $color-value);
+
+ @include template-button-variant('.btn-#{$color-name}', $color-value);
+ @include template-button-label-variant('.btn-label-#{$color-name}', $color-value);
+ @include template-button-outline-variant('.btn-outline-#{$color-name}', $color-value);
+ @include template-button-text-variant('.btn-text-#{$color-name}', $color-value);
+}
+
+// * Bootstrap colors (Uncomment required colors)
+// *******************************************************************************
+
+$bootstrap-colors: (
+ // blue: $blue,
+ // indigo: $indigo,
+ // purple: $purple,
+ // pink: $pink,
+ // orange: $orange,
+ // teal: $teal
+) !default;
+
+@each $color-name, $color-value in $bootstrap-colors {
+ @include bg-variant('.bg-#{$color-name}', $color-value);
+ @include bg-label-variant('.bg-label-#{$color-name}', $color-value);
+ @include bg-label-hover-variant('.bg-label-hover-#{$color-name}', $color-value);
+ @include bg-gradient-variant('.bg-gradient-#{$color-name}', $color-value);
+
+ .border-#{$color-name} {
+ border-color: $color-value !important;
+ }
+
+ @include template-button-variant('.btn-#{$color-name}', $color-value);
+ @include template-button-label-variant('.btn-label-#{$color-name}', $color-value);
+ @include template-button-outline-variant('.btn-outline-#{$color-name}', $color-value);
+}
+
+// * Buttons
+// *******************************************************************************
+
+@include template-button-variant('.btn-white', $white, $body-color);
+@include template-button-label-variant('.btn-label-white', $white, $body-color);
+@include template-button-outline-variant('.btn-outline-white', $white, $body-color);
+
+// ! ToDo: Custom colors (checkbox & radio)
+// *******************************************************************************
+
+$form-control-colors: (
+ black: #000,
+ white: #fff,
+ silver: #eee,
+ gray: #777,
+ gold: #ffeb3b,
+ pink: #e91e63,
+ red: #f44336
+) !default;
+
+@each $color-name, $color-value in $form-control-colors {
+ @include template-form-check-variant('.form-check-#{$color-name}', $color-value);
+}
+
+// * Navbar
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color !=primary and $color !=light {
+ @include template-navbar-style('.navbar.bg-#{$color}', $value);
+ }
+}
+
+@include template-navbar-style('.navbar.bg-white', #fff, $color: $black, $active-color: $black);
+@include template-navbar-style('.navbar.bg-light', $light, $color: $body-color, $active-color: $headings-color);
+@include template-navbar-style('.navbar.bg-lighter', $gray-50, $color: $body-color, $active-color: $headings-color);
+
+// * Footer
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color !=primary and $color !=light {
+ @include template-footer-style('.footer.bg-#{$color}', $value);
+ }
+}
+
+@include template-footer-style('.footer.bg-white', #fff, $color: #6d6b77, $active-color: #444050);
+@include template-footer-style(
+ '.footer.bg-light',
+ rgba-to-hex($gray-100, $rgba-to-hex-bg),
+ $color: $body-color,
+ $active-color: $headings-color
+);
+@include template-footer-style(
+ '.footer.bg-lighter',
+ rgba-to-hex($gray-50, $rgba-to-hex-bg),
+ $color: $body-color,
+ $active-color: $headings-color
+);
diff --git a/resources/assets/vendor/scss/_colors.scss b/resources/assets/vendor/scss/_colors.scss
new file mode 100644
index 0000000..384dc7a
--- /dev/null
+++ b/resources/assets/vendor/scss/_colors.scss
@@ -0,0 +1,126 @@
+@import '_components/include';
+
+// * Custom colors
+// *******************************************************************************
+
+$facebook: #3b5998 !default;
+$twitter: #1da1f2 !default;
+$google-plus: #dd4b39 !default;
+$instagram: #e1306c !default;
+$linkedin: #0077b5 !default;
+$github: #444050 !default;
+$dribbble: #ea4c89 !default;
+$pinterest: #cb2027 !default;
+$slack: #4a154b !default;
+$reddit: #ff4500 !default;
+$youtube: #ff0000 !default;
+$vimeo: #1ab7ea !default;
+
+$custom-colors: (
+ 'facebook': $facebook,
+ 'twitter': $twitter,
+ 'google-plus': $google-plus,
+ 'instagram': $instagram,
+ 'linkedin': $linkedin,
+ 'github': $github,
+ 'dribbble': $dribbble,
+ 'pinterest': $pinterest,
+ 'slack': $slack,
+ 'reddit': $reddit,
+ 'youtube': $youtube,
+ 'vimeo': $vimeo
+) !default;
+
+:root {
+ @each $color, $value in $custom-colors {
+ --#{$prefix}#{$color}: #{$value};
+ }
+}
+
+@each $color-name, $color-value in $custom-colors {
+ @include bg-variant('.bg-#{$color-name}', $color-value);
+ @include bg-label-variant('.bg-label-#{$color-name}', $color-value);
+ @include bg-label-hover-variant('.bg-label-hover-#{$color-name}', $color-value);
+
+ @include template-button-variant('.btn-#{$color-name}', $color-value);
+ @include template-button-label-variant('.btn-label-#{$color-name}', $color-value);
+ @include template-button-outline-variant('.btn-outline-#{$color-name}', $color-value);
+ @include template-button-text-variant('.btn-text-#{$color-name}', $color-value);
+}
+
+// * Bootstrap colors (Uncomment required colors)
+// *******************************************************************************
+
+$bootstrap-colors: (
+ // blue: $blue,
+ // indigo: $indigo,
+ // purple: $purple,
+ // pink: $pink,
+ // orange: $orange,
+ // teal: $teal
+) !default;
+
+@each $color-name, $color-value in $bootstrap-colors {
+ @include bg-variant('.bg-#{$color-name}', $color-value);
+ @include bg-label-variant('.bg-label-#{$color-name}', $color-value);
+ @include bg-label-hover-variant('.bg-label-hover-#{$color-name}', $color-value);
+ @include bg-gradient-variant('.bg-gradient-#{$color-name}', $color-value);
+
+ .border-#{$color-name} {
+ border-color: $color-value !important;
+ }
+
+ @include template-button-variant('.btn-#{$color-name}', $color-value);
+ @include template-button-label-variant('.btn-label-#{$color-name}', $color-value);
+ @include template-button-outline-variant('.btn-outline-#{$color-name}', $color-value);
+}
+
+// * Buttons
+// *******************************************************************************
+
+@include template-button-variant('.btn-white', $white, $body-color);
+@include template-button-label-variant('.btn-label-white', $white, $body-color);
+@include template-button-outline-variant('.btn-outline-white', $white, $body-color);
+
+// ! ToDo: Custom colors (checkbox & radio)
+// *******************************************************************************
+
+$form-control-colors: (
+ black: #000,
+ white: #fff,
+ silver: #eee,
+ gray: #777,
+ gold: #ffeb3b,
+ pink: #e91e63,
+ red: #f44336
+) !default;
+
+@each $color-name, $color-value in $form-control-colors {
+ @include template-form-check-variant('.form-check-#{$color-name}', $color-value);
+}
+
+// * Navbar
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color !=primary and $color !=light {
+ @include template-navbar-style('.navbar.bg-#{$color}', $value);
+ }
+}
+
+@include template-navbar-style('.navbar.bg-white', #fff, $color: $black, $active-color: $black);
+@include template-navbar-style('.navbar.bg-light', $light, $color: $body-color, $active-color: $headings-color);
+@include template-navbar-style('.navbar.bg-lighter', $gray-50, $color: $body-color, $active-color: $headings-color);
+
+// * Footer
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color !=primary and $color !=light {
+ @include template-footer-style('.footer.bg-#{$color}', $value);
+ }
+}
+
+@include template-footer-style('.footer.bg-white', #fff, $color: $body-color, $active-color: $headings-color);
+@include template-footer-style('.footer.bg-light', $light, $color: $body-color, $active-color: $headings-color);
+@include template-footer-style('.footer.bg-lighter', $gray-50, $color: $body-color, $active-color: $headings-color);
diff --git a/resources/assets/vendor/scss/_components-dark.scss b/resources/assets/vendor/scss/_components-dark.scss
new file mode 100644
index 0000000..b4181f8
--- /dev/null
+++ b/resources/assets/vendor/scss/_components-dark.scss
@@ -0,0 +1,16 @@
+@import '_components/include-dark';
+
+// Import components scss
+@import '_components/base';
+@import '_components/common';
+@import '_components/menu';
+@import '_components/layout';
+@import '_components/app-brand';
+@import '_components/custom-options';
+@import '_components/switch';
+@import '_components/avatar';
+@import '_components/timeline';
+@import '_components/blockui';
+@import '_components/drag-drop';
+@import '_components/text-divider';
+@import '_components/footer';
diff --git a/resources/assets/vendor/scss/_components.scss b/resources/assets/vendor/scss/_components.scss
new file mode 100644
index 0000000..e99d543
--- /dev/null
+++ b/resources/assets/vendor/scss/_components.scss
@@ -0,0 +1,16 @@
+@import '_components/include';
+
+// Import components scss
+@import '_components/base';
+@import '_components/common';
+@import '_components/menu';
+@import '_components/layout';
+@import '_components/app-brand';
+@import '_components/custom-options';
+@import '_components/switch';
+@import '_components/avatar';
+@import '_components/timeline';
+@import '_components/blockui';
+@import '_components/drag-drop';
+@import '_components/text-divider';
+@import '_components/footer';
diff --git a/resources/assets/vendor/scss/_components/_app-brand.scss b/resources/assets/vendor/scss/_components/_app-brand.scss
new file mode 100644
index 0000000..0671c29
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_app-brand.scss
@@ -0,0 +1,75 @@
+// App Brand
+// *******************************************************************************
+
+@import 'mixins/app-brand';
+
+.app-brand {
+ display: flex;
+ flex-grow: 0;
+ flex-shrink: 0;
+ overflow: hidden;
+ line-height: 1;
+ min-height: 1px;
+ align-items: center;
+}
+// For cover auth pages
+.auth-cover-brand {
+ position: absolute;
+ z-index: 1;
+ inset-block-start: 2.5rem;
+ inset-inline-start: $spacer * 1.5;
+}
+.app-brand-link {
+ display: flex;
+ align-items: center;
+}
+.app-brand-logo {
+ display: block;
+ flex-grow: 0;
+ flex-shrink: 0;
+ overflow: hidden;
+ min-height: 1px;
+
+ img,
+ svg {
+ display: block;
+ }
+}
+
+.app-brand-text {
+ flex-shrink: 0;
+ opacity: 1;
+ transition: opacity $menu-animation-duration ease-in-out;
+ margin-inline-start: 0.75rem !important;
+}
+
+.app-brand-img-collapsed {
+ display: none;
+}
+
+.app-brand .layout-menu-toggle {
+ display: block;
+}
+
+// App brand with vertical menu
+.menu-vertical .app-brand {
+ padding-right: $menu-vertical-link-padding-x + 0.25rem;
+ padding-left: $menu-vertical-link-padding-x + 0.625rem;
+}
+
+// App brand with vertical menu
+.menu-horizontal .app-brand,
+.menu-horizontal .app-brand + .menu-divider {
+ display: none !important;
+}
+
+:not(.layout-menu) > .menu-vertical.menu-collapsed:not(.layout-menu):not(:hover) {
+ @include template-app-brand-collapsed();
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .layout-menu-collapsed:not(.layout-menu-hover):not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas)
+ .layout-menu {
+ @include template-app-brand-collapsed();
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_avatar.scss b/resources/assets/vendor/scss/_components/_avatar.scss
new file mode 100644
index 0000000..1f054b1
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_avatar.scss
@@ -0,0 +1,157 @@
+// Avatar
+// *******************************************************************************
+
+// Avatar Styles
+.avatar {
+ position: relative;
+ width: $avatar-size;
+ height: $avatar-size;
+ cursor: pointer;
+ img {
+ width: 100%;
+ height: 100%;
+ }
+ // Avatar Initials if no images added
+ .avatar-initial {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ text-transform: uppercase;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $component-active-color;
+ background-color: $avatar-bg;
+ font-size: $avatar-initial;
+ }
+ // Avatar Status indication
+ &.avatar-online,
+ &.avatar-offline,
+ &.avatar-away,
+ &.avatar-busy {
+ &:after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ right: 3px;
+ width: 8px;
+ height: 8px;
+ border-radius: 100%;
+ box-shadow: 0 0 0 2px $avatar-group-border;
+ }
+ }
+ &.avatar-online:after {
+ background-color: $success;
+ }
+ &.avatar-offline:after {
+ background-color: $secondary;
+ }
+ &.avatar-away:after {
+ background-color: $warning;
+ }
+ &.avatar-busy:after {
+ background-color: $danger;
+ }
+}
+
+// Pull up avatar style
+.pull-up {
+ transition: all 0.25s ease;
+ &:hover {
+ transform: translateY(-5px);
+ box-shadow: $box-shadow;
+ z-index: 30;
+ border-radius: 50%;
+ }
+}
+
+// Avatar Sizes
+.avatar-xs {
+ @include template-avatar-style($avatar-size-xs, $avatar-size-xs, $avatar-initial-xs, 1px);
+}
+.avatar-sm {
+ @include template-avatar-style($avatar-size-sm, $avatar-size-sm, $avatar-initial-sm, 2px);
+}
+.avatar-md {
+ @include template-avatar-style($avatar-size-md, $avatar-size-md, $avatar-initial-md, 4px);
+}
+.avatar-lg {
+ @include template-avatar-style($avatar-size-lg, $avatar-size-lg, $avatar-initial-lg, 5px);
+}
+.avatar-xl {
+ @include template-avatar-style($avatar-size-xl, $avatar-size-xl, $avatar-initial-xl, 6px);
+}
+
+// Avatar Group SCSS
+.avatar-group {
+ .avatar {
+ transition: all 0.25s ease;
+ img,
+ .avatar-initial {
+ border: 2px solid $avatar-group-border;
+ // box-shadow: 0 0 0 2px $avatar-group-border, inset 0 0 0 1px rgba($black, 0.07); //0 2px 10px 0 rgba($secondary,.3);
+ }
+ .avatar-initial {
+ background-color: $avatar-bg;
+ color: $headings-color;
+ }
+ &:hover {
+ z-index: 30 !important;
+ transition: all 0.25s ease;
+ }
+ }
+}
+// Avatar Group LTR only with sizing
+@include ltr-only {
+ .avatar-group {
+ // Avatar Group Sizings
+ .avatar {
+ margin-left: -0.8rem;
+ &:first-child {
+ margin-left: 0;
+ }
+ }
+ .avatar-xs {
+ margin-left: -0.65rem;
+ }
+ .avatar-sm {
+ margin-left: -0.75rem;
+ }
+ .avatar-md {
+ margin-left: -0.9rem;
+ }
+ .avatar-lg {
+ margin-left: -1.5rem;
+ }
+ .avatar-xl {
+ margin-left: -1.75rem;
+ }
+ }
+}
+// Avatar Group RTL with sizing
+@include rtl-only {
+ .avatar-group {
+ // Avatar Group Sizings
+ .avatar {
+ margin-right: -0.8rem;
+ margin-left: 0;
+ }
+ .avatar-xs {
+ margin-right: -0.65rem;
+ }
+ .avatar-sm {
+ margin-right: -0.75rem;
+ }
+ .avatar-md {
+ margin-right: -0.9rem;
+ }
+ .avatar-lg {
+ margin-right: -1.5rem;
+ }
+ .avatar-xl {
+ margin-right: -1.75rem;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_base.scss b/resources/assets/vendor/scss/_components/_base.scss
new file mode 100644
index 0000000..5e377d5
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_base.scss
@@ -0,0 +1,183 @@
+// Base
+// *******************************************************************************
+
+body {
+ text-rendering: optimizeLegibility;
+ font-smoothing: antialiased;
+ -moz-font-feature-settings: 'liga' on;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+@include media-breakpoint-up(md) {
+ button.list-group-item {
+ outline: none;
+ }
+}
+
+// * App Overlay
+// *******************************************************************************
+
+.app-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ visibility: hidden;
+ z-index: 3;
+ transition: all 0.25s ease;
+ &.show {
+ visibility: visible;
+ }
+ @if not $dark-style {
+ .light-style & {
+ background-color: rgba($black, 0.5);
+ }
+ }
+ @if $dark-style {
+ .dark-style & {
+ background-color: rgba($modal-backdrop-bg, 0.6);
+ }
+ }
+}
+
+// * Containers
+// *******************************************************************************
+
+.container,
+.container-fluid,
+.container-xxl {
+ padding-right: $container-padding-x-sm;
+ padding-left: $container-padding-x-sm;
+
+ @include media-breakpoint-up(lg) {
+ padding-right: $container-padding-x;
+ padding-left: $container-padding-x;
+ }
+}
+
+// * Thumbnails
+// *******************************************************************************
+
+.img-thumbnail {
+ position: relative;
+ display: block;
+ img {
+ z-index: 1;
+ }
+}
+.img-thumbnail-content {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 3;
+ display: block;
+ opacity: 0;
+ transition: all 0.2s ease-in-out;
+ transform: translate(-50%, -50%);
+
+ .img-thumbnail:hover &,
+ .img-thumbnail:focus & {
+ opacity: 1;
+ }
+}
+
+// Overlay effect
+.img-thumbnail-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ display: block;
+ transition: all 0.2s ease-in-out;
+
+ .img-thumbnail:not(:hover):not(:focus) & {
+ opacity: 0 !important;
+ }
+}
+
+.img-thumbnail-shadow {
+ transition: box-shadow 0.2s;
+
+ &:hover,
+ &:focus {
+ box-shadow: 0 5px 20px rgba($black, 0.4);
+ }
+}
+
+// Zoom-in effect
+.img-thumbnail-zoom-in {
+ overflow: hidden;
+
+ img {
+ transition: all 0.3s ease-in-out;
+ transform: translate3d(0);
+ }
+
+ .img-thumbnail-content {
+ transform: translate(-50%, -50%) scale(0.6);
+ }
+
+ &:hover,
+ &:focus {
+ img {
+ transform: scale(1.1);
+ }
+
+ .img-thumbnail-content {
+ transform: translate(-50%, -50%) scale(1);
+ }
+ }
+}
+
+// * IE Fixes
+// *******************************************************************************
+
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ // Fix IE parent container height bug when containing image with fluid width
+ .card,
+ .card-body,
+ .media,
+ .flex-column,
+ .tab-content {
+ min-height: 1px;
+ }
+
+ img {
+ min-height: 1px;
+ height: auto;
+ }
+}
+
+// * RTL
+// *******************************************************************************
+
+@if $rtl-support {
+ [dir='rtl'] body {
+ text-align: right;
+ direction: rtl;
+ }
+}
+
+// * Buy now section
+// *******************************************************************************
+.buy-now {
+ .btn-buy-now {
+ position: fixed;
+ bottom: 3rem;
+
+ right: $container-padding-x;
+ @include rtl-style() {
+ left: $container-padding-x;
+ right: inherit;
+ }
+ z-index: $zindex-menu-fixed;
+ box-shadow: 0 1px 20px 1px $danger !important;
+ &:hover {
+ box-shadow: none;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_blockui.scss b/resources/assets/vendor/scss/_components/_blockui.scss
new file mode 100644
index 0000000..3b6531d
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_blockui.scss
@@ -0,0 +1,10 @@
+// Block UI
+// *******************************************************************************
+
+.blockUI {
+ &.blockOverlay,
+ &.blockMsg {
+ z-index: $zindex-modal + 1 !important;
+ color: $white !important;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_common.scss b/resources/assets/vendor/scss/_components/_common.scss
new file mode 100644
index 0000000..ceef436
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_common.scss
@@ -0,0 +1,255 @@
+// * Common
+// *******************************************************************************
+
+@use '../_bootstrap-extended/include' as light;
+
+.ui-square,
+.ui-rect,
+.ui-rect-30,
+.ui-rect-60,
+.ui-rect-67,
+.ui-rect-75 {
+ position: relative !important;
+ display: block !important;
+ padding-top: 100% !important;
+ width: 100% !important;
+}
+
+.ui-square {
+ padding-top: 100% !important;
+}
+
+.ui-rect {
+ padding-top: 50% !important;
+}
+
+.ui-rect-30 {
+ padding-top: 30% !important;
+}
+
+.ui-rect-60 {
+ padding-top: 60% !important;
+}
+
+.ui-rect-67 {
+ padding-top: 67% !important;
+}
+
+.ui-rect-75 {
+ padding-top: 75% !important;
+}
+
+.ui-square-content,
+.ui-rect-content {
+ position: absolute !important;
+ top: 0 !important;
+ right: 0 !important;
+ bottom: 0 !important;
+ left: 0 !important;
+}
+
+.text-strike-through {
+ text-decoration: line-through;
+}
+
+// * Line Clamp with ellipsis
+// *******************************************************************************
+
+$clamp-numbers: (
+ '1': 1,
+ '2': 2,
+ '3': 3
+) !default;
+
+@each $clamp-class, $clamp-value in $clamp-numbers {
+ .line-clamp-#{$clamp-class} {
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-line-clamp: $clamp-value;
+ -webkit-box-orient: vertical;
+ }
+}
+
+// * Stars
+// *******************************************************************************
+
+.ui-stars,
+.ui-star,
+.ui-star > * {
+ height: $ui-star-size;
+
+ // Disable dragging
+ -webkit-user-drag: none;
+ -khtml-user-drag: none;
+ -moz-user-drag: none;
+ -o-user-drag: none;
+ user-drag: none;
+}
+
+.ui-stars {
+ display: inline-block;
+ vertical-align: middle;
+ white-space: nowrap;
+}
+
+.ui-star {
+ position: relative;
+ display: block;
+ float: left;
+ width: $ui-star-size;
+ height: $ui-star-size;
+ text-decoration: none !important;
+ font-size: $ui-star-size;
+ line-height: 1;
+ user-select: none;
+
+ @include rtl-style {
+ float: right;
+ }
+
+ & + & {
+ margin-left: $ui-stars-spacer;
+
+ @include rtl-style {
+ margin-right: $ui-stars-spacer;
+ margin-left: 0;
+ }
+ }
+
+ > *,
+ > *::before,
+ > *::after {
+ position: absolute;
+ left: $ui-star-size * 0.5;
+ height: 100%;
+ font-size: 1em;
+ line-height: 1;
+ transform: translateX(-50%);
+
+ @include rtl-style {
+ right: $ui-star-size * 0.5;
+ left: auto;
+ transform: translateX(50%);
+ }
+ }
+
+ > * {
+ top: 0;
+ width: 100%;
+ text-align: center;
+ }
+
+ > *:first-child {
+ z-index: 10;
+ display: none;
+ overflow: hidden;
+ color: $ui-star-filled-color;
+ }
+
+ // Default icon
+ > *:last-child {
+ z-index: 5;
+ display: block;
+ }
+
+ &.half-filled > *:first-child {
+ width: 50%;
+ transform: translateX(-100%);
+
+ @include rtl-style {
+ transform: translateX(100%);
+ }
+ }
+
+ &.filled > *:first-child,
+ &.half-filled > *:first-child {
+ display: block;
+ }
+
+ &.filled > *:last-child {
+ display: none;
+ }
+}
+
+// Hoverable
+
+.ui-stars.hoverable .ui-star > *:first-child {
+ display: block;
+}
+
+// Empty stars if first star is not filled
+.ui-stars.hoverable .ui-star:first-child:not(.filled),
+.ui-stars.hoverable .ui-star:first-child:not(.half-filled) {
+ > *:first-child,
+ ~ .ui-star > *:first-child {
+ display: none;
+ }
+}
+
+.ui-stars.hoverable .ui-star.filled > *:first-child,
+.ui-stars.hoverable .ui-star.half-filled > *:first-child {
+ display: block !important;
+}
+
+.ui-stars.hoverable:hover .ui-star > *:first-child {
+ display: block !important;
+ width: 100% !important;
+ transform: translateX(-50%) !important;
+
+ @include rtl-style {
+ transform: translateX(50%) !important;
+ }
+}
+
+.ui-stars.hoverable .ui-star:hover ~ .ui-star {
+ > *:first-child {
+ display: none !important;
+ }
+
+ > *:last-child {
+ display: block !important;
+ }
+}
+
+// * Background
+// *******************************************************************************
+
+.ui-bg-cover {
+ background-color: rgba(0, 0, 0, 0);
+ background-position: center center;
+ background-size: cover;
+}
+
+.ui-bg-overlay-container,
+.ui-bg-video-container {
+ position: relative;
+
+ > * {
+ position: relative;
+ }
+}
+
+.ui-bg-overlay-container .ui-bg-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ display: block;
+}
+
+// * Styles
+// *******************************************************************************
+@if not $dark-style {
+ .light-style {
+ $ui-star-empty-color: light.$gray-200;
+
+ .ui-bordered {
+ border: 1px solid light.$border-color;
+ }
+
+ .ui-star > *:last-child {
+ color: $ui-star-empty-color;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_custom-options.scss b/resources/assets/vendor/scss/_components/_custom-options.scss
new file mode 100644
index 0000000..fe28073
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_custom-options.scss
@@ -0,0 +1,161 @@
+// Custom Options
+// *******************************************************************************
+
+// Custom option
+.custom-option {
+ padding-left: 0;
+ border: $custom-option-border-width solid $custom-option-border-color;
+ border-radius: $border-radius;
+ margin: subtract($input-focus-border-width, $custom-option-border-width);
+ &:hover {
+ border-width: $custom-option-border-width;
+ border-color: $custom-option-border-hover-color;
+ }
+ &.custom-option-image {
+ border-width: $custom-option-image-border-width !important;
+ overflow: hidden;
+ margin: 0;
+ &:hover {
+ border-width: $custom-option-image-border-width !important;
+ border-color: $custom-option-border-hover-color;
+ }
+ }
+ .custom-option-content {
+ cursor: $custom-option-cursor;
+ width: 100%;
+ }
+ .form-check-input {
+ background-color: transparent;
+ margin-inline-start: $form-check-padding-start * -1.12;
+ }
+}
+
+// Custom option basic
+.custom-option-basic {
+ .custom-option-content {
+ padding: $custom-option-padding;
+ padding-left: $custom-option-padding + $form-check-padding-start + 0.65em;
+ }
+ .custom-option-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding-bottom: 0.4375rem;
+ }
+}
+
+.custom-option-body {
+ color: $body-color;
+}
+
+// Custom option with icon
+.custom-option-icon {
+ overflow: hidden;
+ &.checked {
+ i,
+ svg {
+ color: $component-active-bg;
+ }
+ }
+ &:not(.checked) svg {
+ color: $headings-color;
+ }
+ .custom-option-content {
+ text-align: center;
+ padding: $custom-option-padding;
+ }
+ .custom-option-body {
+ display: block;
+ margin-bottom: 0.5rem;
+ i {
+ color: $headings-color;
+ &::before {
+ font-size: 1.75rem;
+ }
+ margin-bottom: 0.5rem;
+ display: block;
+ }
+ svg {
+ height: 28px;
+ width: 28px;
+ margin-bottom: 0.5rem;
+ }
+ .custom-option-title {
+ display: block;
+ font-size: $font-size-base;
+ font-weight: $font-weight-medium;
+ color: $headings-color;
+ margin-bottom: 0.5rem;
+ }
+ }
+ .form-check-input {
+ float: none !important;
+ margin: 0 !important;
+ }
+}
+
+// Custom option with image
+.custom-option-image {
+ border-width: $custom-option-image-border-width;
+ .custom-option-content {
+ padding: 0;
+ }
+ .custom-option-body {
+ img {
+ height: 100%;
+ width: 100%;
+ }
+ }
+ //radio
+ &.custom-option-image-radio {
+ .form-check-input {
+ display: none;
+ }
+ }
+ //check
+ &.custom-option-image-check {
+ position: relative;
+ .form-check-input {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ margin: 0;
+ border: 0;
+ opacity: 0;
+ border: 1px solid transparent;
+ &:checked {
+ opacity: 1;
+ }
+ }
+ &:hover {
+ .form-check-input {
+ border-color: $form-check-input-focus-border;
+ border-width: 1px;
+ opacity: 1;
+ &:checked {
+ border-color: $primary;
+ }
+ }
+ }
+ }
+}
+
+// RTL Style
+
+@include rtl-only {
+ .custom-option {
+ padding-right: 0;
+ }
+ .custom-option-basic {
+ .custom-option-content {
+ padding-right: $custom-option-padding + $form-check-padding-start;
+ padding-left: $custom-option-padding;
+ }
+ }
+ .custom-option-image.custom-option-image-check {
+ .form-check-input {
+ right: auto;
+ left: 16px;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_drag-drop.scss b/resources/assets/vendor/scss/_components/_drag-drop.scss
new file mode 100644
index 0000000..82f0008
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_drag-drop.scss
@@ -0,0 +1,13 @@
+// * RTL
+// *******************************************************************************
+
+@include rtl-only {
+ #sortable-cards {
+ flex-direction: row-reverse;
+ }
+ #image-list-1,
+ #image-list-2 {
+ flex-direction: row-reverse;
+ justify-content: flex-end;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_footer.scss b/resources/assets/vendor/scss/_components/_footer.scss
new file mode 100644
index 0000000..f701708
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_footer.scss
@@ -0,0 +1,78 @@
+// Footer
+// *******************************************************************************
+
+.footer-link {
+ display: inline-block;
+}
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container {
+ padding-inline: 1.5rem;
+ @include border-top-radius($border-radius);
+}
+.content-footer .footer-container {
+ block-size: 54px;
+}
+// Light footer
+.footer-light {
+ color: $navbar-light-color;
+
+ .footer-text {
+ color: $navbar-light-active-color;
+ }
+
+ .footer-link {
+ color: $navbar-light-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-light-hover-color;
+ }
+
+ &.disabled {
+ color: $navbar-light-disabled-color !important;
+ }
+ }
+
+ .show > .footer-link,
+ .active > .footer-link,
+ .footer-link.show,
+ .footer-link.active {
+ color: $navbar-light-active-color;
+ }
+
+ hr {
+ border-color: $menu-light-border-color;
+ }
+}
+
+// Dark footer
+.footer-dark {
+ color: $navbar-dark-color;
+
+ .footer-text {
+ color: $navbar-dark-active-color;
+ }
+
+ .footer-link {
+ color: $navbar-dark-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-dark-hover-color;
+ }
+
+ &.disabled {
+ color: $navbar-dark-disabled-color !important;
+ }
+ }
+
+ .show > .footer-link,
+ .active > .footer-link,
+ .footer-link.show,
+ .footer-link.active {
+ color: $navbar-dark-active-color;
+ }
+
+ hr {
+ border-color: $menu-dark-border-color;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_include-dark.scss b/resources/assets/vendor/scss/_components/_include-dark.scss
new file mode 100644
index 0000000..b1b6718
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_include-dark.scss
@@ -0,0 +1,13 @@
+// Include Dark
+// *******************************************************************************
+
+@import '../_bootstrap-extended/include-dark';
+
+// Mixins
+@import './_mixins'; // Components mixins
+
+//Variables
+@import '../_custom-variables/components-dark'; // Components custom dark variable (for customization purpose)
+@import '../_custom-variables/components'; // Components custom variable (for customization purpose)
+@import 'variables-dark'; // Components dark variable
+@import 'variables'; // Components variable
diff --git a/resources/assets/vendor/scss/_components/_include.scss b/resources/assets/vendor/scss/_components/_include.scss
new file mode 100644
index 0000000..6ce1af0
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_include.scss
@@ -0,0 +1,11 @@
+// Include
+// *******************************************************************************
+
+@import '../_bootstrap-extended/include';
+
+//Mixins
+@import './_mixins'; // Components mixins
+
+//Components variables
+@import '../_custom-variables/components'; // Components variable (for customization purpose)
+@import 'variables'; // Components variable
diff --git a/resources/assets/vendor/scss/_components/_layout.scss b/resources/assets/vendor/scss/_components/_layout.scss
new file mode 100644
index 0000000..640db5a
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_layout.scss
@@ -0,0 +1,1181 @@
+// Layouts
+// *******************************************************************************
+
+.layout-container {
+ min-height: 100vh;
+}
+
+.layout-wrapper,
+.layout-container {
+ width: 100%;
+ display: flex;
+ flex: 1 1 auto;
+ align-items: stretch;
+}
+
+.layout-menu-offcanvas .layout-wrapper,
+.layout-menu-fixed-offcanvas .layout-wrapper {
+ overflow: hidden;
+}
+
+// * Display menu toggle on navbar for .layout-menu-offcanvas, .layout-menu-fixed-offcanvas
+
+.layout-menu-offcanvas .layout-navbar .layout-menu-toggle,
+.layout-menu-fixed-offcanvas .layout-navbar .layout-menu-toggle {
+ display: block !important;
+}
+
+// * Hide menu close icon from large screen for .layout-menu-offcanvas, .layout-menu-fixed-offcanvas
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .layout-menu-offcanvas .layout-menu .layout-menu-toggle,
+ .layout-menu-fixed-offcanvas .layout-menu .layout-menu-toggle {
+ display: none;
+ }
+ .layout-horizontal .layout-page .menu-horizontal {
+ box-shadow: $menu-horizontal-box-shadow;
+ }
+}
+
+.layout-page,
+.content-wrapper,
+.content-wrapper > *,
+.layout-menu {
+ min-height: 1px;
+}
+
+.layout-navbar,
+.content-footer {
+ flex: 0 0 auto;
+}
+
+.layout-page {
+ display: flex;
+ flex: 1 1 auto;
+ align-items: stretch;
+ padding: 0;
+
+ // Without menu
+ .layout-without-menu & {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+}
+
+.content-wrapper {
+ display: flex;
+ align-items: stretch;
+ flex: 1 1 auto;
+ flex-direction: column;
+ justify-content: space-between;
+}
+// Content backdrop
+.content-backdrop {
+ // z-index: 1 (layout static)
+ @include overlay-backdrop(1, $modal-backdrop-bg, $modal-backdrop-opacity);
+ // z-index: 10 (layout fixed)
+ .layout-menu-fixed & {
+ z-index: 10;
+ }
+ // z-index: 9 (layout-horizontal)
+ .layout-horizontal &:not(.fade) {
+ z-index: 9;
+ // Horizontal fix for search background with opacity
+ top: $navbar-height !important;
+ }
+ &.fade {
+ z-index: -1;
+ }
+}
+
+// * Layout Navbar
+// *******************************************************************************
+.layout-navbar {
+ position: relative;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ height: $navbar-height;
+ flex-wrap: nowrap;
+ color: $body-color;
+ z-index: 2;
+
+ .navbar {
+ transform: translate3d(0, 0, 0);
+ }
+ .navbar-nav-right {
+ flex-basis: 100%;
+ }
+
+ // Style for detached navbar
+ &.navbar-detached {
+ // Container layout max-width
+ $container-xxl: map-get($container-max-widths, xxl);
+ &.container-xxl {
+ max-width: calc(#{$container-xxl} - calc(#{$container-padding-x} * 2));
+ }
+ .layout-navbar-fixed & {
+ .search-input:focus {
+ padding-inline: $card-spacer-x;
+ }
+ }
+ // Navbar fixed
+ .layout-navbar-fixed & {
+ width: calc(100% - calc(#{$container-padding-x} * 2) - #{$menu-width});
+ @include media-breakpoint-down(xl) {
+ width: calc(100% - calc(#{$container-padding-x} * 2)) !important;
+ }
+ @include media-breakpoint-down(lg) {
+ width: calc(100% - calc(#{$container-padding-x-sm} * 2)) !important;
+ }
+ }
+ .layout-navbar-fixed.layout-menu-collapsed & {
+ width: calc(100% - calc(#{$container-padding-x} * 2) - #{$menu-collapsed-width});
+ }
+
+ // Navbar static
+ width: calc(100% - calc(#{$container-padding-x} * 2));
+ @include media-breakpoint-down(xl) {
+ width: calc(100vw - (100vw - 100%) - calc(#{$container-padding-x} * 2)) !important;
+ }
+ @include media-breakpoint-down(lg) {
+ width: calc(100vw - (100vw - 100%) - calc(#{$container-padding-x-sm} * 2)) !important;
+ }
+ .layout-menu-collapsed &,
+ .layout-without-menu & {
+ width: calc(100% - calc(#{$container-padding-x} * 2));
+ }
+
+ margin: $spacer auto 0;
+ border-radius: $border-radius;
+ padding: 0 $card-spacer-x;
+ }
+
+ .navbar-search-wrapper {
+ .search-input,
+ .input-group-text {
+ background-color: transparent;
+ }
+ .navbar-search-suggestion {
+ max-height: $navbar-suggestion-height;
+ border-radius: $navbar-suggestion-border-radius;
+
+ .suggestion {
+ color: $body-color;
+
+ &:hover,
+ &.active {
+ background: $gray-50;
+ color: $body-color;
+ }
+ }
+
+ .suggestions-header {
+ font-weight: $font-weight-medium;
+ }
+ }
+ }
+
+ .search-input-wrapper {
+ .search-toggler {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ right: 1rem;
+ z-index: 1;
+ @include rtl-style() {
+ right: inherit;
+ left: 1rem;
+ }
+ }
+ .twitter-typeahead {
+ position: absolute !important;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ // ! FIX: Horizontal layout search container layout left spacing
+ @include media-breakpoint-up('xxl') {
+ &.container-xxl {
+ left: calc(calc(100% - map-get($container-max-widths, 'xxl')) * 0.5);
+ @include rtl-style() {
+ right: calc(calc(100% - map-get($container-max-widths, 'xxl')) * 0.5);
+ left: inherit;
+ }
+
+ + .search-toggler {
+ right: calc(calc(100% - map-get($container-max-widths, 'xxl') + 5rem) * 0.5);
+ @include rtl-style() {
+ left: calc(calc(100% - map-get($container-max-widths, 'xxl') + 5rem) * 0.5);
+ right: inherit;
+ }
+ }
+ }
+ }
+ }
+
+ .search-input {
+ height: 100%;
+ box-shadow: none;
+ }
+
+ .navbar-search-suggestion {
+ width: $navbar-suggestion-width;
+ .layout-horizontal & {
+ width: calc($navbar-suggestion-width - 4%);
+ }
+ }
+ }
+
+ .dropdown-menu[data-bs-popper] {
+ .layout-wrapper:not(.layout-horizontal) & {
+ top: 147%;
+ }
+ }
+
+ // Navbar custom dropdown
+ .navbar-dropdown {
+ .badge-notifications {
+ top: 3px;
+ inset-inline-end: -2px;
+ }
+ .dropdown-menu {
+ min-width: $navbar-dropdown-width;
+ overflow: hidden;
+ .dropdown-item {
+ padding-block: $navbar-toggler-padding-y;
+ min-height: 2.375rem;
+ }
+ .last-login {
+ white-space: normal;
+ }
+ }
+ // Notifications
+ &.dropdown-notifications {
+ .dropdown-notifications-list {
+ max-height: $navbar-dropdown-content-height;
+ .dropdown-notifications-item {
+ padding: $navbar-notifications-dropdown-item-padding-y $navbar-notifications-dropdown-item-padding-x;
+ cursor: pointer;
+
+ //! Fix: Dropdown notification read badge bg color
+ &:not(.mark-as-read) {
+ .dropdown-notifications-read span {
+ background-color: $primary;
+ }
+ }
+ .dropdown-notifications-actions {
+ text-align: center;
+ > a {
+ display: block;
+ }
+ }
+
+ .dropdown-notifications-archive i,
+ .dropdown-notifications-archive span {
+ color: $headings-color;
+ }
+
+ // Notification default marked as read/unread
+ &.marked-as-read {
+ .dropdown-notifications-read,
+ .dropdown-notifications-archive {
+ visibility: hidden;
+ }
+ //Dropdown notification unread badge bg color
+ .dropdown-notifications-read span {
+ background-color: $secondary;
+ }
+ }
+ &:not(.marked-as-read) {
+ .dropdown-notifications-archive {
+ visibility: hidden;
+ }
+ }
+
+ // Notification hover marked as read/unread
+ &:hover {
+ &.marked-as-read {
+ .dropdown-notifications-read,
+ .dropdown-notifications-archive {
+ visibility: visible;
+ }
+ }
+ &:not(.marked-as-read) {
+ .dropdown-notifications-archive {
+ visibility: visible;
+ }
+ }
+ }
+ }
+ }
+ }
+ // Shortcuts
+ &.dropdown-shortcuts {
+ .dropdown-shortcuts-list {
+ max-height: $navbar-dropdown-content-height;
+ }
+ .dropdown-shortcuts-item {
+ text-align: center;
+ padding: 1.5rem;
+ &:hover {
+ background-color: $navbar-dropdown-hover-bg;
+ }
+ .dropdown-shortcuts-icon {
+ height: 3.125rem;
+ width: 3.125rem;
+ margin-left: auto;
+ margin-right: auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: $navbar-dropdown-icon-bg;
+ }
+ a,
+ a:hover {
+ display: block;
+ margin-bottom: 0;
+ color: $headings-color !important;
+ font-weight: $font-weight-medium;
+ }
+ }
+ }
+ &.dropdown-user {
+ .dropdown-menu {
+ min-width: 14rem;
+ }
+ }
+ }
+
+ &[class*='bg-']:not(.bg-navbar-theme) {
+ .nav-item {
+ .input-group-text,
+ .dropdown-toggle {
+ color: $white;
+ }
+ }
+ }
+
+ @include media-breakpoint-down($menu-collapsed-layout-breakpoint) {
+ .navbar-nav {
+ .nav-item {
+ &.dropdown {
+ .dropdown-menu {
+ position: absolute;
+ .last-login {
+ white-space: nowrap;
+ }
+ }
+ }
+ }
+ }
+ }
+ @include media-breakpoint-down(md) {
+ .navbar-nav {
+ .nav-item.dropdown {
+ position: static;
+ float: left;
+ .dropdown-menu {
+ position: absolute;
+ left: 0.9rem;
+ min-width: auto;
+ width: 92%;
+ }
+ }
+ }
+ }
+}
+
+// To align search suggestion with navbar search input
+@include ltr-only {
+ .layout-horizontal {
+ .layout-navbar {
+ .navbar-search-suggestion {
+ left: 2% !important;
+ }
+ }
+ }
+}
+
+@include rtl-only {
+ .layout-horizontal {
+ .layout-navbar {
+ .navbar-search-suggestion {
+ right: 2% !important;
+ }
+ }
+ }
+}
+
+// * Navbar require high z-index as we use z-index for menu slide-out for below large screen
+@include media-breakpoint-down(xl) {
+ .layout-navbar {
+ z-index: $zindex-menu-fixed;
+ }
+}
+
+// * Layout Menu
+// *******************************************************************************
+.layout-menu {
+ position: relative;
+ flex: 1 0 auto;
+ a:focus-visible {
+ outline: none;
+ }
+ .menu {
+ transform: translate3d(0, 0, 0);
+ }
+
+ .menu-vertical {
+ height: 100%;
+ }
+}
+
+// * Layout Content navbar
+// *******************************************************************************
+
+.layout-content-navbar {
+ .layout-page {
+ flex-basis: 100%;
+ flex-direction: column;
+ width: 0;
+ min-width: 0;
+ max-width: 100%;
+ }
+
+ .content-wrapper {
+ width: 100%;
+ }
+}
+
+// * Layout Navbar full
+// *******************************************************************************
+
+.layout-navbar-full {
+ .layout-container {
+ flex-direction: column;
+ }
+ @include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ &:not(.layout-horizontal) .menu-inner {
+ margin-top: 0.75rem;
+ }
+ }
+
+ .content-wrapper {
+ flex-basis: 100%;
+ width: 0;
+ min-width: 0;
+ max-width: 100%;
+ }
+ // Adjust content backdrop z-index as per layout navbar full
+ .content-backdrop {
+ // static layout
+ &.show {
+ z-index: 9;
+ // fixed/fixed-offcanvas layout
+ .layout-menu-fixed &,
+ .layout-menu-fixed-offcanvas & {
+ z-index: 1076;
+ }
+ }
+ }
+ // }
+}
+
+// * Flipped layout
+// *******************************************************************************
+
+.layout-menu-flipped {
+ .layout-navbar-full .layout-page {
+ flex-direction: row-reverse;
+ }
+
+ .layout-content-navbar .layout-container {
+ flex-direction: row-reverse;
+ }
+}
+
+// * Toggle
+// *******************************************************************************
+
+.layout-menu-toggle {
+ display: block;
+ // Updated menu toggle icon for menu expanded and collapsed
+ .menu-toggle-icon::before {
+ content: '\efb1';
+ }
+ .menu-toggle-icon::before {
+ .layout-menu-collapsed & {
+ content: '\ea6b';
+ }
+ }
+}
+
+// * Collapsed layout (Default static and static off-canvasmenu)
+// *******************************************************************************
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ // Menu style
+
+ .layout-menu-collapsed:not(.layout-menu-hover):not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas) {
+ .layout-menu .menu-vertical,
+ .layout-menu.menu-vertical {
+ @include layout-menu-collapsed();
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-collapsed:not(.layout-menu-hover):not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas) {
+ .layout-menu .menu-vertical,
+ .layout-menu.menu-vertical {
+ @include layout-menu-collapsed-rtl();
+ }
+ }
+ }
+
+ // Menu position
+
+ .layout-menu-hover.layout-menu-collapsed {
+ .layout-menu {
+ margin-right: -$menu-width + $menu-collapsed-width;
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ margin-left: -$menu-width + $menu-collapsed-width;
+ margin-right: 0;
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-hover.layout-menu-collapsed {
+ .layout-menu {
+ margin-left: -$menu-width + $menu-collapsed-width;
+ margin-right: 0;
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ margin-right: -$menu-width + $menu-collapsed-width;
+ margin-left: 0;
+ }
+ }
+ }
+}
+
+// * Off-canvas layout (Layout Collapsed)
+// *******************************************************************************
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .layout-menu-collapsed.layout-menu-offcanvas {
+ .layout-menu {
+ margin-right: -$menu-width;
+ transform: translateX(-100%);
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ margin-right: 0;
+ margin-left: -$menu-width;
+ transform: translateX(100%);
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-collapsed.layout-menu-offcanvas {
+ .layout-menu {
+ margin-right: 0;
+ margin-left: -$menu-width;
+ transform: translateX(100%);
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ margin-right: -$menu-width;
+ margin-left: 0;
+ transform: translateX(-100%);
+ }
+ }
+ }
+}
+
+// * Fixed and fixed off-canvas layout (Layout Fixed)
+// *******************************************************************************
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ // Menu
+
+ .layout-menu-fixed,
+ .layout-menu-fixed-offcanvas {
+ .layout-menu {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ right: 0;
+ left: auto;
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-fixed,
+ &.layout-menu-fixed-offcanvas {
+ .layout-menu {
+ right: 0;
+ left: auto;
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ right: auto;
+ left: 0;
+ }
+ }
+ }
+
+ // Fixed off-canvas
+
+ // Menu collapsed
+ .layout-menu-fixed-offcanvas.layout-menu-collapsed {
+ .layout-menu {
+ transform: translateX(-100%);
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ transform: translateX(100%);
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-fixed-offcanvas.layout-menu-collapsed {
+ .layout-menu {
+ transform: translateX(100%);
+ }
+
+ &.layout-menu-flipped .layout-menu {
+ transform: translateX(-100%);
+ }
+ }
+ }
+
+ // Container
+
+ // Menu expanded
+ .layout-menu-fixed:not(.layout-menu-collapsed),
+ .layout-menu-fixed-offcanvas:not(.layout-menu-collapsed) {
+ .layout-page {
+ padding-left: $menu-width;
+ }
+
+ &.layout-menu-flipped .layout-page {
+ padding-right: $menu-width;
+ padding-left: 0;
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-fixed:not(.layout-menu-collapsed),
+ &.layout-menu-fixed-offcanvas:not(.layout-menu-collapsed) {
+ .layout-page {
+ padding-right: $menu-width;
+ padding-left: 0;
+ }
+
+ &.layout-menu-flipped .layout-page {
+ padding-right: 0;
+ padding-left: $menu-width;
+ }
+ }
+ }
+
+ // Menu collapsed
+ .layout-menu-fixed.layout-menu-collapsed {
+ .layout-page {
+ padding-left: $menu-collapsed-width;
+ }
+
+ &.layout-menu-flipped .layout-page {
+ padding-right: $menu-collapsed-width;
+ padding-left: 0;
+ }
+ }
+
+ @include rtl-only {
+ &.layout-menu-fixed.layout-menu-collapsed {
+ .layout-page {
+ padding-right: $menu-collapsed-width;
+ padding-left: 0;
+ }
+
+ &.layout-menu-flipped .layout-page {
+ padding-right: 0;
+ padding-left: $menu-collapsed-width;
+ }
+ }
+ }
+}
+
+// Reset paddings (for non fixed entities)
+html:not(.layout-navbar-fixed):not(.layout-menu-fixed):not(.layout-menu-fixed-offcanvas) .layout-page,
+html:not(.layout-navbar-fixed) .layout-content-navbar .layout-page {
+ padding-top: 0 !important;
+}
+html:not(.layout-footer-fixed) .content-wrapper {
+ padding-bottom: 0 !important;
+}
+
+@include media-breakpoint-down($menu-collapsed-layout-breakpoint) {
+ .layout-menu-fixed .layout-wrapper.layout-navbar-full .layout-menu,
+ .layout-menu-fixed-offcanvas .layout-wrapper.layout-navbar-full .layout-menu {
+ top: 0 !important;
+ }
+
+ html:not(.layout-navbar-fixed) .layout-navbar-full .layout-page {
+ padding-top: 0 !important;
+ }
+}
+
+// * Hidden navbar layout
+// *******************************************************************************
+.layout-navbar-hidden {
+ .layout-navbar {
+ display: none;
+ }
+}
+
+// * Fixed navbar layout
+// *******************************************************************************
+
+.layout-navbar-fixed {
+ .layout-navbar {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ }
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ // Fix navbar within Navbar Full layout in fixed mode
+ .layout-menu-fixed .layout-navbar-full .layout-navbar,
+ .layout-menu-fixed-offcanvas .layout-navbar-full .layout-navbar {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ }
+
+ // Fix navbar within Content Navbar layout in fixed mode - Menu expanded
+ .layout-navbar-fixed:not(.layout-menu-collapsed),
+ .layout-menu-fixed.layout-navbar-fixed:not(.layout-menu-collapsed),
+ .layout-menu-fixed-offcanvas.layout-navbar-fixed:not(.layout-menu-collapsed) {
+ .layout-content-navbar:not(.layout-without-menu) .layout-navbar {
+ left: $menu-width;
+ }
+
+ &.layout-menu-flipped .layout-content-navbar:not(.layout-without-menu) .layout-navbar {
+ right: $menu-width;
+ left: 0;
+ }
+ }
+
+ // Horizontal Layout when menu fixed
+ .layout-menu-fixed .layout-horizontal .layout-page .menu-horizontal,
+ .layout-menu-fixed-offcanvas .layout-horizontal .layout-page .menu-horizontal {
+ position: fixed;
+ top: $navbar-height;
+ }
+
+ .layout-menu-fixed .layout-horizontal .layout-page .menu-horizontal + [class*='container-'],
+ .layout-menu-fixed-offcanvas .layout-horizontal .layout-page .menu-horizontal + [class*='container-'] {
+ padding-top: calc($container-padding-y + 3.9rem) !important;
+ }
+
+ @include rtl-only {
+ &.layout-navbar-fixed:not(.layout-menu-collapsed),
+ &.layout-menu-fixed.layout-navbar-fixed:not(.layout-menu-collapsed),
+ &.layout-menu-fixed-offcanvas.layout-navbar-fixed:not(.layout-menu-collapsed) {
+ .layout-content-navbar:not(.layout-without-menu) .layout-navbar {
+ right: $menu-width;
+ left: 0;
+ }
+
+ &.layout-menu-flipped .layout-content-navbar:not(.layout-without-menu) .layout-navbar {
+ right: 0;
+ left: $menu-width;
+ }
+ }
+ }
+
+ // Layout fixed not off-canvas - Menu collapsed
+
+ .layout-navbar-fixed.layout-menu-collapsed:not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas),
+ .layout-menu-fixed.layout-navbar-fixed.layout-menu-collapsed {
+ .layout-content-navbar .layout-navbar {
+ left: $menu-collapsed-width;
+ }
+
+ &.layout-menu-flipped .layout-content-navbar .layout-navbar {
+ right: $menu-collapsed-width;
+ left: 0;
+ }
+ }
+
+ @include rtl-only {
+ &.layout-navbar-fixed.layout-menu-collapsed:not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas),
+ &.layout-menu-fixed.layout-navbar-fixed.layout-menu-collapsed {
+ .layout-content-navbar .layout-navbar {
+ right: $menu-collapsed-width;
+ left: 0;
+ }
+
+ &.layout-menu-flipped .layout-content-navbar .layout-navbar {
+ right: 0;
+ left: $menu-collapsed-width;
+ }
+ }
+ }
+}
+
+// * Fixed footer
+// *******************************************************************************
+
+.layout-footer-fixed .content-footer {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ // Fixed footer - Menu expanded
+ .layout-footer-fixed:not(.layout-menu-collapsed) {
+ .layout-wrapper:not(.layout-without-menu) .content-footer {
+ left: $menu-width;
+ }
+
+ &.layout-menu-flipped .layout-wrapper:not(.layout-without-menu) .content-footer {
+ right: $menu-width;
+ left: 0;
+ }
+ }
+
+ // Fixed footer - Menu collapsed
+ .layout-footer-fixed.layout-menu-collapsed:not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas) {
+ .layout-wrapper:not(.layout-without-menu) .content-footer {
+ left: $menu-collapsed-width;
+ }
+
+ &.layout-menu-flipped .layout-wrapper:not(.layout-without-menu) .content-footer {
+ right: $menu-collapsed-width;
+ left: 0;
+ }
+ }
+
+ @include rtl-only {
+ // Fixed footer - Menu expanded
+ &.layout-footer-fixed:not(.layout-menu-collapsed) {
+ .layout-wrapper:not(.layout-without-menu) .content-footer {
+ left: 0;
+ right: $menu-width;
+ }
+
+ &.layout-menu-flipped .layout-wrapper:not(.layout-without-menu) .content-footer {
+ left: $menu-width;
+ right: 0;
+ }
+ }
+
+ // Fixed footer - Menu collapsed
+ &.layout-footer-fixed.layout-menu-collapsed:not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas) {
+ .layout-wrapper:not(.layout-without-menu) .content-footer {
+ left: 0;
+ right: $menu-collapsed-width;
+ }
+
+ &.layout-menu-flipped .layout-wrapper:not(.layout-without-menu) .content-footer {
+ right: 0;
+ left: $menu-collapsed-width;
+ }
+ }
+ }
+}
+
+// * Small screens layout
+// *******************************************************************************
+
+@include media-breakpoint-down($menu-collapsed-layout-breakpoint) {
+ .layout-menu {
+ position: fixed !important;
+ top: 0 !important;
+ height: 100% !important;
+ left: 0 !important;
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ transform: translate3d(-100%, 0, 0);
+ will-change:
+ transform,
+ -webkit-transform;
+
+ @include rtl-style {
+ right: 0 !important;
+ left: auto !important;
+ transform: translate3d(100%, 0, 0);
+ }
+
+ .layout-menu-flipped & {
+ right: 0 !important;
+ left: auto !important;
+ transform: translate3d(100%, 0, 0);
+ }
+
+ .layout-menu-expanded & {
+ transform: translate3d(0, 0, 0) !important;
+ }
+ }
+
+ .layout-menu-expanded body {
+ overflow: hidden;
+ }
+
+ @include rtl-only {
+ &.layout-menu-flipped .layout-menu {
+ right: auto !important;
+ left: 0 !important;
+ transform: translate3d(-100%, 0, 0);
+ }
+ }
+
+ .layout-overlay {
+ position: fixed;
+ top: 0;
+ right: 0;
+ height: 100% !important;
+ left: 0;
+ display: none;
+ background: $modal-backdrop-bg;
+ opacity: $modal-backdrop-opacity;
+ cursor: pointer;
+
+ .layout-menu-expanded & {
+ display: block;
+ }
+ }
+
+ .layout-menu-100vh .layout-menu,
+ .layout-menu-100vh .layout-overlay {
+ height: 100vh !important;
+ }
+
+ .drag-target {
+ height: 100%;
+ width: 40px;
+ position: fixed;
+ top: 0;
+ left: 0px;
+ z-index: 1036;
+ }
+}
+
+// * Z-Indexes
+// *******************************************************************************
+
+// Navbar (fixed)
+.layout-navbar-fixed body:not(.modal-open),
+.layout-menu-fixed body:not(.modal-open),
+.layout-menu-fixed-offcanvas body:not(.modal-open) {
+ .layout-navbar-full .layout-navbar {
+ z-index: $zindex-menu-fixed;
+ }
+
+ .layout-content-navbar .layout-navbar {
+ z-index: $zindex-menu-fixed - 5;
+ }
+}
+
+// Footer (fixed)
+.layout-footer-fixed .content-footer {
+ z-index: $zindex-fixed;
+}
+
+// Menu horizontal
+.layout-menu-horizontal {
+ z-index: 9;
+}
+
+@include media-breakpoint-down($menu-collapsed-layout-breakpoint) {
+ .layout-menu {
+ z-index: $zindex-layout-mobile;
+ }
+
+ .layout-overlay {
+ z-index: $zindex-layout-mobile - 1;
+ }
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ // Default expanded
+
+ // Navbar full layout
+ .layout-navbar-full {
+ .layout-navbar {
+ z-index: 10;
+ }
+
+ .layout-menu {
+ z-index: 9;
+ }
+ }
+ // Content Navbar layout
+ .layout-content-navbar {
+ .layout-navbar {
+ z-index: 9;
+ }
+
+ .layout-menu {
+ z-index: 10;
+ }
+ }
+
+ // Collapsed
+
+ .layout-menu-collapsed:not(.layout-menu-offcanvas):not(.layout-menu-fixed-offcanvas) {
+ // Navbar full layout
+ &.layout-menu-hover .layout-navbar-full .layout-menu {
+ z-index: $zindex-menu-fixed - 5 !important;
+ }
+ // Content Navbar layout
+ .layout-content-navbar .layout-menu {
+ z-index: $zindex-menu-fixed + 5 !important;
+ }
+ }
+
+ // Fixed
+ // Navbar full layout
+ .layout-menu-fixed body:not(.modal-open) .layout-navbar-full .layout-menu,
+ .layout-menu-fixed-offcanvas body:not(.modal-open) .layout-navbar-full .layout-menu {
+ z-index: $zindex-menu-fixed - 5;
+ }
+ // Content Navbar layout
+ .layout-navbar-fixed body:not(.modal-open) .layout-content-navbar .layout-menu,
+ .layout-menu-fixed body:not(.modal-open) .layout-content-navbar .layout-menu,
+ .layout-menu-fixed-offcanvas body:not(.modal-open) .layout-content-navbar .layout-menu {
+ z-index: $zindex-menu-fixed;
+ }
+}
+
+// * Transitions and animations
+// *******************************************************************************
+
+// Disable navbar link hover transition
+.layout-menu-link-no-transition {
+ .layout-menu .menu-link,
+ .layout-menu-horizontal .menu-link {
+ transition: none !important;
+ animation: none !important;
+ }
+}
+
+// Disable navbar link hover transition
+.layout-no-transition .layout-menu,
+.layout-no-transition .layout-menu-horizontal {
+ &,
+ & .menu,
+ & .menu-item {
+ transition: none !important;
+ animation: none !important;
+ }
+}
+
+@include media-breakpoint-down($menu-collapsed-layout-breakpoint) {
+ .layout-transitioning {
+ .layout-overlay {
+ animation: menuAnimation $menu-animation-duration;
+ }
+
+ .layout-menu {
+ transition-duration: $menu-animation-duration;
+ transition-property:
+ transform,
+ -webkit-transform;
+ }
+ }
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .layout-menu-collapsed:not(.layout-transitioning):not(.layout-menu-offcanvas):not(.layout-menu-fixed):not(
+ .layout-menu-fixed-offcanvas
+ )
+ .layout-menu {
+ transition-duration: $menu-animation-duration;
+ transition-property: margin-left, margin-right, width;
+ }
+
+ .layout-transitioning {
+ &.layout-menu-offcanvas .layout-menu {
+ transition-duration: $menu-animation-duration;
+ transition-property:
+ margin-left,
+ margin-right,
+ transform,
+ -webkit-transform;
+ }
+
+ &.layout-menu-fixed,
+ &.layout-menu-fixed-offcanvas {
+ .layout-page {
+ transition-duration: $menu-animation-duration;
+ transition-property: padding-left, padding-right;
+ }
+ }
+
+ &.layout-menu-fixed {
+ .layout-menu {
+ transition: width $menu-animation-duration;
+ }
+ }
+
+ &.layout-menu-fixed-offcanvas {
+ .layout-menu {
+ transition-duration: $menu-animation-duration;
+ transition-property:
+ transform,
+ -webkit-transform;
+ }
+ }
+
+ &.layout-navbar-fixed .layout-content-navbar .layout-navbar,
+ &.layout-footer-fixed .content-footer {
+ transition-duration: $menu-animation-duration;
+ transition-property: left, right;
+ }
+
+ &:not(.layout-menu-offcanvas):not(.layout-menu-fixed):not(.layout-menu-fixed-offcanvas) .layout-menu {
+ transition-duration: $menu-animation-duration;
+ transition-property: margin-left, margin-right, width;
+ }
+ }
+}
+
+// Disable transitions/animations in IE 10-11
+@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+ .menu,
+ .layout-menu,
+ .layout-page,
+ .layout-navbar,
+ .content-footer {
+ transition: none !important;
+ transition-duration: 0s !important;
+ }
+ .layout-overlay {
+ animation: none !important;
+ }
+}
+
+@include keyframes(menuAnimation) {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: $modal-backdrop-opacity;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_menu.scss b/resources/assets/vendor/scss/_components/_menu.scss
new file mode 100644
index 0000000..bb17fa8
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_menu.scss
@@ -0,0 +1,784 @@
+// Menu
+// *******************************************************************************
+
+.menu {
+ display: flex;
+ .app-brand {
+ width: 100%;
+ transition: padding 0.3s ease-in-out;
+ }
+
+ //PS Scrollbar
+ .ps__thumb-y,
+ .ps__rail-y {
+ width: 0.125rem !important;
+ }
+
+ .ps__rail-y {
+ right: 0.25rem !important;
+ left: auto !important;
+ background: none !important;
+
+ @include rtl-style {
+ right: auto !important;
+ left: 0.25rem !important;
+ }
+ }
+
+ .ps__rail-y:hover,
+ .ps__rail-y:focus,
+ .ps__rail-y.ps--clicking,
+ .ps__rail-y:hover > .ps__thumb-y,
+ .ps__rail-y:focus > .ps__thumb-y,
+ .ps__rail-y.ps--clicking > .ps__thumb-y {
+ width: 0.375rem !important;
+ }
+}
+
+.menu-inner {
+ display: flex;
+ align-items: flex-start;
+ justify-content: flex-start;
+ margin: 0;
+ padding: 0;
+ height: 100%;
+}
+.menu-inner-shadow {
+ display: none;
+ position: absolute;
+ top: $navbar-height - (($navbar-height - 3rem) * 0.5);
+ @include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ height: 3rem;
+ }
+ @include media-breakpoint-down($menu-collapsed-layout-breakpoint) {
+ height: 1.5rem;
+ }
+ width: 100%;
+ pointer-events: none;
+ z-index: 2;
+ // Hide menu inner shadow in static layout
+ html:not(.layout-menu-fixed) & {
+ display: none !important;
+ }
+}
+
+// Menu item
+
+.menu-item {
+ align-items: flex-start;
+ justify-content: flex-start;
+
+ &.menu-item-animating {
+ transition: height $menu-animation-duration ease-in-out;
+ }
+}
+
+.menu-item,
+.menu-header,
+.menu-divider,
+.menu-block {
+ flex: 0 0 auto;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+.menu-header {
+ opacity: 1;
+ transition: opacity $menu-animation-duration ease-in-out;
+ .menu-header-text {
+ text-transform: uppercase;
+ letter-spacing: 0.4px;
+ white-space: nowrap;
+ color: $text-muted;
+ }
+}
+
+// Menu Icon
+.menu-icon {
+ flex-grow: 0;
+ flex-shrink: 0;
+ margin-right: $menu-icon-expanded-spacer;
+ line-height: 1;
+ font-size: $menu-icon-expanded-font-size;
+ .menu:not(.menu-no-animation) & {
+ transition: margin-right $menu-animation-duration ease;
+ }
+
+ @include rtl-style {
+ margin-right: 0;
+ margin-left: $menu-icon-expanded-spacer;
+ .menu:not(.menu-no-animation) & {
+ transition: margin-left $menu-animation-duration ease;
+ }
+ }
+}
+
+// Menu link
+.menu-link {
+ position: relative;
+ display: flex;
+ align-items: center;
+ flex: 0 1 auto;
+ margin: 0;
+
+ .menu-item.disabled & {
+ cursor: not-allowed !important;
+ }
+ // link hover animation
+ .menu:not(.menu-no-animation) & {
+ transition-duration: $menu-animation-duration;
+ transition-property: color, background-color;
+ }
+
+ > :not(.menu-icon) {
+ flex: 0 1 auto;
+ opacity: 1;
+ .menu:not(.menu-no-animation) & {
+ transition: opacity $menu-animation-duration ease-in-out;
+ }
+ }
+}
+
+// Sub menu
+.menu-sub {
+ display: none;
+ flex-direction: column;
+ margin: 0;
+ padding: 0;
+
+ .menu:not(.menu-no-animation) & {
+ transition: background-color $menu-animation-duration;
+ }
+
+ .menu-item.open > & {
+ display: flex;
+ }
+}
+
+// Menu toggle open/close arrow
+.menu-toggle::after {
+ position: absolute;
+ top: 50%;
+ display: block;
+ font-family: 'tabler-icons';
+ font-size: $menu-icon-expanded-font-size;
+ transform: translateY(-50%);
+
+ @include ltr-style {
+ content: '\ea61';
+ }
+ @include rtl-style {
+ content: '\ea60';
+ }
+
+ .menu:not(.menu-no-animation) & {
+ transition-duration: $menu-animation-duration;
+ transition-property: -webkit-transform, transform;
+ }
+}
+
+// Menu divider
+.menu-divider {
+ width: 100%;
+ border: 0;
+ border-top: 1px solid;
+}
+
+// Vertical Menu
+// *******************************************************************************
+
+.menu-vertical {
+ overflow: hidden;
+ flex-direction: column;
+
+ // menu expand collapse animation
+ &:not(.menu-no-animation) {
+ transition: width $menu-animation-duration;
+ }
+
+ &,
+ .menu-block,
+ .menu-inner > .menu-item,
+ .menu-inner > .menu-header {
+ width: $menu-width;
+ }
+
+ .menu-inner {
+ flex-direction: column;
+ flex: 1 1 auto;
+
+ > .menu-item {
+ margin: $menu-item-spacer 0 0;
+ // menu-link spacing
+ .menu-link {
+ margin: 0 $menu-vertical-link-margin-x;
+ border-radius: $border-radius;
+ }
+ }
+ }
+
+ .menu-header {
+ padding: $menu-vertical-header-margin-x calc($menu-vertical-link-margin-x * 2) 0.375rem;
+ }
+ .menu-item .menu-link,
+ .menu-block {
+ padding: $menu-vertical-menu-link-padding-y $menu-vertical-link-padding-x;
+ }
+ .menu-item .menu-link {
+ font-size: $menu-font-size;
+ min-height: 38px;
+ > div:not(.badge) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ line-height: 1.467;
+ }
+ }
+
+ .menu-item .menu-toggle {
+ padding-right: calc(#{$menu-vertical-link-padding-x} + #{$caret-width * 3.2});
+
+ @include rtl-style {
+ padding-right: $menu-vertical-link-padding-x;
+ padding-left: calc(#{$menu-vertical-link-padding-x} + #{$caret-width * 3.2});
+ }
+
+ &::after {
+ right: $menu-vertical-link-padding-x;
+
+ @include rtl-style {
+ right: auto;
+ left: $menu-vertical-link-padding-x;
+ }
+ }
+ }
+
+ .menu-item.open:not(.menu-item-closing) > .menu-link:after {
+ transform: translateY(-50%) rotate(90deg);
+
+ @include rtl-style {
+ transform: translateY(-50%) rotate(-90deg);
+ }
+ }
+
+ .menu-divider {
+ margin-top: $menu-link-spacer-x;
+ margin-bottom: $menu-link-spacer-x;
+ padding: 0;
+ }
+
+ .menu-sub {
+ .menu-link {
+ padding-top: $menu-vertical-menu-link-padding-y;
+ padding-bottom: $menu-vertical-menu-link-padding-y;
+ }
+ .menu-item {
+ margin: $menu-item-spacer 0 0;
+ }
+ }
+
+ .menu-icon {
+ width: $menu-icon-expanded-width;
+ }
+
+ .menu-sub .menu-icon {
+ margin-right: 0;
+
+ @include rtl-style {
+ margin-left: 0;
+ }
+ }
+
+ .menu-horizontal-wrapper {
+ flex: none;
+ }
+
+ // Levels
+ //
+
+ $menu-first-level-spacer: $menu-vertical-link-padding-x + $menu-icon-expanded-width + $menu-icon-expanded-spacer;
+
+ .menu-sub .menu-link {
+ padding-left: $menu-first-level-spacer;
+
+ @include rtl-style {
+ padding-right: $menu-first-level-spacer;
+ padding-left: $menu-vertical-link-padding-x;
+ }
+ }
+ // Menu levels loop for padding left/right
+ @for $i from 2 through $menu-max-levels {
+ $selector: '';
+
+ @for $l from 1 through $i {
+ $selector: '#{$selector} .menu-sub';
+ }
+ .layout-wrapper:not(.layout-horizontal) & {
+ .menu-inner > .menu-item {
+ #{$selector} .menu-link {
+ padding-left: $menu-first-level-spacer + ($menu-vertical-menu-level-spacer * ($i)) - 0.225;
+ &::before {
+ left: $menu-icon-expanded-left-spacer + ($menu-vertical-menu-level-spacer * $i) - 1.5;
+ @include rtl-style {
+ right: $menu-icon-expanded-left-spacer + ($menu-vertical-menu-level-spacer * $i) - 1.5;
+ left: inherit;
+ }
+ }
+ @include rtl-style {
+ padding-right: $menu-first-level-spacer + ($menu-vertical-menu-level-spacer * ($i)) - 0.225;
+ padding-left: $menu-vertical-link-padding-x;
+ }
+ }
+ }
+ }
+ }
+}
+
+// Vertical Menu Collapsed
+// *******************************************************************************
+
+@mixin layout-menu-collapsed() {
+ width: $menu-collapsed-width;
+
+ .menu-inner > .menu-item {
+ width: $menu-collapsed-width;
+ }
+
+ .menu-inner > .menu-header,
+ .menu-block {
+ position: relative;
+ margin-left: $menu-collapsed-width;
+ padding-right: ($menu-vertical-link-padding-x * 2) - $menu-icon-expanded-spacer;
+ padding-left: $menu-icon-expanded-spacer;
+ width: $menu-width;
+ .menu-header-text {
+ overflow: hidden;
+ opacity: 0;
+ }
+
+ &::before {
+ content: '';
+ position: absolute;
+ left: -1 * ($menu-collapsed-width * 0.66);
+ height: 1px;
+ width: 1.375rem;
+ background-color: $border-color;
+ top: 50%;
+ }
+ }
+
+ .app-brand {
+ padding-left: $menu-vertical-link-padding-x + 0.38rem;
+ }
+
+ .menu-inner > .menu-item div:not(.menu-block) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ opacity: 0;
+ }
+ .menu-inner > .menu-item > .menu-sub,
+ .menu-inner > .menu-item.open > .menu-sub {
+ display: none;
+ }
+ .menu-inner > .menu-item > .menu-toggle::after {
+ display: none;
+ }
+
+ &:not(.layout-menu-hover) {
+ .menu-inner > .menu-item > .menu-link,
+ .menu-inner > .menu-block,
+ .menu-inner > .menu-header {
+ padding-right: calc(#{$menu-vertical-link-padding-x} + #{$caret-width * 1.2});
+ }
+ }
+
+ .menu-inner > .menu-item > .menu-link .menu-icon {
+ text-align: center;
+ margin-right: 0;
+ }
+}
+
+@mixin layout-menu-collapsed-rtl() {
+ .menu-block {
+ width: $menu-collapsed-width !important;
+ }
+ .menu-inner > .menu-item > .menu-link {
+ padding-left: $menu-vertical-link-padding-x;
+ }
+
+ .menu-inner > .menu-header,
+ .menu-block {
+ margin-right: $menu-collapsed-width;
+ margin-left: 0;
+ padding-right: $menu-icon-expanded-spacer;
+ padding-left: ($menu-vertical-link-padding-x * 2) - $menu-icon-expanded-spacer;
+
+ &::before {
+ right: -1 * ($menu-collapsed-width * 0.66);
+ left: auto;
+ }
+ }
+
+ &:not(.layout-menu-hover) {
+ .menu-inner > .menu-item > .menu-link,
+ .menu-inner > .menu-block,
+ .menu-inner > .menu-header {
+ padding-inline: $menu-vertical-link-padding-x;
+ }
+ }
+
+ .menu-inner > .menu-item > .menu-link .menu-icon {
+ margin-left: 0;
+ }
+}
+// Only for menu example
+.menu-collapsed:not(:hover) {
+ @include layout-menu-collapsed();
+
+ @include rtl-style {
+ @include layout-menu-collapsed-rtl();
+ }
+}
+
+// Horizontal
+// *******************************************************************************
+
+.menu-horizontal {
+ flex-direction: row;
+ width: 100%;
+
+ .menu-inner {
+ overflow: hidden;
+ flex-direction: row;
+ flex: 0 1 100%;
+ > .menu-item.active > .menu-link.menu-toggle {
+ font-weight: $font-weight-medium;
+ }
+ .menu-item.active > .menu-link:not(.menu-toggle) {
+ font-weight: $font-weight-medium;
+ }
+ }
+
+ .menu-item .menu-link {
+ padding: $menu-horizontal-link-padding-y $menu-horizontal-link-padding-x;
+ }
+
+ .menu-item .menu-toggle {
+ padding-right: calc(#{$menu-horizontal-link-padding-x} + #{$caret-width * 3});
+
+ @include rtl-style {
+ padding-right: $menu-horizontal-link-padding-x;
+ padding-left: calc(#{$menu-horizontal-link-padding-x} + #{$caret-width * 3});
+ }
+
+ &::after {
+ right: calc(#{$menu-horizontal-link-padding-x} - #{0.2rem});
+
+ @include rtl-style {
+ right: auto;
+ left: calc(#{$menu-horizontal-link-padding-x} - #{0.2rem});
+ }
+ }
+ }
+
+ .menu-inner > .menu-item > .menu-toggle {
+ &::after {
+ transform: translateY(-50%) rotate(90deg);
+
+ @include rtl-style {
+ transform: translateY(-50%) rotate(-90deg);
+ }
+ }
+ &::before {
+ position: absolute;
+ block-size: $menu-vertical-header-margin-y;
+ content: '';
+ inline-size: 100%;
+ inset-block-start: 100%;
+ inset-inline-start: 0;
+ z-index: 2;
+ pointer-events: auto;
+ }
+ }
+ .menu-inner > .menu-item > .menu-sub {
+ margin-top: $menu-vertical-header-margin-y;
+ }
+
+ .menu-inner > .menu-item:not(.menu-item-closing).open .menu-item.open {
+ position: relative;
+ }
+
+ .menu-header,
+ .menu-divider {
+ display: none !important;
+ }
+
+ .menu-sub {
+ position: absolute;
+ width: $menu-sub-width;
+ padding: calc($menu-horizontal-item-spacer + $menu-item-spacer) 0;
+ box-shadow: $box-shadow-lg;
+ .menu-item {
+ padding: 1px $menu-link-spacer-x;
+ &.open .menu-link > div::after {
+ position: absolute;
+ content: '';
+ z-index: 2;
+ pointer-events: auto;
+ width: 1.0625rem;
+ height: 100%;
+ right: -1.0625rem;
+ }
+ }
+
+ .menu-sub {
+ position: absolute;
+ left: 100%;
+ top: 0;
+ width: 100%;
+
+ @include rtl-style {
+ left: -100%;
+ }
+ }
+
+ .menu-link {
+ padding-top: $menu-horizontal-menu-link-padding-y;
+ padding-bottom: $menu-horizontal-menu-link-padding-y;
+ border-radius: $border-radius;
+ }
+ }
+
+ .menu-inner > .menu-item {
+ .menu-sub {
+ @include border-radius($border-radius);
+ }
+ > .menu-sub {
+ .menu-sub {
+ margin: 0 $menu-horizontal-spacer-x;
+ }
+ }
+ }
+
+ &:not(.menu-no-animation) .menu-inner .menu-item.open .menu-sub {
+ animation: menuDropdownShow $menu-animation-duration ease-in-out;
+ }
+
+ // Sub menu link padding left
+ .menu-sub .menu-link {
+ padding-left: $menu-horizontal-menu-level-spacer;
+ min-height: 2.375rem;
+
+ @include rtl-style {
+ padding-right: $menu-horizontal-menu-level-spacer;
+ padding-left: $menu-horizontal-link-padding-x;
+ }
+ }
+ @include media-breakpoint-down(lg) {
+ & {
+ display: none;
+ }
+ }
+}
+
+.menu-horizontal-wrapper {
+ overflow: hidden;
+ flex: 0 1 100%;
+ width: 0;
+
+ .menu:not(.menu-no-animation) & .menu-inner {
+ transition: margin $menu-animation-duration;
+ }
+}
+
+.menu-horizontal-prev,
+.menu-horizontal-next {
+ position: relative;
+ display: block;
+ flex: 0 0 auto;
+ width: $menu-control-width;
+
+ &::after {
+ content: '\ea61';
+ position: absolute;
+ top: 50%;
+ display: block;
+ font-family: 'tabler-icons';
+ font-size: $menu-icon-expanded-font-size;
+ transform: translateY(-50%);
+ }
+
+ &.disabled {
+ cursor: not-allowed !important;
+ }
+}
+
+.menu-horizontal-prev::after {
+ border-right: 0;
+ transform: translate(0, -50%) rotate(180deg);
+
+ @include rtl-style {
+ transform: translate(0, -50%) rotate(360deg);
+ }
+}
+
+.menu-horizontal-next::after {
+ border-left: 0;
+ transform: translate(50%, -50%) rotate(360deg);
+
+ @include rtl-style {
+ transform: translate(-50%, -50%) rotate(180deg);
+ }
+}
+
+@include keyframes(menuDropdownShow) {
+ 0% {
+ opacity: 0;
+ transform: translateY(-0.5rem);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+// Menu light/dark color mode
+// *******************************************************************************
+
+.menu-light {
+ color: $navbar-light-color;
+
+ .menu-link,
+ .menu-horizontal-prev,
+ .menu-horizontal-next {
+ color: $navbar-light-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-light-hover-color;
+ }
+
+ &.active {
+ color: $navbar-light-active-color;
+ }
+ }
+
+ .menu-item.disabled .menu-link {
+ color: $navbar-light-disabled-color !important;
+ }
+
+ .menu-item.open:not(.menu-item-closing) > .menu-toggle,
+ .menu-item.active > .menu-link {
+ color: $navbar-light-active-color;
+ }
+
+ .menu-item.active > .menu-link:not(.menu-toggle) {
+ background: $menu-light-menu-bg;
+ }
+
+ .menu-inner > .menu-item.menu-item-closing .menu-item.open .menu-sub,
+ .menu-inner > .menu-item.menu-item-closing .menu-item.open .menu-toggle {
+ color: $navbar-light-color;
+ }
+
+ .menu-text {
+ color: $navbar-light-active-color;
+ }
+
+ .menu-header {
+ color: $navbar-light-color;
+ }
+
+ hr,
+ .menu-divider,
+ .menu-inner > .menu-item.open > .menu-sub::before {
+ border-color: $menu-light-border-color !important;
+ }
+
+ .menu-inner > .menu-header::before,
+ .menu-block::before {
+ background-color: $navbar-light-disabled-color;
+ }
+
+ .menu-inner > .menu-item.open .menu-item.open > .menu-toggle::before {
+ background-color: $menu-light-border-color;
+ }
+
+ .menu-inner > .menu-item.open .menu-item.active > .menu-link::before {
+ background-color: $navbar-light-active-color;
+ }
+
+ .ps__thumb-y {
+ background: $navbar-light-color !important;
+ }
+}
+
+.menu-dark {
+ color: $navbar-dark-color;
+
+ .menu-link,
+ .menu-horizontal-prev,
+ .menu-horizontal-next {
+ color: $navbar-dark-color;
+
+ &:hover,
+ &:focus {
+ color: $navbar-dark-hover-color;
+ }
+
+ &.active {
+ color: $navbar-dark-active-color;
+ }
+ }
+
+ .menu-item.disabled .menu-link {
+ color: $navbar-dark-disabled-color !important;
+ }
+
+ .menu-item.open:not(.menu-item-closing) > .menu-toggle,
+ .menu-item.active > .menu-link {
+ color: $navbar-dark-active-color;
+ }
+
+ .menu-item.active > .menu-link:not(.menu-toggle) {
+ background: $menu-dark-menu-bg;
+ }
+
+ .menu-inner > .menu-item.menu-item-closing .menu-item.open .menu-sub,
+ .menu-inner > .menu-item.menu-item-closing .menu-item.open .menu-toggle {
+ color: $navbar-dark-color;
+ }
+
+ .menu-text {
+ color: $navbar-dark-active-color;
+ }
+
+ .menu-header {
+ color: $navbar-dark-color;
+ }
+
+ hr,
+ .menu-divider,
+ .menu-inner > .menu-item.open > .menu-sub::before {
+ border-color: $menu-dark-border-color !important;
+ }
+
+ .menu-inner > .menu-header::before,
+ .menu-block::before {
+ background-color: $navbar-dark-disabled-color;
+ }
+
+ .menu-inner > .menu-item.open .menu-item.open > .menu-toggle::before {
+ background-color: $menu-dark-border-color;
+ }
+
+ .menu-inner > .menu-item.open .menu-item.active > .menu-link::before {
+ background-color: $navbar-dark-active-color;
+ }
+
+ .ps__thumb-y {
+ background: $navbar-dark-color !important;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_mixins.scss b/resources/assets/vendor/scss/_components/_mixins.scss
new file mode 100644
index 0000000..4c4241c
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_mixins.scss
@@ -0,0 +1,9 @@
+@import 'mixins/navbar';
+@import 'mixins/footer';
+@import 'mixins/menu';
+@import 'mixins/avatar';
+@import 'mixins/text-divider';
+@import 'mixins/timeline';
+@import 'mixins/treeview';
+@import 'mixins/switch';
+@import 'mixins/misc';
diff --git a/resources/assets/vendor/scss/_components/_switch.scss b/resources/assets/vendor/scss/_components/_switch.scss
new file mode 100644
index 0000000..dbb4ed6
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_switch.scss
@@ -0,0 +1,239 @@
+// Switches
+// *******************************************************************************
+
+.switch {
+ margin-right: $switch-spacer-x;
+ position: relative;
+ vertical-align: middle;
+ margin-bottom: 0;
+ display: inline-block;
+ border-radius: $switch-border-radius;
+ cursor: pointer;
+
+ @include template-switch-size-base(
+ '',
+ $switch-width,
+ $switch-height,
+ $switch-font-size,
+ $switch-label-font-size,
+ $switch-label-line-height,
+ $switch-inner-spacer
+ );
+
+ @include rtl-style {
+ margin-left: $switch-spacer-x;
+ margin-right: 0;
+ }
+}
+
+// Input
+// *******************************************************************************
+
+.switch-input {
+ opacity: 0;
+ position: absolute;
+ padding: 0;
+ margin: 0;
+ z-index: -1;
+}
+
+// Toggle slider
+// *******************************************************************************
+
+.switch-toggle-slider {
+ position: absolute;
+ overflow: hidden;
+ border-radius: $switch-border-radius;
+ background: $switch-off-bg;
+ color: $switch-off-color;
+ transition-duration: 0.2s;
+ transition-property: left, right, background, box-shadow;
+ cursor: pointer;
+ user-select: none;
+ box-shadow: $form-switch-box-shadow;
+ &::after {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+}
+
+// Label switch
+// *******************************************************************************
+
+.switch-label {
+ display: inline-block;
+ font-weight: 400;
+ color: $switch-label-color;
+ position: relative;
+ cursor: default;
+}
+
+// Checked / Unchecked states
+.switch-off,
+.switch-on {
+ height: 100%;
+ width: 100%;
+ text-align: center;
+ position: absolute;
+ top: 0;
+ transition-duration: 0.2s;
+ transition-property: left, right;
+}
+
+.switch-on {
+ left: -100%;
+
+ @include rtl-style {
+ left: auto;
+ right: -100%;
+ }
+
+ .switch-input:not(:checked) ~ .switch-toggle-slider & {
+ color: transparent;
+ }
+}
+
+.switch-off {
+ left: 0;
+
+ @include rtl-style {
+ right: 0;
+ left: auto;
+ }
+}
+
+// Checked state
+.switch-input:checked ~ .switch-toggle-slider {
+ .switch-on {
+ left: 0;
+
+ @include rtl-style {
+ right: 0;
+ left: auto;
+ }
+ }
+
+ .switch-off {
+ left: 100%;
+ color: transparent;
+
+ @include rtl-style {
+ right: 100%;
+ left: auto;
+ }
+ }
+}
+
+// Toggler
+// *******************************************************************************
+
+.switch-toggle-slider::after {
+ content: '';
+ position: absolute;
+ left: 0;
+ display: block;
+ border-radius: 999px;
+ background: $switch-holder-bg;
+ box-shadow: $switch-holder-shadow;
+ transition-duration: 0.2s;
+ transition-property: left, right, background;
+
+ @include rtl-style {
+ right: 0;
+ left: auto;
+ }
+}
+
+// Stacked switches
+// *******************************************************************************
+
+.switches-stacked {
+ @include clearfix;
+
+ .switch {
+ display: block;
+ @include ltr-style {
+ margin-right: 0;
+ }
+ @include rtl-style {
+ margin-left: 0;
+ }
+ &:not(:last-child) {
+ margin-bottom: $switch-spacer-y;
+ }
+ }
+}
+
+// Square
+// *******************************************************************************
+
+.switch-square,
+.switch-square .switch-toggle-slider {
+ @if $enable-rounded {
+ border-radius: $switch-square-border-radius;
+ } @else {
+ border-radius: 0;
+ }
+}
+
+.switch-square .switch-toggle-slider::after {
+ @if $enable-rounded {
+ border-radius: calc(#{$switch-square-border-radius} - 2px);
+ } @else {
+ border-radius: 0;
+ }
+}
+
+// Disabled
+// *******************************************************************************
+
+.switch-input:disabled {
+ ~ .switch-toggle-slider {
+ opacity: $switch-disabled-opacity;
+ }
+
+ ~ .switch-label {
+ color: $switch-label-disabled-color;
+ }
+}
+
+// Switch Sizes
+// *******************************************************************************
+
+@include template-switch-size(
+ 'sm',
+ $switch-width-sm,
+ $switch-height-sm,
+ $switch-font-size,
+ $switch-label-font-size-sm,
+ $switch-label-line-height-sm,
+ $switch-inner-spacer-sm
+);
+@include template-switch-size(
+ 'lg',
+ $switch-width-lg,
+ $switch-height-lg,
+ $switch-font-size,
+ $switch-label-font-size-lg,
+ $switch-label-line-height-lg
+);
+
+// Variations
+// *******************************************************************************
+
+@each $color, $value in $theme-colors {
+ @if $color != primary and $color != light {
+ @include template-switch-variant('.switch-#{$color}', $value);
+ }
+}
+
+// Validation states
+// *******************************************************************************
+
+.switch .valid-feedback,
+.switch .invalid-feedback {
+ padding-left: $switch-gutter;
+}
+
+@include template-switch-validation-state('valid', $form-feedback-valid-color);
+@include template-switch-validation-state('invalid', $form-feedback-invalid-color);
diff --git a/resources/assets/vendor/scss/_components/_text-divider.scss b/resources/assets/vendor/scss/_components/_text-divider.scss
new file mode 100644
index 0000000..95101d8
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_text-divider.scss
@@ -0,0 +1,180 @@
+// Divider
+// *******************************************************************************
+
+@import '../../scss/_custom-variables/libs';
+
+.divider {
+ display: block;
+ text-align: center;
+ margin: $divider-margin-y $divider-margin-x;
+ overflow: hidden;
+ white-space: nowrap;
+
+ .divider-text {
+ position: relative;
+ display: inline-block;
+ font-size: $divider-font-size;
+ padding: $divider-text-padding-y $divider-text-padding-x;
+ color: $divider-text-color;
+
+ i {
+ font-size: $divider-icon-size;
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ width: 100vw;
+ border-top: 1px solid $divider-color;
+ }
+
+ &:before {
+ right: 100%;
+ }
+
+ &:after {
+ left: 100%;
+ }
+ }
+ &.text-start {
+ .divider-text {
+ padding-left: 0;
+ }
+ }
+ &.text-end {
+ .divider-text {
+ padding-right: 0;
+ }
+ }
+ &.text-start-center {
+ .divider-text {
+ left: -25%;
+ }
+ }
+ &.text-end-center {
+ .divider-text {
+ right: -25%;
+ }
+ }
+ // Dotted Divider
+ &.divider-dotted .divider-text:before,
+ &.divider-dotted .divider-text:after,
+ &.divider-dotted:before,
+ &.divider-dotted:after {
+ border-style: dotted;
+ border-width: 0 1px 1px;
+ border-color: $divider-color;
+ }
+
+ // Dashed Divider
+ &.divider-dashed .divider-text:before,
+ &.divider-dashed .divider-text:after,
+ &.divider-dashed:before,
+ &.divider-dashed:after {
+ border-style: dashed;
+ border-width: 0 1px 1px;
+ border-color: $divider-color;
+ }
+
+ // For Vertical Divider
+ &.divider-vertical {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ margin: unset;
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ left: 48%;
+ border-left: 1px solid $divider-color;
+ }
+
+ &:before {
+ bottom: 50%;
+ top: 0;
+ }
+
+ &:after {
+ top: 50%;
+ bottom: 0;
+ }
+
+ // Dashed Vertical Divider
+ &.divider-dashed {
+ &:before,
+ &:after {
+ border-width: 1px 1px 1px 0;
+ }
+ }
+
+ // Dotted Vertical Divider
+ &.divider-dotted {
+ &:before,
+ &:after {
+ border-width: 1px 1px 1px 0;
+ }
+ }
+
+ // For Vertical Divider text
+ .divider-text {
+ background-color: $card-bg;
+ z-index: 1;
+ padding: 0.5125rem;
+ &:before,
+ &:after {
+ content: unset;
+ }
+
+ // For card statistics Sales Overview divider
+ .badge-divider-bg {
+ padding: $divider-text-padding-x - 0.687rem $divider-text-padding-x - 0.748rem;
+ border-radius: 50%;
+ font-size: $divider-font-size - 0.1875rem;
+ background-color: $gray-50;
+ color: $text-muted;
+ }
+ }
+ }
+}
+
+// RTL
+@include rtl-only {
+ .divider {
+ &.text-start-center {
+ .divider-text {
+ right: -25%;
+ left: auto;
+ }
+ }
+ &.text-end-center {
+ .divider-text {
+ left: -25%;
+ right: auto;
+ }
+ }
+ &.text-start {
+ .divider-text {
+ padding-right: 0;
+ padding-left: $divider-text-padding-x;
+ }
+ }
+ &.text-end {
+ .divider-text {
+ padding-left: 0;
+ padding-right: $divider-text-padding-x;
+ }
+ }
+ }
+}
+
+// For Contextual Colors
+@each $color, $value in $theme-colors {
+ @if $color !=primary and $color !=light {
+ @include template-text-divider-variant('.divider-#{$color}', $value);
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_timeline.scss b/resources/assets/vendor/scss/_components/_timeline.scss
new file mode 100644
index 0000000..96157d4
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_timeline.scss
@@ -0,0 +1,363 @@
+// Timeline
+// *******************************************************************************
+
+@import '../../scss/_custom-variables/libs';
+
+.timeline {
+ position: relative;
+ height: 100%;
+ width: 100%;
+ padding: 0;
+ list-style: none;
+
+ .timeline-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-direction: row;
+ > *:first-child {
+ margin-right: 0.5rem;
+ }
+ }
+ // End Indicator
+ .timeline-end-indicator {
+ position: absolute;
+ bottom: -1.35rem;
+ left: -0.65rem;
+
+ i {
+ font-size: $timeline-end-indicator-font-size;
+ color: $timeline-border-color;
+ }
+ }
+
+ // Timeline Item
+ .timeline-item {
+ position: relative;
+ padding-left: 1.4rem;
+
+ .timeline-event {
+ position: relative;
+ width: 100%;
+ min-height: $timeline-item-min-height;
+ background-color: $timeline-item-bg-color;
+ border-radius: $timeline-item-border-radius;
+ padding: $timeline-item-padding-y $timeline-item-padding-x $timeline-item-padding-y - 0.1625;
+
+ .timeline-event-time {
+ position: absolute;
+ top: 1.2rem;
+ font-size: $timeline-event-time-size;
+ color: $timeline-event-time-color;
+ }
+ }
+ // Timeline Point Indicator
+
+ .timeline-indicator,
+ .timeline-indicator-advanced {
+ position: absolute;
+ left: -1rem;
+ top: 0.64rem;
+ z-index: 2;
+ height: $timeline-indicator-size;
+ width: $timeline-indicator-size;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ border-radius: 50%;
+ }
+
+ .timeline-indicator {
+ box-shadow: 0 0 0 10px $body-bg;
+ }
+
+ //For advanced Timeline Indicator Background
+ .timeline-indicator-advanced {
+ background-color: $card-bg;
+ top: 0;
+ }
+
+ .timeline-point {
+ position: absolute;
+ left: -0.38rem;
+ top: 0;
+ z-index: 2;
+ display: block;
+ height: $timeline-point-size;
+ width: $timeline-point-size;
+ border-radius: 50%;
+ background-color: $timeline-point-color;
+ box-shadow: 0 0 0 10px $card-bg;
+ }
+
+ // Transparent Timeline Item
+ &.timeline-item-transparent {
+ .timeline-event {
+ top: -0.9rem;
+ background-color: transparent;
+
+ @include ltr-style {
+ padding-left: 0;
+ }
+
+ &.timeline-event-shadow {
+ padding-left: 2rem;
+ }
+ }
+ }
+ }
+
+ // Timeline outline
+ &.timeline-outline {
+ .timeline-item {
+ .timeline-point {
+ outline: unset;
+ background-color: $card-bg !important;
+ border: 2px solid $primary;
+ }
+ }
+ }
+ // Timeline Center
+ &.timeline-center {
+ .timeline-end-indicator {
+ bottom: -1.4rem;
+ left: 50%;
+ margin-left: 0.55rem;
+ }
+
+ .timeline-item {
+ width: 50%;
+ clear: both;
+ &.timeline-item-left,
+ &:nth-of-type(odd):not(.timeline-item-left):not(.timeline-item-right) {
+ float: left;
+ padding-left: 0;
+ padding-right: 2.25rem;
+ padding-bottom: 2.5rem;
+ border-left: 0;
+ border-right: 1px solid $timeline-border-color;
+ .timeline-event {
+ .timeline-event-time {
+ right: -10.2rem;
+ }
+ }
+
+ .timeline-point {
+ left: 100%;
+ }
+ }
+
+ &.timeline-item-right,
+ &:nth-of-type(even):not(.timeline-item-left):not(.timeline-item-right) {
+ float: right;
+ right: 1px;
+ padding-left: 2.25rem;
+ padding-bottom: 2.5rem;
+ border-left: 1px solid $timeline-border-color;
+
+ .timeline-event {
+ .timeline-event-time {
+ left: -10.2rem;
+ }
+ .timeline-point {
+ left: 0;
+ }
+ }
+ }
+
+ .timeline-point {
+ left: 50%;
+ margin-left: -0.6875rem;
+ }
+ .timeline-point-indicator {
+ left: 50%;
+ margin-left: -0.3125rem;
+ }
+ }
+ }
+
+ // To remove arrows (visible while switching tabs) in widgets
+ &.timeline-advance {
+ .timeline-item {
+ .timeline-event {
+ &:before,
+ &:after {
+ border: transparent;
+ }
+ }
+ }
+ }
+}
+
+// LTR only
+@include ltr-only {
+ .timeline:not(.timeline-center) {
+ padding-left: 0.5rem;
+ }
+ .timeline-item {
+ border-left: 1px solid $timeline-border-color;
+ }
+}
+
+// RTL
+@include rtl-only {
+ .timeline:not(.timeline-center) {
+ padding-right: 0.5rem;
+ .timeline-item {
+ border-right: 1px solid $timeline-border-color;
+ }
+
+ .timeline-end-indicator {
+ left: auto;
+ right: -0.75rem;
+ }
+
+ .timeline-item {
+ padding-left: 0;
+ padding-right: 2rem;
+ border-right: 1px solid $timeline-border-color;
+
+ &.timeline-item-transparent {
+ .timeline-event {
+ padding-right: 0;
+ }
+ }
+
+ .timeline-point {
+ right: -0.38rem;
+ left: auto;
+ }
+ .timeline-indicator {
+ right: -0.75rem;
+ left: auto;
+ }
+ .timeline-indicator-advanced {
+ right: -1rem;
+ left: auto;
+ }
+ }
+ }
+}
+
+@include media-breakpoint-up(md) {
+ .timeline.timeline-center .timeline-item {
+ &.timeline-item-left,
+ &:nth-of-type(odd):not(.timeline-item-left):not(.timeline-item-right) {
+ .timeline-indicator {
+ left: calc(100% - calc(#{$timeline-indicator-size}/ 2));
+ }
+ }
+ }
+}
+// To Change Timeline Center's Alignment om small Screen
+
+@include media-breakpoint-down(md) {
+ .timeline {
+ &.timeline-center {
+ .timeline-end-indicator {
+ left: -2px;
+ }
+
+ .timeline-item {
+ border-right: 0 !important;
+ left: 1rem;
+ &:not(:last-child) {
+ border-left: 1px solid $timeline-border-color !important;
+ }
+ float: left !important;
+ width: 100%;
+ padding-left: 3rem !important;
+ padding-right: 1.5rem !important;
+
+ .timeline-event {
+ .timeline-event-time {
+ top: -1.7rem;
+ left: 0 !important;
+ right: auto !important;
+ }
+ }
+ .timeline-point {
+ left: -0.7rem !important;
+ margin-left: 0 !important;
+ }
+ .timeline-point-indicator {
+ left: 0 !important;
+ margin-left: -0.3125rem !important;
+ }
+ }
+ }
+ }
+ // RTL: Timeline Center's Alignment om small Screen
+ @include rtl-only {
+ .timeline {
+ &.timeline-center {
+ .timeline-item {
+ border-left: 0 !important;
+ right: 1rem !important;
+ &:not(:last-child) {
+ border-right: 1px solid $timeline-border-color !important;
+ }
+ }
+
+ .timeline-item {
+ float: right !important;
+ width: 100%;
+ padding-right: 3.5rem !important;
+ padding-left: 1.5rem !important;
+ .timeline-event {
+ .timeline-event-time {
+ top: -1.2rem;
+ right: 0 !important;
+ left: auto !important;
+ }
+ }
+ .timeline-point {
+ right: -0.7rem !important;
+ margin-right: 0 !important;
+ }
+ }
+ }
+ }
+ }
+}
+
+@include media-breakpoint-down(md) {
+ .timeline .timeline-item .timeline-indicator,
+ .timeline .timeline-item .timeline-indicator-advanced {
+ @include rtl-style {
+ left: auto;
+ right: -0.6875rem;
+ }
+ }
+
+ @include rtl-only {
+ .timeline-center {
+ .timeline-item {
+ padding-left: 0;
+ padding-right: 3rem;
+ }
+ }
+ }
+}
+@include media-breakpoint-down(sm) {
+ .timeline {
+ .timeline-header {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+ }
+}
+// For Contextual Colors
+@each $color, $value in $theme-colors {
+ @if $color !=primary and $color !=light {
+ @include template-timeline-point-variant(
+ '.timeline-point-#{$color}',
+ if($color== 'dark' and $dark-style, $light, $value)
+ );
+ @include template-timeline-indicator-variant(
+ '.timeline-indicator-#{$color}',
+ if($color== 'dark' and $dark-style, $light, $value)
+ );
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/_variables-dark.scss b/resources/assets/vendor/scss/_components/_variables-dark.scss
new file mode 100644
index 0000000..745cb60
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_variables-dark.scss
@@ -0,0 +1,25 @@
+// Dark Layout Variables
+
+// ! _variable-dark.scss file overrides _variable.scss file.
+
+// Avatar
+// *******************************************************************************
+$avatar-bg: #373b50 !default; // (C)
+
+// Menu
+// *******************************************************************************
+$menu-horizontal-box-shadow: 0px 1px 4px 0px rgba($shadow-bg, 0.1) !default;
+
+// switch
+// *******************************************************************************
+$switch-off-color: rgba-to-hex($gray-600, $rgba-to-hex-bg) !default;
+$switch-off-bg: rgba-to-hex(rgba($base, 0.1), $rgba-to-hex-bg) !default;
+$switch-off-border: rgba-to-hex(rgba($base, 0.1), $rgba-to-hex-bg) !default;
+// Timeline
+// *******************************************************************************
+$timeline-border-color: rgba-to-hex(rgba($base, 0.12), $rgba-to-hex-bg) !default;
+$timeline-event-time-color: $body-color !default;
+
+// Text Divider
+// *******************************************************************************
+$divider-color: $border-color !default;
diff --git a/resources/assets/vendor/scss/_components/_variables.scss b/resources/assets/vendor/scss/_components/_variables.scss
new file mode 100644
index 0000000..a3a9479
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/_variables.scss
@@ -0,0 +1,168 @@
+// Common
+// *******************************************************************************
+
+$ui-star-size: 1.1em !default;
+$ui-stars-spacer: -0.1em !default;
+$ui-star-filled-color: $yellow !default;
+
+// Navbar (custom navbar)
+// *******************************************************************************
+$navbar-height: 3.5rem !default;
+$navbar-suggestion-width: 100% !default;
+$navbar-suggestion-height: 28rem !default;
+$navbar-suggestion-border-radius: $border-radius !default;
+$navbar-dropdown-width: 22rem !default;
+$navbar-dropdown-content-height: 24.08rem !default;
+$navbar-notifications-dropdown-item-padding-y: 0.75rem !default;
+$navbar-notifications-dropdown-item-padding-x: 1rem !default;
+
+// Menu
+// *******************************************************************************
+
+$menu-width: 16.25rem !default;
+$menu-collapsed-width: 4.375rem !default;
+$menu-collapsed-layout-breakpoint: xl !default;
+
+$menu-font-size: $font-size-base !default;
+
+$menu-item-spacer: 0.375rem !default;
+
+$menu-vertical-link-margin-x: 0.75rem !default;
+$menu-link-spacer-x: 0.5rem !default;
+
+$menu-vertical-link-padding-y: 0.5rem !default;
+$menu-vertical-link-padding-x: 0.75rem !default;
+$menu-vertical-menu-link-padding-y: 0.5rem !default;
+$menu-vertical-menu-level-spacer: 0.5rem !default;
+
+$menu-vertical-header-margin-y: 0.5rem !default;
+$menu-vertical-header-margin-x: 1.25rem !default;
+
+$menu-horizontal-spacer-x: 0.375rem !default;
+$menu-horizontal-item-spacer: 0.25rem !default;
+$menu-horizontal-link-padding-y: 0.5rem !default;
+$menu-horizontal-link-padding-x: 1rem !default;
+$menu-horizontal-menu-link-padding-y: 0.5rem !default;
+$menu-horizontal-menu-level-spacer: 2.75rem !default;
+$menu-horizontal-box-shadow: 0px 1px 4px 0px rgba($black, 0.1) !default;
+
+$menu-sub-width: $menu-width !default;
+$menu-control-width: 2.25rem !default;
+$menu-control-arrow-size: 0.5rem !default;
+
+$menu-icon-expanded-width: 1.375rem !default;
+$menu-icon-expanded-left-spacer: 2.25rem !default;
+$menu-icon-expanded-font-size: 1.375rem !default;
+$menu-icon-expanded-spacer: 0.5rem !default;
+
+$menu-animation-duration: 0.3s !default;
+$menu-max-levels: 5 !default;
+
+$menu-dark-border-color: rgba(255, 255, 255, 0.2) !default;
+$menu-dark-menu-bg: rgba(0, 0, 0, 0.06) !default;
+$menu-light-border-color: rgba(0, 0, 0, 0.06) !default;
+$menu-light-menu-bg: rgba(0, 0, 0, 0.05) !default;
+
+// Custom Options
+// *******************************************************************************
+
+$custom-option-padding: 1.067em !default;
+$custom-option-cursor: pointer !default;
+$custom-option-border-color: $border-color !default;
+$custom-option-border-width: 1px !default;
+$custom-option-image-border-width: 2px !default;
+$custom-option-border-hover-color: $input-border-hover-color !default;
+
+// Switches
+// *******************************************************************************
+
+$switch-font-size: 0.625rem !default;
+$switch-border-radius: 30rem !default;
+
+$switch-width: 2.5rem !default;
+$switch-width-sm: 1.875rem !default;
+$switch-width-lg: 3.25rem !default;
+
+$switch-height: 1.35rem !default;
+$switch-height-sm: 1.125rem !default;
+$switch-height-lg: 1.75rem !default;
+
+$switch-label-font-size: $font-size-base !default;
+$switch-label-font-size-sm: $font-size-xs !default;
+$switch-label-font-size-lg: $font-size-lg !default;
+
+$switch-label-line-height: 1.4 !default;
+$switch-label-line-height-sm: 1.6 !default;
+$switch-label-line-height-lg: 1.47 !default;
+
+$switch-spacer-x: 0.75rem !default;
+$switch-spacer-y: 0.75rem !default;
+$switch-gutter: 0.5rem !default;
+$switch-inner-spacer: 0.25rem !default;
+$switch-inner-spacer-sm: 0.17rem !default;
+
+$switch-square-border-radius: $border-radius !default;
+
+$switch-label-color: $headings-color !default;
+$switch-label-disabled-color: $text-muted !default;
+$switch-disabled-opacity: 0.45 !default;
+
+$switch-off-color: $gray-400 !default;
+$switch-off-bg: rgba-to-hex($gray-100, $rgba-to-hex-bg) !default;
+$switch-off-border: rgba-to-hex($gray-100, $rgba-to-hex-bg) !default;
+$switch-holder-bg: $white !default;
+$switch-holder-shadow: $box-shadow-xs !default;
+$switch-focus-box-shadow: $input-btn-focus-box-shadow !default;
+
+// Avatars
+// *******************************************************************************
+
+$avatar-size-xl: 4rem !default;
+$avatar-size-lg: 3.5rem !default;
+$avatar-size-md: 3rem !default;
+$avatar-size: 2.5rem !default; // Default
+$avatar-size-sm: 2rem !default;
+$avatar-size-xs: 1.5rem !default;
+
+$avatar-initial-xl: 1.875rem !default;
+$avatar-initial-lg: 1.5rem !default;
+$avatar-initial-md: 1.125rem !default;
+$avatar-initial: $font-size-base !default;
+$avatar-initial-sm: 0.8125rem !default;
+$avatar-initial-xs: 0.625rem !default;
+
+$avatar-group-border: $card-bg !default;
+$avatar-bg: #eeedf0 !default; // (C)
+
+// Timeline
+// *******************************************************************************
+
+$timeline-border-color: $border-color !default;
+
+$timeline-indicator-size: 2rem !default;
+$timeline-point-size: 0.75rem !default;
+$timeline-point-color: $primary !default;
+$timeline-point-indicator-color: $primary !default;
+$timeline-end-indicator-font-size: 1.5rem !default;
+$timeline-item-min-height: 4rem !default;
+$timeline-item-padding-x: 0 !default;
+$timeline-item-padding-y: 0.5rem !default;
+$timeline-item-bg-color: $card-bg !default;
+$timeline-item-border-radius: $border-radius !default;
+
+$timeline-event-time-size: 0.85rem !default;
+$timeline-event-time-color: $text-muted !default;
+
+// Text Divider
+// *******************************************************************************
+$divider-color: $gray-200 !default;
+
+$divider-margin-y: 1rem !default;
+$divider-margin-x: 0 !default;
+
+$divider-text-padding-y: 0rem !default;
+$divider-text-padding-x: 1rem !default;
+
+$divider-font-size: $font-size-base !default;
+$divider-text-color: $headings-color !default;
+$divider-icon-size: 1.25rem !default;
diff --git a/resources/assets/vendor/scss/_components/mixins/_app-brand.scss b/resources/assets/vendor/scss/_components/mixins/_app-brand.scss
new file mode 100644
index 0000000..bc83dc5
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_app-brand.scss
@@ -0,0 +1,29 @@
+// Within menu
+@mixin template-app-brand-collapsed() {
+ .app-brand {
+ width: $menu-collapsed-width;
+ }
+
+ .app-brand-logo,
+ .app-brand-link,
+ .app-brand-text {
+ margin-right: auto;
+ margin-left: auto;
+ }
+
+ .app-brand-logo ~ .app-brand-text,
+ .app-brand .layout-menu-toggle {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ opacity: 0;
+ }
+
+ .app-brand-img {
+ display: none;
+ }
+
+ .app-brand-img-collapsed {
+ display: block;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_avatar.scss b/resources/assets/vendor/scss/_components/mixins/_avatar.scss
new file mode 100644
index 0000000..2941376
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_avatar.scss
@@ -0,0 +1,22 @@
+// Avatar
+// *******************************************************************************
+
+@mixin template-avatar-style($height, $width, $font-size, $status-indicator-position: 2px) {
+ width: $width;
+ height: $height;
+
+ .avatar-initial {
+ font-size: $font-size;
+ }
+
+ &.avatar-online,
+ &.avatar-offline,
+ &.avatar-away,
+ &.avatar-busy {
+ &:after {
+ width: $width * 0.2;
+ height: $height * 0.2;
+ right: $status-indicator-position;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_footer.scss b/resources/assets/vendor/scss/_components/mixins/_footer.scss
new file mode 100644
index 0000000..c3e9959
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_footer.scss
@@ -0,0 +1,47 @@
+// Footer
+// *******************************************************************************
+
+@mixin template-footer-style($parent, $bg, $color: null, $active-color: null, $border: null) {
+ $colors: get-navbar-prop($bg, $active-color, $color, $border);
+
+ #{$parent} {
+ color: map-get($colors, color);
+ .layout-footer-fixed .layout-horizontal & {
+ background-color: map-get($colors, bg) !important;
+ }
+
+ .layout-footer-fixed .layout-wrapper:not(.layout-horizontal) & {
+ .footer-container {
+ background-color: map-get($colors, bg) !important;
+ }
+ }
+
+ .footer-link {
+ color: map-get($colors, color);
+
+ &:hover,
+ &:focus {
+ color: map-get($colors, active-color);
+ }
+
+ &.disabled {
+ color: map-get($colors, disabled-color) !important;
+ }
+ }
+
+ .footer-text {
+ color: map-get($colors, active-color);
+ }
+
+ .show > .footer-link,
+ .active > .footer-link,
+ .footer-link.show,
+ .footer-link.active {
+ color: map-get($colors, active-color);
+ }
+
+ hr {
+ border-color: map-get($colors, border);
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_menu.scss b/resources/assets/vendor/scss/_components/mixins/_menu.scss
new file mode 100644
index 0000000..afe903f
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_menu.scss
@@ -0,0 +1,133 @@
+// Menu
+// *******************************************************************************
+
+@mixin template-menu-style($parent, $bg, $color: null, $active-color: null, $border: null, $active-bg: null) {
+ $colors: get-navbar-prop($bg, $active-color, $color, $border);
+ $contrast-percent: map-get($colors, contrast-percent);
+
+ @if not $active-bg {
+ $active-bg: rgba-to-hex(
+ rgba(map-get($colors, bg), 1 - if($contrast-percent < 0.75, 0.025, 0.05)),
+ if($contrast-percent > 0.25, #fff, #000)
+ );
+ }
+
+ $menu-active-bg: linear-gradient(270deg, rgba($active-bg, 0.7) 0%, $active-bg 100%);
+ $menu-active-bg-rtl: linear-gradient(-270deg, rgba($active-bg, 0.7) 0%, $active-bg 100%);
+ $horizontal-active-bg: rgba-to-hex(rgba($active-bg, 0.16), $bg);
+
+ #{$parent} {
+ background-color: map-get($colors, bg) !important;
+ &.menu-horizontal {
+ background-color: rgba(map-get($colors, bg), 0.95) !important;
+ }
+ color: map-get($colors, color);
+
+ .menu-link,
+ .menu-horizontal-prev,
+ .menu-horizontal-next {
+ color: map-get($colors, color);
+ &:hover,
+ &:focus {
+ color: map-get($colors, active-color);
+ }
+
+ &.active {
+ color: map-get($colors, active-color);
+ }
+ }
+ .menu-toggle::after {
+ color: map-get($colors, color);
+ }
+
+ .menu-item.disabled .menu-link,
+ .menu-horizontal-prev.disabled,
+ .menu-horizontal-next.disabled {
+ color: map-get($colors, disabled-color) !important;
+ }
+
+ .menu-item.open:not(.menu-item-closing) > .menu-toggle,
+ .menu-item.active > .menu-link {
+ color: map-get($colors, active-color);
+ }
+
+ //vertical menu active item bg color
+ &.menu-vertical .menu-item.active > .menu-link:not(.menu-toggle) {
+ background: $menu-active-bg;
+ box-shadow: 0px 2px 6px 0px rgba($active-bg, 0.3);
+ color: color-contrast($active-bg) !important;
+ &.menu-toggle::after {
+ color: color-contrast($active-bg) !important;
+ }
+ @if $rtl-support {
+ [dir='rtl'] & {
+ background: $menu-active-bg-rtl !important;
+ }
+ }
+ }
+
+ //-
+ &.menu-horizontal {
+ .menu-inner > .menu-item.active > .menu-link.menu-toggle {
+ background: $menu-active-bg;
+ color: color-contrast($active-bg) !important;
+ box-shadow: 0px 2px 6px 0px rgba($active-bg, 0.3);
+ &.menu-toggle::after {
+ color: color-contrast($active-bg) !important;
+ }
+ @if $rtl-support {
+ [dir='rtl'] & {
+ background: $menu-active-bg-rtl;
+ box-shadow: 0px 2px 6px 0px rgba($active-bg, 0.3);
+ color: color-contrast($active-bg) !important;
+ }
+ }
+ }
+
+ .menu-inner .menu-item:not(.menu-item-closing) > .menu-sub,
+ .menu-inner .menu-item.open > .menu-toggle {
+ background: $bg;
+ }
+
+ .menu-item.active > .menu-link:not(.menu-toggle) {
+ background: $horizontal-active-bg;
+ color: $active-bg !important;
+ }
+ }
+ .menu-inner > .menu-item.menu-item-closing .menu-item.open .menu-sub,
+ .menu-inner > .menu-item.menu-item-closing .menu-item.open .menu-toggle {
+ background: transparent;
+ color: color-contrast($active-bg);
+ }
+
+ .menu-inner-shadow {
+ background: linear-gradient($bg 41%, rgba($bg, 0.11) 95%, rgba($bg, 0));
+ }
+
+ .menu-text {
+ color: map-get($colors, active-color);
+ }
+
+ .menu-header {
+ color: map-get($colors, muted-color);
+ }
+
+ hr,
+ .menu-divider,
+ .menu-inner > .menu-item.open > .menu-sub::before {
+ border-color: map-get($colors, border) !important;
+ }
+
+ .menu-block::before {
+ background-color: map-get($colors, muted-color);
+ }
+
+ .ps__thumb-y,
+ .ps__rail-y.ps--clicking > .ps__thumb-y {
+ background: rgba(
+ map-get($colors, active-color),
+ if($contrast-percent > 0.75, map-get($colors, opacity) - 0.4, map-get($colors, opacity) - 0.2)
+ ) !important;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_misc.scss b/resources/assets/vendor/scss/_components/mixins/_misc.scss
new file mode 100644
index 0000000..f45340d
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_misc.scss
@@ -0,0 +1,6 @@
+// SVG Color
+@mixin template-svg-color($background) {
+ .svg-illustration svg {
+ fill: $background;
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_navbar.scss b/resources/assets/vendor/scss/_components/mixins/_navbar.scss
new file mode 100644
index 0000000..907493c
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_navbar.scss
@@ -0,0 +1,90 @@
+// Navbar
+// *******************************************************************************
+
+@mixin template-navbar-style($parent, $bg, $color: null, $active-color: null, $border: null) {
+ $colors: get-navbar-prop($bg, $active-color, $color, $border);
+
+ #{$parent} {
+ background-color: rgba(map-get($colors, bg), 0.88) !important;
+ color: map-get($colors, color);
+
+ .navbar-brand,
+ .navbar-brand a {
+ color: map-get($colors, active-color);
+
+ &:hover,
+ &:focus {
+ color: map-get($colors, active-color);
+ }
+ }
+
+ // Navbar search color
+ .navbar-search-wrapper {
+ .navbar-search-icon,
+ .search-input {
+ color: map-get($colors, color);
+ }
+ }
+ .search-input-wrapper {
+ .search-input,
+ .search-toggler {
+ background-color: $bg !important;
+ color: map-get($colors, color);
+ }
+ }
+
+ .navbar-nav {
+ > .nav-link,
+ > .nav-item > .nav-link,
+ > .nav > .nav-item > .nav-link {
+ color: map-get($colors, color);
+
+ &:hover,
+ &:focus {
+ color: map-get($colors, active-color);
+ }
+
+ &.disabled {
+ color: map-get($colors, disabled-color) !important;
+ }
+ }
+
+ .show > .nav-link,
+ .active > .nav-link,
+ .nav-link.show,
+ .nav-link.active {
+ color: map-get($colors, active-color);
+ }
+ }
+
+ .navbar-toggler {
+ color: map-get($colors, color);
+ border-color: map-get($colors, border);
+ }
+
+ .navbar-toggler-icon {
+ background-image: if(
+ map-get($colors, contrast-percent) > 0.75,
+ $navbar-light-toggler-icon-bg,
+ $navbar-dark-toggler-icon-bg
+ );
+ }
+
+ .navbar-text {
+ color: map-get($colors, color);
+
+ a {
+ color: map-get($colors, active-color);
+
+ &:hover,
+ &:focus {
+ color: map-get($colors, active-color);
+ }
+ }
+ }
+
+ hr {
+ border-color: map-get($colors, border);
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_switch.scss b/resources/assets/vendor/scss/_components/mixins/_switch.scss
new file mode 100644
index 0000000..a5b5339
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_switch.scss
@@ -0,0 +1,179 @@
+// * Switches
+// *******************************************************************************
+
+@mixin template-switch-size-base(
+ $size,
+ $width,
+ $height,
+ $font-size,
+ $form-label-font-size,
+ $label-line-height,
+ $inner-spacer
+) {
+ min-height: $height;
+
+ font-size: $form-label-font-size;
+ line-height: $label-line-height;
+
+ $delta: 0;
+ $line-height-computed: $form-label-font-size * $label-line-height;
+ .switch-label:first-child {
+ padding-right: $switch-gutter;
+ }
+ .switch-input ~ .switch-label {
+ padding-left: $width + $switch-gutter;
+ }
+
+ .switch-toggle-slider {
+ width: $width;
+ height: $height - ($delta * 2);
+ font-size: $font-size;
+ line-height: $height;
+ border: 1px solid transparent;
+
+ i {
+ position: relative;
+ font-size: $form-label-font-size;
+ @if ($size== 'lg') {
+ top: -2px;
+ } @else if ($size== 'sm') {
+ top: -2px;
+ } @else {
+ top: -1.35px;
+ }
+ }
+
+ @if ($line-height-computed>$height) {
+ top: (($line-height-computed - $height) * 0.5) + $delta;
+ } @else {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+ }
+
+ .switch-label {
+ @if ($line-height-computed < $height) {
+ top: ($height - $line-height-computed) * 0.5;
+ } @else {
+ top: 0;
+ }
+ }
+
+ .switch-input:checked ~ .switch-toggle-slider::after {
+ left: $width - $height - 0.1;
+ }
+
+ .switch-toggle-slider::after {
+ margin-left: $inner-spacer;
+ width: ceil(rem-to-px($height - $inner-spacer * 2));
+ height: ceil(rem-to-px($height - $inner-spacer * 2));
+ }
+
+ .switch-on {
+ padding-left: $inner-spacer;
+ padding-right: $height - $inner-spacer;
+ }
+
+ .switch-off {
+ padding-left: $height - $inner-spacer;
+ padding-right: $inner-spacer;
+ }
+
+ @if $rtl-support {
+ [dir='rtl'] & .switch-label {
+ padding-right: $width + $switch-gutter;
+ padding-left: 0;
+ }
+ [dir='rtl'] & .switch-input:checked ~ .switch-toggle-slider::after {
+ left: auto;
+ right: $width - $height - 0.15;
+ }
+
+ [dir='rtl'] & .switch-toggle-slider {
+ &::after {
+ margin-left: 0;
+ margin-right: $inner-spacer;
+ }
+ }
+
+ [dir='rtl'] & .switch-on {
+ padding-left: $height - $inner-spacer;
+ padding-right: $inner-spacer;
+ }
+
+ [dir='rtl'] & .switch-off {
+ padding-left: $inner-spacer;
+ padding-right: $height - $inner-spacer;
+ }
+ }
+}
+
+// Switch size
+@mixin template-switch-size(
+ $size,
+ $width,
+ $height,
+ $font-size,
+ $form-label-font-size,
+ $label-line-height,
+ $inner-spacer: $switch-inner-spacer
+) {
+ .switch-#{$size} {
+ @include template-switch-size-base(
+ $size,
+ $width,
+ $height,
+ $font-size,
+ $form-label-font-size,
+ $label-line-height,
+ $inner-spacer
+ );
+ }
+}
+
+// Switch variant
+@mixin template-switch-variant($parent, $background, $color: null) {
+ $selector: if($parent== '', '', '#{$parent}.switch');
+ $color: if($color, $color, color-contrast($background));
+
+ #{$selector} .switch-input:checked ~ .switch-toggle-slider {
+ background: $background;
+ color: $color;
+ box-shadow: 0 2px 6px 0 rgba($background, 0.3);
+ }
+}
+
+// Switch theme
+@mixin template-switch-theme($parent, $background, $color: null) {
+ @include template-switch-variant($parent, $background, $color);
+}
+
+// Switch validation
+@mixin template-switch-validation-state($state, $color) {
+ .switch-input {
+ //BS & jQuery validation
+ .was-validated &:#{$state},
+ &.invalid,
+ //jq
+ &.is-#{$state} {
+ ~ .switch-label {
+ color: $color;
+ }
+
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+
+ ~ .switch-toggle-slider {
+ border: 1px solid $color !important;
+ }
+
+ &:checked ~ .switch-toggle-slider {
+ background: $color;
+ color: color-contrast($color);
+ box-shadow: 0 2px 6px 0 rgba($color, 0.3);
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_text-divider.scss b/resources/assets/vendor/scss/_components/mixins/_text-divider.scss
new file mode 100644
index 0000000..cd67b7e
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_text-divider.scss
@@ -0,0 +1,17 @@
+// Text Divider
+// *******************************************************************************
+
+@mixin template-text-divider-variant($divider-color, $background) {
+ $divider-selector: if($divider-color== '', '', '#{$divider-color}');
+ .divider {
+ {$divider-selector} {
+ &.divider-vertical,
+ .divider-text {
+ &:before,
+ &:after {
+ border-color: $background;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_timeline.scss b/resources/assets/vendor/scss/_components/mixins/_timeline.scss
new file mode 100644
index 0000000..5067c84
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_timeline.scss
@@ -0,0 +1,33 @@
+// Timeline
+// *******************************************************************************
+
+// Timeline point
+@mixin template-timeline-point-variant($point-color, $background) {
+ .timeline {
+ #{$point-color} {
+ background-color: $background !important;
+ outline: 3px solid rgba($background, 0.12);
+ }
+
+ // Timeline-outline styles
+ &.timeline-outline {
+ #{$point-color} {
+ border: 2px solid $background !important;
+ }
+ }
+ }
+}
+
+@mixin template-timeline-indicator-variant($indicator-color, $background) {
+ $color: $background;
+ $background: rgba-to-hex(rgba($background, 0.16), $rgba-to-hex-bg);
+
+ .timeline {
+ #{$indicator-color} {
+ background-color: $background;
+ i {
+ color: $color !important;
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_components/mixins/_treeview.scss b/resources/assets/vendor/scss/_components/mixins/_treeview.scss
new file mode 100644
index 0000000..081a8c4
--- /dev/null
+++ b/resources/assets/vendor/scss/_components/mixins/_treeview.scss
@@ -0,0 +1,30 @@
+// Treeview
+// *******************************************************************************
+
+// Treeview click
+@mixin template-treeview-clicked-bg($background) {
+ .jstree-default {
+ .jstree-wholerow-hovered,
+ .jstree-hovered {
+ background: $component-hover-bg;
+ color: $component-hover-color;
+ }
+ .jstree-wholerow-clicked,
+ .jstree-clicked {
+ background: $component-hover-color;
+ color: $white;
+ }
+ }
+ .jstree-default-dark {
+ .jstree-wholerow-hovered,
+ .jstree-hovered {
+ background: $component-hover-bg;
+ color: $component-hover-color;
+ }
+ .jstree-wholerow-clicked,
+ .jstree-clicked {
+ background: $component-hover-color;
+ color: $white;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_custom-variables/_bootstrap-extended-dark.scss b/resources/assets/vendor/scss/_custom-variables/_bootstrap-extended-dark.scss
new file mode 100644
index 0000000..29b6f8f
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_bootstrap-extended-dark.scss
@@ -0,0 +1,6 @@
+// ===================================================================================================================
+// ? TIP: It is recommended to use this file for overriding bootstrap extended dark variables (_bootstrap-extended/_variables-dark.scss).
+// Copy and paste variables as needed, modify their values, and remove the !default flag.
+// ===================================================================================================================
+
+// $success: #f0f000 !default;
diff --git a/resources/assets/vendor/scss/_custom-variables/_bootstrap-extended.scss b/resources/assets/vendor/scss/_custom-variables/_bootstrap-extended.scss
new file mode 100644
index 0000000..e6dedd5
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_bootstrap-extended.scss
@@ -0,0 +1,7 @@
+// ===================================================================================================================
+// ? TIP: It is recommended to use this file for overriding bootstrap extended variables (_bootstrap-extended/_variables.scss).
+// Copy and paste variables as needed, modify their values, and remove the !default flag.
+// ===================================================================================================================
+
+// $font-size-root: 14px !default;
+// $success: #00ff00 !default;
diff --git a/resources/assets/vendor/scss/_custom-variables/_components-dark.scss b/resources/assets/vendor/scss/_custom-variables/_components-dark.scss
new file mode 100644
index 0000000..706c14e
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_components-dark.scss
@@ -0,0 +1,5 @@
+// ==========================================================================================================
+// ? TIP: It is recommended to use this file for overriding component dark variables (_components/_variables-dark.scss).
+// Copy and paste variables as needed, modify their values, and remove the !default flag.
+// ==========================================================================================================
+// $menu-width: 18rem !default;
diff --git a/resources/assets/vendor/scss/_custom-variables/_components.scss b/resources/assets/vendor/scss/_custom-variables/_components.scss
new file mode 100644
index 0000000..e6230c4
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_components.scss
@@ -0,0 +1,6 @@
+// ================================================================================================
+// ? TIP: It is recommended to use this file for overriding component variables (_components/_variables.scss).
+// Copy and paste variables as needed, modify their values, and remove the !default flag.
+// ================================================================================================
+
+// $menu-width: 14rem !default;
diff --git a/resources/assets/vendor/scss/_custom-variables/_libs.scss b/resources/assets/vendor/scss/_custom-variables/_libs.scss
new file mode 100644
index 0000000..0235932
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_libs.scss
@@ -0,0 +1,8 @@
+// ================================================================================================
+// ? TIP: It is recommended to use this file for overriding any library variables from (libs/) folder.
+// Copy and paste variables as needed, modify their values, and remove the !default flag.
+// ================================================================================================
+
+@import 'support';
+
+// $flatpickr-content-padding: 0.5rem;
\ No newline at end of file
diff --git a/resources/assets/vendor/scss/_custom-variables/_pages.scss b/resources/assets/vendor/scss/_custom-variables/_pages.scss
new file mode 100644
index 0000000..f72a574
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_pages.scss
@@ -0,0 +1,8 @@
+// ================================================================================================
+// ? TIP: It is recommended to use this file for overriding any pages variables from the (pages/) folder.
+// Copy and paste variables as needed, modify their values, and remove the !default flag.
+// ================================================================================================
+
+@import 'support';
+
+// $calender-sidebar-width: 20rem;
\ No newline at end of file
diff --git a/resources/assets/vendor/scss/_custom-variables/_support.scss b/resources/assets/vendor/scss/_custom-variables/_support.scss
new file mode 100644
index 0000000..93cde5c
--- /dev/null
+++ b/resources/assets/vendor/scss/_custom-variables/_support.scss
@@ -0,0 +1,51 @@
+$enable-light-style: true;
+$enable-dark-style: true;
+$enable-rtl-support: true;
+
+@mixin app-ltr($has-child: true) {
+ @if $enable-rtl-support {
+ @if $has-child {
+ html:not([dir='rtl']) & {
+ @content;
+ }
+ } @else {
+ html:not([dir='rtl']) {
+ @content;
+ }
+ }
+ } @else {
+ @content;
+ }
+}
+
+@mixin app-ltr-style() {
+ @if $enable-rtl-support {
+ &:not([dir='rtl']) {
+ @content;
+ }
+ } @else {
+ @content;
+ }
+}
+
+@mixin app-rtl($has-child: true) {
+ @if $enable-rtl-support {
+ @if $has-child {
+ [dir='rtl'] & {
+ @content;
+ }
+ } @else {
+ [dir='rtl'] {
+ @content;
+ }
+ }
+ }
+}
+
+@mixin app-rtl-style() {
+ @if $enable-rtl-support {
+ &[dir='rtl'] {
+ @content;
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/_theme/_common.scss b/resources/assets/vendor/scss/_theme/_common.scss
new file mode 100644
index 0000000..09a66bf
--- /dev/null
+++ b/resources/assets/vendor/scss/_theme/_common.scss
@@ -0,0 +1,75 @@
+// Theme mixin
+// *******************************************************************************
+
+@mixin template-common-theme($background, $color: null) {
+ @include text-variant('.text-primary', $background);
+ @include bg-variant('.bg-primary', $background);
+ @include bg-label-variant('.bg-label-primary', $background);
+ @include bg-label-hover-variant('.bg-label-hover-primary', $background);
+ @include bg-gradient-variant('.bg-gradient-primary', $background);
+ @include bg-glow-variant('.bg-primary', $background);
+ @include template-pagination-theme($background, $color);
+ @include template-pagination-outline-variant('.pagination-outline-primary', $background);
+ @include template-progress-bar-theme($background, $color);
+ @include template-progress-shadow-theme('.progress-bar', $background);
+ @include template-modal-onboarding-theme($background, $color);
+ @include template-list-group-theme($background, $color);
+ @include template-list-group-timeline-variant('.list-group-timeline-primary', $background);
+ @include template-alert-variant('.alert-primary', $background);
+ @include template-alert-outline-variant('.alert-outline-primary', $background);
+ @include template-alert-solid-variant('.alert-solid-primary', $background);
+ @include template-tooltip-variant(
+ '.tooltip-primary, .tooltip-primary > .tooltip, .ngb-tooltip-primary + ngb-tooltip-window',
+ $background,
+ $color
+ );
+ @include template-popover-variant(
+ '.popover-primary, .popover-primary > .popover, .ngb-popover-primary + ngb-popover-window',
+ $background,
+ $color
+ );
+
+ // Need to add shift-color as BS5 updated with table variant colors like this
+
+ @include template-table-variant('primary', shift-color($background, $table-bg-scale));
+ @include template-button-variant('.btn-primary', $background, $color);
+ @include template-button-label-variant('.btn-label-primary', $background, $color);
+ @include template-button-text-variant('.btn-text-primary', $background, $color);
+ @include template-button-outline-variant('.btn-outline-primary', $background, $color);
+ @include template-dropdown-theme(rgba-to-hex(rgba($background, 0.16), $card-bg), $background);
+ @include template-nav-theme($background, $color);
+ @include template-form-control-theme($background);
+ @include template-form-check-theme($background, $color);
+ @include template-form-switch-theme($background);
+ @include template-file-input-theme($background);
+
+ @include template-switch-variant('', $background, $color); // For default switch
+ @include template-switch-variant('.switch-primary', $background, $color);
+
+ @include template-timeline-point-variant('.timeline-point-primary', $background);
+ @include template-timeline-indicator-variant('.timeline-indicator-primary', $background);
+ @include template-text-divider-variant('.divider-primary', $background);
+
+ @include template-navbar-style('.navbar.bg-primary', $background);
+ @include template-menu-style('.menu.bg-primary', $background);
+ @include template-footer-style('.footer.bg-primary', $background);
+ @include template-float-label-theme($background);
+ @include template-svg-color($background);
+ @include template-treeview-clicked-bg($background);
+ @include template-card-border-shadow-variant('.card-border-shadow-primary', $background);
+ @include template-card-hover-border-variant('.card-hover-border-primary', $background);
+
+ html:not([dir='rtl']) .border-primary,
+ html[dir='rtl'] .border-primary {
+ border-color: $background !important;
+ }
+ a {
+ color: $background;
+ &:hover {
+ color: tint-color($background, 10%);
+ }
+ }
+ .fill-primary {
+ fill: $background;
+ }
+}
diff --git a/resources/assets/vendor/scss/_theme/_libs.scss b/resources/assets/vendor/scss/_theme/_libs.scss
new file mode 100644
index 0000000..68d8c88
--- /dev/null
+++ b/resources/assets/vendor/scss/_theme/_libs.scss
@@ -0,0 +1,75 @@
+// Imports
+// *******************************************************************************
+
+@import '../../libs/nouislider/mixins';
+@import '../../libs/select2/mixins';
+
+@import '../../libs/tagify/mixins';
+@import '../../libs/datatables-responsive-bs5/mixins';
+@import '../../libs/bootstrap-select/mixins';
+@import '../../libs/bootstrap-datepicker/mixins';
+@import '../../libs/flatpickr/mixins';
+@import '../../libs/bootstrap-daterangepicker/mixins';
+@import '../../libs/jquery-timepicker/mixins';
+@import '../../libs/quill/mixins';
+@import '../../libs/typeahead-js/mixins';
+@import '../../libs/dropzone/mixins';
+@import '../../libs/swiper/mixins';
+@import '../../libs/spinkit/mixins';
+@import '../../libs/plyr/mixins';
+@import '../../libs/fullcalendar/mixins';
+@import '../../libs/sweetalert2/mixins';
+@import '../../libs/pickr/mixins';
+@import '../../libs/shepherd/mixins';
+@import '../../libs/bs-stepper/mixins';
+
+// Theme mixin
+// *******************************************************************************
+
+@mixin template-libs-theme($background, $color: null) {
+ @include nouislider-theme($background);
+ @include select2-theme($background, $color);
+ @include tagify-theme($background);
+ @include bs-datatables-theme($background);
+ @include bs-select-theme($background, $color);
+ @include bs-datepicker-theme($background, $color);
+ @include flatpickr-theme($background, $color);
+ @include bs-daterangepicker-theme($background, $color);
+ @include timepicker-theme($background, $color);
+ @include quill-theme($background);
+ @include typeahead-theme($background, $color);
+ @include dropzone-theme($background);
+ @include swiper-theme($background);
+ @include spinkit-theme($background);
+ @include plyr-theme($background, $color);
+ @include fullcalendar-theme($background, $color);
+ @include sweetalert2-theme($background, $color);
+ @include colorPicker-theme($background);
+ @include icon-theme($background);
+ @include tour-theme($background);
+ @include bs-stepper-theme($background);
+}
+
+@mixin template-libs-dark-theme($background, $color: null) {
+ @include nouislider-theme($background);
+ @include select2-theme($background, $color);
+ @include tagify-theme($background);
+ @include bs-datatables-theme($background);
+ @include bs-select-theme($background, $color);
+ @include bs-datepicker-dark-theme($background, $color);
+ @include flatpickr-dark-theme($background, $color);
+ @include bs-daterangepicker-dark-theme($background, $color);
+ @include timepicker-theme($background, $color);
+ @include quill-theme($background);
+ @include typeahead-theme($background, $color);
+ @include dropzone-theme($background);
+ @include swiper-theme($background);
+ @include spinkit-theme($background);
+ @include plyr-theme($background, $color);
+ @include fullcalendar-theme($background, $color);
+ @include sweetalert2-dark-theme($background, $color);
+ @include colorPicker-theme($background);
+ @include icon-theme($background); // ToDo: placement of mixin
+ @include tour-theme($background);
+ @include bs-stepper-theme($background);
+}
diff --git a/resources/assets/vendor/scss/_theme/_pages.scss b/resources/assets/vendor/scss/_theme/_pages.scss
new file mode 100644
index 0000000..b98f5e2
--- /dev/null
+++ b/resources/assets/vendor/scss/_theme/_pages.scss
@@ -0,0 +1,10 @@
+// Page mixins
+// *******************************************************************************
+
+@import '../pages/mixins';
+
+@mixin template-pages-theme($background, $color: null) {
+ // include page related mixins
+ @include app-chat-theme($background);
+ @include front-theme($background);
+}
diff --git a/resources/assets/vendor/scss/_theme/_theme.scss b/resources/assets/vendor/scss/_theme/_theme.scss
new file mode 100644
index 0000000..3cf16bb
--- /dev/null
+++ b/resources/assets/vendor/scss/_theme/_theme.scss
@@ -0,0 +1,103 @@
+// ? Theme related styles common styles
+
+@import '../_components/include';
+
+// Space above detached navbar (vertical layout only)
+.layout-navbar-fixed .layout-wrapper:not(.layout-horizontal) .layout-page:before {
+ content: '';
+ width: 100%;
+ height: calc($spacer + $navbar-height);
+ position: fixed;
+ top: 0px;
+ z-index: 10;
+}
+
+.bg-menu-theme {
+ // Sub menu item link bullet
+ .menu-sub > .menu-item > .menu-link:before {
+ content: '\ea6b';
+ font-family: 'tabler-icons';
+ position: absolute;
+ font-size: 0.75rem;
+ font-weight: bold;
+ }
+ &.menu-vertical {
+ .menu-sub > .menu-item > .menu-link:before {
+ left: 1.1rem;
+ @include rtl-style {
+ right: 1.1rem;
+ left: inherit;
+ }
+ }
+ .menu-sub > .menu-item .menu-link .menu-icon {
+ display: none;
+ }
+ }
+ &.menu-horizontal {
+ .menu-inner > .menu-item > .menu-sub > .menu-item > .menu-link {
+ @include ltr-style {
+ padding-left: $menu-horizontal-link-padding-x;
+ }
+ @include rtl-style {
+ padding-right: $menu-horizontal-link-padding-x;
+ }
+ &:before {
+ content: '';
+ }
+ }
+ }
+ // Sub menu item link bullet
+ .menu-sub > .menu-item > .menu-link:before {
+ // For horizontal layout
+ .layout-horizontal & {
+ left: 1.1rem;
+ @include rtl-style {
+ right: 1.1rem;
+ left: inherit;
+ }
+ }
+ }
+
+ .menu-inner .menu-item .menu-link {
+ .layout-wrapper:not(.layout-horizontal) & {
+ border-radius: $border-radius;
+ }
+ }
+ .menu-inner > .menu-item > .menu-link {
+ .layout-horizontal & {
+ border-radius: $border-radius;
+ }
+ }
+
+ .menu-inner > {
+ // Spacing and Box-shadow only for horizontal menu above lg screen
+ @include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .menu-item {
+ .layout-horizontal & {
+ margin: $menu-vertical-header-margin-y 0;
+ &:not(:first-child) {
+ margin-inline-start: calc($menu-item-spacer / 2);
+ }
+ &:not(:last-child) {
+ margin-inline-end: calc($menu-item-spacer / 2);
+ }
+ }
+ }
+ }
+ .menu-item.active:before {
+ .layout-wrapper:not(.layout-horizontal) & {
+ content: '';
+ position: absolute;
+ right: 0;
+ width: 0.25rem;
+ height: 2.6845rem;
+ border-radius: $border-radius 0 0 $border-radius;
+ @include rtl-style {
+ left: 0;
+ right: inherit;
+ border-radius: 0 $border-radius $border-radius 0;
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/core-dark.scss b/resources/assets/vendor/scss/core-dark.scss
new file mode 100644
index 0000000..7233d20
--- /dev/null
+++ b/resources/assets/vendor/scss/core-dark.scss
@@ -0,0 +1,4 @@
+@import 'bootstrap-dark';
+@import 'bootstrap-extended-dark';
+@import 'components-dark';
+@import 'colors-dark';
diff --git a/resources/assets/vendor/scss/core.scss b/resources/assets/vendor/scss/core.scss
new file mode 100644
index 0000000..dae0761
--- /dev/null
+++ b/resources/assets/vendor/scss/core.scss
@@ -0,0 +1,4 @@
+@import 'bootstrap';
+@import 'bootstrap-extended';
+@import 'components';
+@import 'colors';
diff --git a/resources/assets/vendor/scss/pages/_mixins.scss b/resources/assets/vendor/scss/pages/_mixins.scss
new file mode 100644
index 0000000..87ce6d2
--- /dev/null
+++ b/resources/assets/vendor/scss/pages/_mixins.scss
@@ -0,0 +1,78 @@
+/*
+* Pages Mixins
+*/
+@import '../../scss/_bootstrap-extended/functions';
+
+@mixin icon-theme($color) {
+ .icon-card.active {
+ outline: 1px solid $color;
+ i,
+ svg {
+ color: $color;
+ }
+ }
+}
+
+// App Chat
+@mixin app-chat-theme($color) {
+ $chat-item-active-bg: $color;
+ .app-chat {
+ .sidebar-body {
+ .chat-contact-list {
+ li {
+ &.active {
+ background: $chat-item-active-bg;
+ }
+ }
+ }
+ }
+ .app-chat-history {
+ .chat-history {
+ .chat-message {
+ &.chat-message-right {
+ .chat-message-text {
+ background-color: $color !important;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+@mixin front-theme($color) {
+ // Navbar ---------------------
+ .navbar {
+ &.landing-navbar {
+ .navbar-nav {
+ .show > .nav-link,
+ .active > .nav-link,
+ .nav-link.show,
+ .nav-link.active,
+ .nav-link:hover {
+ color: $color !important;
+ i {
+ color: $color !important;
+ }
+ }
+ }
+ }
+ }
+
+ // Landing page ---------------------
+ // Useful features
+ .landing-features {
+ .features-icon-wrapper {
+ .features-icon-box {
+ .features-icon {
+ border: 2px solid rgba($color, 0.2);
+ }
+ &:hover {
+ .features-icon {
+ background-color: rgba($color, 0.05);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/resources/assets/vendor/scss/theme-bordered-dark.scss b/resources/assets/vendor/scss/theme-bordered-dark.scss
new file mode 100644
index 0000000..dcaa37a
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-bordered-dark.scss
@@ -0,0 +1,343 @@
+@import './_components/include-dark';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #7367f0;
+
+body {
+ background: $card-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+.dropdown-menu,
+.popover,
+.toast,
+.flatpickr-calendar:not(.app-calendar-sidebar .flatpickr-calendar),
+.datepicker.datepicker-inline,
+.datepicker.datepicker-inline table,
+.daterangepicker,
+.pcr-app,
+.ui-timepicker-wrapper,
+.twitter-typeahead .tt-menu,
+.tagify__dropdown,
+.swal2-popup,
+.select2-dropdown,
+.select2-container--default .select2-dropdown.select2-dropdown--above,
+.shepherd-element,
+.menu-horizontal .menu-inner > .menu-item.open .menu-sub,
+div.dataTables_wrapper .dt-button-collection {
+ outline: none;
+ box-shadow: none !important;
+ border: 1px solid $border-color !important;
+}
+
+.flatpickr-days,
+.flatpickr-time {
+ border-width: 0 !important;
+}
+
+// Bootstrap select > double border fix
+.dropdown-menu .dropdown-menu {
+ border: none !important;
+}
+.datepicker.datepicker-inline {
+ width: fit-content;
+ border-radius: $border-radius;
+}
+.apexcharts-canvas .apexcharts-tooltip,
+.modal-content,
+.offcanvas,
+div.dataTables_wrapper .dt-button-collection > div[role='menu'] {
+ box-shadow: none !important;
+}
+.modal-content {
+ & {
+ border: $border-width solid $border-color !important;
+ }
+}
+.offcanvas.offcanvas-start,
+.offcanvas.offcanvas-end,
+.offcanvas.offcanvas-top,
+.offcanvas.offcanvas-bottom {
+ border-width: $border-width;
+}
+.select2-dropdown {
+ border-color: $border-color !important;
+}
+.bs-popover-start > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::before {
+ border-left-color: $border-color !important;
+ right: -1px;
+}
+.bs-popover-end > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::before {
+ border-right-color: $border-color !important;
+ left: -1px;
+}
+.bs-popover-top > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::before {
+ border-top-color: $border-color !important;
+ bottom: -1px;
+}
+.bs-popover-bottom > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::before {
+ border-bottom-color: $border-color !important;
+ top: -1px;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-dark-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+.layout-navbar,
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.navbar-detached {
+ border: 1px solid $border-color;
+ box-shadow: none;
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($card-bg, 70%) 44%, rgba($card-bg, 43%) 73%, rgba($card-bg, 0%));
+ -webkit-mask: linear-gradient($card-bg, $card-bg 18%, transparent 100%);
+ mask: linear-gradient($card-bg, $card-bg 18%, transparent 100%);
+}
+.layout-horizontal {
+ .layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+ }
+ .layout-page .menu-horizontal {
+ box-shadow: none;
+ border-bottom: 1px solid $border-color;
+ }
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+@include template-menu-style(
+ '.bg-menu-theme',
+ $card-bg,
+ $color: $headings-color,
+ $active-color: $headings-color,
+ $active-bg: $primary-color
+);
+
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-75;
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-50;
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: $body-color !important;
+ }
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .layout-menu {
+ box-shadow: 0 0 0 1px $border-color;
+ }
+}
+
+.layout-menu-horizontal {
+ box-shadow: 0 -1px 0 $border-color inset;
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.content-footer .footer-container {
+ .layout-footer-fixed .layout-wrapper:not(.layout-horizontal) & {
+ border: 1px solid $border-color;
+ border-bottom: 0;
+ }
+}
+.content-footer {
+ .layout-horizontal & {
+ border-top: 1px solid $border-color;
+ }
+}
+
+// Component styles
+// ---------------------------------------------------------------------------
+
+// card
+.card:not(.card-group .card),
+.card-group {
+ box-shadow: none;
+ border: $border-width solid $card-border-color;
+}
+// card border-shadow variant
+.card {
+ &[class*='card-border-shadow-'] {
+ &:hover {
+ box-shadow: none !important;
+ }
+ }
+}
+
+//Accordion
+.accordion {
+ &:not(.accordion-custom-button):not(.accordion-arrow-left) {
+ .accordion-item {
+ border: $accordion-border-width solid $accordion-border-color;
+ }
+ }
+ .accordion-item {
+ box-shadow: none !important;
+ }
+}
+
+// Tabs
+.nav-tabs-shadow {
+ box-shadow: none !important;
+ border: 1px solid $border-color !important;
+ border-radius: $border-radius;
+}
+.nav-pills:not(.card-header-pills) {
+ ~ .tab-content {
+ border: 1px solid $border-color !important;
+ @include border-radius($border-radius);
+ box-shadow: none;
+ }
+}
+.nav-align-top .nav-tabs {
+ @include border-top-radius($border-radius);
+ ~ .tab-content {
+ box-shadow: none;
+ border-top-width: 0 !important;
+ @include border-bottom-radius($border-radius);
+ }
+}
+.nav-align-bottom .nav-tabs {
+ @include border-bottom-radius($border-radius);
+ ~ .tab-content {
+ box-shadow: none;
+ border-bottom-width: 0 !important;
+ @include border-top-radius($border-radius);
+ }
+}
+.nav-align-left .nav-tabs {
+ @include ltr-style {
+ @include border-start-radius($border-radius);
+ }
+ @include rtl-style {
+ @include border-end-radius($border-radius);
+ }
+ ~ .tab-content {
+ box-shadow: none;
+ @include ltr-style {
+ border-left-width: 0 !important;
+ @include border-end-radius($border-radius);
+ }
+ @include rtl-style {
+ border-right-width: 0 !important;
+ @include border-start-radius($border-radius);
+ }
+ }
+}
+.nav-align-right .nav-tabs {
+ @include ltr-style {
+ @include border-end-radius($border-radius);
+ }
+ @include rtl-style {
+ @include border-start-radius($border-radius);
+ }
+ ~ .tab-content {
+ box-shadow: none;
+ @include ltr-style {
+ border-right-width: 0 !important;
+ @include border-start-radius($border-radius);
+ }
+ @include rtl-style {
+ border-left-width: 0 !important;
+ @include border-end-radius($border-radius);
+ }
+ }
+}
+
+//Kanban-item
+.kanban-item {
+ box-shadow: none !important;
+ border: $border-width solid $card-border-color;
+}
+
+// default form wizard style
+
+.bs-stepper:not(.wizard-modern) {
+ box-shadow: none !important;
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ .modal .modal-body & {
+ border-width: 0;
+ }
+}
+
+// modern form wizard style
+
+.bs-stepper.wizard-modern {
+ .bs-stepper-content {
+ box-shadow: none !important;
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ }
+}
+// file upload (dropzone)
+.dark-style .dz-preview {
+ box-shadow: none;
+ border: 1px solid $border-color;
+}
+
+// timeline
+.timeline {
+ .timeline-item {
+ .timeline-indicator,
+ .timeline-indicator-advanced {
+ box-shadow: 0 0 0 10px $card-bg;
+ }
+ }
+}
+
+// App email rear card border effect
+.app-email {
+ .app-email-view {
+ .email-card-last {
+ &:before {
+ border: 1px solid $border-color;
+ }
+
+ &:after {
+ border: 1px solid $border-color;
+ }
+ }
+ }
+}
+
+// authentication
+.authentication-wrapper .authentication-bg {
+ border-inline-start: 1px solid $border-color;
+}
diff --git a/resources/assets/vendor/scss/theme-bordered.scss b/resources/assets/vendor/scss/theme-bordered.scss
new file mode 100644
index 0000000..2676efc
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-bordered.scss
@@ -0,0 +1,343 @@
+@import './_components/include';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #7367f0;
+$body-bg: #f8f7fa;
+
+body {
+ background: $card-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+.dropdown-menu,
+.popover,
+.toast,
+.flatpickr-calendar:not(.app-calendar-sidebar .flatpickr-calendar),
+.datepicker.datepicker-inline,
+.datepicker.datepicker-inline table,
+.daterangepicker,
+.pcr-app,
+.ui-timepicker-wrapper,
+.twitter-typeahead .tt-menu,
+.tagify__dropdown,
+.swal2-popup,
+.select2-dropdown,
+.select2-container--default .select2-dropdown.select2-dropdown--above,
+.shepherd-element,
+.menu-horizontal .menu-inner > .menu-item.open .menu-sub,
+div.dataTables_wrapper .dt-button-collection {
+ outline: none;
+ box-shadow: none !important;
+ border: 1px solid $border-color !important;
+}
+
+.flatpickr-days,
+.flatpickr-time {
+ border-width: 0 !important;
+}
+
+// Bootstrap select > double border fix
+.dropdown-menu .dropdown-menu {
+ border: none !important;
+}
+.datepicker.datepicker-inline {
+ width: fit-content;
+ border-radius: $border-radius;
+}
+.apexcharts-canvas .apexcharts-tooltip,
+.modal-content,
+.offcanvas,
+div.dataTables_wrapper .dt-button-collection > div[role='menu'] {
+ box-shadow: none !important;
+}
+.modal-content {
+ & {
+ border: $border-width solid $border-color !important;
+ }
+}
+.offcanvas.offcanvas-start,
+.offcanvas.offcanvas-end,
+.offcanvas.offcanvas-top,
+.offcanvas.offcanvas-bottom {
+ border-width: $border-width;
+}
+.select2-dropdown {
+ border-color: $border-color !important;
+}
+.bs-popover-start > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::before {
+ border-left-color: $border-color !important;
+ right: -1px;
+}
+.bs-popover-end > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::before {
+ border-right-color: $border-color !important;
+ left: -1px;
+}
+.bs-popover-top > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::before {
+ border-top-color: $border-color !important;
+ bottom: -1px;
+}
+.bs-popover-bottom > .popover-arrow::before,
+.bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::before {
+ border-bottom-color: $border-color !important;
+ top: -1px;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+.layout-navbar,
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.navbar-detached {
+ border: 1px solid $border-color;
+ box-shadow: none;
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($card-bg, 70%) 44%, rgba($card-bg, 43%) 73%, rgba($card-bg, 0%));
+ -webkit-mask: linear-gradient($card-bg, $card-bg 18%, transparent 100%);
+ mask: linear-gradient($card-bg, $card-bg 18%, transparent 100%);
+}
+.layout-horizontal {
+ .layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+ }
+ .layout-page .menu-horizontal {
+ box-shadow: none;
+ border-bottom: 1px solid $border-color;
+ }
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+
+@include template-menu-style(
+ '.bg-menu-theme',
+ $card-bg,
+ $color: $headings-color,
+ $active-color: $headings-color,
+ $active-bg: $primary-color
+);
+
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-75;
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-50;
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: $body-color !important;
+ }
+}
+
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .layout-menu {
+ box-shadow: 0 0 0 1px $border-color;
+ }
+}
+
+.layout-menu-horizontal {
+ box-shadow: 0 -1px 0 $border-color inset;
+}
+
+// timeline
+.timeline {
+ .timeline-item {
+ .timeline-indicator,
+ .timeline-indicator-advanced {
+ box-shadow: 0 0 0 10px $card-bg;
+ }
+ }
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.content-footer .footer-container {
+ .layout-footer-fixed .layout-wrapper:not(.layout-horizontal) & {
+ border: 1px solid $border-color;
+ border-bottom: 0;
+ }
+}
+.layout-horizontal .bg-footer-theme {
+ border-top: 1px solid $border-color;
+}
+
+// Component styles
+// ---------------------------------------------------------------------------
+
+// card
+.card:not(.card-group .card),
+.card-group {
+ box-shadow: none;
+ border: $border-width solid $card-border-color;
+}
+// card border-shadow variant
+.card {
+ &[class*='card-border-shadow-'] {
+ &:hover {
+ box-shadow: none !important;
+ }
+ }
+}
+
+//Accordion
+.accordion {
+ &:not(.accordion-custom-button):not(.accordion-arrow-left) {
+ .accordion-item {
+ border: $accordion-border-width solid $accordion-border-color;
+ }
+ }
+ .accordion-item {
+ box-shadow: none !important;
+ }
+}
+
+// Tabs
+.nav-tabs-shadow {
+ box-shadow: none !important;
+ border: 1px solid $border-color !important;
+ border-radius: $border-radius;
+}
+.nav-pills:not(.card-header-pills) {
+ ~ .tab-content {
+ border: 1px solid $border-color !important;
+ @include border-radius($border-radius);
+ box-shadow: none;
+ }
+}
+.nav-align-top .nav-tabs {
+ @include border-top-radius($border-radius);
+ ~ .tab-content {
+ box-shadow: none;
+ border-top-width: 0 !important;
+ @include border-bottom-radius($border-radius);
+ }
+}
+.nav-align-bottom .nav-tabs {
+ @include border-bottom-radius($border-radius);
+ ~ .tab-content {
+ box-shadow: none;
+ border-bottom-width: 0 !important;
+ @include border-top-radius($border-radius);
+ }
+}
+.nav-align-left .nav-tabs {
+ @include ltr-style {
+ @include border-start-radius($border-radius);
+ }
+ @include rtl-style {
+ @include border-end-radius($border-radius);
+ }
+ ~ .tab-content {
+ box-shadow: none;
+ @include ltr-style {
+ border-left-width: 0 !important;
+ @include border-end-radius($border-radius);
+ }
+ @include rtl-style {
+ border-right-width: 0 !important;
+ @include border-start-radius($border-radius);
+ }
+ }
+}
+.nav-align-right .nav-tabs {
+ @include ltr-style {
+ @include border-end-radius($border-radius);
+ }
+ @include rtl-style {
+ @include border-start-radius($border-radius);
+ }
+ ~ .tab-content {
+ box-shadow: none;
+ @include ltr-style {
+ border-right-width: 0 !important;
+ @include border-start-radius($border-radius);
+ }
+ @include rtl-style {
+ border-left-width: 0 !important;
+ @include border-end-radius($border-radius);
+ }
+ }
+}
+
+//Kanban-item
+.kanban-item {
+ box-shadow: none !important;
+ border: $border-width solid $card-border-color;
+}
+// default form wizard style
+.bs-stepper:not(.wizard-modern) {
+ box-shadow: none !important;
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ .modal .modal-body & {
+ border-width: 0;
+ }
+}
+
+// modern form wizard style
+
+.bs-stepper.wizard-modern {
+ .bs-stepper-content {
+ box-shadow: none !important;
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ }
+}
+// file upload (dropzone)
+.light-style .dz-preview {
+ box-shadow: none;
+ border: 1px solid $border-color;
+}
+
+// App email rear card border effect
+
+.app-email {
+ .app-email-view {
+ .email-card-last {
+ &:before {
+ border: 1px solid $border-color;
+ }
+
+ &:after {
+ border: 1px solid $border-color;
+ }
+ }
+ }
+}
+
+// authentication
+.authentication-wrapper .authentication-bg {
+ border-inline-start: 1px solid $border-color;
+}
diff --git a/resources/assets/vendor/scss/theme-default-dark.scss b/resources/assets/vendor/scss/theme-default-dark.scss
new file mode 100644
index 0000000..b2478e0
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-default-dark.scss
@@ -0,0 +1,94 @@
+@import './_components/include-dark';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #7367f0;
+
+body {
+ background: $body-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-dark-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+
+.layout-navbar {
+ box-shadow: 0 0 10px $border-color;
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.layout-horizontal .layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+}
+.navbar-detached {
+ box-shadow: $box-shadow-sm;
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($body-bg, 70%) 44%, rgba($body-bg, 43%) 73%, rgba($body-bg, 0%));
+ -webkit-mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+ mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+
+@include template-menu-style(
+ '.bg-menu-theme',
+ $card-bg,
+ $color: $headings-color,
+ $active-color: $headings-color,
+ $border: transparent,
+ $active-bg: $primary-color
+);
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .bg-menu-theme {
+ box-shadow: $box-shadow-sm;
+ }
+}
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-75;
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-50;
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: $body-color !important;
+ }
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container,
+.layout-footer-fixed .layout-wrapper.layout-horizontal .content-footer {
+ box-shadow: $box-shadow;
+}
diff --git a/resources/assets/vendor/scss/theme-default.scss b/resources/assets/vendor/scss/theme-default.scss
new file mode 100644
index 0000000..27b48d3
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-default.scss
@@ -0,0 +1,93 @@
+@import './_components/include';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #7367f0;
+$body-bg: #f8f7fa;
+
+body {
+ background: $body-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+
+.layout-navbar {
+ box-shadow: 0 0 10px $border-color;
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.layout-horizontal .layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+}
+.navbar-detached {
+ box-shadow: $box-shadow-sm;
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($body-bg, 70%) 44%, rgba($body-bg, 43%) 73%, rgba($body-bg, 0%));
+ -webkit-mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+ mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+@include template-menu-style(
+ '.bg-menu-theme',
+ $card-bg,
+ $color: $headings-color,
+ $active-color: $headings-color,
+ $border: transparent,
+ $active-bg: $primary-color
+);
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .bg-menu-theme {
+ box-shadow: $box-shadow-sm;
+ }
+}
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-75;
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-50;
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: $body-color !important;
+ }
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container,
+.layout-footer-fixed .layout-wrapper.layout-horizontal .content-footer {
+ box-shadow: $box-shadow;
+}
diff --git a/resources/assets/vendor/scss/theme-raspberry-dark.scss b/resources/assets/vendor/scss/theme-raspberry-dark.scss
new file mode 100644
index 0000000..2f852d2
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-raspberry-dark.scss
@@ -0,0 +1,136 @@
+@import './_components/include-dark';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #e30b5c;
+
+body {
+ background: $body-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+
+.layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.navbar-detached {
+ box-shadow: 0 0 0.375rem 0.25rem rgba($black, 0.15);
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($body-bg, 70%) 44%, rgba($body-bg, 43%) 73%, rgba($body-bg, 0%));
+ -webkit-mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+ mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+}
+.layout-horizontal .layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+
+@include template-menu-style(
+ '.bg-menu-theme',
+ $card-bg,
+ $color: $headings-color,
+ $active-color: $body-color,
+ $active-bg: $primary-color
+);
+
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-75;
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: $gray-50;
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: $body-color !important;
+ }
+}
+
+.layout-menu {
+ box-shadow: 0 0 0 1px $border-color;
+}
+
+.layout-menu-horizontal {
+ box-shadow: 0 -1px 0 $border-color inset;
+}
+
+.timeline .timeline-item .timeline-event:after {
+ content: '';
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container,
+.layout-footer-fixed .layout-wrapper.layout-horizontal .content-footer {
+ box-shadow: $box-shadow;
+}
+// Component styles
+// ---------------------------------------------------------------------------
+
+// card
+.card {
+ box-shadow: none;
+ border: $border-width solid $card-border-color;
+}
+
+// Accordion
+.accordion {
+ .accordion-item {
+ border-top: $accordion-border-width solid $accordion-border-color;
+ }
+}
+
+// default form wizard style
+
+.bs-stepper:not(.wizard-modern) {
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ .modal .modal-body & {
+ border-width: 0;
+ }
+}
+
+// modern form wizard style
+
+.bs-stepper.wizard-modern {
+ .bs-stepper-content {
+ box-shadow: none !important;
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ }
+}
diff --git a/resources/assets/vendor/scss/theme-raspberry.scss b/resources/assets/vendor/scss/theme-raspberry.scss
new file mode 100644
index 0000000..8b07048
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-raspberry.scss
@@ -0,0 +1,137 @@
+@import './_components/include';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #e30b5c;
+$body-bg: #f8f7fa;
+
+body {
+ background: $body-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+
+.layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.navbar-detached {
+ box-shadow: 0 0 0.375rem 0.25rem rgba(rgba-to-hex($gray-500, $rgba-to-hex-bg), 0.15);
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($body-bg, 70%) 44%, rgba($body-bg, 43%) 73%, rgba($body-bg, 0%));
+ -webkit-mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+ mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+}
+.layout-horizontal .layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+
+@include template-menu-style(
+ '.bg-menu-theme',
+ $card-bg,
+ $color: $headings-color,
+ $active-color: $headings-color,
+ $active-bg: $primary-color
+);
+
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: rgba-to-hex(rgba($black, 0.08), $rgba-to-hex-bg);
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: rgba-to-hex(rgba($black, 0.06), $rgba-to-hex-bg);
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: $body-color !important;
+ }
+}
+
+.layout-menu {
+ box-shadow: 0 0 0 1px $border-color;
+}
+
+.layout-menu-horizontal {
+ box-shadow: 0 -1px 0 $border-color inset;
+}
+
+.timeline .timeline-item .timeline-event:after {
+ content: '';
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container,
+.layout-footer-fixed .layout-wrapper.layout-horizontal .content-footer {
+ box-shadow: $box-shadow;
+}
+// Component styles
+// ---------------------------------------------------------------------------
+
+// card
+.card {
+ box-shadow: none;
+ border: $border-width solid $card-border-color;
+}
+
+// Accordion
+.accordion {
+ .accordion-item {
+ border-top: $accordion-border-width solid $accordion-border-color;
+ }
+}
+
+// default form wizard style
+
+.bs-stepper:not(.wizard-modern) {
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ .modal .modal-body & {
+ border-width: 0;
+ }
+}
+
+// modern form wizard style
+
+.bs-stepper.wizard-modern {
+ .bs-stepper-content {
+ box-shadow: none !important;
+ border: 1px solid $border-color;
+ border-radius: $card-border-radius;
+ }
+}
diff --git a/resources/assets/vendor/scss/theme-semi-dark-dark.scss b/resources/assets/vendor/scss/theme-semi-dark-dark.scss
new file mode 100644
index 0000000..eb51502
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-semi-dark-dark.scss
@@ -0,0 +1,87 @@
+@import './_components/include-dark';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #7367f0;
+
+body {
+ background: $body-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-dark-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+.layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.navbar-detached {
+ box-shadow: 0 0.125rem 0.5rem 0 rgba($shadow-bg, 0.18);
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($body-bg, 70%) 44%, rgba($body-bg, 43%) 73%, rgba($body-bg, 0%));
+ -webkit-mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+ mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+@include template-menu-style(
+ '.bg-menu-theme',
+ #2f3349,
+ $color: #cfcce4,
+ $active-color: $white,
+ $active-bg: $primary-color
+);
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .bg-menu-theme {
+ box-shadow: 0px 2px 8px 0px rgba(#131120, 0.18);
+ }
+}
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: rgba(#e1def5, 0.08);
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: rgba(#e1def5, 0.06);
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: rgba(#e1def5, 0.7) !important;
+ }
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container,
+.layout-footer-fixed .layout-wrapper.layout-horizontal .content-footer {
+ box-shadow: $box-shadow;
+}
diff --git a/resources/assets/vendor/scss/theme-semi-dark.scss b/resources/assets/vendor/scss/theme-semi-dark.scss
new file mode 100644
index 0000000..e135b10
--- /dev/null
+++ b/resources/assets/vendor/scss/theme-semi-dark.scss
@@ -0,0 +1,89 @@
+@import './_components/include';
+@import './_theme/common';
+@import './_theme/libs';
+@import './_theme/pages';
+@import './_theme/_theme';
+
+$primary-color: #7367f0;
+$body-bg: #f8f7fa;
+
+body {
+ background: $body-bg;
+}
+
+.bg-body {
+ background: $body-bg !important;
+}
+
+@include template-common-theme($primary-color);
+@include template-libs-theme($primary-color);
+@include template-pages-theme($primary-color);
+
+// Navbar
+// ---------------------------------------------------------------------------
+@include template-navbar-style('.bg-navbar-theme', $card-bg, $color: $headings-color, $active-color: $headings-color);
+
+.layout-navbar {
+ box-shadow: 0 1px 0 $border-color;
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.menu-horizontal {
+ backdrop-filter: saturate(200%) blur(6px);
+}
+.navbar-detached {
+ box-shadow: 0 0.125rem 0.5rem 0 rgba($black, 0.12);
+}
+.layout-navbar-fixed .layout-page:before {
+ backdrop-filter: saturate(200%) blur(10px);
+ background: linear-gradient(180deg, rgba($body-bg, 70%) 44%, rgba($body-bg, 43%) 73%, rgba($body-bg, 0%));
+ -webkit-mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+ mask: linear-gradient($body-bg, $body-bg 18%, transparent 100%);
+}
+
+// Menu
+// ---------------------------------------------------------------------------
+@include template-menu-style(
+ '.bg-menu-theme',
+ #2f3349,
+ $color: #cfcce4,
+ $active-color: $white,
+ $active-bg: $primary-color
+);
+@include media-breakpoint-up($menu-collapsed-layout-breakpoint) {
+ .bg-menu-theme {
+ box-shadow: 0px 2px 8px 0px rgba(#131120, 0.12);
+ }
+}
+.bg-menu-theme {
+ .menu-inner {
+ .menu-item {
+ &.open,
+ &.active {
+ > .menu-link.menu-toggle {
+ &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: rgba(#e1def5, 0.08);
+ }
+ }
+ }
+ &:not(.active) > .menu-link:hover {
+ html:not(.layout-menu-collapsed) &,
+ .layout-menu-hover.layout-menu-collapsed & {
+ background: rgba(#e1def5, 0.06);
+ }
+ }
+ }
+ }
+ .menu-inner .menu-sub .menu-item:not(.active) > .menu-link::before {
+ color: rgba(#e1def5, 0.7) !important;
+ }
+}
+
+// Footer
+// ---------------------------------------------------------------------------
+@include template-footer-style('.bg-footer-theme', $card-bg, $color: $primary-color, $active-color: $primary-color);
+
+.layout-footer-fixed .layout-wrapper:not(.layout-horizontal) .content-footer .footer-container,
+.layout-footer-fixed .layout-wrapper.layout-horizontal .content-footer {
+ box-shadow: $box-shadow;
+}
diff --git a/resources/img/avatar/generic.svg b/resources/img/avatar/generic.svg
new file mode 100644
index 0000000..b1ea776
--- /dev/null
+++ b/resources/img/avatar/generic.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/border-dark.svg b/resources/img/customizer/border-dark.svg
new file mode 100644
index 0000000..e9045d3
--- /dev/null
+++ b/resources/img/customizer/border-dark.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/border.svg b/resources/img/customizer/border.svg
new file mode 100644
index 0000000..5bc0ae6
--- /dev/null
+++ b/resources/img/customizer/border.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/collapsed-dark.svg b/resources/img/customizer/collapsed-dark.svg
new file mode 100644
index 0000000..f77b79c
--- /dev/null
+++ b/resources/img/customizer/collapsed-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/collapsed.svg b/resources/img/customizer/collapsed.svg
new file mode 100644
index 0000000..9f260a6
--- /dev/null
+++ b/resources/img/customizer/collapsed.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/compact-dark.svg b/resources/img/customizer/compact-dark.svg
new file mode 100644
index 0000000..b1eec2d
--- /dev/null
+++ b/resources/img/customizer/compact-dark.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/compact.svg b/resources/img/customizer/compact.svg
new file mode 100644
index 0000000..e96965a
--- /dev/null
+++ b/resources/img/customizer/compact.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/dark-dark.svg b/resources/img/customizer/dark-dark.svg
new file mode 100644
index 0000000..f747b43
--- /dev/null
+++ b/resources/img/customizer/dark-dark.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/resources/img/customizer/dark.svg b/resources/img/customizer/dark.svg
new file mode 100644
index 0000000..692f0ee
--- /dev/null
+++ b/resources/img/customizer/dark.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/resources/img/customizer/default-dark.svg b/resources/img/customizer/default-dark.svg
new file mode 100644
index 0000000..07482aa
--- /dev/null
+++ b/resources/img/customizer/default-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/default.svg b/resources/img/customizer/default.svg
new file mode 100644
index 0000000..81ebf39
--- /dev/null
+++ b/resources/img/customizer/default.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/expanded-dark.svg b/resources/img/customizer/expanded-dark.svg
new file mode 100644
index 0000000..f918a86
--- /dev/null
+++ b/resources/img/customizer/expanded-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/expanded.svg b/resources/img/customizer/expanded.svg
new file mode 100644
index 0000000..6359527
--- /dev/null
+++ b/resources/img/customizer/expanded.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/hidden-dark.svg b/resources/img/customizer/hidden-dark.svg
new file mode 100644
index 0000000..5a74bd6
--- /dev/null
+++ b/resources/img/customizer/hidden-dark.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/hidden.svg b/resources/img/customizer/hidden.svg
new file mode 100644
index 0000000..b25f266
--- /dev/null
+++ b/resources/img/customizer/hidden.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/horizontal-fixed-dark.svg b/resources/img/customizer/horizontal-fixed-dark.svg
new file mode 100644
index 0000000..fd7a613
--- /dev/null
+++ b/resources/img/customizer/horizontal-fixed-dark.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/horizontal-fixed.svg b/resources/img/customizer/horizontal-fixed.svg
new file mode 100644
index 0000000..83a5ae7
--- /dev/null
+++ b/resources/img/customizer/horizontal-fixed.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/horizontal-static-dark.svg b/resources/img/customizer/horizontal-static-dark.svg
new file mode 100644
index 0000000..5525b13
--- /dev/null
+++ b/resources/img/customizer/horizontal-static-dark.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/horizontal-static.svg b/resources/img/customizer/horizontal-static.svg
new file mode 100644
index 0000000..f776605
--- /dev/null
+++ b/resources/img/customizer/horizontal-static.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/light-dark.svg b/resources/img/customizer/light-dark.svg
new file mode 100644
index 0000000..22fb55a
--- /dev/null
+++ b/resources/img/customizer/light-dark.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/resources/img/customizer/light.svg b/resources/img/customizer/light.svg
new file mode 100644
index 0000000..81928ba
--- /dev/null
+++ b/resources/img/customizer/light.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/resources/img/customizer/ltr-dark.svg b/resources/img/customizer/ltr-dark.svg
new file mode 100644
index 0000000..c7bb412
--- /dev/null
+++ b/resources/img/customizer/ltr-dark.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/ltr.svg b/resources/img/customizer/ltr.svg
new file mode 100644
index 0000000..8cfc1d8
--- /dev/null
+++ b/resources/img/customizer/ltr.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/rtl-dark.svg b/resources/img/customizer/rtl-dark.svg
new file mode 100644
index 0000000..962f3a8
--- /dev/null
+++ b/resources/img/customizer/rtl-dark.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/rtl.svg b/resources/img/customizer/rtl.svg
new file mode 100644
index 0000000..643bebc
--- /dev/null
+++ b/resources/img/customizer/rtl.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/semi-dark-dark.svg b/resources/img/customizer/semi-dark-dark.svg
new file mode 100644
index 0000000..39a907a
--- /dev/null
+++ b/resources/img/customizer/semi-dark-dark.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/semi-dark.svg b/resources/img/customizer/semi-dark.svg
new file mode 100644
index 0000000..697a5ad
--- /dev/null
+++ b/resources/img/customizer/semi-dark.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/static-dark.svg b/resources/img/customizer/static-dark.svg
new file mode 100644
index 0000000..a3f15f1
--- /dev/null
+++ b/resources/img/customizer/static-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/static.svg b/resources/img/customizer/static.svg
new file mode 100644
index 0000000..d8b0963
--- /dev/null
+++ b/resources/img/customizer/static.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/sticky-dark.svg b/resources/img/customizer/sticky-dark.svg
new file mode 100644
index 0000000..2762308
--- /dev/null
+++ b/resources/img/customizer/sticky-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/sticky.svg b/resources/img/customizer/sticky.svg
new file mode 100644
index 0000000..f75d5a4
--- /dev/null
+++ b/resources/img/customizer/sticky.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/system-dark.svg b/resources/img/customizer/system-dark.svg
new file mode 100644
index 0000000..d011793
--- /dev/null
+++ b/resources/img/customizer/system-dark.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/system.svg b/resources/img/customizer/system.svg
new file mode 100644
index 0000000..cd8fa74
--- /dev/null
+++ b/resources/img/customizer/system.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/vertical-dark.svg b/resources/img/customizer/vertical-dark.svg
new file mode 100644
index 0000000..f918a86
--- /dev/null
+++ b/resources/img/customizer/vertical-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/vertical.svg b/resources/img/customizer/vertical.svg
new file mode 100644
index 0000000..6359527
--- /dev/null
+++ b/resources/img/customizer/vertical.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/wide-dark.svg b/resources/img/customizer/wide-dark.svg
new file mode 100644
index 0000000..2372991
--- /dev/null
+++ b/resources/img/customizer/wide-dark.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/customizer/wide.svg b/resources/img/customizer/wide.svg
new file mode 100644
index 0000000..76d1e53
--- /dev/null
+++ b/resources/img/customizer/wide.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/illustrations/auth-forgot-password-illustration-dark.png b/resources/img/illustrations/auth-forgot-password-illustration-dark.png
new file mode 100644
index 0000000..a2575d4
Binary files /dev/null and b/resources/img/illustrations/auth-forgot-password-illustration-dark.png differ
diff --git a/resources/img/illustrations/auth-forgot-password-illustration-light.png b/resources/img/illustrations/auth-forgot-password-illustration-light.png
new file mode 100644
index 0000000..eec7594
Binary files /dev/null and b/resources/img/illustrations/auth-forgot-password-illustration-light.png differ
diff --git a/resources/img/illustrations/auth-login-illustration-dark.png b/resources/img/illustrations/auth-login-illustration-dark.png
new file mode 100644
index 0000000..edde615
Binary files /dev/null and b/resources/img/illustrations/auth-login-illustration-dark.png differ
diff --git a/resources/img/illustrations/auth-login-illustration-light.png b/resources/img/illustrations/auth-login-illustration-light.png
new file mode 100644
index 0000000..3a071d9
Binary files /dev/null and b/resources/img/illustrations/auth-login-illustration-light.png differ
diff --git a/resources/img/illustrations/auth-register-illustration-dark.png b/resources/img/illustrations/auth-register-illustration-dark.png
new file mode 100644
index 0000000..50c6584
Binary files /dev/null and b/resources/img/illustrations/auth-register-illustration-dark.png differ
diff --git a/resources/img/illustrations/auth-register-illustration-light.png b/resources/img/illustrations/auth-register-illustration-light.png
new file mode 100644
index 0000000..7582ed2
Binary files /dev/null and b/resources/img/illustrations/auth-register-illustration-light.png differ
diff --git a/resources/img/illustrations/auth-register-multisteps-illustration.png b/resources/img/illustrations/auth-register-multisteps-illustration.png
new file mode 100644
index 0000000..4865d1d
Binary files /dev/null and b/resources/img/illustrations/auth-register-multisteps-illustration.png differ
diff --git a/resources/img/illustrations/auth-register-multisteps-shape-dark.png b/resources/img/illustrations/auth-register-multisteps-shape-dark.png
new file mode 100644
index 0000000..46e8ada
Binary files /dev/null and b/resources/img/illustrations/auth-register-multisteps-shape-dark.png differ
diff --git a/resources/img/illustrations/auth-register-multisteps-shape-light.png b/resources/img/illustrations/auth-register-multisteps-shape-light.png
new file mode 100644
index 0000000..444cf15
Binary files /dev/null and b/resources/img/illustrations/auth-register-multisteps-shape-light.png differ
diff --git a/resources/img/illustrations/auth-reset-password-illustration-dark.png b/resources/img/illustrations/auth-reset-password-illustration-dark.png
new file mode 100644
index 0000000..5032f94
Binary files /dev/null and b/resources/img/illustrations/auth-reset-password-illustration-dark.png differ
diff --git a/resources/img/illustrations/auth-reset-password-illustration-light.png b/resources/img/illustrations/auth-reset-password-illustration-light.png
new file mode 100644
index 0000000..56528ff
Binary files /dev/null and b/resources/img/illustrations/auth-reset-password-illustration-light.png differ
diff --git a/resources/img/illustrations/auth-two-step-illustration-dark.png b/resources/img/illustrations/auth-two-step-illustration-dark.png
new file mode 100644
index 0000000..59bc745
Binary files /dev/null and b/resources/img/illustrations/auth-two-step-illustration-dark.png differ
diff --git a/resources/img/illustrations/auth-two-step-illustration-light.png b/resources/img/illustrations/auth-two-step-illustration-light.png
new file mode 100644
index 0000000..10e4a57
Binary files /dev/null and b/resources/img/illustrations/auth-two-step-illustration-light.png differ
diff --git a/resources/img/illustrations/auth-verify-email-illustration-dark.png b/resources/img/illustrations/auth-verify-email-illustration-dark.png
new file mode 100644
index 0000000..8e93590
Binary files /dev/null and b/resources/img/illustrations/auth-verify-email-illustration-dark.png differ
diff --git a/resources/img/illustrations/auth-verify-email-illustration-light.png b/resources/img/illustrations/auth-verify-email-illustration-light.png
new file mode 100644
index 0000000..e428b98
Binary files /dev/null and b/resources/img/illustrations/auth-verify-email-illustration-light.png differ
diff --git a/resources/img/illustrations/bg-shape-image-dark.png b/resources/img/illustrations/bg-shape-image-dark.png
new file mode 100644
index 0000000..ad3a050
Binary files /dev/null and b/resources/img/illustrations/bg-shape-image-dark.png differ
diff --git a/resources/img/illustrations/bg-shape-image-light.png b/resources/img/illustrations/bg-shape-image-light.png
new file mode 100644
index 0000000..c18d34e
Binary files /dev/null and b/resources/img/illustrations/bg-shape-image-light.png differ
diff --git a/resources/img/illustrations/page-misc-error.png b/resources/img/illustrations/page-misc-error.png
new file mode 100644
index 0000000..a8d2c4f
Binary files /dev/null and b/resources/img/illustrations/page-misc-error.png differ
diff --git a/resources/img/illustrations/page-misc-launching-soon.png b/resources/img/illustrations/page-misc-launching-soon.png
new file mode 100644
index 0000000..29da9eb
Binary files /dev/null and b/resources/img/illustrations/page-misc-launching-soon.png differ
diff --git a/resources/img/illustrations/page-misc-under-maintenance.png b/resources/img/illustrations/page-misc-under-maintenance.png
new file mode 100644
index 0000000..02547d8
Binary files /dev/null and b/resources/img/illustrations/page-misc-under-maintenance.png differ
diff --git a/resources/img/illustrations/page-misc-you-are-not-authorized.png b/resources/img/illustrations/page-misc-you-are-not-authorized.png
new file mode 100644
index 0000000..d1ea59d
Binary files /dev/null and b/resources/img/illustrations/page-misc-you-are-not-authorized.png differ
diff --git a/resources/img/logo/horizontal-02.png b/resources/img/logo/horizontal-02.png
new file mode 100644
index 0000000..5efaf3a
Binary files /dev/null and b/resources/img/logo/horizontal-02.png differ
diff --git a/resources/img/logo/horizontal-04.png b/resources/img/logo/horizontal-04.png
new file mode 100644
index 0000000..6560e3f
Binary files /dev/null and b/resources/img/logo/horizontal-04.png differ
diff --git a/resources/img/logo/horizontal-circulo-01.png b/resources/img/logo/horizontal-circulo-01.png
new file mode 100644
index 0000000..cd0287a
Binary files /dev/null and b/resources/img/logo/horizontal-circulo-01.png differ
diff --git a/resources/img/logo/horizontal-circulo-03.png b/resources/img/logo/horizontal-circulo-03.png
new file mode 100644
index 0000000..7fac358
Binary files /dev/null and b/resources/img/logo/horizontal-circulo-03.png differ
diff --git a/resources/img/logo/koneko-01.png b/resources/img/logo/koneko-01.png
new file mode 100644
index 0000000..5d3c977
Binary files /dev/null and b/resources/img/logo/koneko-01.png differ
diff --git a/resources/img/logo/koneko-02.png b/resources/img/logo/koneko-02.png
new file mode 100644
index 0000000..aec5746
Binary files /dev/null and b/resources/img/logo/koneko-02.png differ
diff --git a/resources/img/logo/koneko-03.png b/resources/img/logo/koneko-03.png
new file mode 100644
index 0000000..048a10b
Binary files /dev/null and b/resources/img/logo/koneko-03.png differ
diff --git a/resources/img/logo/koneko-04.png b/resources/img/logo/koneko-04.png
new file mode 100644
index 0000000..d4eed33
Binary files /dev/null and b/resources/img/logo/koneko-04.png differ
diff --git a/resources/img/logo/vertical-02.png b/resources/img/logo/vertical-02.png
new file mode 100644
index 0000000..61ecf93
Binary files /dev/null and b/resources/img/logo/vertical-02.png differ
diff --git a/resources/img/logo/vertical-04.png b/resources/img/logo/vertical-04.png
new file mode 100644
index 0000000..b87dd93
Binary files /dev/null and b/resources/img/logo/vertical-04.png differ
diff --git a/resources/js/app.js b/resources/js/app.js
new file mode 100644
index 0000000..5c3ea25
--- /dev/null
+++ b/resources/js/app.js
@@ -0,0 +1,83 @@
+/**
+ * Deshabilita o pone en modo de solo lectura los campos del formulario.
+ * @param {string} formSelector - Selector del formulario a deshabilitar.
+ */
+const disableStoreForm = (formSelector) => {
+ const form = document.querySelector(formSelector);
+ if (!form) {
+ console.warn(`Formulario no encontrado con el selector: ${formSelector}`);
+ return;
+ }
+
+ /**
+ * Habilita o deshabilita un select con Select2.
+ * @param {HTMLElement} selectElement - El select afectado.
+ * @param {boolean} disabled - Si debe ser deshabilitado.
+ */
+ const toggleSelect2Disabled = (selectElement, disabled) => {
+ selectElement.disabled = disabled;
+ selectElement.dispatchEvent(new Event('change', { bubbles: true }));
+ };
+
+ /**
+ * Aplica modo solo lectura a un select estándar o Select2.
+ * @param {HTMLElement} select - El select a modificar.
+ * @param {boolean} readonly - Si debe estar en modo solo lectura.
+ */
+ const setSelectReadonly = (select, readonly) => {
+ select.setAttribute('readonly-mode', readonly);
+ select.style.pointerEvents = readonly ? 'none' : '';
+ select.tabIndex = readonly ? -1 : '';
+
+ if (select.classList.contains('select2-hidden-accessible')) {
+ toggleSelect2Disabled(select, readonly);
+ }
+ };
+
+ /**
+ * Aplica modo solo lectura a un checkbox o radio.
+ * @param {HTMLElement} checkbox - El input a modificar.
+ * @param {boolean} readonly - Si debe ser solo lectura.
+ */
+ const setCheckboxReadonly = (checkbox, readonly) => {
+ checkbox.setAttribute('readonly-mode', readonly);
+ checkbox.style.pointerEvents = readonly ? 'none' : '';
+ checkbox[readonly ? 'addEventListener' : 'removeEventListener']('click', preventInteraction);
+ };
+
+ /**
+ * Previene interacción con el elemento.
+ * @param {Event} event - El evento de clic.
+ */
+ const preventInteraction = (event) => event.preventDefault();
+
+ // Obtener todos los inputs del formulario
+ const inputs = form.querySelectorAll('input, textarea, select');
+
+ inputs.forEach((el) => {
+ if (!el.classList.contains('data-always-enabled')) {
+ switch (el.tagName) {
+ case 'SELECT':
+ if (el.classList.contains('select2')) {
+ toggleSelect2Disabled(el, true);
+ } else {
+ setSelectReadonly(el, true);
+ }
+ break;
+ case 'INPUT':
+ if (['checkbox', 'radio'].includes(el.type)) {
+ setCheckboxReadonly(el, true);
+ } else {
+ el.readOnly = true;
+ }
+ break;
+ case 'TEXTAREA':
+ el.readOnly = true;
+ break;
+ }
+ }
+ });
+};
+
+// Hacer la función accesible globalmente
+window.disableStoreForm = disableStoreForm;
diff --git a/resources/js/auth/app-access-permission.js b/resources/js/auth/app-access-permission.js
new file mode 100644
index 0000000..e2ccac8
--- /dev/null
+++ b/resources/js/auth/app-access-permission.js
@@ -0,0 +1,206 @@
+/**
+ * App user list (jquery)
+ */
+
+'use strict';
+
+$(function () {
+ var dataTablePermissions = $('.datatables-permissions'),
+ dt_permission,
+ userList = baseUrl + 'app/user/list';
+ // Users List datatable
+ if (dataTablePermissions.length) {
+ dt_permission = dataTablePermissions.DataTable({
+ ajax: assetsPath + 'json/permissions-list.json', // JSON file to add data
+ columns: [
+ // columns according to JSON
+ { data: '' },
+ { data: 'id' },
+ { data: 'name' },
+ { data: 'assigned_to' },
+ { data: 'created_date' },
+ { data: '' }
+ ],
+ columnDefs: [
+ {
+ // For Responsive
+ className: 'control',
+ orderable: false,
+ searchable: false,
+ responsivePriority: 2,
+ targets: 0,
+ render: function (data, type, full, meta) {
+ return '';
+ }
+ },
+ {
+ targets: 1,
+ searchable: false,
+ visible: false
+ },
+ {
+ // Name
+ targets: 2,
+ render: function (data, type, full, meta) {
+ var $name = full['name'];
+ return '' + $name + ' ';
+ }
+ },
+ {
+ // User Role
+ targets: 3,
+ orderable: false,
+ render: function (data, type, full, meta) {
+ var $assignedTo = full['assigned_to'],
+ $output = '';
+ var roleBadgeObj = {
+ Admin: 'Administrator ',
+ Manager: 'Manager ',
+ Users: 'Users ',
+ Support: 'Support ',
+ Restricted:
+ 'Restricted User '
+ };
+ for (var i = 0; i < $assignedTo.length; i++) {
+ var val = $assignedTo[i];
+ $output += roleBadgeObj[val];
+ }
+ return '' + $output + ' ';
+ }
+ },
+ {
+ // remove ordering from Name
+ targets: 4,
+ orderable: false,
+ render: function (data, type, full, meta) {
+ var $date = full['created_date'];
+ return '' + $date + ' ';
+ }
+ },
+ {
+ // Actions
+ targets: -1,
+ searchable: false,
+ title: 'Actions',
+ orderable: false,
+ render: function (data, type, full, meta) {
+ return (
+ '' +
+ '
' +
+ ' ' +
+ '' +
+ ' '
+ );
+ }
+ }
+ ],
+ order: [[1, 'asc']],
+ dom:
+ '<"row mx-1"' +
+ '<"col-sm-12 col-md-3" l>' +
+ '<"col-sm-12 col-md-9"<"dt-action-buttons text-xl-end text-lg-start text-md-end text-start d-flex align-items-center justify-content-md-end justify-content-center flex-wrap"<"me-4 mt-n6 mt-md-0"f>B>>' +
+ '>t' +
+ '<"row"' +
+ '<"col-sm-12 col-md-6"i>' +
+ '<"col-sm-12 col-md-6"p>' +
+ '>',
+ language: {
+ sLengthMenu: 'Show _MENU_',
+ search: '',
+ searchPlaceholder: 'Search Permissions',
+ paginate: {
+ next: ' ',
+ previous: ' '
+ }
+ },
+ // Buttons with Dropdown
+ buttons: [
+ {
+ text: 'Add Permission ',
+ className: 'add-new btn btn-primary mb-6 mb-md-0 waves-effect waves-light',
+ attr: {
+ 'data-bs-toggle': 'modal',
+ 'data-bs-target': '#addPermissionModal'
+ },
+ init: function (api, node, config) {
+ $(node).removeClass('btn-secondary');
+ }
+ }
+ ],
+ // For responsive popup
+ responsive: {
+ details: {
+ display: $.fn.dataTable.Responsive.display.modal({
+ header: function (row) {
+ var data = row.data();
+ return 'Details of ' + data['name'];
+ }
+ }),
+ type: 'column',
+ renderer: function (api, rowIdx, columns) {
+ var data = $.map(columns, function (col, i) {
+ return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
+ ? '' +
+ '' +
+ col.title +
+ ':' +
+ ' ' +
+ '' +
+ col.data +
+ ' ' +
+ ' '
+ : '';
+ }).join('');
+
+ return data ? $(' ').append(data) : false;
+ }
+ }
+ },
+ initComplete: function () {
+ // Adding role filter once table initialized
+ this.api()
+ .columns(3)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ' Select Role '
+ )
+ .appendTo('.user_role')
+ .on('change', function () {
+ var val = $.fn.dataTable.util.escapeRegex($(this).val());
+ column.search(val ? '^' + val + '$' : '', true, false).draw();
+ });
+
+ column
+ .data()
+ .unique()
+ .sort()
+ .each(function (d, j) {
+ select.append('' + d + ' ');
+ });
+ });
+ }
+ });
+ }
+
+ // Delete Record
+ $('.datatables-permissions tbody').on('click', '.delete-record', function () {
+ dt_permission.row($(this).parents('tr')).remove().draw();
+ });
+
+ // Filter form control to default size
+ // ? setTimeout used for multilingual table initialization
+ setTimeout(() => {
+ $('.dataTables_filter .form-control').removeClass('form-control-sm');
+ $('.dataTables_length .form-select').removeClass('form-select-sm');
+ $('.dataTables_info').addClass('ms-n1');
+ $('.dataTables_paginate').addClass('me-n1');
+ }, 300);
+});
diff --git a/resources/js/auth/app-access-roles.js b/resources/js/auth/app-access-roles.js
new file mode 100644
index 0000000..0568330
--- /dev/null
+++ b/resources/js/auth/app-access-roles.js
@@ -0,0 +1,428 @@
+/**
+ * App user list
+ */
+
+'use strict';
+
+// Datatable (jquery)
+$(function () {
+ var dtUserTable = $('.datatables-users'),
+ dt_User,
+ statusObj = {
+ 1: { title: 'Pending', class: 'bg-label-warning' },
+ 2: { title: 'Active', class: 'bg-label-success' },
+ 3: { title: 'Inactive', class: 'bg-label-secondary' }
+ };
+
+ var userView = baseUrl + 'app/user/view/account';
+
+ // Users List datatable
+ if (dtUserTable.length) {
+ var dtUser = dtUserTable.DataTable({
+ ajax: assetsPath + 'json/user-list.json', // JSON file to add data
+ columns: [
+ // columns according to JSON
+ { data: 'id' },
+ { data: 'id' },
+ { data: 'full_name' },
+ { data: 'role' },
+ { data: 'current_plan' },
+ { data: 'billing' },
+ { data: 'status' },
+ { data: '' }
+ ],
+ columnDefs: [
+ {
+ // For Responsive
+ className: 'control',
+ orderable: false,
+ searchable: false,
+ responsivePriority: 2,
+ targets: 0,
+ render: function (data, type, full, meta) {
+ return '';
+ }
+ },
+ {
+ // For Checkboxes
+ targets: 1,
+ orderable: false,
+ checkboxes: {
+ selectAllRender: ' '
+ },
+ render: function () {
+ return ' ';
+ },
+ searchable: false
+ },
+ {
+ // User full name and email
+ targets: 2,
+ responsivePriority: 4,
+ render: function (data, type, full, meta) {
+ var $name = full['full_name'],
+ $email = full['email'],
+ $image = full['avatar'];
+ if ($image) {
+ // For Avatar image
+ var $output =
+ ' ';
+ } else {
+ // For Avatar badge
+ var stateNum = Math.floor(Math.random() * 6);
+ var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
+ var $state = states[stateNum],
+ $name = full['full_name'],
+ $initials = $name.match(/\b\w/g) || [];
+ $initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
+ $output = '' + $initials + ' ';
+ }
+ // Creates full output for row
+ var $row_output =
+ '' +
+ '
' +
+ '
' +
+ $output +
+ '
' +
+ '
' +
+ '
' +
+ '
';
+ return $row_output;
+ }
+ },
+ {
+ // User Role
+ targets: 3,
+ render: function (data, type, full, meta) {
+ var $role = full['role'];
+ var roleBadgeObj = {
+ Subscriber: ' ',
+ Author: ' ',
+ Maintainer: ' ',
+ Editor: ' ',
+ Admin: ' '
+ };
+ return (
+ "" +
+ roleBadgeObj[$role] +
+ $role +
+ ' '
+ );
+ }
+ },
+ {
+ // Plans
+ targets: 4,
+ render: function (data, type, full, meta) {
+ var $plan = full['current_plan'];
+
+ return '' + $plan + ' ';
+ }
+ },
+ {
+ // User Status
+ targets: 6,
+ render: function (data, type, full, meta) {
+ var $status = full['status'];
+
+ return (
+ '' +
+ statusObj[$status].title +
+ ' '
+ );
+ }
+ },
+ {
+ // Actions
+ targets: -1,
+ title: 'Actions',
+ searchable: false,
+ orderable: false,
+ render: function (data, type, full, meta) {
+ return (
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ '
'
+ );
+ }
+ }
+ ],
+ order: [[2, 'desc']],
+ dom:
+ '<"row"' +
+ '<"col-md-2">' +
+ '<"col-md-10"<"dt-action-buttons text-xl-end text-lg-start text-md-end text-start d-flex align-items-center justify-content-end flex-md-row flex-column mb-6 mb-md-0"fB>>' +
+ '>t' +
+ '<"row"' +
+ '<"col-sm-12 col-md-6"i>' +
+ '<"col-sm-12 col-md-6"p>' +
+ '>',
+ language: {
+ sLengthMenu: 'Show _MENU_',
+ search: '',
+ searchPlaceholder: 'Search User',
+ paginate: {
+ next: ' ',
+ previous: ' '
+ }
+ },
+ buttons: [
+ {
+ extend: 'collection',
+ className:
+ 'btn btn-label-secondary dropdown-toggle me-4 waves-effect waves-light border-left-0 border-right-0 rounded',
+ text: ' Export ',
+ buttons: [
+ {
+ extend: 'print',
+ text: ' Print',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [3, 4, 5, 6, 7],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ },
+ customize: function (win) {
+ //customize print view for dark
+ $(win.document.body)
+ .css('color', config.colors.headingColor)
+ .css('border-color', config.colors.borderColor)
+ .css('background-color', config.colors.bodyBg);
+ $(win.document.body)
+ .find('table')
+ .addClass('compact')
+ .css('color', 'inherit')
+ .css('border-color', 'inherit')
+ .css('background-color', 'inherit');
+ }
+ },
+ {
+ extend: 'csv',
+ text: ' Csv',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [3, 4, 5, 6, 7],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ },
+ {
+ extend: 'excel',
+ text: ' Excel',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [3, 4, 5, 6, 7],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ },
+ {
+ extend: 'pdf',
+ text: ' Pdf',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [3, 4, 5, 6, 7],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ },
+ {
+ extend: 'copy',
+ text: ' Copy',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [3, 4, 5, 6, 7],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ text: 'Add new role ',
+ className: 'btn btn-primary waves-effect waves-light rounded border-left-0 border-right-0',
+ attr: {
+ 'data-bs-toggle': 'modal',
+ 'data-bs-target': '#addRoleModal'
+ }
+ }
+ ],
+ // For responsive popup
+ responsive: {
+ details: {
+ display: $.fn.dataTable.Responsive.display.modal({
+ header: function (row) {
+ var data = row.data();
+ return 'Details of ' + data['full_name'];
+ }
+ }),
+ type: 'column',
+ renderer: function (api, rowIdx, columns) {
+ var data = $.map(columns, function (col, i) {
+ return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
+ ? '' +
+ '' +
+ col.title +
+ ':' +
+ ' ' +
+ '' +
+ col.data +
+ ' ' +
+ ' '
+ : '';
+ }).join('');
+
+ return data ? $(' ').append(data) : false;
+ }
+ }
+ },
+ initComplete: function () {
+ // Adding role filter once table initialized
+ this.api()
+ .columns(3)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ' Select Role '
+ )
+ .appendTo('.user_role')
+ .on('change', function () {
+ var val = $.fn.dataTable.util.escapeRegex($(this).val());
+ column.search(val ? '^' + val + '$' : '', true, false).draw();
+ });
+
+ column
+ .data()
+ .unique()
+ .sort()
+ .each(function (d, j) {
+ select.append('' + d + ' ');
+ });
+ });
+ }
+ });
+ }
+ // Delete Record
+ $('.datatables-users tbody').on('click', '.delete-record', function () {
+ dtUser.row($(this).parents('tr')).remove().draw();
+ });
+
+ // Filter form control to default size
+ // ? setTimeout used for multilingual table initialization
+ setTimeout(() => {
+ $('.dataTables_filter .form-control').removeClass('form-control-sm');
+ $('.dataTables_length .form-select').removeClass('form-select-sm');
+ }, 300);
+ $('.dataTables_filter').addClass('ms-n4 me-4 mt-0 mt-md-6');
+});
+
+(function () {
+ // On edit role click, update text
+ var roleEditList = document.querySelectorAll('.role-edit-modal'),
+ roleAdd = document.querySelector('.add-new-role'),
+ roleTitle = document.querySelector('.role-title');
+
+ roleAdd.onclick = function () {
+ roleTitle.innerHTML = 'Add New Role'; // reset text
+ };
+ if (roleEditList) {
+ roleEditList.forEach(function (roleEditEl) {
+ roleEditEl.onclick = function () {
+ roleTitle.innerHTML = 'Edit Role'; // reset text
+ };
+ });
+ }
+})();
diff --git a/resources/js/auth/app-user-list.js b/resources/js/auth/app-user-list.js
new file mode 100644
index 0000000..4d00b93
--- /dev/null
+++ b/resources/js/auth/app-user-list.js
@@ -0,0 +1,533 @@
+/**
+ * Page User List
+ */
+
+'use strict';
+
+// Datatable (jquery)
+$(function () {
+ let borderColor, bodyBg, headingColor;
+
+ if (isDarkStyle) {
+ borderColor = config.colors_dark.borderColor;
+ bodyBg = config.colors_dark.bodyBg;
+ headingColor = config.colors_dark.headingColor;
+ } else {
+ borderColor = config.colors.borderColor;
+ bodyBg = config.colors.bodyBg;
+ headingColor = config.colors.headingColor;
+ }
+
+ // Variable declaration for table
+ var dt_user_table = $('.datatables-users'),
+ select2 = $('.select2'),
+ userView = baseUrl + 'app/user/view/account',
+ statusObj = {
+ 1: { title: 'Pending', class: 'bg-label-warning' },
+ 2: { title: 'Active', class: 'bg-label-success' },
+ 3: { title: 'Inactive', class: 'bg-label-secondary' }
+ };
+
+ if (select2.length) {
+ var $this = select2;
+ $this.wrap('
').select2({
+ placeholder: 'Select Country',
+ dropdownParent: $this.parent()
+ });
+ }
+
+ // Users datatable
+ if (dt_user_table.length) {
+ var dt_user = dt_user_table.DataTable({
+ ajax: assetsPath + 'json/user-list.json', // JSON file to add data
+ columns: [
+ // columns according to JSON
+ { data: 'id' },
+ { data: 'id' },
+ { data: 'full_name' },
+ { data: 'role' },
+ { data: 'current_plan' },
+ { data: 'billing' },
+ { data: 'status' },
+ { data: 'action' }
+ ],
+ columnDefs: [
+ {
+ // For Responsive
+ className: 'control',
+ searchable: false,
+ orderable: false,
+ responsivePriority: 2,
+ targets: 0,
+ render: function (data, type, full, meta) {
+ return '';
+ }
+ },
+ {
+ // For Checkboxes
+ targets: 1,
+ orderable: false,
+ checkboxes: {
+ selectAllRender: ' '
+ },
+ render: function () {
+ return ' ';
+ },
+ searchable: false
+ },
+ {
+ // User full name and email
+ targets: 2,
+ responsivePriority: 4,
+ render: function (data, type, full, meta) {
+ var $name = full['full_name'],
+ $email = full['email'],
+ $image = full['avatar'];
+ if ($image) {
+ // For Avatar image
+ var $output =
+ ' ';
+ } else {
+ // For Avatar badge
+ var stateNum = Math.floor(Math.random() * 6);
+ var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
+ var $state = states[stateNum],
+ $name = full['full_name'],
+ $initials = $name.match(/\b\w/g) || [];
+ $initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
+ $output = '' + $initials + ' ';
+ }
+ // Creates full output for row
+ var $row_output =
+ '' +
+ '
' +
+ '
' +
+ $output +
+ '
' +
+ '
' +
+ '
' +
+ '
';
+ return $row_output;
+ }
+ },
+ {
+ // User Role
+ targets: 3,
+ render: function (data, type, full, meta) {
+ var $role = full['role'];
+ var roleBadgeObj = {
+ Subscriber: ' ',
+ Author: ' ',
+ Maintainer: ' ',
+ Editor: ' ',
+ Admin: ' '
+ };
+ return (
+ "" +
+ roleBadgeObj[$role] +
+ $role +
+ ' '
+ );
+ }
+ },
+ {
+ // Plans
+ targets: 4,
+ render: function (data, type, full, meta) {
+ var $plan = full['current_plan'];
+
+ return '' + $plan + ' ';
+ }
+ },
+ {
+ // User Status
+ targets: 6,
+ render: function (data, type, full, meta) {
+ var $status = full['status'];
+
+ return (
+ '' +
+ statusObj[$status].title +
+ ' '
+ );
+ }
+ },
+ {
+ // Actions
+ targets: -1,
+ title: 'Actions',
+ searchable: false,
+ orderable: false,
+ render: function (data, type, full, meta) {
+ return (
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ '
'
+ );
+ }
+ }
+ ],
+ order: [[2, 'desc']],
+ dom:
+ '<"row"' +
+ '<"col-md-2"<"ms-n2"l>>' +
+ '<"col-md-10"<"dt-action-buttons text-xl-end text-lg-start text-md-end text-start d-flex align-items-center justify-content-end flex-md-row flex-column mb-6 mb-md-0 mt-n6 mt-md-0"fB>>' +
+ '>t' +
+ '<"row"' +
+ '<"col-sm-12 col-md-6"i>' +
+ '<"col-sm-12 col-md-6"p>' +
+ '>',
+ language: {
+ sLengthMenu: '_MENU_',
+ search: '',
+ searchPlaceholder: 'Search User',
+ paginate: {
+ next: ' ',
+ previous: ' '
+ }
+ },
+ // Buttons with Dropdown
+ buttons: [
+ {
+ extend: 'collection',
+ className: 'btn btn-label-secondary dropdown-toggle mx-4 waves-effect waves-light',
+ text: ' Export',
+ buttons: [
+ {
+ extend: 'print',
+ text: ' Print',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5],
+ // prevent avatar to be print
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ },
+ customize: function (win) {
+ //customize print view for dark
+ $(win.document.body)
+ .css('color', headingColor)
+ .css('border-color', borderColor)
+ .css('background-color', bodyBg);
+ $(win.document.body)
+ .find('table')
+ .addClass('compact')
+ .css('color', 'inherit')
+ .css('border-color', 'inherit')
+ .css('background-color', 'inherit');
+ }
+ },
+ {
+ extend: 'csv',
+ text: ' Csv',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ },
+ {
+ extend: 'excel',
+ text: ' Excel',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ },
+ {
+ extend: 'pdf',
+ text: ' Pdf',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ },
+ {
+ extend: 'copy',
+ text: ' Copy',
+ className: 'dropdown-item',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5],
+ // prevent avatar to be display
+ format: {
+ body: function (inner, coldex, rowdex) {
+ if (inner.length <= 0) return inner;
+ var el = $.parseHTML(inner);
+ var result = '';
+ $.each(el, function (index, item) {
+ if (item.classList !== undefined && item.classList.contains('user-name')) {
+ result = result + item.lastChild.firstChild.textContent;
+ } else if (item.innerText === undefined) {
+ result = result + item.textContent;
+ } else result = result + item.innerText;
+ });
+ return result;
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ text: 'Add New User ',
+ className: 'add-new btn btn-primary waves-effect waves-light',
+ attr: {
+ 'data-bs-toggle': 'offcanvas',
+ 'data-bs-target': '#offcanvasAddUser'
+ }
+ }
+ ],
+ // For responsive popup
+ responsive: {
+ details: {
+ display: $.fn.dataTable.Responsive.display.modal({
+ header: function (row) {
+ var data = row.data();
+ return 'Details of ' + data['full_name'];
+ }
+ }),
+ type: 'column',
+ renderer: function (api, rowIdx, columns) {
+ var data = $.map(columns, function (col, i) {
+ return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
+ ? '' +
+ '' +
+ col.title +
+ ':' +
+ ' ' +
+ '' +
+ col.data +
+ ' ' +
+ ' '
+ : '';
+ }).join('');
+
+ return data ? $(' ').append(data) : false;
+ }
+ }
+ },
+ initComplete: function () {
+ // Adding role filter once table initialized
+ this.api()
+ .columns(3)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ' Select Role '
+ )
+ .appendTo('.user_role')
+ .on('change', function () {
+ var val = $.fn.dataTable.util.escapeRegex($(this).val());
+ column.search(val ? '^' + val + '$' : '', true, false).draw();
+ });
+
+ column
+ .data()
+ .unique()
+ .sort()
+ .each(function (d, j) {
+ select.append('' + d + ' ');
+ });
+ });
+ // Adding plan filter once table initialized
+ this.api()
+ .columns(4)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ' Select Plan '
+ )
+ .appendTo('.user_plan')
+ .on('change', function () {
+ var val = $.fn.dataTable.util.escapeRegex($(this).val());
+ column.search(val ? '^' + val + '$' : '', true, false).draw();
+ });
+
+ column
+ .data()
+ .unique()
+ .sort()
+ .each(function (d, j) {
+ select.append('' + d + ' ');
+ });
+ });
+ // Adding status filter once table initialized
+ this.api()
+ .columns(6)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ' Select Status '
+ )
+ .appendTo('.user_status')
+ .on('change', function () {
+ var val = $.fn.dataTable.util.escapeRegex($(this).val());
+ column.search(val ? '^' + val + '$' : '', true, false).draw();
+ });
+
+ column
+ .data()
+ .unique()
+ .sort()
+ .each(function (d, j) {
+ select.append(
+ '' +
+ statusObj[d].title +
+ ' '
+ );
+ });
+ });
+ }
+ });
+ }
+
+ // Delete Record
+ $('.datatables-users tbody').on('click', '.delete-record', function () {
+ dt_user.row($(this).parents('tr')).remove().draw();
+ });
+
+ // Filter form control to default size
+ // ? setTimeout used for multilingual table initialization
+ setTimeout(() => {
+ $('.dataTables_filter .form-control').removeClass('form-control-sm');
+ $('.dataTables_length .form-select').removeClass('form-select-sm');
+ }, 300);
+});
+
+// Validation & Phone mask
+(function () {
+ const phoneMaskList = document.querySelectorAll('.phone-mask'),
+ addNewUserForm = document.getElementById('addNewUserForm');
+
+ // Phone Number
+ if (phoneMaskList) {
+ phoneMaskList.forEach(function (phoneMask) {
+ new Cleave(phoneMask, {
+ phone: true,
+ phoneRegionCode: 'US'
+ });
+ });
+ }
+ // Add New User Form Validation
+ const fv = FormValidation.formValidation(addNewUserForm, {
+ fields: {
+ userFullname: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter fullname '
+ }
+ }
+ },
+ userEmail: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your email'
+ },
+ emailAddress: {
+ message: 'The value is not a valid email address'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ eleValidClass: '',
+ rowSelector: function (field, ele) {
+ // field is the field name & ele is the field element
+ return '.mb-6';
+ }
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+})();
diff --git a/resources/js/auth/app-user-view-account.js b/resources/js/auth/app-user-view-account.js
new file mode 100644
index 0000000..82f49dd
--- /dev/null
+++ b/resources/js/auth/app-user-view-account.js
@@ -0,0 +1,222 @@
+/**
+ * App User View - Account (jquery)
+ */
+
+$(function () {
+ 'use strict';
+
+ // Variable declaration for table
+ var dt_invoice_table = $('.datatable-invoice');
+
+ // Invoice datatable
+ // --------------------------------------------------------------------
+ if (dt_invoice_table.length) {
+ var dt_invoice = dt_invoice_table.DataTable({
+ ajax: assetsPath + 'json/invoice-list.json', // JSON file to add data
+ columns: [
+ // columns according to JSON
+ { data: '' },
+ { data: 'invoice_id' },
+ { data: 'invoice_status' },
+ { data: 'total' },
+ { data: 'issued_date' },
+ { data: 'action' }
+ ],
+ columnDefs: [
+ {
+ // For Responsive
+ className: 'control',
+ responsivePriority: 2,
+ targets: 0,
+ render: function (data, type, full, meta) {
+ return '';
+ }
+ },
+ {
+ // Invoice ID
+ targets: 1,
+ render: function (data, type, full, meta) {
+ var $invoice_id = full['invoice_id'];
+ // Creates full output for row
+ var $row_output = '#' + $invoice_id + ' ';
+ return $row_output;
+ }
+ },
+ {
+ // Invoice status
+ targets: 2,
+ render: function (data, type, full, meta) {
+ var $invoice_status = full['invoice_status'],
+ $due_date = full['due_date'],
+ $balance = full['balance'];
+ var roleBadgeObj = {
+ Sent: ' ',
+ Draft:
+ ' ',
+ 'Past Due':
+ ' ',
+ 'Partial Payment':
+ ' ',
+ Paid: ' ',
+ Downloaded:
+ ' '
+ };
+ return (
+ " Balance: ' +
+ $balance +
+ ' Due Date: ' +
+ $due_date +
+ " '>" +
+ roleBadgeObj[$invoice_status] +
+ ''
+ );
+ }
+ },
+ {
+ // Total Invoice Amount
+ targets: 3,
+ render: function (data, type, full, meta) {
+ var $total = full['total'];
+ return '$' + $total;
+ }
+ },
+ {
+ // Actions
+ targets: -1,
+ title: 'Actions',
+ orderable: false,
+ render: function (data, type, full, meta) {
+ return (
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '
'
+ );
+ }
+ }
+ ],
+ order: [[1, 'desc']],
+ dom:
+ '<"row mx-6"' +
+ '<"col-sm-6 col-12 d-flex align-items-center justify-content-center justify-content-sm-start mt-6 mt-sm-0"<"invoice-head-label">>' +
+ '<"col-sm-6 col-12 d-flex justify-content-center justify-content-md-end align-items-baseline"<"dt-action-buttons d-flex justify-content-center flex-md-row align-items-baseline gap-2"lB>>' +
+ '>t' +
+ '<"row mx-4"' +
+ '<"col-sm-12 col-xxl-6 text-center text-xxl-start pb-md-2 pb-xxl-0"i>' +
+ '<"col-sm-12 col-xxl-6 d-md-flex justify-content-xxl-end justify-content-center"p>' +
+ '>',
+ language: {
+ sLengthMenu: 'Show _MENU_',
+ search: '',
+ searchPlaceholder: 'Search Invoice',
+ paginate: {
+ next: ' ',
+ previous: ' '
+ }
+ },
+ // Buttons with Dropdown
+ buttons: [
+ {
+ extend: 'collection',
+ className: 'btn btn-label-secondary dropdown-toggle float-sm-end mb-3 mb-sm-0 waves-effect waves-light',
+ text: ' Export',
+ buttons: [
+ {
+ extend: 'print',
+ text: ' Print',
+ className: 'dropdown-item',
+ exportOptions: { columns: [1, 2, 3, 4] }
+ },
+ {
+ extend: 'csv',
+ text: ' Csv',
+ className: 'dropdown-item',
+ exportOptions: { columns: [1, 2, 3, 4] }
+ },
+ {
+ extend: 'excel',
+ text: ' Excel',
+ className: 'dropdown-item',
+ exportOptions: { columns: [1, 2, 3, 4] }
+ },
+ {
+ extend: 'pdf',
+ text: ' Pdf',
+ className: 'dropdown-item',
+ exportOptions: { columns: [1, 2, 3, 4] }
+ },
+ {
+ extend: 'copy',
+ text: ' Copy',
+ className: 'dropdown-item',
+ exportOptions: { columns: [1, 2, 3, 4] }
+ }
+ ]
+ }
+ ],
+ // For responsive popup
+ responsive: {
+ details: {
+ display: $.fn.dataTable.Responsive.display.modal({
+ header: function (row) {
+ var data = row.data();
+ return 'Details of ' + data['full_name'];
+ }
+ }),
+ type: 'column',
+ renderer: function (api, rowIdx, columns) {
+ var data = $.map(columns, function (col, i) {
+ return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
+ ? '' +
+ '' +
+ col.title +
+ ':' +
+ ' ' +
+ '' +
+ col.data +
+ ' ' +
+ ' '
+ : '';
+ }).join('');
+
+ return data ? $(' ').append(data) : false;
+ }
+ }
+ }
+ });
+ $('div.invoice-head-label').html('Invoice List ');
+ }
+ // On each datatable draw, initialize tooltip
+ dt_invoice_table.on('draw.dt', function () {
+ var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
+ var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
+ return new bootstrap.Tooltip(tooltipTriggerEl, {
+ boundary: document.body
+ });
+ });
+ });
+
+ // Delete Record
+ $('.datatable-invoice tbody').on('click', '.delete-record', function () {
+ dt_invoice.row($(this).parents('tr')).remove().draw();
+ });
+ // Filter form control to default size
+ // ? setTimeout used for multilingual table initialization
+ setTimeout(() => {
+ $('.dataTables_filter .form-control').removeClass('form-control-sm');
+ $('.dataTables_length .form-select').removeClass('form-select-sm');
+ }, 300);
+});
diff --git a/resources/js/auth/app-user-view-billing.js b/resources/js/auth/app-user-view-billing.js
new file mode 100644
index 0000000..212b396
--- /dev/null
+++ b/resources/js/auth/app-user-view-billing.js
@@ -0,0 +1,57 @@
+/**
+ * App User View - Billing
+ */
+
+'use strict';
+
+(function () {
+ // Cancel Subscription alert
+ const cancelSubscription = document.querySelector('.cancel-subscription');
+
+ // Alert With Functional Confirm Button
+ if (cancelSubscription) {
+ cancelSubscription.onclick = function () {
+ Swal.fire({
+ text: 'Are you sure you would like to cancel your subscription?',
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Yes',
+ customClass: {
+ confirmButton: 'btn btn-primary me-2 waves-effect waves-light',
+ cancelButton: 'btn btn-label-secondary waves-effect waves-light'
+ },
+ buttonsStyling: false
+ }).then(function (result) {
+ if (result.value) {
+ Swal.fire({
+ icon: 'success',
+ title: 'Unsubscribed!',
+ text: 'Your subscription cancelled successfully.',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ } else if (result.dismiss === Swal.DismissReason.cancel) {
+ Swal.fire({
+ title: 'Cancelled',
+ text: 'Unsubscription Cancelled!!',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ }
+ });
+ };
+ }
+
+ // On edit address click, update text of add address modal
+ const addressEdit = document.querySelector('.edit-address'),
+ addressTitle = document.querySelector('.address-title'),
+ addressSubTitle = document.querySelector('.address-subtitle');
+
+ addressEdit.onclick = function () {
+ addressTitle.innerHTML = 'Edit Address'; // reset text
+ addressSubTitle.innerHTML = 'Edit your current address';
+ };
+})();
diff --git a/resources/js/auth/app-user-view-security.js b/resources/js/auth/app-user-view-security.js
new file mode 100644
index 0000000..fa0e1ed
--- /dev/null
+++ b/resources/js/auth/app-user-view-security.js
@@ -0,0 +1,63 @@
+/**
+ * App User View - Security
+ */
+
+'use strict';
+
+(function () {
+ const formChangePass = document.querySelector('#formChangePassword');
+
+ // Form validation for Change password
+ if (formChangePass) {
+ const fv = FormValidation.formValidation(formChangePass, {
+ fields: {
+ newPassword: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter new password'
+ },
+ stringLength: {
+ min: 8,
+ message: 'Password must be more than 8 characters'
+ }
+ }
+ },
+ confirmPassword: {
+ validators: {
+ notEmpty: {
+ message: 'Please confirm new password'
+ },
+ identical: {
+ compare: function () {
+ return formChangePass.querySelector('[name="newPassword"]').value;
+ },
+ message: 'The password and its confirm are not the same'
+ },
+ stringLength: {
+ min: 8,
+ message: 'Password must be more than 8 characters'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.form-password-toggle'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+})();
diff --git a/resources/js/auth/app-user-view.js b/resources/js/auth/app-user-view.js
new file mode 100644
index 0000000..60b1d23
--- /dev/null
+++ b/resources/js/auth/app-user-view.js
@@ -0,0 +1,89 @@
+/**
+ * App User View - Suspend User Script
+ */
+'use strict';
+
+(function () {
+ const suspendUser = document.querySelector('.suspend-user');
+
+ // Suspend User javascript
+ if (suspendUser) {
+ suspendUser.onclick = function () {
+ Swal.fire({
+ title: 'Are you sure?',
+ text: "You won't be able to revert user!",
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Yes, Suspend user!',
+ customClass: {
+ confirmButton: 'btn btn-primary me-2 waves-effect waves-light',
+ cancelButton: 'btn btn-label-secondary waves-effect waves-light'
+ },
+ buttonsStyling: false
+ }).then(function (result) {
+ if (result.value) {
+ Swal.fire({
+ icon: 'success',
+ title: 'Suspended!',
+ text: 'User has been suspended.',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ } else if (result.dismiss === Swal.DismissReason.cancel) {
+ Swal.fire({
+ title: 'Cancelled',
+ text: 'Cancelled Suspension :)',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ }
+ });
+ };
+ }
+
+ //? Billing page have multiple buttons
+ // Cancel Subscription alert
+ const cancelSubscription = document.querySelectorAll('.cancel-subscription');
+
+ // Alert With Functional Confirm Button
+ if (cancelSubscription) {
+ cancelSubscription.forEach(btnCancle => {
+ btnCancle.onclick = function () {
+ Swal.fire({
+ text: 'Are you sure you would like to cancel your subscription?',
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Yes',
+ customClass: {
+ confirmButton: 'btn btn-primary me-2 waves-effect waves-light',
+ cancelButton: 'btn btn-label-secondary waves-effect waves-light'
+ },
+ buttonsStyling: false
+ }).then(function (result) {
+ if (result.value) {
+ Swal.fire({
+ icon: 'success',
+ title: 'Unsubscribed!',
+ text: 'Your subscription cancelled successfully.',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ } else if (result.dismiss === Swal.DismissReason.cancel) {
+ Swal.fire({
+ title: 'Cancelled',
+ text: 'Unsubscription Cancelled!!',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ }
+ });
+ };
+ });
+ }
+})();
diff --git a/resources/js/auth/modal-add-new-address.js b/resources/js/auth/modal-add-new-address.js
new file mode 100644
index 0000000..5ca25dd
--- /dev/null
+++ b/resources/js/auth/modal-add-new-address.js
@@ -0,0 +1,73 @@
+/**
+ * Add New Address
+ */
+
+'use strict';
+
+// Select2 (jquery)
+$(function () {
+ const select2 = $('.select2');
+
+ // Select2 Country
+ if (select2.length) {
+ select2.each(function () {
+ var $this = $(this);
+ $this.wrap('
').select2({
+ placeholder: 'Select value',
+ dropdownParent: $this.parent()
+ });
+ });
+ }
+});
+
+// Add New Address form validation
+document.addEventListener('DOMContentLoaded', function () {
+ (function () {
+ // initCustomOptionCheck on modal show to update the custom select
+ let addNewAddress = document.getElementById('addNewAddress');
+ addNewAddress.addEventListener('show.bs.modal', function (event) {
+ // Init custom option check
+ window.Helpers.initCustomOptionCheck();
+ });
+
+ FormValidation.formValidation(document.getElementById('addNewAddressForm'), {
+ fields: {
+ modalAddressFirstName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your first name'
+ },
+ regexp: {
+ regexp: /^[a-zA-Zs]+$/,
+ message: 'The first name can only consist of alphabetical'
+ }
+ }
+ },
+ modalAddressLastName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your last name'
+ },
+ regexp: {
+ regexp: /^[a-zA-Zs]+$/,
+ message: 'The last name can only consist of alphabetical'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-add-new-cc.js b/resources/js/auth/modal-add-new-cc.js
new file mode 100644
index 0000000..41bfe4d
--- /dev/null
+++ b/resources/js/auth/modal-add-new-cc.js
@@ -0,0 +1,107 @@
+/**
+ * Add new credit card
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ // Variables
+ const creditCardMask = document.querySelector('.credit-card-mask'),
+ expiryDateMask = document.querySelector('.expiry-date-mask'),
+ cvvMask = document.querySelector('.cvv-code-mask'),
+ btnReset = document.querySelector('.btn-reset');
+ let cleave;
+
+ // Credit Card
+ function initCleave() {
+ if (creditCardMask) {
+ cleave = new Cleave(creditCardMask, {
+ creditCard: true,
+ onCreditCardTypeChanged: function (type) {
+ if (type != '' && type != 'unknown') {
+ document.querySelector('.card-type').innerHTML =
+ ' ';
+ } else {
+ document.querySelector('.card-type').innerHTML = '';
+ }
+ }
+ });
+ }
+ }
+
+ // Init cleave on show modal (To fix the cc image issue)
+ let addNewCCModal = document.getElementById('addNewCCModal');
+ addNewCCModal.addEventListener('show.bs.modal', function (event) {
+ initCleave();
+ });
+
+ // Expiry Date Mask
+ if (expiryDateMask) {
+ new Cleave(expiryDateMask, {
+ date: true,
+ delimiter: '/',
+ datePattern: ['m', 'y']
+ });
+ }
+
+ // CVV
+ if (cvvMask) {
+ new Cleave(cvvMask, {
+ numeral: true,
+ numeralPositiveOnly: true
+ });
+ }
+
+ // Credit card form validation
+ FormValidation.formValidation(document.getElementById('addNewCCForm'), {
+ fields: {
+ modalAddCard: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your credit card number'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ //* Move the error message out of the `input-group` element
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ }).on('plugins.message.displayed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ //* Move the error message out of the `input-group` element
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement.parentElement);
+ }
+ });
+
+ // reset card image on click of cancel
+ btnReset.addEventListener('click', function (e) {
+ // blank '.card-type' innerHTML to remove image
+ document.querySelector('.card-type').innerHTML = '';
+ // destroy cleave and init again on modal open
+ cleave.destroy();
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-add-permission.js b/resources/js/auth/modal-add-permission.js
new file mode 100644
index 0000000..b76feaa
--- /dev/null
+++ b/resources/js/auth/modal-add-permission.js
@@ -0,0 +1,35 @@
+/**
+ * Add Permission Modal JS
+ */
+
+'use strict';
+
+// Add permission form validation
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ FormValidation.formValidation(document.getElementById('addPermissionForm'), {
+ fields: {
+ modalPermissionName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter permission name'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-add-role.js b/resources/js/auth/modal-add-role.js
new file mode 100644
index 0000000..af4c8fe
--- /dev/null
+++ b/resources/js/auth/modal-add-role.js
@@ -0,0 +1,44 @@
+/**
+ * Add new role Modal JS
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ // add role form validation
+ FormValidation.formValidation(document.getElementById('addRoleForm'), {
+ fields: {
+ modalRoleName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter role name'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+
+ // Select All checkbox click
+ const selectAll = document.querySelector('#selectAll'),
+ checkboxList = document.querySelectorAll('[type="checkbox"]');
+ selectAll.addEventListener('change', t => {
+ checkboxList.forEach(e => {
+ e.checked = t.target.checked;
+ });
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-edit-cc.js b/resources/js/auth/modal-edit-cc.js
new file mode 100644
index 0000000..5b5c254
--- /dev/null
+++ b/resources/js/auth/modal-edit-cc.js
@@ -0,0 +1,79 @@
+/**
+ * Edit credit card
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ const editCreditCardMaskEdit = document.querySelector('.credit-card-mask-edit'),
+ editExpiryDateMaskEdit = document.querySelector('.expiry-date-mask-edit'),
+ editCVVMaskEdit = document.querySelector('.cvv-code-mask-edit');
+
+ // Credit Card
+ if (editCreditCardMaskEdit) {
+ new Cleave(editCreditCardMaskEdit, {
+ creditCard: true,
+ onCreditCardTypeChanged: function (type) {
+ if (type != '' && type != 'unknown') {
+ document.querySelector('.card-type-edit').innerHTML =
+ ' ';
+ } else {
+ document.querySelector('.card-type-edit').innerHTML = '';
+ }
+ }
+ });
+ }
+
+ // Expiry Date MaskEdit
+ if (editExpiryDateMaskEdit) {
+ new Cleave(editExpiryDateMaskEdit, {
+ date: true,
+ delimiter: '/',
+ datePattern: ['m', 'y']
+ });
+ }
+
+ // CVV MaskEdit
+ if (editCVVMaskEdit) {
+ new Cleave(editCVVMaskEdit, {
+ numeral: true,
+ numeralPositiveOnly: true
+ });
+ }
+
+ // Credit card form validation
+ FormValidation.formValidation(document.getElementById('editCCForm'), {
+ fields: {
+ modalEditCard: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your credit card number'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ //* Move the error message out of the `input-group` element
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-edit-permission.js b/resources/js/auth/modal-edit-permission.js
new file mode 100644
index 0000000..ee06c49
--- /dev/null
+++ b/resources/js/auth/modal-edit-permission.js
@@ -0,0 +1,35 @@
+/**
+ * Edit Permission Modal JS
+ */
+
+'use strict';
+
+// Edit permission form validation
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ FormValidation.formValidation(document.getElementById('editPermissionForm'), {
+ fields: {
+ editPermissionName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter permission name'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-sm-9'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-edit-user.js b/resources/js/auth/modal-edit-user.js
new file mode 100644
index 0000000..1edcb67
--- /dev/null
+++ b/resources/js/auth/modal-edit-user.js
@@ -0,0 +1,103 @@
+/**
+ * Edit User
+ */
+
+'use strict';
+
+// Select2 (jquery)
+$(function () {
+ const select2 = $('.select2');
+
+ // Select2 Country
+ if (select2.length) {
+ select2.each(function () {
+ var $this = $(this);
+ $this.wrap('
').select2({
+ placeholder: 'Select value',
+ dropdownParent: $this.parent()
+ });
+ });
+ }
+});
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ // variables
+ const modalEditUserTaxID = document.querySelector('.modal-edit-tax-id');
+ const modalEditUserPhone = document.querySelector('.phone-number-mask');
+
+ // Prefix
+ if (modalEditUserTaxID) {
+ new Cleave(modalEditUserTaxID, {
+ prefix: 'TIN',
+ blocks: [3, 3, 3, 4],
+ uppercase: true
+ });
+ }
+
+ // Phone Number Input Mask
+ if (modalEditUserPhone) {
+ new Cleave(modalEditUserPhone, {
+ phone: true,
+ phoneRegionCode: 'US'
+ });
+ }
+
+ // Edit user form validation
+ FormValidation.formValidation(document.getElementById('editUserForm'), {
+ fields: {
+ modalEditUserFirstName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your first name'
+ },
+ regexp: {
+ regexp: /^[a-zA-Zs]+$/,
+ message: 'The first name can only consist of alphabetical'
+ }
+ }
+ },
+ modalEditUserLastName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your last name'
+ },
+ regexp: {
+ regexp: /^[a-zA-Zs]+$/,
+ message: 'The last name can only consist of alphabetical'
+ }
+ }
+ },
+ modalEditUserName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your username'
+ },
+ stringLength: {
+ min: 6,
+ max: 30,
+ message: 'The name must be more than 6 and less than 30 characters long'
+ },
+ regexp: {
+ regexp: /^[a-zA-Z0-9 ]+$/,
+ message: 'The name can only consist of alphabetical, number and space'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+ })();
+});
diff --git a/resources/js/auth/modal-enable-otp.js b/resources/js/auth/modal-enable-otp.js
new file mode 100644
index 0000000..767edf2
--- /dev/null
+++ b/resources/js/auth/modal-enable-otp.js
@@ -0,0 +1,53 @@
+/**
+ * Enable OTP
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ const phoneMask = document.querySelector('.phone-number-otp-mask');
+
+ // Phone Number Input Mask
+ if (phoneMask) {
+ new Cleave(phoneMask, {
+ phone: true,
+ phoneRegionCode: 'US'
+ });
+ }
+
+ // Enable OTP form validation
+ FormValidation.formValidation(document.getElementById('enableOTPForm'), {
+ fields: {
+ modalEnableOTPPhone: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your mobile number'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-12'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ //* Move the error message out of the `input-group` element
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ })();
+});
diff --git a/resources/js/auth/pages-account-settings-account.js b/resources/js/auth/pages-account-settings-account.js
new file mode 100644
index 0000000..1a2b0c7
--- /dev/null
+++ b/resources/js/auth/pages-account-settings-account.js
@@ -0,0 +1,189 @@
+/**
+ * Account Settings - Account
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ const formAccSettings = document.querySelector('#formAccountSettings'),
+ deactivateAcc = document.querySelector('#formAccountDeactivation'),
+ deactivateButton = deactivateAcc.querySelector('.deactivate-account');
+
+ // Form validation for Add new record
+ if (formAccSettings) {
+ const fv = FormValidation.formValidation(formAccSettings, {
+ fields: {
+ firstName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter first name'
+ }
+ }
+ },
+ lastName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter last name'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.col-md-6'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+
+ if (deactivateAcc) {
+ const fv = FormValidation.formValidation(deactivateAcc, {
+ fields: {
+ accountActivation: {
+ validators: {
+ notEmpty: {
+ message: 'Please confirm you want to delete account'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: ''
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ fieldStatus: new FormValidation.plugins.FieldStatus({
+ onStatusChanged: function (areFieldsValid) {
+ areFieldsValid
+ ? // Enable the submit button
+ // so user has a chance to submit the form again
+ deactivateButton.removeAttribute('disabled')
+ : // Disable the submit button
+ deactivateButton.setAttribute('disabled', 'disabled');
+ }
+ }),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+
+ // Deactivate account alert
+ const accountActivation = document.querySelector('#accountActivation');
+
+ // Alert With Functional Confirm Button
+ if (deactivateButton) {
+ deactivateButton.onclick = function () {
+ if (accountActivation.checked == true) {
+ Swal.fire({
+ text: 'Are you sure you would like to deactivate your account?',
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Yes',
+ customClass: {
+ confirmButton: 'btn btn-primary me-2 waves-effect waves-light',
+ cancelButton: 'btn btn-label-secondary waves-effect waves-light'
+ },
+ buttonsStyling: false
+ }).then(function (result) {
+ if (result.value) {
+ Swal.fire({
+ icon: 'success',
+ title: 'Deleted!',
+ text: 'Your file has been deleted.',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ } else if (result.dismiss === Swal.DismissReason.cancel) {
+ Swal.fire({
+ title: 'Cancelled',
+ text: 'Deactivation Cancelled!!',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ }
+ });
+ }
+ };
+ }
+
+ // CleaveJS validation
+
+ const phoneNumber = document.querySelector('#phoneNumber'),
+ zipCode = document.querySelector('#zipCode');
+ // Phone Mask
+ if (phoneNumber) {
+ new Cleave(phoneNumber, {
+ phone: true,
+ phoneRegionCode: 'US'
+ });
+ }
+
+ // Pincode
+ if (zipCode) {
+ new Cleave(zipCode, {
+ delimiter: '',
+ numeral: true
+ });
+ }
+
+ // Update/reset user image of account page
+ let accountUserImage = document.getElementById('uploadedAvatar');
+ const fileInput = document.querySelector('.account-file-input'),
+ resetFileInput = document.querySelector('.account-image-reset');
+
+ if (accountUserImage) {
+ const resetImage = accountUserImage.src;
+ fileInput.onchange = () => {
+ if (fileInput.files[0]) {
+ accountUserImage.src = window.URL.createObjectURL(fileInput.files[0]);
+ }
+ };
+ resetFileInput.onclick = () => {
+ fileInput.value = '';
+ accountUserImage.src = resetImage;
+ };
+ }
+ })();
+});
+
+// Select2 (jquery)
+$(function () {
+ var select2 = $('.select2');
+ // For all Select2
+ if (select2.length) {
+ select2.each(function () {
+ var $this = $(this);
+ $this.wrap('
');
+ $this.select2({
+ dropdownParent: $this.parent()
+ });
+ });
+ }
+});
diff --git a/resources/js/auth/pages-account-settings-billing.js b/resources/js/auth/pages-account-settings-billing.js
new file mode 100644
index 0000000..317f502
--- /dev/null
+++ b/resources/js/auth/pages-account-settings-billing.js
@@ -0,0 +1,194 @@
+/**
+ * Account Settings - Billing & Plans
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ const creditCardMask = document.querySelector('.credit-card-mask'),
+ expiryDateMask = document.querySelector('.expiry-date-mask'),
+ CVVMask = document.querySelector('.cvv-code-mask');
+
+ // Credit Card
+ if (creditCardMask) {
+ new Cleave(creditCardMask, {
+ creditCard: true,
+ onCreditCardTypeChanged: function (type) {
+ if (type != '' && type != 'unknown') {
+ document.querySelector('.card-type').innerHTML =
+ ' ';
+ } else {
+ document.querySelector('.card-type').innerHTML = '';
+ }
+ }
+ });
+ }
+
+ // Expiry Date Mask
+ if (expiryDateMask) {
+ new Cleave(expiryDateMask, {
+ date: true,
+ delimiter: '/',
+ datePattern: ['m', 'y']
+ });
+ }
+
+ // CVV Mask
+ if (CVVMask) {
+ new Cleave(CVVMask, {
+ numeral: true,
+ numeralPositiveOnly: true
+ });
+ }
+
+ const formAccSettings = document.getElementById('formAccountSettings'),
+ mobileNumber = document.querySelector('.mobile-number'),
+ zipCode = document.querySelector('.zip-code'),
+ creditCardForm = document.getElementById('creditCardForm');
+
+ // Form validation
+ if (formAccSettings) {
+ const fv = FormValidation.formValidation(formAccSettings, {
+ fields: {
+ companyName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter company name'
+ }
+ }
+ },
+ billingEmail: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter billing email'
+ },
+ emailAddress: {
+ message: 'Please enter valid email address'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.col-sm-6'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+ }
+
+ // Credit card form validation
+ if (creditCardForm) {
+ FormValidation.formValidation(creditCardForm, {
+ fields: {
+ paymentCard: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your credit card number'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: ''
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ //* Move the error message out of the `input-group` element
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+
+ // Cancel Subscription alert
+ const cancelSubscription = document.querySelector('.cancel-subscription');
+
+ // Alert With Functional Confirm Button
+ if (cancelSubscription) {
+ cancelSubscription.onclick = function () {
+ Swal.fire({
+ text: 'Are you sure you would like to cancel your subscription?',
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Yes',
+ customClass: {
+ confirmButton: 'btn btn-primary me-2 waves-effect waves-light',
+ cancelButton: 'btn btn-label-secondary waves-effect waves-light'
+ },
+ buttonsStyling: false
+ }).then(function (result) {
+ if (result.value) {
+ Swal.fire({
+ icon: 'success',
+ title: 'Unsubscribed!',
+ text: 'Your subscription cancelled successfully.',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ } else if (result.dismiss === Swal.DismissReason.cancel) {
+ Swal.fire({
+ title: 'Cancelled',
+ text: 'Unsubscription Cancelled!!',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-success waves-effect waves-light'
+ }
+ });
+ }
+ });
+ };
+ }
+ // CleaveJS validation
+
+ // Phone Mask
+ if (mobileNumber) {
+ new Cleave(mobileNumber, {
+ phone: true,
+ phoneRegionCode: 'US'
+ });
+ }
+
+ // Pincode
+ if (zipCode) {
+ new Cleave(zipCode, {
+ delimiter: '',
+ numeral: true
+ });
+ }
+ })();
+});
+
+// Select2 (jquery)
+$(function () {
+ var select2 = $('.select2');
+
+ // Select2
+ if (select2.length) {
+ select2.each(function () {
+ var $this = $(this);
+ $this.wrap('
');
+ $this.select2({
+ dropdownParent: $this.parent()
+ });
+ });
+ }
+});
diff --git a/resources/js/auth/pages-account-settings-security.js b/resources/js/auth/pages-account-settings-security.js
new file mode 100644
index 0000000..f7f8a5d
--- /dev/null
+++ b/resources/js/auth/pages-account-settings-security.js
@@ -0,0 +1,125 @@
+/**
+ * Account Settings - Security
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ const formChangePass = document.querySelector('#formAccountSettings'),
+ formApiKey = document.querySelector('#formAccountSettingsApiKey');
+
+ // Form validation for Change password
+ if (formChangePass) {
+ const fv = FormValidation.formValidation(formChangePass, {
+ fields: {
+ currentPassword: {
+ validators: {
+ notEmpty: {
+ message: 'Please current password'
+ },
+ stringLength: {
+ min: 8,
+ message: 'Password must be more than 8 characters'
+ }
+ }
+ },
+ newPassword: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter new password'
+ },
+ stringLength: {
+ min: 8,
+ message: 'Password must be more than 8 characters'
+ }
+ }
+ },
+ confirmPassword: {
+ validators: {
+ notEmpty: {
+ message: 'Please confirm new password'
+ },
+ identical: {
+ compare: function () {
+ return formChangePass.querySelector('[name="newPassword"]').value;
+ },
+ message: 'The password and its confirm are not the same'
+ },
+ stringLength: {
+ min: 8,
+ message: 'Password must be more than 8 characters'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.col-md-6'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+
+ // Form validation for API key
+ if (formApiKey) {
+ const fvApi = FormValidation.formValidation(formApiKey, {
+ fields: {
+ apiKey: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter API key name'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: ''
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ // Submit the form when all fields are valid
+ // defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+ })();
+});
+
+// Select2 (jquery)
+$(function () {
+ var select2 = $('.select2');
+
+ // Select2 API Key
+ if (select2.length) {
+ select2.each(function () {
+ var $this = $(this);
+ $this.wrap('
');
+ $this.select2({
+ dropdownParent: $this.parent()
+ });
+ });
+ }
+});
diff --git a/resources/js/auth/pages-auth-multisteps.js b/resources/js/auth/pages-auth-multisteps.js
new file mode 100644
index 0000000..9934fcf
--- /dev/null
+++ b/resources/js/auth/pages-auth-multisteps.js
@@ -0,0 +1,305 @@
+/**
+ * Page auth register multi-steps
+ */
+
+'use strict';
+
+// Select2 (jquery)
+$(function () {
+ var select2 = $('.select2');
+
+ // select2
+ if (select2.length) {
+ select2.each(function () {
+ var $this = $(this);
+ $this.wrap('
');
+ $this.select2({
+ placeholder: 'Select an country',
+ dropdownParent: $this.parent()
+ });
+ });
+ }
+});
+
+// Multi Steps Validation
+// --------------------------------------------------------------------
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ const stepsValidation = document.querySelector('#multiStepsValidation');
+ if (typeof stepsValidation !== undefined && stepsValidation !== null) {
+ // Multi Steps form
+ const stepsValidationForm = stepsValidation.querySelector('#multiStepsForm');
+ // Form steps
+ const stepsValidationFormStep1 = stepsValidationForm.querySelector('#accountDetailsValidation');
+ const stepsValidationFormStep2 = stepsValidationForm.querySelector('#personalInfoValidation');
+ const stepsValidationFormStep3 = stepsValidationForm.querySelector('#billingLinksValidation');
+ // Multi steps next prev button
+ const stepsValidationNext = [].slice.call(stepsValidationForm.querySelectorAll('.btn-next'));
+ const stepsValidationPrev = [].slice.call(stepsValidationForm.querySelectorAll('.btn-prev'));
+
+ const multiStepsExDate = document.querySelector('.multi-steps-exp-date'),
+ multiStepsCvv = document.querySelector('.multi-steps-cvv'),
+ multiStepsMobile = document.querySelector('.multi-steps-mobile'),
+ multiStepsPincode = document.querySelector('.multi-steps-pincode'),
+ multiStepsCard = document.querySelector('.multi-steps-card');
+
+ // Expiry Date Mask
+ if (multiStepsExDate) {
+ new Cleave(multiStepsExDate, {
+ date: true,
+ delimiter: '/',
+ datePattern: ['m', 'y']
+ });
+ }
+
+ // CVV
+ if (multiStepsCvv) {
+ new Cleave(multiStepsCvv, {
+ numeral: true,
+ numeralPositiveOnly: true
+ });
+ }
+
+ // Mobile
+ if (multiStepsMobile) {
+ new Cleave(multiStepsMobile, {
+ phone: true,
+ phoneRegionCode: 'US'
+ });
+ }
+
+ // Pincode
+ if (multiStepsPincode) {
+ new Cleave(multiStepsPincode, {
+ delimiter: '',
+ numeral: true
+ });
+ }
+
+ // Credit Card
+ if (multiStepsCard) {
+ new Cleave(multiStepsCard, {
+ creditCard: true,
+ onCreditCardTypeChanged: function (type) {
+ if (type != '' && type != 'unknown') {
+ document.querySelector('.card-type').innerHTML =
+ ' ';
+ } else {
+ document.querySelector('.card-type').innerHTML = '';
+ }
+ }
+ });
+ }
+
+ let validationStepper = new Stepper(stepsValidation, {
+ linear: true
+ });
+
+ // Account details
+ const multiSteps1 = FormValidation.formValidation(stepsValidationFormStep1, {
+ fields: {
+ multiStepsUsername: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter username'
+ },
+ stringLength: {
+ min: 6,
+ max: 30,
+ message: 'The name must be more than 6 and less than 30 characters long'
+ },
+ regexp: {
+ regexp: /^[a-zA-Z0-9 ]+$/,
+ message: 'The name can only consist of alphabetical, number and space'
+ }
+ }
+ },
+ multiStepsEmail: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter email address'
+ },
+ emailAddress: {
+ message: 'The value is not a valid email address'
+ }
+ }
+ },
+ multiStepsPass: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter password'
+ }
+ }
+ },
+ multiStepsConfirmPass: {
+ validators: {
+ notEmpty: {
+ message: 'Confirm Password is required'
+ },
+ identical: {
+ compare: function () {
+ return stepsValidationFormStep1.querySelector('[name="multiStepsPass"]').value;
+ },
+ message: 'The password and its confirm are not the same'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: '.col-sm-6'
+ }),
+ autoFocus: new FormValidation.plugins.AutoFocus(),
+ submitButton: new FormValidation.plugins.SubmitButton()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ }).on('core.form.valid', function () {
+ // Jump to the next step when all fields in the current step are valid
+ validationStepper.next();
+ });
+
+ // Personal info
+ const multiSteps2 = FormValidation.formValidation(stepsValidationFormStep2, {
+ fields: {
+ multiStepsFirstName: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter first name'
+ }
+ }
+ },
+ multiStepsAddress: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter your address'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: function (field, ele) {
+ // field is the field name
+ // ele is the field element
+ switch (field) {
+ case 'multiStepsFirstName':
+ return '.col-sm-6';
+ case 'multiStepsAddress':
+ return '.col-md-12';
+ default:
+ return '.row';
+ }
+ }
+ }),
+ autoFocus: new FormValidation.plugins.AutoFocus(),
+ submitButton: new FormValidation.plugins.SubmitButton()
+ }
+ }).on('core.form.valid', function () {
+ // Jump to the next step when all fields in the current step are valid
+ validationStepper.next();
+ });
+
+ // Social links
+ const multiSteps3 = FormValidation.formValidation(stepsValidationFormStep3, {
+ fields: {
+ multiStepsCard: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter card number'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ // Use this for enabling/changing valid/invalid class
+ // eleInvalidClass: '',
+ eleValidClass: '',
+ rowSelector: function (field, ele) {
+ // field is the field name
+ // ele is the field element
+ switch (field) {
+ case 'multiStepsCard':
+ return '.col-md-12';
+
+ default:
+ return '.col-dm-6';
+ }
+ }
+ }),
+ autoFocus: new FormValidation.plugins.AutoFocus(),
+ submitButton: new FormValidation.plugins.SubmitButton()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ }).on('core.form.valid', function () {
+ // You can submit the form
+ // stepsValidationForm.submit()
+ // or send the form data to server via an Ajax request
+ // To make the demo simple, I just placed an alert
+ alert('Submitted..!!');
+ });
+
+ stepsValidationNext.forEach(item => {
+ item.addEventListener('click', event => {
+ // When click the Next button, we will validate the current step
+ switch (validationStepper._currentIndex) {
+ case 0:
+ multiSteps1.validate();
+ break;
+
+ case 1:
+ multiSteps2.validate();
+ break;
+
+ case 2:
+ multiSteps3.validate();
+ break;
+
+ default:
+ break;
+ }
+ });
+ });
+
+ stepsValidationPrev.forEach(item => {
+ item.addEventListener('click', event => {
+ switch (validationStepper._currentIndex) {
+ case 2:
+ validationStepper.previous();
+ break;
+
+ case 1:
+ validationStepper.previous();
+ break;
+
+ case 0:
+
+ default:
+ break;
+ }
+ });
+ });
+ }
+ })();
+});
diff --git a/resources/js/auth/pages-auth-two-steps.js b/resources/js/auth/pages-auth-two-steps.js
new file mode 100644
index 0000000..0939acb
--- /dev/null
+++ b/resources/js/auth/pages-auth-two-steps.js
@@ -0,0 +1,83 @@
+/**
+ * Page auth two steps
+ */
+
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ let maskWrapper = document.querySelector('.numeral-mask-wrapper');
+
+ for (let pin of maskWrapper.children) {
+ pin.onkeyup = function (e) {
+ // Check if the key pressed is a number (0-9)
+ if (/^\d$/.test(e.key)) {
+ // While entering value, go to next
+ if (pin.nextElementSibling) {
+ if (this.value.length === parseInt(this.attributes['maxlength'].value)) {
+ pin.nextElementSibling.focus();
+ }
+ }
+ } else if (e.key === 'Backspace') {
+ // While deleting entered value, go to previous
+ if (pin.previousElementSibling) {
+ pin.previousElementSibling.focus();
+ }
+ }
+ };
+ // Prevent the default behavior for the minus key
+ pin.onkeypress = function (e) {
+ if (e.key === '-') {
+ e.preventDefault();
+ }
+ };
+ }
+
+ const twoStepsForm = document.querySelector('#twoStepsForm');
+
+ // Form validation for Add new record
+ if (twoStepsForm) {
+ const fv = FormValidation.formValidation(twoStepsForm, {
+ fields: {
+ otp: {
+ validators: {
+ notEmpty: {
+ message: 'Please enter otp'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.mb-6'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+
+ defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ });
+
+ const numeralMaskList = twoStepsForm.querySelectorAll('.numeral-mask');
+ const keyupHandler = function () {
+ let otpFlag = true,
+ otpVal = '';
+ numeralMaskList.forEach(numeralMaskEl => {
+ if (numeralMaskEl.value === '') {
+ otpFlag = false;
+ twoStepsForm.querySelector('[name="otp"]').value = '';
+ }
+ otpVal = otpVal + numeralMaskEl.value;
+ });
+ if (otpFlag) {
+ twoStepsForm.querySelector('[name="otp"]').value = otpVal;
+ }
+ };
+ numeralMaskList.forEach(numeralMaskEle => {
+ numeralMaskEle.addEventListener('keyup', keyupHandler);
+ });
+ }
+ })();
+});
diff --git a/resources/js/auth/pages-auth.js b/resources/js/auth/pages-auth.js
new file mode 100644
index 0000000..9627b75
--- /dev/null
+++ b/resources/js/auth/pages-auth.js
@@ -0,0 +1,112 @@
+('use strict');
+
+const formAuthentication = document.querySelector('#formAuthentication');
+
+document.addEventListener('DOMContentLoaded', function (e) {
+ (function () {
+ // Form validation for Add new record
+ if (formAuthentication) {
+ const fv = FormValidation.formValidation(formAuthentication, {
+ fields: {
+ username: {
+ validators: {
+ notEmpty: {
+ message: 'Por favor, introduzca su nombre de usuario'
+ },
+ stringLength: {
+ min: 6,
+ message: 'El nombre de usuario debe tener más de 6 caracteres'
+ }
+ }
+ },
+ email: {
+ validators: {
+ notEmpty: {
+ message: 'Por favor, introduzca su correo electrónico'
+ },
+ emailAddress: {
+ message: 'Por favor, introduzca una dirección de correo electrónico válida'
+ }
+ }
+ },
+ 'email-username': {
+ validators: {
+ notEmpty: {
+ message: 'Por favor, introduzca su correo electrónico / nombre de usuario'
+ },
+ stringLength: {
+ min: 6,
+ message: 'El nombre de usuario debe tener más de 6 caracteres'
+ }
+ }
+ },
+ password: {
+ validators: {
+ notEmpty: {
+ message: 'Por favor, introduzca su contraseña'
+ },
+ stringLength: {
+ min: 6,
+ message: 'La contraseña debe tener más de 6 caracteres'
+ }
+ }
+ },
+ 'confirm-password': {
+ validators: {
+ notEmpty: {
+ message: 'Confirme la contraseña'
+ },
+ identical: {
+ compare: function () {
+ return formAuthentication.querySelector('[name="password"]').value;
+ },
+ message: 'La contraseña y su confirmación no son iguales'
+ },
+ stringLength: {
+ min: 6,
+ message: 'La contraseña debe tener más de 6 caracteres'
+ }
+ }
+ },
+ terms: {
+ validators: {
+ notEmpty: {
+ message: 'Acepte los términos y condiciones'
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.fv-row'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+
+ defaultSubmit: new FormValidation.plugins.DefaultSubmit(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ },
+ init: instance => {
+ instance.on('plugins.message.placed', function (e) {
+ if (e.element.parentElement.classList.contains('input-group')) {
+ e.element.parentElement.insertAdjacentElement('afterend', e.messageElement);
+ }
+ });
+ }
+ });
+ }
+
+ // Two Steps Verification
+ const numeralMask = document.querySelectorAll('.numeral-mask');
+
+ // Verification masking
+ if (numeralMask.length) {
+ numeralMask.forEach(e => {
+ new Cleave(e, {
+ numeral: true
+ });
+ });
+ }
+ })();
+});
diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js
new file mode 100644
index 0000000..5f1390b
--- /dev/null
+++ b/resources/js/bootstrap.js
@@ -0,0 +1,4 @@
+import axios from 'axios';
+window.axios = axios;
+
+window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
diff --git a/resources/js/pages/admin-settings-scripts.js b/resources/js/pages/admin-settings-scripts.js
new file mode 100644
index 0000000..4061713
--- /dev/null
+++ b/resources/js/pages/admin-settings-scripts.js
@@ -0,0 +1,27 @@
+import '../../assets/js/notifications/LivewireNotification.js';
+import FormCustomListener from '../../assets/js/forms/formCustomListener';
+
+new FormCustomListener({
+ buttonSelectors: ['.btn-save', '.btn-cancel', '.btn-reset'] // Selectores para botones
+});
+
+Livewire.on('clearLocalStoregeTemplateCustomizer', event => {
+ const _deleteCookie = name => {
+ document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
+ };
+
+ const pattern = 'templateCustomizer-';
+
+ // Iterar sobre todas las claves en localStorage
+ Object.keys(localStorage).forEach(key => {
+ if (key.startsWith(pattern)) {
+ localStorage.removeItem(key);
+ }
+ });
+
+ _deleteCookie('admin-mode');
+ _deleteCookie('admin-colorPref');
+ _deleteCookie('colorPref');
+ _deleteCookie('theme');
+ _deleteCookie('direction');
+});
diff --git a/resources/js/pages/cache-manager-scripts.js b/resources/js/pages/cache-manager-scripts.js
new file mode 100644
index 0000000..4a2131e
--- /dev/null
+++ b/resources/js/pages/cache-manager-scripts.js
@@ -0,0 +1,99 @@
+import '../../assets/js/notifications/LivewireNotification.js';
+import FormCustomListener from '../../assets/js/forms/formCustomListener';
+
+// Inicializar listener para estadísticas de cache
+new FormCustomListener({
+ buttonSelectors: ['.btn-clear-cache', '.btn-reload-cache-stats']
+});
+
+// Inicializar listener para funciones de cache
+new FormCustomListener({
+ formSelector: '#cache-functions-card',
+ buttonSelectors: ['.btn', '.btn-config-cache', '.btn-cache-routes'],
+ callbacks: [
+ null, // Callback por defecto para .btn
+ (form, button) => {
+ // Emitir notificación de carga
+ notification.emitNotification({
+ target: '#cache-functions-card .notification-container',
+ message: 'Generando cache de configuraciones de Laravel...',
+ type: 'warning'
+ });
+
+ // Generar cache de configuraciones mediante una petición AJAX
+ fetch('/admin/cache/config/cache', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
+ },
+ body: JSON.stringify({})
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Error al generar el cache de configuraciones');
+ }
+ return response.json();
+ })
+ .then(() => {
+ // Emitir notificación de éxito con recarga diferida
+ notification.emitNotification({
+ target: '#cache-functions-card .notification-container',
+ message: 'Se ha cacheado la configuración de Laravel...',
+ type: 'success',
+ deferReload: true
+ });
+ })
+ .catch(error => {
+ // Emitir notificación de error
+ notification.emitNotification({
+ target: '#cache-functions-card .notification-container',
+ message: `Error: ${error.message}`,
+ type: 'danger'
+ });
+ console.error('Error al generar el cache:', error);
+ });
+ },
+ (form, button) => {
+ // Emitir notificación de carga
+ notification.emitNotification({
+ target: '#cache-functions-card .notification-container',
+ message: 'Generando cache de rutas de Laravel...',
+ type: 'warning'
+ });
+
+ // Recargar estadísticas de cache mediante una petición AJAX
+ fetch('/admin/cache/route/cache', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
+ }
+ })
+ .then(response => {
+ if (!response.ok) {
+ throw new Error('Error al recargar las estadísticas de cache');
+ }
+ return response.json();
+ })
+ .then(() => {
+ // Emitir notificación de éxito con recarga diferida
+ notification.emitNotification({
+ target: '#cache-functions-card .notification-container',
+ message: 'Se han cacheado las rutas de Laravel...',
+ type: 'success',
+ deferReload: true
+ });
+ })
+ .catch(error => {
+ // Emitir notificación de error
+ notification.emitNotification({
+ target: '#cache-functions-card .notification-container',
+ message: `Error: ${error.message}`,
+ type: 'danger'
+ });
+ console.error('Error al recargar las estadísticas:', error);
+ });
+ }
+ ]
+});
diff --git a/resources/js/pages/permissions-scripts.js b/resources/js/pages/permissions-scripts.js
new file mode 100644
index 0000000..cff3fe1
--- /dev/null
+++ b/resources/js/pages/permissions-scripts.js
@@ -0,0 +1,197 @@
+/**
+ * App user list (jquery)
+ */
+
+'use strict';
+
+$(function () {
+ var dataTablePermissions = $('.datatables-permissions'),
+ dt_permission,
+ userList = baseUrl + 'app/user/list';
+
+ // Users List datatable
+ if (dataTablePermissions.length) {
+ dt_permission = dataTablePermissions.DataTable({
+ ajax: window.location.href,
+ columns: [
+ // columns according to JSON
+ { data: '' },
+ { data: 'id' },
+ { data: 'name' },
+ { data: 'assigned_to' },
+ { data: 'created_date' },
+ { data: '' }
+ ],
+ columnDefs: [
+ {
+ // For Responsive
+ className: 'control',
+ orderable: false,
+ searchable: false,
+ responsivePriority: 2,
+ targets: 0,
+ render: function (data, type, full, meta) {
+ return '';
+ }
+ },
+ {
+ targets: 1,
+ searchable: false,
+ visible: false
+ },
+ {
+ // Name
+ targets: 2,
+ render: function (data, type, full, meta) {
+ var $name = full['name'];
+ return '' + $name + ' ';
+ }
+ },
+ {
+ // User Role
+ targets: 3,
+ orderable: false,
+ render: function (data, type, full, meta) {
+ var $assignedTo = full['assigned_to'],
+ $output = '';
+ var roleBadgeObj = {
+ Admin:
+ 'Administrator ',
+ Manager:
+ 'Manager ',
+ Users:
+ 'Users ',
+ Support:
+ 'Support ',
+ Restricted:
+ 'Restricted User '
+ };
+ for (var i = 0; i < $assignedTo.length; i++) {
+ var val = $assignedTo[i];
+ $output += roleBadgeObj[val];
+ }
+ return '' + $output + ' ';
+ }
+ },
+ {
+ // remove ordering from Name
+ targets: 4,
+ orderable: false,
+ render: function (data, type, full, meta) {
+ var $date = full['created_date'];
+ return '' + $date + ' ';
+ }
+ },
+ {
+ // Actions
+ targets: -1,
+ searchable: false,
+ title: 'Actions',
+ orderable: false,
+ render: function (data, type, full, meta) {
+ return (
+ '' +
+ '
' +
+ ' ' +
+ '' +
+ ' '
+ );
+ }
+ }
+ ],
+ order: [[1, 'asc']],
+ dom:
+ '<"row mx-1"' +
+ '<"col-sm-12 col-md-3" l>' +
+ '<"col-sm-12 col-md-9"<"dt-action-buttons text-xl-end text-lg-start text-md-end text-start d-flex align-items-center justify-content-md-end justify-content-center flex-wrap"<"me-4 mt-n6 mt-md-0"f>B>>' +
+ '>t' +
+ '<"row"' +
+ '<"col-sm-12 col-md-6"i>' +
+ '<"col-sm-12 col-md-6"p>' +
+ '>',
+ language: $.fn.dataTable.ext.datatable_spanish_default,
+ // Buttons with Dropdown
+ buttons: [],
+ // For responsive popup
+ responsive: {
+ details: {
+ display: $.fn.dataTable.Responsive.display.modal({
+ header: function (row) {
+ var data = row.data();
+ return 'Details of ' + data['name'];
+ }
+ }),
+ type: 'column',
+ renderer: function (api, rowIdx, columns) {
+ var data = $.map(columns, function (col, i) {
+ return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
+ ? '' +
+ '' +
+ col.title +
+ ':' +
+ ' ' +
+ '' +
+ col.data +
+ ' ' +
+ ' '
+ : '';
+ }).join('');
+
+ return data ? $(' ').append(data) : false;
+ }
+ }
+ },
+ initComplete: function () {
+ // Adding role filter once table initialized
+ this.api()
+ .columns(3)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ' Select Role '
+ )
+ .appendTo('.user_role')
+ .on('change', function () {
+ var val = $.fn.dataTable.util.escapeRegex($(this).val());
+ column.search(val ? '^' + val + '$' : '', true, false).draw();
+ });
+
+ column
+ .data()
+ .unique()
+ .sort()
+ .each(function (d, j) {
+ select.append('' + d + ' ');
+ });
+ });
+ }
+ });
+ }
+
+ // Delete Record
+ $('.datatables-permissions tbody').on('click', '.delete-record', function () {
+ dt_permission.row($(this).parents('tr')).remove().draw();
+ });
+
+ // Filter form control to default size
+ // ? setTimeout used for multilingual table initialization
+ setTimeout(() => {
+ $('.dataTables_filter .form-control').removeClass('form-control-sm');
+ $('.dataTables_length .form-select').removeClass('form-select-sm');
+ $('.dataTables_info').addClass('ms-n1');
+ $('.dataTables_paginate').addClass('me-n1');
+ }, 300);
+});
diff --git a/resources/js/pages/roles-scripts.js b/resources/js/pages/roles-scripts.js
new file mode 100644
index 0000000..b334e4a
--- /dev/null
+++ b/resources/js/pages/roles-scripts.js
@@ -0,0 +1 @@
+import '../../assets/js/notifications/LivewireNotification.js';
diff --git a/resources/js/pages/smtp-settings-scripts.js b/resources/js/pages/smtp-settings-scripts.js
new file mode 100644
index 0000000..f616c46
--- /dev/null
+++ b/resources/js/pages/smtp-settings-scripts.js
@@ -0,0 +1,25 @@
+import '../../assets/js/notifications/LivewireNotification.js';
+import SmtpSettingsForm from '../../js/smtp-settings/SmtpSettingsForm';
+import SenderResponseForm from '../../js/smtp-settings/SenderResponseForm.js';
+
+window.smtpSettingsForm = new SmtpSettingsForm();
+window.senderResponseForm = new SenderResponseForm();
+
+Livewire.hook('morphed', ({ component }) => {
+ switch (component.name) {
+ case 'mail-smtp-settings':
+ if (window.smtpSettingsForm) {
+ window.smtpSettingsForm.reload(); // Recarga el formulario sin destruir la instancia
+ }
+ break;
+
+ case 'mail-sender-response-settings':
+ if (window.senderResponseForm) {
+ window.senderResponseForm.reload(); // Recarga el formulario sin destruir la instancia
+ }
+ break;
+
+ default:
+ break;
+ }
+});
diff --git a/resources/js/smtp-settings/SenderResponseForm.js b/resources/js/smtp-settings/SenderResponseForm.js
new file mode 100644
index 0000000..7071604
--- /dev/null
+++ b/resources/js/smtp-settings/SenderResponseForm.js
@@ -0,0 +1,220 @@
+export default class SenderResponseForm {
+ constructor(config = {}) {
+ const defaultConfig = {
+ formSenderResponseId: 'mail-sender-response-settings-card',
+ replyToMethodId: 'reply_to_method',
+ saveSenderResponseButtonId: 'save_sender_response_button',
+ cancelButtonId: 'cancel_sender_response_button'
+ };
+
+ this.config = { ...defaultConfig, ...config };
+ this.formSenderResponse = null;
+ this.smtpReplyToMethod = null;
+ this.saveButton = null;
+ this.cancelButton = null;
+
+ this.init(); // Inicializa el formulario
+ }
+
+ // Método para inicializar el formulario
+ init() {
+ try {
+ // Obtener elementos esenciales
+ this.formSenderResponse = document.getElementById(this.config.formSenderResponseId);
+ this.smtpReplyToMethod = document.getElementById(this.config.replyToMethodId);
+ this.saveButton = document.getElementById(this.config.saveSenderResponseButtonId);
+ this.cancelButton = document.getElementById(this.config.cancelButtonId);
+
+ // Asignar eventos
+ this.formSenderResponse.addEventListener('input', event => this.handleInput(event));
+ this.smtpReplyToMethod.addEventListener('change', () => this.handleToggleReplyToMethod());
+ this.cancelButton.addEventListener('click', () => this.handleCancel());
+
+ // Inicializar validación del formulario
+ this.initializeFormValidation(this.formSenderResponse, this.senderResponsValidateConfig, () => {
+ this.handleFormValid();
+ });
+
+ // Disparar el evento 'change' en el método de respuesta
+ setTimeout(() => this.smtpReplyToMethod.dispatchEvent(new Event('change')), 0);
+ } catch (error) {
+ console.error('Error al inicializar el formulario de respuesta:', error);
+ }
+ }
+
+ /**
+ * Método de recarga parcial
+ * Este método restablece la validación y los eventos sin destruir la instancia.
+ */
+ reload() {
+ try {
+ // Vuelve a inicializar la validación del formulario
+ this.initializeFormValidation(this.formSenderResponse, this.senderResponsValidateConfig, () => {
+ this.handleFormValid();
+ });
+
+ // Vuelve a agregar los eventos (si es necesario, depende de tu lógica)
+ this.smtpReplyToMethod.dispatchEvent(new Event('change'));
+ } catch (error) {
+ console.error('Error al recargar el formulario:', error);
+ }
+ }
+
+ /**
+ * Maneja el evento de entrada en el formulario.
+ * @param {Event} event - Evento de entrada.
+ */
+ handleInput(event) {
+ const target = event.target;
+
+ if (['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)) {
+ this.toggleButtonsState(this.formSenderResponse, true); // Habilitar botones
+ }
+ }
+
+ /**
+ * Muestra u oculta el campo de correo personalizado según el método de respuesta seleccionado.
+ * @param {HTMLElement} smtpReplyToMethod - Elemento select del método de respuesta.
+ */
+ handleToggleReplyToMethod() {
+ const emailCustomDiv = document.querySelector('.email-custom-div');
+
+ if (emailCustomDiv) {
+ emailCustomDiv.style.display = Number(this.smtpReplyToMethod.value) === 3 ? 'block' : 'none';
+ }
+ }
+
+ /**
+ * Cancels the sender response form submission.
+ * This method disables the form buttons, disables all form fields,
+ * and sets the cancel button to a loading state.
+ *
+ * @returns {void}
+ */
+ handleCancel() {
+ this.disableFormFields(this.formSenderResponse);
+ this.toggleButtonsState(this.formSenderResponse, false);
+ this.setButtonLoadingState(this.cancelButton, true);
+ }
+
+ /**
+ * Inicializa la validación del formulario.
+ * @param {HTMLElement} form - El formulario.
+ * @param {Object} config - Configuración de validación.
+ * @param {Function} onValidCallback - Callback cuando el formulario es válido.
+ */
+ initializeFormValidation(form, config, onValidCallback) {
+ return FormValidation.formValidation(form, config).on('core.form.valid', onValidCallback);
+ }
+
+ /**
+ * Maneja la acción cuando el formulario es válido.
+ */
+ handleFormValid() {
+ this.disableFormFields(this.formSenderResponse);
+ this.toggleButtonsState(this.formSenderResponse, false);
+ this.setButtonLoadingState(this.saveButton, true);
+
+ Livewire.dispatch('saveMailSenderResponseSettings');
+ }
+
+ /**
+ * Deshabilita todos los campos del formulario.
+ * @param {HTMLElement} form - El formulario.
+ */
+ disableFormFields(form) {
+ form.querySelectorAll('input, select, textarea').forEach(field => {
+ field.disabled = true;
+ });
+ }
+
+ /**
+ * Habilita o deshabilita los botones dentro del formulario.
+ * @param {HTMLElement} form - El formulario.
+ * @param {boolean} state - Estado de habilitación.
+ */
+ toggleButtonsState(form, state) {
+ form.querySelectorAll('button').forEach(button => {
+ button.disabled = !state;
+ });
+ }
+
+ /**
+ * Configura el estado de carga de un botón.
+ * @param {HTMLElement} button - El botón.
+ * @param {boolean} isLoading - Si el botón está en estado de carga.
+ */
+ setButtonLoadingState(button, isLoading) {
+ const loadingText = button.getAttribute('data-loading-text');
+
+ if (loadingText && isLoading) {
+ button.innerHTML = loadingText;
+ } else {
+ button.innerHTML = button.getAttribute('data-original-text') || button.innerHTML;
+ }
+ }
+
+ senderResponsValidateConfig = {
+ fields: {
+ from_address: {
+ validators: {
+ notEmpty: {
+ message: 'El correo electrónico de salida es obligatorio.'
+ },
+ emailAddress: {
+ message: 'Por favor, introduce un correo electrónico válido.'
+ }
+ }
+ },
+ from_name: {
+ validators: {
+ notEmpty: {
+ message: 'El nombre del remitente es obligatorio.'
+ }
+ }
+ },
+ reply_to_method: {
+ validators: {
+ notEmpty: {
+ message: 'El método de respuesta es obligatorio.'
+ }
+ }
+ },
+ reply_to_email: {
+ validators: {
+ callback: {
+ message: 'El correo electrónico de respuesta es obligatorio.',
+ callback: function (input) {
+ if (Number(document.getElementById('reply_to_method').value) === 3) {
+ return input.value.trim() !== '' && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(input.value);
+ }
+ return true;
+ }
+ }
+ }
+ },
+ reply_to_name: {
+ validators: {
+ callback: {
+ message: 'El nombre de respuesta es obligatorio.',
+ callback: function (input) {
+ if (Number(document.getElementById('reply_to_method').value) === 3) {
+ return input.value.trim() !== '';
+ }
+ return true;
+ }
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({
+ eleValidClass: '',
+ rowSelector: '.fv-row'
+ }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ };
+}
diff --git a/resources/js/smtp-settings/SmtpSettingsForm.js b/resources/js/smtp-settings/SmtpSettingsForm.js
new file mode 100644
index 0000000..8704bf1
--- /dev/null
+++ b/resources/js/smtp-settings/SmtpSettingsForm.js
@@ -0,0 +1,239 @@
+export default class SmtpSettingsForm {
+ constructor(config = {}) {
+ const defaultConfig = {
+ formSmtpSettingsSelector: '#mail-smtp-settings-card',
+ changeSmtpSettingsId: 'change_smtp_settings',
+ testSmtpConnectionButtonId: 'test_smtp_connection_button',
+ saveSmtpConnectionButtonId: 'save_smtp_connection_button',
+ cancelSmtpConnectionButtonId: 'cancel_smtp_connection_button'
+ };
+
+ this.config = { ...defaultConfig, ...config };
+ this.formSmtpSettings = null;
+ this.changeSmtpSettingsCheckbox = null;
+ this.testButton = null;
+ this.saveButton = null;
+ this.cancelButton = null;
+ this.validator = null;
+
+ this.init();
+ }
+
+ /**
+ * Inicializa el formulario de configuración SMTP.
+ */
+ init() {
+ try {
+ // Obtener elementos esenciales
+ this.formSmtpSettings = document.querySelector(this.config.formSmtpSettingsSelector);
+ this.notificationArea = this.formSmtpSettings.querySelector(this.config.notificationAreaSelector);
+ this.changeSmtpSettingsCheckbox = document.getElementById(this.config.changeSmtpSettingsId);
+ this.testButton = document.getElementById(this.config.testSmtpConnectionButtonId);
+ this.saveButton = document.getElementById(this.config.saveSmtpConnectionButtonId);
+ this.cancelButton = document.getElementById(this.config.cancelSmtpConnectionButtonId);
+
+ // Asignar eventos
+ this.changeSmtpSettingsCheckbox.addEventListener('change', event => this.handleCheckboxChange(event));
+ this.testButton.addEventListener('click', event => this.handleTestConnection(event));
+ this.cancelButton.addEventListener('click', () => this.handleCancel());
+
+ // Inicializar validación del formulario
+ this.validator = FormValidation.formValidation(this.formSmtpSettings, this.smtpSettingsFormValidateConfig);
+ } catch (error) {
+ console.error('Error al inicializar el formulario SMTP:', error);
+ }
+ }
+
+ /**
+ * Método de recarga parcial
+ * Este método restablece la validación y los eventos sin destruir la instancia.
+ */
+ reload() {
+ try {
+ // Inicializar validación del formulario
+ this.validator = FormValidation.formValidation(this.formSmtpSettings, this.smtpSettingsFormValidateConfig);
+ } catch (error) {
+ console.error('Error al recargar el formulario:', error);
+ }
+ }
+
+ /**
+ * Maneja el cambio en la casilla "Cambiar configuración SMTP".
+ * @param {Event} event - Evento de cambio.
+ */
+ handleCheckboxChange(event) {
+ const isEnabled = event.target.checked;
+
+ this.toggleFieldsState(['host', 'port', 'encryption', 'username', 'password'], isEnabled);
+
+ this.testButton.disabled = false;
+ this.saveButton.disabled = true;
+ this.cancelButton.disabled = false;
+
+ if (!isEnabled) {
+ Livewire.dispatch('loadSettings');
+ }
+ }
+
+ /**
+ * Maneja el clic en el botón "Probar conexión".
+ * @param {Event} event - Evento de clic.
+ */
+ handleTestConnection(event) {
+ event.preventDefault();
+
+ this.validator.resetForm();
+
+ this.validator.validate().then(status => {
+ if (status === 'Valid') {
+ this.disableFormFields(this.formSmtpSettings);
+ this.toggleButtonsState(this.formSmtpSettings, false);
+ this.setButtonLoadingState(this.testButton, true);
+
+ Livewire.dispatch('testSmtpConnection');
+ }
+ });
+ }
+
+ /**
+ * Maneja la cancelación de cambios en la configuración SMTP.
+ */
+ handleCancel() {
+ this.disableFormFields(this.formSmtpSettings);
+ this.toggleButtonsState(this.formSmtpSettings, false);
+ this.setButtonLoadingState(this.cancelButton, true);
+
+ Livewire.dispatch('loadSettings');
+ }
+
+ /**
+ * Habilita o deshabilita los campos del formulario.
+ * @param {Array} fields - IDs de los campos a actualizar.
+ * @param {boolean} isEnabled - Estado de habilitación.
+ */
+ toggleFieldsState(fields, isEnabled) {
+ fields.forEach(id => {
+ const field = document.getElementById(id);
+
+ if (field) field.disabled = !isEnabled;
+ });
+ }
+
+ /**
+ * Deshabilita todos los campos del formulario.
+ * @param {HTMLElement} form - El formulario.
+ */
+ disableFormFields(form) {
+ form.querySelectorAll('input, select, textarea').forEach(field => {
+ field.disabled = true;
+ });
+ }
+
+ /**
+ * Habilita o deshabilita los botones dentro del formulario.
+ * @param {HTMLElement} form - El formulario.
+ * @param {boolean} state - Estado de habilitación.
+ */
+ toggleButtonsState(form, state) {
+ form.querySelectorAll('button').forEach(button => {
+ button.disabled = !state;
+ });
+ }
+
+ /**
+ * Configura el estado de carga de un botón.
+ * @param {HTMLElement} button - El botón.
+ * @param {boolean} isLoading - Si el botón está en estado de carga.
+ */
+ setButtonLoadingState(button, isLoading) {
+ const loadingText = button.getAttribute('data-loading-text');
+
+ if (loadingText && isLoading) {
+ button.innerHTML = loadingText;
+ } else {
+ button.innerHTML = button.getAttribute('data-original-text') || button.innerHTML;
+ }
+ }
+
+ smtpSettingsFormValidateConfig = {
+ fields: {
+ host: {
+ validators: {
+ callback: {
+ message: 'El servidor SMTP es obligatorio.',
+ callback: function (input) {
+ // Ejecutar la validación solo si 'change_smtp_settings' está marcado
+ if (document.getElementById('change_smtp_settings').checked) {
+ return input.value.trim() !== '';
+ }
+ return true; // No validar si no está marcado
+ }
+ }
+ }
+ },
+ port: {
+ validators: {
+ callback: {
+ message: 'El puerto SMTP es obligatorio.',
+ callback: function (input) {
+ if (document.getElementById('change_smtp_settings').checked) {
+ return (
+ input.value.trim() !== '' &&
+ /^\d+$/.test(input.value) &&
+ input.value >= 1 &&
+ input.value <= 65535
+ );
+ }
+ return true;
+ }
+ }
+ }
+ },
+ encryption: {
+ validators: {
+ callback: {
+ message: 'La encriptación es obligatoria.',
+ callback: function (input) {
+ if (document.getElementById('change_smtp_settings').checked) {
+ return input.value.trim() !== '';
+ }
+ return true;
+ }
+ }
+ }
+ },
+ username: {
+ validators: {
+ callback: {
+ message: 'El usuario SMTP es obligatorio.',
+ callback: function (input) {
+ if (document.getElementById('change_smtp_settings').checked) {
+ return input.value.trim().length >= 6;
+ }
+ return true;
+ }
+ }
+ }
+ },
+ password: {
+ validators: {
+ callback: {
+ message: 'Por favor, introduzca su contraseña.',
+ callback: function (input) {
+ if (document.getElementById('change_smtp_settings').checked) {
+ return input.value.trim().length >= 5;
+ }
+ return true;
+ }
+ }
+ }
+ }
+ },
+ plugins: {
+ trigger: new FormValidation.plugins.Trigger(),
+ bootstrap5: new FormValidation.plugins.Bootstrap5({ rowSelector: '.fv-row' }),
+ submitButton: new FormValidation.plugins.SubmitButton(),
+ autoFocus: new FormValidation.plugins.AutoFocus()
+ }
+ };
+}
diff --git a/resources/lang/es/auth.php b/resources/lang/es/auth.php
new file mode 100644
index 0000000..b845247
--- /dev/null
+++ b/resources/lang/es/auth.php
@@ -0,0 +1,18 @@
+ 'Estas credenciales no coinciden con nuestros registros.',
+ 'password' => 'La contraseña ingresada no es correcta.',
+ 'throttle' => 'Demasiados intentos de acceso. Por favor intente nuevamente en :seconds segundos.',
+];
diff --git a/resources/lang/es/errors.php b/resources/lang/es/errors.php
new file mode 100644
index 0000000..d88611b
--- /dev/null
+++ b/resources/lang/es/errors.php
@@ -0,0 +1,10 @@
+ 'Esta acción solo está permitida para solicitudes AJAX.',
+ 'page_not_found' => 'No pudimos encontrar la página que estás buscando.',
+ 'route_not_found' => 'No se pudo encontrar la ruta :route.',
+ 'bad_request' => 'La solicitud está mal formada o contiene errores sintácticos.',
+ 'unauthorized' => 'No tienes permiso para acceder a esta página.',
+ 'forbidden' => 'No tienes permiso para acceder a este recurso.',
+];
diff --git a/resources/lang/es/locale.php b/resources/lang/es/locale.php
new file mode 100644
index 0000000..e3a07f6
--- /dev/null
+++ b/resources/lang/es/locale.php
@@ -0,0 +1,291 @@
+ "Web App",
+ "List of appointments" => "Listado de citas",
+ "Calendar medico" => "Calendario Médico",
+ "Vacations" => "Vacaciones",
+ "Specialties" => "Especialidades",
+ "Email contact" => "Correo de contacto",
+
+ "Billing API" => "API de facturación",
+ "PAC status" => "Info. del Pack",
+
+ "Social media" => "Redes sociales",
+ "Location" => "Ubicación",
+ "Office hours" => "Horario consultorio",
+
+ "Online dating" => "Citas en línea",
+ "Billing" => "Facturación",
+ "Invoice consultation" => "Facturar consultas",
+ "CFDI Ingresos" => "CFDI Ingresos",
+ "CFDI 4.0 Catalogs" => "Catálogos CFDI 4.0",
+ "Catalogs" => "Catálogos",
+
+ "CRM" => "CRM",
+ "Diary" => "Agenda",
+ "Diary settings" => "Configuraciones de Agenda",
+ "QR Codes" => "Códigos QR",
+
+ "Dropdown Lists" => "Listas desplegables",
+ "Agenda" => "Agenda",
+ "koneko.mx" => "koneko.mx",
+ "medico.esys.mx" => "medico.esys.mx",
+
+ "General setting" => "Ajustes generales",
+ "Working hours" => "Horario laboral",
+ "Working hours new users" => "Hor. nuevos usuarios",
+
+ "System users" => "Usuarios del sistema",
+
+ "medico users" => "Usuarios Médico",
+ "System settings" => "Ajustes de sistema",
+ "Settings" => "Ajustes",
+ "Appointment tags" => "Etiquetas de citas",
+
+ "My page" => "Mi página",
+ "Relationship" => "Amistades",
+ "Colleagues" => "Colegas",
+ "Galleries" => "Galerias",
+ "Posts" => "Publicaciones",
+ "My profile" => "Mi perfil",
+ "User profile" => "Perfil de usuario",
+ "Patients" => "Pacientes",
+ "Doctors" => "Médicos",
+ "Clinics" => "Médicos",
+ "My account" => "Mi cuenta",
+
+ "Appointments and payments" => "Citas",
+ "Administration" => "Administración",
+ "Roles and permissions" => "Roles y permisos",
+ "Payments" => "Pagos",
+ "new payment" => "Nuevo pago",
+ "Appointment, Calendar" => "Citas (Calendario)",
+ "Appointment, List" => "Citas (Lista)",
+ "Appointment" => "Cita",
+ "Appointments" => "Citas",
+ "Book appointment" => "Reservar una cita",
+ "My services" => "Mis servicios",
+ "Services" => "Servicios",
+ "New service" => "Nuevo servicio",
+ "Patients" => "Pacientes",
+ "Secretaries" => "Secretárias",
+ "Secretary" => "Secretaria",
+ "Administrators" => "Administratores",
+ "Security" => "Seguridad",
+ "Legal contents" => "Contenidos legales",
+
+ "Roles" => "Roles",
+ "Role" => "Role",
+ "Permissions" => 'Permisos',
+
+ "new destination" => "Nuevo destino",
+ "new post" => "Nueva publicación",
+
+ "about" => 'Acerca de',
+
+ "Destination" => "Destino",
+ "Destinations" => "Destinos",
+
+ "Profiles" => "Perfiles",
+ "Drop-down list" => "Listas desplegables",
+
+ "Slider" => "Rotador",
+ "Newsletter" => "Boletín",
+
+ "Main" => "Principal",
+ "Subscriptors" => "Suscriptores",
+
+ "Miscellaneous" => "Varios",
+ "System" => "Sistema",
+ "Users" => "Usuarios",
+ "My profile" => 'Mi perfil',
+ "Website" => "Sitio Web",
+ "Jetstream" => "Jetstream",
+ "Posts" => "Publicaciones",
+ "Tags" => "Etiquetas",
+ "Categories" => "Categorías",
+ "Home" => "Inicio",
+ "Starter Kit" => "Starter Kit",
+ "Apps & Pages" => "Apps & Pages",
+ "User Interface" => "User Interface",
+ "Vuexy Layouts" => "Vuexy Layouts",
+ "Dashboard" => "Dashboard",
+ "Dashboards" => "Dashboards",
+ "Analytics" => "Analytics",
+ "eCommerce" => "eCommerce",
+ "Apps" => "Apps",
+ "UI Elements" => "UI Elements",
+ "Forms & Tables" => "Forms & Tables",
+ "Pages" => "Pages",
+ "Charts & Maps" => "Charts & Maps",
+ "Others" => "Others",
+ "Email" => "Email",
+ "Chat" => "Chat",
+ "Todo" => "Todo",
+ "Calendar" => "Calendar",
+ "Ecommerce" => "Ecommerce",
+ "Shop" => "Shop",
+ "Wish List" => "Wish List",
+ "Checkout" => "Checkout",
+ "Starter kit" => "Starter kit",
+ "1 column" => "1 column",
+ "2 columns" => "2 columns",
+ "Fixed navbar" => "Fixed navbar",
+ "Floating navbar" => "Floating navbar",
+ "Fixed layout" => "Fixed layout",
+ "Static layout" => "Static layout",
+ "Dark layout" => "Dark layout",
+ "Light layout" => "Light layout",
+ "Data List" => "Data List",
+ "List View" => "List View",
+ "Thumb View" => "Thumb View",
+ "Content" => "Content",
+ "Grid" => "Grid",
+ "Typography" => "Typography",
+ "Text Utilities" => "Text Utilities",
+ "Syntax Highlighter" => "Syntax Highlighter",
+ "Helper Classes" => "Helper Classes",
+ "Colors" => "Colors",
+ "Icons" => "Icons",
+ "Feather" => "Feather",
+ "Font Awesome" => "Font Awesome",
+ "Card" => "Card",
+ "Basic" => "Basic",
+ "Advance" => "Advance",
+ "Advanced" => "Advanced",
+ "Statistics" => "Statistics",
+ "Card Actions" => "Card Actions",
+ "Table" => "Table",
+ "Datatable" => "Datatable",
+ "Components" => "Components",
+ "Alerts" => "Alerts",
+ "Buttons" => "Buttons",
+ "Breadcrumbs" => "Breadcrumbs",
+ "Carousel" => "Carousel",
+ "Collapse" => "Collapse",
+ "Dropdowns" => "Dropdowns",
+ "List Group" => "List Group",
+ "Modals" => "Modals",
+ "Pagination" => "Pagination",
+ "Navs Component" => "Navs Component",
+ "Navbar" => "Navbar",
+ "Tabs Component" => "Tabs Component",
+ "Pills Component" => "Pills Component",
+ "Tooltips" => "Tooltips",
+ "Popovers" => "Popovers",
+ "Badges" => "Badges",
+ "Pill Badges" => "Pill Badges",
+ "Progress" => "Progress",
+ "Media Objects" => "Media Objects",
+ "Spinner" => "Spinner",
+ "Toasts" => "Toasts",
+ "Extra Components" => "Extra Components",
+ "Avatar" => "Avatar",
+ "Chips" => "Chips",
+ "Divider" => "Divider",
+ "Form Elements" => "Form Elements",
+ "Select" => "Select",
+ "Switch" => "Switch",
+ "Checkbox" => "Checkbox",
+ "Radio" => "Radio",
+ "Input" => "Input",
+ "Input Groups" => "Input Groups",
+ "Number Input" => "Number Input",
+ "Textarea" => "Textarea",
+ "Date & Time Picker" => "Date & Time Picker",
+ "Form Layout" => "Form Layout",
+ "Form Wizard" => "Form Wizard",
+ "Form Validation" => "Form Validation",
+ "Authentication" => "Authentication",
+ "Login v1" => "Login v1",
+ "Login v2" => "Login v2",
+ "Register v1" => "Register v1",
+ "Register v2" => "Register v2",
+ "Forgot Password v1" => "Forgot Password v1",
+ "Forgot Password v2" => "Forgot Password v2",
+ "Reset Password v1" => "Reset Password v1",
+ "Reset Password v2" => "Reset Password v2",
+ "Coming Soon" => "Coming Soon",
+ "Error" => "Error",
+ "404" => "404",
+ "500" => "500",
+ "Not Authorized" => "Not Authorized",
+ "Maintenance" => "Maintenance",
+ "Profile" => "Profile",
+ "FAQ" => "FAQ",
+ "Knowledge Base" => "Knowledge Base",
+ "Search" => "Search",
+ "Invoice" => "Invoice",
+ "Charts" => "Charts",
+ "Apex" => "Apex",
+ "Chartjs" => "Chartjs",
+ "Echarts" => "Echarts",
+ "Google Maps" => "Google Maps",
+ "Sweet Alert" => "Sweet Alert",
+ "Toastr" => "Toastr",
+ "File Uploader" => "File Uploader",
+ "Quill Editor" => "Quill Editor",
+ "Drag & Drop" => "Drag & Drop",
+ "Tour" => "Tour",
+ "Clipboard" => "Clipboard",
+ "Context Menu" => "Context Menu",
+ "l18n" => "l18n",
+ "Menu Levels" => "Menu Levels",
+ "Second Level 2.1" => "Second Level 2.1",
+ "Second Level 2.2" => "Second Level 2.2",
+ "Third Level 3.1" => "Third Level 3.1",
+ "Third Level 3.2" => "Third Level 3.2",
+ "Disabled Menu" => "Disabled Menu",
+ "Documentation" => "Documentation",
+ "Raise Support" => "Raise Support",
+ "Miscellaneous" => "Varios",
+ "Extensions" => "Extensions",
+ "Media Player" => "Media Player",
+ "agGrid Table" => "agGrid Table",
+ "User Settings" => "User Settings",
+ "User" => "Usuario",
+ "List" => "List",
+ "View" => "View",
+ "Edit" => "Edit",
+ "Account Settings" => "Account Settings",
+ "Error 404" => "Error 404",
+ "Error 405" => "Error 405",
+ "Details" => "Details",
+ "Swiper" => "Swiper",
+ "I18n" => "I18n",
+ "Access Control" => "Access Control",
+ "File Manager" => "File Manager",
+ "Pricing" => "Pricing",
+ "Kanban" => "Kanban",
+ "Preview" => "Preview",
+ "Add" => "Add",
+ "Blog" => "Blog",
+ "Detail" => "Detail",
+ "Mail Template" => "Mail Template",
+ "Welcome" => "Welcome",
+ "Forgot" => "Forgot",
+ "Verify" => "Verify",
+ "Deactivate" => "Deactivate",
+ "Order" => "Order",
+ "Page Layouts" => "Page Layouts",
+ "Collapsed Menu" => "Collapsed Menu",
+ "Layout Full" => "Layout Full",
+ "Without Menu" => "Without Menu",
+ "Layout Empty" => "Layout Empty",
+ "Layout Blank" => "Layout Blank",
+ "Form Repeater" => "Form Repeater",
+ "Leaflet Maps" => "Leaflet Maps",
+ "Misc" => "Varios",
+ "Input Mask" => "Input Mask",
+ "Timeline" => "Timeline",
+ "BlockUI" => "BlockUI",
+ "Tree" => "Tree",
+ "Ratings" => "Ratings",
+ "Locale" => "Locale",
+ "Reset Password" => "Reset Password",
+ "Verify Email" => "Verify Email",
+ "Deactivate Account" => "Deactivate Account",
+ "Promotional" => "Promotional",
+ "message" => "Cake sesame snaps cupcake gingerbread danish I love gingerbread. Apple pie pie jujubes chupa chups muffin halvah lollipop. Chocolate cake oat cake tiramisu marzipan sugar plum. Donut sweet pie oat cake dragée fruitcake cotton candy lemon drops."
+];
diff --git a/resources/lang/es/messages.php b/resources/lang/es/messages.php
new file mode 100644
index 0000000..c339043
--- /dev/null
+++ b/resources/lang/es/messages.php
@@ -0,0 +1,740 @@
+ 'Estas credenciales no coinciden con nuestros registros.',
+ 'password' => 'La contraseña ingresada no es correcta.',
+ 'throttle' => 'Demasiados intentos de acceso. Por favor intente nuevamente en :seconds segundos.',
+
+ "30 Days" => "30 Días",
+ "60 Days" => "60 Días",
+ "90 Days" => "90 Días",
+ ":amount Total" => ":amount Total",
+ ":days day trial" => "prueba por :days days",
+ ":resource Details" => "Detalles del :resource",
+ ":resource Details: :title" => "Detalles del :resource : :title",
+ "A new verification link has been sent to the email address you provided during registration." => "Se ha enviado un nuevo enlace de verificación a la dirección de correo electrónico que proporcionó durante el registro.",
+ "Accept Invitation" => "Aceptar invitación",
+ "Action" => "Acción",
+ "Action Happened At" => "La acción sucedió a las",
+ "Action Initiated By" => "La acción inició a las",
+ "Action Name" => "Nombre de la acción",
+ "Action Status" => "Estado de la acción",
+ "Action Target" => "Objetivo de la acción",
+ "Actions" => "Acciones",
+ "Add" => "Añadir",
+ "Add a new team member to your team, allowing them to collaborate with you." => "Agregue un nuevo miembro a su equipo, permitiéndole colaborar con usted.",
+ "Add additional security to your account using two factor authentication." => "Agregue seguridad adicional a su cuenta mediante la autenticación de dos factores.",
+ "Add row" => "Añadir fila",
+ "Add Team Member" => "Añadir un nuevo miembro al equipo",
+ "Add VAT Number" => "Agregar número VAT",
+ "Added." => "Añadido.",
+ "Address" => "Dirección",
+ "Address Line 2" => "Dirección de la línea 2",
+ "Afghanistan" => "Afganistán",
+ "Aland Islands" => "Islas Aland",
+ "Albania" => "Albania",
+ "Algeria" => "Algeria",
+ "All of the people that are part of this team." => "Todas las personas que forman parte de este equipo.",
+ "All resources loaded." => "Todos los recursos cargados.",
+ "All rights reserved." => "Todos los derechos reservados.",
+ "Already registered?" => "¿Ya se registró?",
+ "American Samoa" => "Samoa Americana",
+ "An error occured while uploading the file." => "Ocurrio un error al subir el archivo.",
+ "An unexpected error occurred and we have notified our support team. Please try again later." => "Se produjo un error inesperado y hemos notificado a nuestro equipo de soporte. Por favor intente de nuevo más tarde.",
+ "Andorra" => "Andorra",
+ "Angola" => "Angola",
+ "Anguilla" => "Anguila",
+ "Another user has updated this resource since this page was loaded. Please refresh the page and try again." => "Otro usuario ha modificado el recurso desde que esta página fue cargada. Por favor refresque la página e intente nuevamente.",
+ "Antarctica" => "Antártica",
+ "Antigua And Barbuda" => "Antigua y Barbuda",
+ "Antigua and Barbuda" => "Antigua y Barbuda",
+ "API Token" => "Token API",
+ "API Token Permissions" => "Permisos para el token API",
+ "API Tokens" => "Tokens API",
+ "API tokens allow third-party services to authenticate with our application on your behalf." => "Los tokens API permiten a servicios de terceros autenticarse con nuestra aplicación en su nombre.",
+ "Apply" => "Aplicar",
+ "Apply Coupon" => "Aplicar cupón",
+ "April" => "Abril",
+ "Are you sure you want to delete the selected resources?" => "¿Está seguro de que desea eliminar los recursos seleccionados?",
+ "Are you sure you want to delete this file?" => "¿Está seguro de que desea eliminar este archivo?",
+ "Are you sure you want to delete this resource?" => "¿Está seguro de que desea eliminar este recurso?",
+ "Are you sure you want to delete this team? Once a team is deleted, all of its resources and data will be permanently deleted." => "¿Está seguro que desea eliminar este equipo? Una vez que se elimina un equipo, todos sus recursos y datos se eliminarán de forma permanente.",
+ "Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account." => "¿Está seguro que desea eliminar su cuenta? Una vez que se elimine su cuenta, todos sus recursos y datos se eliminarán de forma permanente. Ingrese su contraseña para confirmar que desea eliminar su cuenta de forma permanente.",
+ "Are you sure you want to detach the selected resources?" => "¿Está seguro que desea desvincular los recursos seleccionados?",
+ "Are you sure you want to detach this resource?" => "¿Está seguro que desea desvincular este recurso?",
+ "Are you sure you want to force delete the selected resources?" => "¿Está seguro que desea forzar la eliminación de los recurso seleccionados?",
+ "Are you sure you want to force delete this resource?" => "¿Está seguro que desea forzar la eliminación de este recurso?",
+ "Are you sure you want to restore the selected resources?" => "¿Está seguro que desea restaurar los recursos seleccionados?",
+ "Are you sure you want to restore this resource?" => "¿Está seguro que desea restaurar este recurso?",
+ "Are you sure you want to run this action?" => "¿Está seguro que desea ejecutar esta acción?",
+ "Are you sure you would like to delete this API token?" => "¿Está seguro que desea eliminar este token API?",
+ "Are you sure you would like to leave this team?" => "¿Está seguro que le gustaría abandonar este equipo?",
+ "Are you sure you would like to remove this person from the team?" => "¿Está seguro que desea retirar a esta persona del equipo?",
+ "Argentina" => "Argentina",
+ "Armenia" => "Armenia",
+ "Aruba" => "Aruba",
+ "Attach" => "Adjuntar",
+ "Attach & Attach Another" => "Adjuntar & adjuntar otro",
+ "Attach :resource" => "Adjuntar :resource",
+ "August" => "Agosto",
+ "Australia" => "Australia",
+ "Austria" => "Austria",
+ "Azerbaijan" => "Azerbaijan",
+ "Bahamas" => "Bahamas",
+ "Bahrain" => "Bahrain",
+ "Bangladesh" => "Bangladesh",
+ "Barbados" => "Barbados",
+ "Belarus" => "Bielorrusia",
+ "Belgium" => "Bélgica",
+ "Belize" => "Belice",
+ "Benin" => "Benin",
+ "Bermuda" => "Bermuda",
+ "Bhutan" => "Bután",
+ "Billing Information" => "Información de facturación",
+ "Billing Management" => "Gestión de facturación",
+ "Bolivia" => "Bolivia",
+ "Bolivia, Plurinational State of" => "Bolivia, Estado Plurinacional de",
+ "Bonaire, Sint Eustatius and Saba" => "Bonaire, San Eustaquio y Saba",
+ "Bosnia And Herzegovina" => "Bosnia y Herzegovina",
+ "Bosnia and Herzegovina" => "Bosnia y Herzegovina",
+ "Botswana" => "Botswana",
+ "Bouvet Island" => "Isla Bouvet",
+ "Brazil" => "Brasil",
+ "British Indian Ocean Territory" => "Territorio Británico del Océano Índico",
+ "Browser Sessions" => "Sesiones del navegador",
+ "Brunei Darussalam" => "Brunei",
+ "Bulgaria" => "Bulgaria",
+ "Burkina Faso" => "Burkina Faso",
+ "Burundi" => "Burundi",
+ "Cambodia" => "Camboya",
+ "Cameroon" => "Camerún",
+ "Canada" => "Canadá",
+ "Cancel" => "Cancelar",
+ "Cancel Subscription" => "Cancelar suscripción",
+ "Cape Verde" => "Cabo Verde",
+ "Card" => "Tarjeta",
+ "Cayman Islands" => "Islas Caimán",
+ "Central African Republic" => "República Centroafricana",
+ "Chad" => "Chad",
+ "Change Subscription Plan" => "Cambiar plan de suscripción",
+ "Changes" => "Cambios",
+ "Chile" => "Chile",
+ "China" => "China",
+ "Choose" => "Elija",
+ "Choose :field" => "Elija :field",
+ "Choose :resource" => "Elija :resource",
+ "Choose an option" => "Elija una opción",
+ "Choose date" => "Elija fecha",
+ "Choose File" => "Elija archivo",
+ "Choose Type" => "Elija tipo",
+ "Christmas Island" => "Isla de Navidad",
+ "City" => "Ciudad",
+ "Click to choose" => "Haga click para elegir",
+ "Close" => "Cerrar",
+ "Cocos (Keeling) Islands" => "Islas Cocos (Keeling)",
+ "Code" => "Código",
+ "Colombia" => "Colombia",
+ "Comoros" => "Comoros",
+ "Confirm" => "Confirmar",
+ "Confirm Password" => "Confirmar contraseña",
+ "Confirm Payment" => "Confirmar pago",
+ "Confirm your :amount payment" => "Confirme su pago de :amount",
+ "Congo" => "Congo",
+ "Congo, Democratic Republic" => "República democrática del Congo",
+ "Congo, the Democratic Republic of the" => "Congo, República Democrática del",
+ "Constant" => "Constante",
+ "Cook Islands" => "Islas Cook",
+ "Costa Rica" => "Costa Rica",
+ "Cote D'Ivoire" => "Costa de Marfil",
+ "could not be found." => "no se pudo encontrar.",
+ "Country" => "País",
+ "Coupon" => "Cupón",
+ "Create" => "Crear",
+ "Create & Add Another" => "Crear & Añadir otro",
+ "Create :resource" => "Crear :resource",
+ "Create a new team to collaborate with others on projects." => "Cree un nuevo equipo para colaborar con otros en proyectos.",
+ "Create Account" => "Crear cuenta",
+ "Create API Token" => "Crear Token API",
+ "Create New Team" => "Crear nuevo equipo",
+ "Create Team" => "Crear equipo",
+ "Created." => "Creado.",
+ "Croatia" => "Croacia",
+ "Cuba" => "Cuba",
+ "Curaçao" => "Curazao",
+ "Current Password" => "Contraseña actual",
+ "Current Subscription Plan" => "Plan de suscripción actual",
+ "Currently Subscribed" => "Suscrito actualmente",
+ "Customize" => "Personalizar ",
+ "Cyprus" => "Chipre",
+ "Czech Republic" => "República Checa",
+ "Côte d'Ivoire" => "Costa de Marfil",
+ "Dashboard" => "Panel",
+ "December" => "Diciembre",
+ "Decrease" => "Disminuir",
+ "Delete" => "Eliminar",
+ "Delete Account" => "Borrar cuenta",
+ "Delete API Token" => "Borrar token API",
+ "Delete File" => "Borrar archivo",
+ "Delete Resource" => "Eliminar recurso",
+ "Delete Selected" => "Eliminar seleccionado",
+ "Delete Team" => "Borrar equipo",
+ "Denmark" => "Dinamarca",
+ "Detach" => "Desvincular",
+ "Detach Resource" => "Desvincular recurso",
+ "Detach Selected" => "Desvincular selección",
+ "Details" => "Detalles",
+ "Disable" => "Deshabilitar",
+ "Djibouti" => "Yibuti",
+ "Do you really want to leave? You have unsaved changes." => "¿Realmente desea salir? Aún hay cambios sin guardar.",
+ "Dominica" => "Dominica",
+ "Dominican Republic" => "República Dominicana",
+ "Done." => "Hecho.",
+ "Download" => "Descargar",
+ "Download Receipt" => "Descargar recibo",
+ "Ecuador" => "Ecuador",
+ "Edit" => "Editar",
+ "Edit :resource" => "Editar :resource",
+ "Edit Attached" => "Editar Adjunto",
+ "Egypt" => "Egipto",
+ "El Salvador" => "El Salvador",
+ "Email" => "Correo electrónico",
+ "Email Address" => "Correo electrónico",
+ "Email Addresses" => "Correos electrónicos",
+ "Email Password Reset Link" => "Enviar enlace para restablecer contraseña",
+ "Enable" => "Habilitar",
+ "Ensure your account is using a long, random password to stay secure." => "Asegúrese que su cuenta esté usando una contraseña larga y aleatoria para mantenerse seguro.",
+ "Equatorial Guinea" => "Guinea Ecuatorial",
+ "Eritrea" => "Eritrea",
+ "Estonia" => "Estonia",
+ "Ethiopia" => "Etiopía",
+ "ex VAT" => "sin VAT",
+ "Extra Billing Information" => "Información de facturación adicional",
+ "Extra confirmation is needed to process your payment. Please confirm your payment by filling out your payment details below." => "Se necesita confirmación adicional para procesar su pago. Confirme su pago completando los detalles a continuación.",
+ "Extra confirmation is needed to process your payment. Please continue to the payment page by clicking on the button below." => "Se necesita confirmación adicional para procesar su pago. Continúe a la página de pago haciendo clic en el botón de abajo.",
+ "Falkland Islands (Malvinas)" => "Malvinas (Falkland Islands)",
+ "Faroe Islands" => "Islas Feroe",
+ "February" => "Febrero",
+ "Fiji" => "Fiyi",
+ "Finland" => "Finlandia",
+ "For your security, please confirm your password to continue." => "Por su seguridad, confirme su contraseña para continuar.",
+ "Forbidden" => "Prohibido",
+ "Force Delete" => "Forzar la eliminación",
+ "Force Delete Resource" => "Forzar la eliminación del recurso",
+ "Force Delete Selected" => "Forzar la eliminación de la selección",
+ "Forgot your password?" => "¿Olvidó su contraseña?",
+ "Forgot Your Password?" => "¿Olvidó su Contraseña?",
+ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one." => "¿Olvidó su contraseña? No hay problema. Simplemente déjenos saber su dirección de correo electrónico y le enviaremos un enlace para restablecer la contraseña que le permitirá elegir una nueva.",
+ "France" => "Francia",
+ "French Guiana" => "Guayana Francesa",
+ "French Polynesia" => "Polinesia Francesa",
+ "French Southern Territories" => "Tierras Australes y Antárticas Francesas",
+ "Full name" => "Nombre completo",
+ "Gabon" => "Gabón",
+ "Gambia" => "Gambia",
+ "Georgia" => "Georgia",
+ "Germany" => "Alemania",
+ "Ghana" => "Ghana",
+ "Gibraltar" => "Gibraltar",
+ "Go back" => "Ir atrás",
+ "Go Home" => "Ir a inicio",
+ "Go to page :page" => "Ir a la página :page",
+ "Great! You have accepted the invitation to join the :team team." => "¡Genial! Usted ha aceptado la invitación para unirse al equipo :team.",
+ "Greece" => "Grecia",
+ "Greenland" => "Groenlandia",
+ "Grenada" => "Grenada",
+ "Guadeloupe" => "Guadalupe",
+ "Guam" => "Guam",
+ "Guatemala" => "Guatemala",
+ "Guernsey" => "Guernsey",
+ "Guinea" => "Guinea",
+ "Guinea-Bissau" => "Guinea-Bisáu",
+ "Guyana" => "Guyana",
+ "Haiti" => "Haití",
+ "Have a coupon code?" => "¿Tiene un código de descuento?",
+ "Having second thoughts about cancelling your subscription? You can instantly reactive your subscription at any time until the end of your current billing cycle. After your current billing cycle ends, you may choose an entirely new subscription plan." => "¿Tiene dudas sobre la cancelación de su suscripción? Puede reactivar instantáneamente su suscripción en cualquier momento hasta el final de su ciclo de facturación actual. Una vez que finalice su ciclo de facturación actual, puede elegir un plan de suscripción completamente nuevo.",
+ "Heard Island & Mcdonald Islands" => "Islas Heard y McDonald",
+ "Heard Island and McDonald Islands" => "Islas Heard y McDonald",
+ "Hello!" => "¡Hola!",
+ "Hide Content" => "Ocultar contenido",
+ "Hold Up!" => "En espera!",
+ "Holy See (Vatican City State)" => "Ciudad del Vaticano",
+ "Honduras" => "Honduras",
+ "Hong Kong" => "Hong Kong",
+ "Hungary" => "Hungría",
+ "I accept the terms of service" => "Acepto los términos del servicio",
+ "I agree to the :terms_of_service and :privacy_policy" => "Acepto los :terms_of_service y la :privacy_policy",
+ "Iceland" => "Islandia",
+ "ID" => "ID",
+ "If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password." => "Si es necesario, puede salir de todas las demás sesiones de otros navegadores en todos sus dispositivos. Algunas de sus sesiones recientes se enumeran a continuación; sin embargo, es posible que esta lista no sea exhaustiva. Si cree que su cuenta se ha visto comprometida, también debería actualizar su contraseña.",
+ "If you already have an account, you may accept this invitation by clicking the button below:" => "Si ya tiene una cuenta, puede aceptar esta invitación haciendo clic en el botón de abajo:",
+ "If you did not create an account, no further action is required." => "Si no ha creado una cuenta, no se requiere ninguna acción adicional.",
+ "If you did not expect to receive an invitation to this team, you may discard this email." => "Si no esperaba recibir una invitación para este equipo, puede descartar este correo electrónico.",
+ "If you did not request a password reset, no further action is required." => "Si no ha solicitado el restablecimiento de contraseña, omita este mensaje de correo electrónico.",
+ "If you do not have an account, you may create one by clicking the button below. After creating an account, you may click the invitation acceptance button in this email to accept the team invitation:" => "Si no tiene una cuenta, puede crear una haciendo clic en el botón de abajo. Después de crear una cuenta, puede hacer clic en el botón de aceptación de la invitación en este correo electrónico para aceptar la invitación del equipo:",
+ "If you need to add specific contact or tax information to your receipts, like your full business name, VAT identification number, or address of record, you may add it here." => "Si necesita agregar información de contacto específica o de impuestos a sus recibos, como su nombre comercial completo, número de identificación VAT o dirección de registro, puede agregarlo aquí.",
+ "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:" => "Si tiene problemas para hacer clic en el botón \":actionText\", copie y pegue la siguiente URL \nen su navegador web:",
+ "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:" => "Si tiene problemas para hacer clic en el botón \":actionText\", copie y pegue la siguiente URL \nen su navegador web:",
+ "Increase" => "Incrementar",
+ "India" => "India",
+ "Indonesia" => "Indonesia",
+ "Iran, Islamic Republic Of" => "República Islámica de Irán",
+ "Iran, Islamic Republic of" => "Irán, República Islámica de",
+ "Iraq" => "Iraq",
+ "Ireland" => "Irlanda",
+ "Isle Of Man" => "Isla de Man",
+ "Isle of Man" => "Isla de Man",
+ "Israel" => "Israel",
+ "It looks like you do not have an active subscription. You may choose one of the subscription plans below to get started. Subscription plans may be changed or cancelled at your convenience." => "Parece que no tiene una suscripción activa. Puede elegir uno de los planes de suscripción a continuación para comenzar. Los planes de suscripción se pueden cambiar o cancelar según su conveniencia.",
+ "Italy" => "Italia",
+ "Jamaica" => "Jamaica",
+ "Jane Doe" => "Jane Doe",
+ "January" => "Enero",
+ "Japan" => "Japón",
+ "Jersey" => "Jersey",
+ "Jordan" => "Jordán",
+ "July" => "Julio",
+ "June" => "Junio",
+ "Kazakhstan" => "Kazajistán",
+ "Kenya" => "Kenya",
+ "Key" => "Clave",
+ "Kiribati" => "Kiribati",
+ "Korea" => "Corea del Sur",
+ "Korea, Democratic People's Republic of" => "Corea del Norte",
+ "Korea, Republic of" => "Corea, República de",
+ "Kosovo" => "Kosovo",
+ "Kuwait" => "Kuwait",
+ "Kyrgyzstan" => "Kirguistán",
+ "Lao People's Democratic Republic" => "Laos, República Democrática Popular de",
+ "Last active" => "Activo por última vez",
+ "Last used" => "Usado por última vez",
+ "Latvia" => "Letonia",
+ "Leave" => "Abandonar",
+ "Leave Team" => "Abandonar equipo",
+ "Lebanon" => "Líbano",
+ "Lens" => "Lens",
+ "Lesotho" => "Lesoto",
+ "Liberia" => "Liberia",
+ "Libyan Arab Jamahiriya" => "Libia",
+ "Liechtenstein" => "Liechtenstein",
+ "Lithuania" => "Lituania",
+ "Load :perPage More" => "Cargar :perPage Mas",
+ "Log in" => "Iniciar sesión",
+ "Log Out" => "Finalizar sesión",
+ "Log Out Other Browser Sessions" => "Cerrar las demás sesiones",
+ "Login" => "Iniciar sesión",
+ "Logout" => "Finalizar sesión",
+ "Luxembourg" => "Luxemburgo",
+ "Macao" => "Macao",
+ "Macedonia" => "Macedonia",
+ "Macedonia, the former Yugoslav Republic of" => "Macedonia, ex República Yugoslava de",
+ "Madagascar" => "Madagascar",
+ "Malawi" => "Malaui",
+ "Malaysia" => "Malasia",
+ "Maldives" => "Maldivas",
+ "Mali" => "Malí",
+ "Malta" => "Malta",
+ "Manage Account" => "Administrar cuenta",
+ "Manage and log out your active sessions on other browsers and devices." => "Administre y cierre sus sesiones activas en otros navegadores y dispositivos.",
+ "Manage API Tokens" => "Administrar Tokens API",
+ "Manage Role" => "Administrar rol",
+ "Manage Team" => "Administrar equipo",
+ "Managing billing for :billableName" => "Gestionando la facturación de :billableName",
+ "March" => "Marzo",
+ "Marshall Islands" => "Islas Marshall",
+ "Martinique" => "Martinica",
+ "Mauritania" => "Mauritania",
+ "Mauritius" => "Mauricio",
+ "May" => "Mayo",
+ "Mayotte" => "Mayotte",
+ "Mexico" => "México",
+ "Micronesia, Federated States Of" => "Micronesia, Estados Federados de",
+ "Micronesia, Federated States of" => "Micronesia, Estados Federados de",
+ "Moldova" => "Moldavia",
+ "Moldova, Republic of" => "Moldavia, República de",
+ "Monaco" => "Mónaco",
+ "Mongolia" => "Mongolia",
+ "Montenegro" => "Montenegro",
+ "Month To Date" => "Mes hasta la fecha",
+ "Monthly" => "Mensual",
+ "monthly" => "mensual",
+ "Montserrat" => "Montserrat",
+ "Morocco" => "Marruecos",
+ "Mozambique" => "Mozambique",
+ "Myanmar" => "Myanmar",
+ "Name" => "Nombre",
+ "Namibia" => "Namibia",
+ "Nauru" => "Nauru",
+ "Nepal" => "Nepal",
+ "Netherlands" => "Países Bajos",
+ "Netherlands Antilles" => "Antillas Holandesas",
+ "Nevermind, I'll keep my old plan" => "No importa, mantendré mi antiguo plan",
+ "New" => "Nuevo",
+ "New :resource" => "Nuevo :resource",
+ "New Caledonia" => "Nueva Caledonia",
+ "New Password" => "Nueva Contraseña",
+ "New Zealand" => "Nueva Zelanda",
+ "Next" => "Siguiente",
+ "Nicaragua" => "Nicaragua",
+ "Niger" => "Níger",
+ "Nigeria" => "Nigeria",
+ "Niue" => "Niue",
+ "No" => "No",
+ "No :resource matched the given criteria." => "Ningún :resource coincide con los criterios.",
+ "No additional information..." => "Sin información adicional...",
+ "No Current Data" => "Sin datos actuales",
+ "No Data" => "No hay datos",
+ "no file selected" => "no se seleccionó el archivo",
+ "No Increase" => "No incrementar",
+ "No Prior Data" => "No hay datos previos",
+ "No Results Found." => "No se encontraron resultados.",
+ "Norfolk Island" => "Isla Norfolk",
+ "Northern Mariana Islands" => "Islas Marianas del Norte",
+ "Norway" => "Noruega",
+ "Not Found" => "No encontrado",
+ "Nova User" => "Usuario Nova",
+ "November" => "Noviembre",
+ "October" => "Octubre",
+ "of" => "de",
+ "Oh no" => "Oh no",
+ "Oman" => "Omán",
+ "Once a team is deleted, all of its resources and data will be permanently deleted. Before deleting this team, please download any data or information regarding this team that you wish to retain." => "Una vez que se elimina un equipo, todos sus recursos y datos se eliminarán de forma permanente. Antes de eliminar este equipo, descargue cualquier dato o información sobre este equipo que desee conservar.",
+ "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain." => "Una vez su cuenta sea borrada, todos sus recursos y datos se eliminarán de forma permanente. Antes de borrar su cuenta, por favor descargue cualquier dato o información que desee conservar.",
+ "Only Trashed" => "Solo en papelera",
+ "Original" => "Original",
+ "Our billing management portal allows you to conveniently manage your subscription plan, payment method, and download your recent invoices." => "Nuestro portal de administración de facturación le permite administrar cómodamente su plan de suscripción, método de pago y descargar sus facturas recientes.",
+ "Page Expired" => "Página expirada",
+ "Pagination Navigation" => "Navegación por los enlaces de paginación",
+ "Pakistan" => "Pakistán",
+ "Palau" => "Palau",
+ "Palestinian Territory, Occupied" => "Territorios Palestinos",
+ "Panama" => "Panamá",
+ "Papua New Guinea" => "Papúa Nueva Guinea",
+ "Paraguay" => "Paraguay",
+ "Password" => "Contraseña",
+ "Pay :amount" => "Pague :amount",
+ "Payment Cancelled" => "Pago cancelado",
+ "Payment Confirmation" => "Confirmación de pago",
+ "Payment Information" => "Información del pago",
+ "Payment Method" => "Método de pago",
+ "Payment Successful" => "Pago exitoso",
+ "Pending Team Invitations" => "Invitaciones de equipo pendientes",
+ "Per Page" => "Por Página",
+ "Permanently delete this team." => "Eliminar este equipo de forma permanente",
+ "Permanently delete your account." => "Eliminar su cuenta de forma permanente.",
+ "Permissions" => "Permisos",
+ "Peru" => "Perú",
+ "Philippines" => "Filipinas",
+ "Photo" => "Foto",
+ "Pitcairn" => "Islas Pitcairn",
+ "Please accept the terms of service." => "Por favor acepte los términos del servicio.",
+ "Please click the button below to verify your email address." => "Por favor, haga clic en el botón de abajo para verificar su dirección de correo electrónico.",
+ "Please confirm access to your account by entering one of your emergency recovery codes." => "Por favor confirme el acceso a su cuenta ingresando uno de sus códigos de recuperación de emergencia.",
+ "Please confirm access to your account by entering the authentication code provided by your authenticator application." => "Por favor confirme el acceso a su cuenta digitando el código de autenticación provisto por su aplicación autenticadora.",
+ "Please copy your new API token. For your security, it won't be shown again." => "Por favor copie su nuevo token API. Por su seguridad, no se volverá a mostrar.",
+ "Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices." => "Por favor ingrese su contraseña para confirmar que desea cerrar las demás sesiones de otros navegadores en todos sus dispositivos.",
+ "Please provide a maximum of three receipt emails addresses." => "Proporcione un máximo de tres direcciones para recibir correo electrónico.",
+ "Please provide the email address of the person you would like to add to this team." => "Por favor proporcione la dirección de correo electrónico de la persona que le gustaría agregar a este equipo.",
+ "Please provide your name." => "Por favor proporcione su nombre.",
+ "Poland" => "Polonia",
+ "Portugal" => "Portugal",
+ "Press / to search" => "Presione / para buscar",
+ "Preview" => "Previsualizar",
+ "Previous" => "Previo",
+ "Privacy Policy" => "Política de Privacidad",
+ "Profile" => "Perfil",
+ "Profile Information" => "Información de perfil",
+ "Puerto Rico" => "Puerto Rico",
+ "Qatar" => "Qatar",
+ "Quarter To Date" => "Trimestre hasta la fecha",
+ "Receipt Email Addresses" => "Direcciones para recibir correo electrónico",
+ "Receipts" => "Recibos",
+ "Recovery Code" => "Código de recuperación",
+ "Regards" => "Saludos",
+ "Regards," => "Saludos,",
+ "Regenerate Recovery Codes" => "Regenerar códigos de recuperación",
+ "Register" => "Registrarse",
+ "Reload" => "Recargar",
+ "Remember me" => "Mantener sesión activa",
+ "Remember Me" => "Mantener sesión activa",
+ "Remove" => "Eliminar",
+ "Remove Photo" => "Eliminar foto",
+ "Remove Team Member" => "Eliminar miembro del equipo",
+ "Resend Verification Email" => "Reenviar correo de verificación",
+ "Reset Filters" => "Restablecer filtros",
+ "Reset Password" => "Restablecer contraseña",
+ "Reset Password Notification" => "Notificación de restablecimiento de contraseña",
+ "resource" => "recurso",
+ "Resources" => "Recursos",
+ "resources" => "recursos",
+ "Restore" => "Restaurar",
+ "Restore Resource" => "Restaurar Recursos",
+ "Restore Selected" => "Restaurar Selección",
+ "results" => "resultados",
+ "Resume Subscription" => "Reanudar suscripción",
+ "Return to :appName" => "Regresar a :appName",
+ "Reunion" => "Reunión",
+ "Role" => "Rol",
+ "Romania" => "Rumania",
+ "Run Action" => "Ejecutar Acción",
+ "Russian Federation" => "Federación Rusa",
+ "Rwanda" => "Ruanda",
+ "Réunion" => "Reunión",
+ "Saint Barthelemy" => "San Bartolomé",
+ "Saint Barthélemy" => "San Bartolomé",
+ "Saint Helena" => "Santa Helena",
+ "Saint Kitts And Nevis" => "San Cristóbal y Nieves",
+ "Saint Kitts and Nevis" => "Saint Kitts y Nevis",
+ "Saint Lucia" => "Santa Lucía",
+ "Saint Martin" => "San Martín",
+ "Saint Martin (French part)" => "San Martín (parte francesa)",
+ "Saint Pierre And Miquelon" => "San Pedro y Miquelón",
+ "Saint Pierre and Miquelon" => "San Pedro y Miquelón",
+ "Saint Vincent And Grenadines" => "San Vicente y las Granadinas",
+ "Saint Vincent and the Grenadines" => "San Vicente y las Granadinas",
+ "Samoa" => "Samoa",
+ "San Marino" => "San Marino",
+ "Sao Tome And Principe" => "Santo Tomé y Príncipe",
+ "Sao Tome and Principe" => "Santo Tomé y Príncipe",
+ "Saudi Arabia" => "Arabia Saudita",
+ "Save" => "Guardar",
+ "Saved." => "Guardado.",
+ "Search" => "Buscar",
+ "Select" => "Seleccione",
+ "Select a different plan" => "Seleccione un plan diferente",
+ "Select A New Photo" => "Seleccione una nueva foto",
+ "Select Action" => "Seleccione una Acción",
+ "Select All" => "Seleccione Todo",
+ "Select All Matching" => "Seleccione Todas las coincidencias",
+ "Send Password Reset Link" => "Enviar enlace para restablecer la contraseña",
+ "Senegal" => "Senegal",
+ "September" => "Septiembre",
+ "Serbia" => "Serbia",
+ "Server Error" => "Error del servidor",
+ "Service Unavailable" => "Servicio no disponible",
+ "Seychelles" => "Seychelles",
+ "Show All Fields" => "Mostrar todos los campos",
+ "Show Content" => "Mostrar contenido",
+ "Show Recovery Codes" => "Mostrar códigos de recuperación",
+ "Showing" => "Mostrando",
+ "Sierra Leone" => "Sierra Leona",
+ "Signed in as" => "Registrado como",
+ "Singapore" => "Singapur",
+ "Sint Maarten (Dutch part)" => "San Martín",
+ "Slovakia" => "Eslovaquia",
+ "Slovenia" => "Eslovenia",
+ "Solomon Islands" => "Islas Salomón",
+ "Somalia" => "Somalia",
+ "Something went wrong." => "Algo salió mal.",
+ "Sorry! You are not authorized to perform this action." => "¡Lo siento! Usted no está autorizado para ejecutar esta acción.",
+ "Sorry, your session has expired." => "Lo siento, su sesión ha caducado.",
+ "South Africa" => "Sudáfrica",
+ "South Georgia And Sandwich Isl." => "Islas Georgias del Sur y Sandwich del Sur",
+ "South Georgia and the South Sandwich Islands" => "Georgia del sur y las islas Sandwich del sur",
+ "South Sudan" => "Sudán del Sur",
+ "Spain" => "España",
+ "Sri Lanka" => "Sri Lanka",
+ "Standalone Actions" => "Acciones independientes",
+ "Start Polling" => "Iniciar encuesta",
+ "State / County" => "Estado / País",
+ "Stop Polling" => "Detener encuesta",
+ "Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost." => "Guarde estos códigos de recuperación en un administrador de contraseñas seguro. Se pueden utilizar para recuperar el acceso a su cuenta si pierde su dispositivo de autenticación de dos factores.",
+ "Subscribe" => "Suscriba",
+ "Subscription Information" => "Información de suscripción",
+ "Subscription Pending" => "Suscripción pendiente",
+ "Sudan" => "Sudán",
+ "Suriname" => "Suriname",
+ "Svalbard And Jan Mayen" => "Svalbard y Jan Mayen",
+ "Svalbard and Jan Mayen" => "Svalbard y Jan Mayen",
+ "Swaziland" => "Eswatini",
+ "Sweden" => "Suecia",
+ "Switch Teams" => "Cambiar de equipo",
+ "Switzerland" => "Suiza",
+ "Syrian Arab Republic" => "Siria",
+ "Taiwan" => "Taiwán",
+ "Taiwan, Province of China" => "Taiwan, provincia de China",
+ "Tajikistan" => "Tayikistán",
+ "Tanzania" => "Tanzania",
+ "Tanzania, United Republic of" => "Tanzania, República Unida de",
+ "Team Details" => "Detalles del equipo",
+ "Team Invitation" => "Invitación de equipo",
+ "Team Members" => "Miembros del equipo",
+ "Team Name" => "Nombre del equipo",
+ "Team Owner" => "Propietario del equipo",
+ "Team Settings" => "Ajustes del equipo",
+ "Terms of Service" => "Términos del servicio",
+ "Thailand" => "Tailandia",
+ "Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn't receive the email, we will gladly send you another." => "¡Gracias por registrarse! Antes de comenzar, ¿podría verificar su dirección de correo electrónico haciendo clic en el enlace que le acabamos de enviar? Si no recibió el correo electrónico, con gusto le enviaremos otro.",
+ "Thanks for your continued support. We've attached a copy of your invoice for your records. Please let us know if you have any questions or concerns." => "Gracias por su apoyo continuo. Hemos adjuntado una copia de su factura para sus registros. Háganos saber si tiene alguna pregunta o inquietud.",
+ "Thanks," => "Gracias,",
+ "The :attribute must be a valid role." => ":Attribute debe ser un rol válido.",
+ "The :attribute must be at least :length characters and contain at least one number." => "La :attribute debe tener al menos :length caracteres y contener por lo menos un número.",
+ "The :attribute must be at least :length characters and contain at least one special character and one number." => "La :attribute debe tener al menos :length caracteres y contener por lo menos un caracter especial y un número.",
+ "The :attribute must be at least :length characters and contain at least one special character." => "La :attribute debe tener al menos :length caracteres y contener por lo menos un carácter especial.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character and one number." => "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula y un número.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character and one special character." => "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula y un carácter especial.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character." => "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula, un número y un carácter especial.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character." => "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula.",
+ "The :attribute must be at least :length characters." => "La :attribute debe tener al menos :length caracteres.",
+ "The :attribute must contain at least one letter." => "La :attribute debe contener al menos una letra.",
+ "The :attribute must contain at least one number." => "La :attribute debe contener al menos un número.",
+ "The :attribute must contain at least one symbol." => "La :attribute debe contener al menos un símbolo.",
+ "The :attribute must contain at least one uppercase and one lowercase letter." => "La :attribute debe contener al menos una letra mayúscula y una minúscula.",
+ "The :resource was created!" => "¡El :resource fue creado!",
+ "The :resource was deleted!" => "¡El :resource fue eliminado!",
+ "The :resource was restored!" => "¡El :resource fue restaurado!",
+ "The :resource was updated!" => "¡El :resource fue actualizado!",
+ "The action ran successfully!" => "¡La acción se ejecutó correctamente!",
+ "The file was deleted!" => "¡El archivo fue eliminado!",
+ "The given :attribute has appeared in a data leak. Please choose a different :attribute." => "La :attribute proporcionada se ha visto comprometida en una filtración de datos (data leak). Elija una :attribute diferente.",
+ "The government won't let us show you what's behind these doors" => "El gobierno no nos permitirá mostrarle lo que hay detrás de estas puertas",
+ "The HasOne relationship has already been filled." => "La relación HasOne ya fué completada.",
+ "The password is incorrect." => "La contraseña es incorrecta.",
+ "The payment was successful." => "El pago fue exitoso.",
+ "The provided coupon code is invalid." => "El código de cupón proporcionado no es válido.",
+ "The provided password does not match your current password." => "La contraseña proporcionada no coincide con su contraseña actual.",
+ "The provided password was incorrect." => "La contraseña proporcionada no es correcta.",
+ "The provided two factor authentication code was invalid." => "El código de autenticación de dos factores proporcionado no es válido.",
+ "The provided VAT number is invalid." => "El número VAT proporcionado no es válido.",
+ "The receipt emails must be valid email addresses." => "Los correos electrónicos de recepción deben ser direcciones válidas.",
+ "The resource was updated!" => "¡El recurso fue actualizado!",
+ "The selected country is invalid." => "El país seleccionado no es válido.",
+ "The selected plan is invalid." => "El plan seleccionado no es válido.",
+ "The team's name and owner information." => "Nombre del equipo e información del propietario.",
+ "There are no available options for this resource." => "No hay opciones disponibles para este recurso.",
+ "There is no active subscription." => "No hay una suscripción activa.",
+ "There was a problem executing the action." => "Hubo un problema ejecutando la acción.",
+ "There was a problem submitting the form." => "Hubo un problema al enviar el formulario.",
+ "These people have been invited to your team and have been sent an invitation email. They may join the team by accepting the email invitation." => "Estas personas han sido invitadas a su equipo y se les ha enviado un correo electrónico de invitación. Pueden unirse al equipo aceptando la invitación por correo electrónico.",
+ "This account does not have an active subscription." => "Esta cuenta no tiene una suscripción activa.",
+ "This action is unauthorized." => "Esta acción no está autorizada.",
+ "This device" => "Este dispositivo",
+ "This file field is read-only." => "Este campo de archivo es de solo lectura.",
+ "This image" => "Esta imagen",
+ "This is a secure area of the application. Please confirm your password before continuing." => "Esta es un área segura de la aplicación. Confirme su contraseña antes de continuar.",
+ "This password does not match our records." => "Esta contraseña no coincide con nuestros registros.",
+ "This password reset link will expire in :count minutes." => "Este enlace de restablecimiento de contraseña expirará en :count minutos.",
+ "This payment was already successfully confirmed." => "Este pago ya se confirmó con éxito.",
+ "This payment was cancelled." => "Este pago fue cancelado.",
+ "This resource no longer exists" => "Este recurso ya no existe",
+ "This subscription cannot be resumed. Please create a new subscription." => "Esta suscripción no se puede reanudar. Por favor cree una nueva suscripción.",
+ "This subscription has expired and cannot be resumed. Please create a new subscription." => "Esta suscripción ha caducado y no se puede reanudar. Cree una nueva suscripción.",
+ "This user already belongs to the team." => "Este usuario ya pertenece al equipo.",
+ "This user has already been invited to the team." => "Este usuario ya ha sido invitado al equipo.",
+ "Timor-Leste" => "Timor Oriental",
+ "to" => "al",
+ "Today" => "Hoy",
+ "Toggle navigation" => "Activar navegación",
+ "Togo" => "Togo",
+ "Tokelau" => "Tokelau",
+ "Token Name" => "Nombre del token",
+ "Tonga" => "Tonga",
+ "Too Many Requests" => "Demasiadas peticiones",
+ "total" => "total",
+ "Total:" => "Total:",
+ "Trashed" => "Desechado",
+ "Trinidad And Tobago" => "Trinidad y Tobago",
+ "Trinidad and Tobago" => "Trinidad y Tobago",
+ "Tunisia" => "Tunisia",
+ "Turkey" => "Turquía",
+ "Turkmenistan" => "Turkmenistán",
+ "Turks And Caicos Islands" => "Islas Turcas y Caicos",
+ "Turks and Caicos Islands" => "Islas Turcas y Caicos",
+ "Tuvalu" => "Tuvalu",
+ "Two Factor Authentication" => "Autenticación de dos factores",
+ "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application." => "La autenticación de dos factores ahora está habilitada. Escanee el siguiente código QR usando la aplicación de autenticación de su teléfono.",
+ "Scan the following QR code using your phone's authenticator application and confirm it with the generated OTP code." => "Escanee el siguiente código QR usando la aplicación de autenticación de su teléfono y confírmelo con el código OTP generado.",
+ "Uganda" => "Uganda",
+ "Ukraine" => "Ucrania",
+ "Unauthorized" => "No autorizado",
+ "United Arab Emirates" => "Emiratos Árabes Unidos",
+ "United Kingdom" => "Reino Unido",
+ "United States" => "Estados Unidos",
+ "United States Minor Outlying Islands" => "Islas Ultramarinas Menores de los Estados Unidos",
+ "United States Outlying Islands" => "Islas Ultramarinas Menores de los Estados Unidos",
+ "Update" => "Actualizar",
+ "Update & Continue Editing" => "Actualice & Continúe Editando",
+ "Update :resource" => "Actualizar :resource",
+ "Update :resource: :title" => "Actualice el :title del :resource:",
+ "Update attached :resource: :title" => "Actualice el :title del :resource: adjuntado",
+ "Update Password" => "Actualizar contraseña",
+ "Update Payment Information" => "Actualizar la información de pago",
+ "Update Payment Method" => "Actualizar método de pago",
+ "Update your account's profile information and email address." => "Actualice la información de su cuenta y la dirección de correo electrónico",
+ "Uruguay" => "Uruguay",
+ "Use a recovery code" => "Use un código de recuperación",
+ "Use an authentication code" => "Use un código de autenticación",
+ "Uzbekistan" => "Uzbekistan",
+ "Value" => "Valor",
+ "Vanuatu" => "Vanuatu",
+ "VAT Number" => "Número VAT",
+ "Venezuela" => "Venezuela",
+ "Venezuela, Bolivarian Republic of" => "Venezuela, República Bolivariana de",
+ "Verify Email Address" => "Confirme su correo electrónico",
+ "Viet Nam" => "Vietnam",
+ "View" => "Vista",
+ "View Receipt" => "Ver recibo",
+ "Virgin Islands, British" => "Islas Vírgenes Británicas",
+ "Virgin Islands, U.S." => "Islas Vírgenes Estadounidenses",
+ "Wallis And Futuna" => "Wallis y Futuna",
+ "Wallis and Futuna" => "Wallis y Futuna",
+ "We are processing your subscription. Once the subscription has successfully processed, this page will update automatically. Typically, this process should only take a few seconds." => "Estamos procesando su suscripción. Una vez que la suscripción se haya procesado correctamente esta página se actualizará automáticamente. Normalmente, este proceso solo debería llevar unos segundos.",
+ "We are unable to process your payment. Please contact customer support." => "No podemos procesar su pago. Comuníquese con el servicio de atención al cliente.",
+ "We were unable to find a registered user with this email address." => "No pudimos encontrar un usuario registrado con esta dirección de correo electrónico.",
+ "We will send a receipt download link to the email addresses that you specify below. You may separate multiple email addresses using commas." => "Enviaremos un enlace de descarga de recibo a las direcciones de correo electrónico que especifique a continuación. Puede separar varias direcciones de correo electrónico con comas.",
+ "We're lost in space. The page you were trying to view does not exist." => "Estamos perdidos en el espacio. La página que intenta buscar no existe.",
+ "Welcome Back!" => "¡Bienvenido de nuevo!",
+ "Western Sahara" => "Sahara Occidental",
+ "When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone's Google Authenticator application." => "Cuando la autenticación de dos factores esté habilitada, le pediremos un token aleatorio seguro durante la autenticación. Puede recuperar este token desde la aplicación Google Authenticator de su teléfono.",
+ "Whoops" => "Ups",
+ "Whoops!" => "¡Ups!",
+ "Whoops! Something went wrong." => "¡Ups! Algo salió mal.",
+ "With Trashed" => "Incluida la papelera",
+ "Write" => "Escriba",
+ "Year To Date" => "Año hasta la fecha",
+ "Yearly" => "Anual",
+ "Yemen" => "Yemen",
+ "Yes" => "Sí",
+ "You are already subscribed." => "Usted ya está suscrito.",
+ "You are currently within your free trial period. Your trial will expire on :date." => "Actualmente se encuentra dentro de su período de prueba gratuito. Su prueba vencerá el :date.",
+ "You are receiving this email because we received a password reset request for your account." => "Ha recibido este mensaje porque se solicitó un restablecimiento de contraseña para su cuenta.",
+ "You have been invited to join the :team team!" => "¡Usted ha sido invitado a unirse al equipo :team!",
+ "You have enabled two factor authentication." => "Ha habilitado la autenticación de dos factores.",
+ "You have not enabled two factor authentication." => "No ha habilitado la autenticación de dos factores.",
+ "You may accept this invitation by clicking the button below:" => "Puede aceptar esta invitación haciendo clic en el botón de abajo:",
+ "You may cancel your subscription at any time. Once your subscription has been cancelled, you will have the option to resume the subscription until the end of your current billing cycle." => "Puedes cancelar tu subscripción en cualquier momento. Una vez que su suscripción haya sido cancelada, tendrá la opción de reanudar la suscripción hasta el final de su ciclo de facturación actual.",
+ "You may delete any of your existing tokens if they are no longer needed." => "Puede eliminar cualquiera de sus tokens existentes si ya no los necesita.",
+ "You may not delete your personal team." => "No se puede borrar su equipo personal.",
+ "You may not leave a team that you created." => "No se puede abandonar un equipo que usted creó.",
+ "Your :invoiceName invoice is now available!" => "¡Su factura :invoiceName ya está disponible!",
+ "Your card was declined. Please contact your card issuer for more information." => "Su tarjeta fue rechazada. Comuníquese con el emisor de su tarjeta para obtener más información.",
+ "Your current payment method is :paypal." => "Su método de pago actual es :paypal.",
+ "Your current payment method is a credit card ending in :lastFour that expires on :expiration." => "Su método de pago actual es una tarjeta de crédito que termina en :lastFour que vence el :expiration.",
+ "Your registered VAT Number is :vatNumber." => "Su número VAT registrado es :vatNumber.",
+ "Zambia" => "Zambia",
+ "Zimbabwe" => "Zimbabwe",
+ "Zip / Postal Code" => "Zip / Código postal",
+ "Åland Islands" => "Islas Åland",
+
+ // Mis traducciones
+ 'code.regex' => 'El código solo puede contener letras, números, guiones y guiones bajos.',
+ 'tel.regex' => 'El teléfono solo puede contener números, espacios y caracteres como (), + y -.',
+ 'tel.max' => 'El teléfono no puede exceder los 20 caracteres.',
+ 'tel2.regex' => 'El teléfono alternativo solo puede contener números, espacios y caracteres como (), + y -.',
+ 'tel2.max' => 'El teléfono alternativo no puede exceder los 20 caracteres.',
+ 'lat.numeric' => 'La latitud debe ser un número válido.',
+ 'lat.between' => 'La latitud debe estar entre -90 y 90 grados.',
+ 'lng.numeric' => 'La longitud debe ser un número válido.',
+ 'lng.between' => 'La longitud debe estar entre -180 y 180 grados.',
+ 'confirmDeletion.accepted' => 'Debe confirmar la eliminación antes de continuar.',
+];
diff --git a/resources/lang/es/pagination.php b/resources/lang/es/pagination.php
new file mode 100644
index 0000000..d8f0d19
--- /dev/null
+++ b/resources/lang/es/pagination.php
@@ -0,0 +1,17 @@
+ 'Siguiente »',
+ 'previous' => '« Anterior',
+];
diff --git a/resources/lang/es/passwords.php b/resources/lang/es/passwords.php
new file mode 100644
index 0000000..7745e64
--- /dev/null
+++ b/resources/lang/es/passwords.php
@@ -0,0 +1,20 @@
+ '¡Su contraseña ha sido restablecida!',
+ 'sent' => '¡Le hemos enviado por correo electrónico el enlace para restablecer su contraseña!',
+ 'throttled' => 'Por favor espere antes de intentar de nuevo.',
+ 'token' => 'El token de restablecimiento de contraseña es inválido.',
+ 'user' => 'No encontramos ningún usuario con ese correo electrónico.',
+];
diff --git a/resources/lang/es/validation-inline.php b/resources/lang/es/validation-inline.php
new file mode 100644
index 0000000..b8e6505
--- /dev/null
+++ b/resources/lang/es/validation-inline.php
@@ -0,0 +1,133 @@
+ 'Este campo debe ser aceptado.',
+ 'accepted_if' => 'Este campo debe ser aceptado cuando :other sea :value.',
+ 'active_url' => 'Esta no es una URL válida.',
+ 'after' => 'Debe ser una fecha después de :date.',
+ 'after_or_equal' => 'Debe ser una fecha después o igual a :date.',
+ 'alpha' => 'Este campo solo puede contener letras.',
+ 'alpha_dash' => 'Este campo solo puede contener letras, números, guiones y guiones bajos.',
+ 'alpha_num' => 'Este campo solo puede contener letras y números.',
+ 'array' => 'Este campo debe ser un array (colección).',
+ 'attached' => 'Este campo ya se adjuntó.',
+ 'before' => 'Debe ser una fecha antes de :date.',
+ 'before_or_equal' => 'Debe ser una fecha anterior o igual a :date.',
+ 'between' => [
+ 'array' => 'El contenido debe tener entre :min y :max elementos.',
+ 'file' => 'Este archivo debe ser entre :min y :max kilobytes.',
+ 'numeric' => 'Este valor debe ser entre :min y :max.',
+ 'string' => 'El texto debe ser entre :min y :max caracteres.',
+ ],
+ 'nullable|boolean' => 'El campo debe ser verdadero o falso.',
+ 'confirmed' => 'La confirmación no coincide.',
+ 'current_password' => 'La contraseña es incorrecta.',
+ 'date' => 'Esta no es una fecha válida.',
+ 'date_equals' => 'El campo debe ser una fecha igual a :date.',
+ 'date_format' => 'El campo no corresponde al formato :format.',
+ 'different' => 'Este valor deben ser diferente de :other.',
+ 'digits' => 'Debe tener :digits dígitos.',
+ 'digits_between' => 'Debe tener entre :min y :max dígitos.',
+ 'dimensions' => 'Las dimensiones de esta imagen son inválidas.',
+ 'distinct' => 'El campo tiene un valor duplicado.',
+ 'email' => 'No es un correo válido.',
+ 'ends_with' => 'Debe finalizar con uno de los siguientes valores: :values.',
+ 'exists' => 'El valor seleccionado es inválido.',
+ 'file' => 'El campo debe ser un archivo.',
+ 'filled' => 'Este campo debe tener un valor.',
+ 'gt' => [
+ 'array' => 'El contenido debe tener mas de :value elementos.',
+ 'file' => 'El archivo debe ser mayor que :value kilobytes.',
+ 'numeric' => 'El valor del campo debe ser mayor que :value.',
+ 'string' => 'El texto debe ser mayor de :value caracteres.',
+ ],
+ 'gte' => [
+ 'array' => 'El contenido debe tener :value elementos o más.',
+ 'file' => 'El tamaño del archivo debe ser mayor o igual que :value kilobytes.',
+ 'numeric' => 'El valor debe ser mayor o igual que :value.',
+ 'string' => 'El texto debe ser mayor o igual de :value caracteres.',
+ ],
+ 'image' => 'Esta debe ser una imagen.',
+ 'in' => 'El valor seleccionado es inválido.',
+ 'in_array' => 'Este valor no existe en :other.',
+ 'integer' => 'Esto debe ser un entero.',
+ 'ip' => 'Debe ser una dirección IP válida.',
+ 'ipv4' => 'Debe ser una dirección IPv4 válida.',
+ 'ipv6' => 'Debe ser una dirección IPv6 válida.',
+ 'json' => 'Debe ser un texto válido en JSON.',
+ 'lt' => [
+ 'array' => 'El contenido debe tener menor de :value elementos.',
+ 'file' => 'El tamaño del archivo debe ser menor a :value kilobytes.',
+ 'numeric' => 'El valor debe ser menor que :value.',
+ 'string' => 'El texto debe ser menor de :value caracteres.',
+ ],
+ 'lte' => [
+ 'array' => 'El contenido no debe tener más de :value elementos.',
+ 'file' => 'El tamaño del archivo debe ser menor o igual que :value kilobytes.',
+ 'numeric' => 'El valor debe ser menor o igual que :value.',
+ 'string' => 'El texto debe ser menor o igual de :value caracteres.',
+ ],
+ 'max' => [
+ 'array' => 'El contenido no debe tener más de :max elementos.',
+ 'file' => 'El tamaño del archivo no debe ser mayor a :max kilobytes.',
+ 'numeric' => 'El valor no debe ser mayor de :max.',
+ 'string' => 'El texto no debe ser mayor a :max caracteres.',
+ ],
+ 'mimes' => 'Debe ser un archivo de tipo: :values.',
+ 'mimetypes' => 'Debe ser un archivo de tipo: :values.',
+ 'min' => [
+ 'array' => 'El contenido debe tener al menos :min elementos.',
+ 'file' => 'El tamaño del archivo debe ser al menos de :min kilobytes.',
+ 'numeric' => 'El valor debe ser al menos de :min.',
+ 'string' => 'El texto debe ser al menos de :min caracteres.',
+ ],
+ 'multiple_of' => 'Este valor debe ser múltiplo de :value',
+ 'not_in' => 'El valor seleccionado es inválido.',
+ 'not_regex' => 'Este formato es inválido.',
+ 'numeric' => 'Debe ser un número.',
+ 'password' => 'La contraseña es incorrecta.',
+ 'present' => 'Este campo debe estar presente.',
+ 'prohibited' => 'Este campo está prohibido',
+ 'prohibited_if' => 'Este campo está prohibido cuando :other es :value.',
+ 'prohibited_unless' => 'Este campo está prohibido a menos que :other sea :values.',
+ 'regex' => 'Este formato es inválido.',
+ 'relatable' => 'Este campo no se puede asociar con este recurso.',
+ 'required' => 'Este campo es requerido.',
+ 'required_if' => 'Este campo es requerido cuando :other es :value.',
+ 'required_unless' => 'Este campo es requerido a menos que :other esté en :values.',
+ 'required_with' => 'Este campo es requerido cuando :values está presente.',
+ 'required_with_all' => 'Este campo es requerido cuando :values están presentes.',
+ 'required_without' => 'Este campo es requerido cuando :values no está presente.',
+ 'required_without_all' => 'Este campo es requerido cuando ninguno de :values están presentes.',
+ 'same' => 'El valor de este campo debe ser igual a :other.',
+ 'size' => [
+ 'array' => 'El contenido debe tener :size elementos.',
+ 'file' => 'El tamaño del archivo debe ser de :size kilobytes.',
+ 'numeric' => 'El valor debe ser :size.',
+ 'string' => 'El texto debe ser de :size caracteres.',
+ ],
+ 'starts_with' => 'Debe comenzar con alguno de los siguientes valores: :values.',
+ 'string' => 'Debe ser un texto.',
+ 'timezone' => 'Debe ser de una zona horaria válida.',
+ 'unique' => 'Este campo ya ha sido tomado.',
+ 'uploaded' => 'Falló al subir.',
+ 'url' => 'Debe ser una URL válida.',
+ 'uuid' => 'Debe ser un UUID válido.',
+ 'custom' => [
+ 'attribute-name' => [
+ 'rule-name' => 'custom-message',
+ ],
+ ],
+ 'attributes' => [],
+];
diff --git a/resources/lang/es/validation.php b/resources/lang/es/validation.php
new file mode 100644
index 0000000..863f3e3
--- /dev/null
+++ b/resources/lang/es/validation.php
@@ -0,0 +1,196 @@
+ ':attribute debe ser aceptado.',
+ 'accepted_if' => ':attribute debe ser aceptado cuando :other sea :value.',
+ 'active_url' => ':attribute no es una URL válida.',
+ 'after' => ':attribute debe ser una fecha posterior a :date.',
+ 'after_or_equal' => ':attribute debe ser una fecha posterior o igual a :date.',
+ 'alpha' => ':attribute sólo debe contener letras.',
+ 'alpha_dash' => ':attribute sólo debe contener letras, números, guiones y guiones bajos.',
+ 'alpha_num' => ':attribute sólo debe contener letras y números.',
+ 'array' => ':attribute debe ser un conjunto.',
+ 'attached' => 'Este :attribute ya se adjuntó.',
+ 'before' => ':attribute debe ser una fecha anterior a :date.',
+ 'before_or_equal' => ':attribute debe ser una fecha anterior o igual a :date.',
+ 'between' => [
+ 'array' => ':attribute tiene que tener entre :min - :max elementos.',
+ 'file' => ':attribute debe pesar entre :min - :max kilobytes.',
+ 'numeric' => ':attribute tiene que estar entre :min - :max.',
+ 'string' => ':attribute tiene que tener entre :min - :max caracteres.',
+ ],
+ 'nullable|boolean' => 'El campo :attribute debe tener un valor verdadero o falso.',
+ 'confirmed' => 'La confirmación de :attribute no coincide.',
+ 'current_password' => 'La contraseña es incorrecta.',
+ 'date' => ':attribute no es una fecha válida.',
+ 'date_equals' => ':attribute debe ser una fecha igual a :date.',
+ 'date_format' => ':attribute no corresponde al formato :format.',
+ 'different' => ':attribute y :other deben ser diferentes.',
+ 'digits' => ':attribute debe tener :digits dígitos.',
+ 'digits_between' => ':attribute debe tener entre :min y :max dígitos.',
+ 'dimensions' => 'Las dimensiones de la imagen :attribute no son válidas.',
+ 'distinct' => 'El campo :attribute contiene un valor duplicado.',
+ 'email' => ':attribute no es un correo válido.',
+ 'ends_with' => 'El campo :attribute debe finalizar con uno de los siguientes valores: :values',
+ 'exists' => ':attribute es inválido.',
+ 'file' => 'El campo :attribute debe ser un archivo.',
+ 'filled' => 'El campo :attribute es obligatorio.',
+ 'gt' => [
+ 'array' => 'El campo :attribute debe tener más de :value elementos.',
+ 'file' => 'El campo :attribute debe tener más de :value kilobytes.',
+ 'numeric' => 'El campo :attribute debe ser mayor que :value.',
+ 'string' => 'El campo :attribute debe tener más de :value caracteres.',
+ ],
+ 'gte' => [
+ 'array' => 'El campo :attribute debe tener como mínimo :value elementos.',
+ 'file' => 'El campo :attribute debe tener como mínimo :value kilobytes.',
+ 'numeric' => 'El campo :attribute debe ser como mínimo :value.',
+ 'string' => 'El campo :attribute debe tener como mínimo :value caracteres.',
+ ],
+ 'image' => ':attribute debe ser una imagen.',
+ 'in' => ':attribute es inválido.',
+ 'in_array' => 'El campo :attribute no existe en :other.',
+ 'integer' => ':attribute debe ser un número entero.',
+ 'ip' => ':attribute debe ser una dirección IP válida.',
+ 'ipv4' => ':attribute debe ser una dirección IPv4 válida.',
+ 'ipv6' => ':attribute debe ser una dirección IPv6 válida.',
+ 'json' => 'El campo :attribute debe ser una cadena JSON válida.',
+ 'lt' => [
+ 'array' => 'El campo :attribute debe tener menos de :value elementos.',
+ 'file' => 'El campo :attribute debe tener menos de :value kilobytes.',
+ 'numeric' => 'El campo :attribute debe ser menor que :value.',
+ 'string' => 'El campo :attribute debe tener menos de :value caracteres.',
+ ],
+ 'lte' => [
+ 'array' => 'El campo :attribute debe tener como máximo :value elementos.',
+ 'file' => 'El campo :attribute debe tener como máximo :value kilobytes.',
+ 'numeric' => 'El campo :attribute debe ser como máximo :value.',
+ 'string' => 'El campo :attribute debe tener como máximo :value caracteres.',
+ ],
+ 'max' => [
+ 'array' => ':attribute no debe tener más de :max elementos.',
+ 'file' => ':attribute no debe ser mayor que :max kilobytes.',
+ 'numeric' => ':attribute no debe ser mayor que :max.',
+ 'string' => ':attribute no debe ser mayor que :max caracteres.',
+ ],
+ 'mimes' => ':attribute debe ser un archivo con formato: :values.',
+ 'mimetypes' => ':attribute debe ser un archivo con formato: :values.',
+ 'min' => [
+ 'array' => ':attribute debe tener al menos :min elementos.',
+ 'file' => 'El tamaño de :attribute debe ser de al menos :min kilobytes.',
+ 'numeric' => 'El tamaño de :attribute debe ser de al menos :min.',
+ 'string' => ':attribute debe contener al menos :min caracteres.',
+ ],
+ 'multiple_of' => 'El campo :attribute debe ser múltiplo de :value',
+ 'not_in' => ':attribute es inválido.',
+ 'not_regex' => 'El formato del campo :attribute no es válido.',
+ 'numeric' => ':attribute debe ser numérico.',
+ 'password' => 'La contraseña es incorrecta.',
+ 'present' => 'El campo :attribute debe estar presente.',
+ 'prohibited' => 'El campo :attribute está prohibido.',
+ 'prohibited_if' => 'El campo :attribute está prohibido cuando :other es :value.',
+ 'prohibited_unless' => 'El campo :attribute está prohibido a menos que :other sea :values.',
+ 'regex' => 'El formato de :attribute es inválido.',
+ 'relatable' => 'Este :attribute no se puede asociar con este recurso',
+ 'required' => 'El campo :attribute es obligatorio.',
+ 'required_if' => 'El campo :attribute es obligatorio cuando :other es :value.',
+ 'required_unless' => 'El campo :attribute es obligatorio a menos que :other esté en :values.',
+ 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.',
+ 'required_with_all' => 'El campo :attribute es obligatorio cuando :values están presentes.',
+ 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.',
+ 'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de :values está presente.',
+ 'same' => ':attribute y :other deben coincidir.',
+ 'size' => [
+ 'array' => ':attribute debe contener :size elementos.',
+ 'file' => 'El tamaño de :attribute debe ser :size kilobytes.',
+ 'numeric' => 'El tamaño de :attribute debe ser :size.',
+ 'string' => ':attribute debe contener :size caracteres.',
+ ],
+ 'starts_with' => 'El campo :attribute debe comenzar con uno de los siguientes valores: :values',
+ 'string' => 'El campo :attribute debe ser una cadena de caracteres.',
+ 'timezone' => ':Attribute debe ser una zona horaria válida.',
+ 'unique' => 'El campo :attribute ya ha sido registrado.',
+ 'uploaded' => 'Subir :attribute ha fallado.',
+ 'url' => ':Attribute debe ser una URL válida.',
+ 'uuid' => 'El campo :attribute debe ser un UUID válido.',
+ 'custom' => [
+ 'email' => [
+ 'unique' => 'El :attribute ya ha sido registrado.',
+ ],
+ 'password' => [
+ 'min' => 'La :attribute debe contener más de :min caracteres',
+ ],
+ ],
+ 'attributes' => [
+ 'address' => 'dirección',
+ 'age' => 'edad',
+ 'body' => 'contenido',
+ 'city' => 'ciudad',
+ 'content' => 'contenido',
+ 'country' => 'país',
+ 'current_password' => 'contraseña actual',
+ 'date' => 'fecha',
+ 'day' => 'día',
+ 'description' => 'descripción',
+ 'email' => 'correo electrónico',
+ 'excerpt' => 'extracto',
+ 'first_name' => 'nombre',
+ 'gender' => 'género',
+ 'hour' => 'hora',
+ 'last_name' => 'apellido',
+ 'message' => 'mensaje',
+ 'minute' => 'minuto',
+ 'mobile' => 'móvil',
+ 'month' => 'mes',
+ 'name' => 'nombre',
+ 'password' => 'contraseña',
+ 'password_confirmation' => 'confirmación de la contraseña',
+ 'phone' => 'teléfono',
+ 'price' => 'precio',
+ 'role' => 'rol',
+ 'second' => 'segundo',
+ 'sex' => 'sexo',
+ 'subject' => 'asunto',
+ 'terms' => 'términos',
+ 'time' => 'hora',
+ 'title' => 'título',
+ 'username' => 'usuario',
+ 'year' => 'año',
+
+ // Mis traducciones
+ 'description' => 'descripción',
+ 'rfc' => 'RFC',
+ 'nombre_fiscal' => 'nombre fiscal',
+ 'c_regimen_fiscal' => 'régimen fiscal',
+ 'domicilio_fiscal' => 'domicilio fiscal',
+ 'c_pais' => 'país',
+ 'c_estado' => 'estado',
+ 'c_municipio' => 'municipio',
+ 'c_localidad' => 'localidad',
+ 'c_codigo_postal' => 'código postal',
+ 'c_colonia' => 'colonia',
+ 'direccion' => 'dirección',
+ 'num_ext' => 'número exterior',
+ 'num_int' => 'número interior',
+ 'lat' => 'latitud',
+ 'lng' => 'longitud',
+ 'tel' => 'teléfono',
+ 'tel2' => 'teléfono secundario',
+ 'status' => 'estado',
+ 'show_on_website' => 'mostrar en el sitio web',
+ 'enable_ecommerce' => 'habilitar eCommerce',
+ 'confirmDeletion' => 'confirmar eliminación',
+
+ ],
+];
diff --git a/resources/lang/es_MX.json b/resources/lang/es_MX.json
new file mode 100644
index 0000000..2fe076a
--- /dev/null
+++ b/resources/lang/es_MX.json
@@ -0,0 +1,732 @@
+{
+ "A fresh verification link has been sent to your email address.": "Se ha enviado un nuevo enlace de verificación a su correo electrónico.",
+ "All rights reserved.": "Todos los derechos reservados.",
+ "Before proceeding, please check your email for a verification link.": "Antes de continuar, por favor revise su correo electrónico para un enlace de verificación.",
+ "click here to request another": "haga clic aquí para solicitar otro",
+ "Confirm Password": "Confirmar contraseña",
+ "E-Mail Address": "E-mail",
+ "Error": "Error ",
+ "Forbidden": "Prohibido",
+ "Forgot Your Password?": "¿Olvidó su contraseña?",
+ "Go Home": "Ir a inicio",
+ "Hello!": "¡Hola!",
+ "hi": "hola",
+ "If you did not create an account, no further action is required.": "Si no ha creado una cuenta, no se requiere ninguna acción adicional.",
+ "If you did not receive the email": "Si no ha recibido el correo electrónico",
+ "If you did not request a password reset, no further action is required.": "Si no ha solicitado el restablecimiento de contraseña, omita este correo electrónico.",
+ "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser: [:actionURL](:actionURL)": "Si tiene problemas para hacer clic en el botón \":actionText\", copie y pegue la URL a continuación \nen su navegador web: [:actionURL] (:actionURL)",
+ "Login": "Entrar",
+ "Name": "Nombre",
+ "Oh no": "Oh no ",
+ "Page Expired": "Página Expirada",
+ "Page Not Found": "Página no encontrada",
+ "Password": "Contraseña",
+ "Please click the button below to verify your email address.": "Por favor, haga clic en el botón de abajo para verificar su dirección de correo electrónico.",
+ "Regards": "Saludos",
+ "Regards,": "Saludos,",
+ "Register": "Registrar",
+ "Remember Me": "Recuérdame",
+ "Reset Password": "Restablecer contraseña",
+ "Reset Password Notification": "Notificación de restablecimiento de contraseña",
+ "Send Password Reset Link": "Enviar enlace para restablecer la contraseña",
+ "Service Unavailable": "Servicio no disponible",
+ "Sorry, the page you are looking for could not be found.": "Lo sentimos, la página que está buscando no se pudo encontrar.",
+ "Sorry, you are forbidden from accessing this page.": "Lo sentimos, se le prohíbe el acceso a esta página.",
+ "Sorry, you are making too many requests to our servers.": "Lo sentimos, estás haciendo demasiadas peticiones a nuestros servidores.",
+ "Sorry, you are not authorized to access this page.": "Lo sentimos, no estás autorizado para acceder a esta página.",
+ "Sorry, your session has expired. Please refresh and try again.": "Lo sentimos, tu sesión ha expirado. Por favor, actualice y vuelva a intentarlo.",
+ "Sorry, we are doing some maintenance. Please check back soon.": "Lo sentimos, estamos haciendo un poco de mantenimiento. Por favor, vuelva pronto.",
+ "Toggle navigation": "Activar navegación",
+ "Too Many Requests": "Demansiadas peticiones",
+ "Unauthorized": "No autorizado",
+ "Verify Your Email Address": "Verifica tu correo electrónico",
+ "You are receiving this email because we received a password reset request for your account.": "Ha recibido este mensaje porque se solicitó un restablecimiento de contraseña para su cuenta.",
+ "Whoops!": "¡Vaya!",
+ "Whoops, something went wrong on our servers.": "Vaya, algo salió mal en nuestros servidores.",
+ "This password reset link will expire in :count minutes.": "Este enlace de restablecimiento de contraseña expirará en :count minutos.",
+ "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si tiene problemas para hacer clic en el botón \":actionText\", copie y pegue la siguiente URL \nen su navegador web:",
+ "Verify Email Address": "Confirme su correo electrónico",
+ "failed": "Estas credenciales no coinciden con nuestros registros.",
+ "password": "La contraseña ingresada no es correcta.",
+ "throttle": "Demasiados intentos de acceso. Por favor intente nuevamente en :seconds segundos.",
+ "30 Days": "30 Días",
+ "60 Days": "60 Días",
+ "90 Days": "90 Días",
+ ":amount Total": ":amount Total",
+ ":days day trial": "prueba por :days days",
+ ":resource Details": "Detalles del :resource",
+ ":resource Details: :title": "Detalles del :resource : :title",
+ "A new verification link has been sent to the email address you provided during registration.": "Se ha enviado un nuevo enlace de verificación a la dirección de correo electrónico que proporcionó durante el registro.",
+ "Accept Invitation": "Aceptar invitación",
+ "Action": "Acción",
+ "Action Happened At": "La acción sucedió a las",
+ "Action Initiated By": "La acción inició a las",
+ "Action Name": "Nombre de la acción",
+ "Action Status": "Estado de la acción",
+ "Action Target": "Objetivo de la acción",
+ "Actions": "Acciones",
+ "Add": "Añadir",
+ "Add a new team member to your team, allowing them to collaborate with you.": "Agregue un nuevo miembro a su equipo, permitiéndole colaborar con usted.",
+ "Add additional security to your account using two factor authentication.": "Agregue seguridad adicional a su cuenta mediante la autenticación de dos factores.",
+ "Add row": "Añadir fila",
+ "Add Team Member": "Añadir un nuevo miembro al equipo",
+ "Add VAT Number": "Agregar número VAT",
+ "Added.": "Añadido.",
+ "Address": "Dirección",
+ "Address Line 2": "Dirección de la línea 2",
+ "Afghanistan": "Afganistán",
+ "Aland Islands": "Islas Aland",
+ "Albania": "Albania",
+ "Algeria": "Algeria",
+ "All of the people that are part of this team.": "Todas las personas que forman parte de este equipo.",
+ "All resources loaded.": "Todos los recursos cargados.",
+ "Already registered?": "¿Ya se registró?",
+ "American Samoa": "Samoa Americana",
+ "An error occured while uploading the file.": "Ocurrio un error al subir el archivo.",
+ "An unexpected error occurred and we have notified our support team. Please try again later.": "Se produjo un error inesperado y hemos notificado a nuestro equipo de soporte. Por favor intente de nuevo más tarde.",
+ "Andorra": "Andorra",
+ "Angola": "Angola",
+ "Anguilla": "Anguila",
+ "Another user has updated this resource since this page was loaded. Please refresh the page and try again.": "Otro usuario ha modificado el recurso desde que esta página fue cargada. Por favor refresque la página e intente nuevamente.",
+ "Antarctica": "Antártica",
+ "Antigua And Barbuda": "Antigua y Barbuda",
+ "Antigua and Barbuda": "Antigua y Barbuda",
+ "API Token": "Token API",
+ "API Token Permissions": "Permisos para el token API",
+ "API Tokens": "Tokens API",
+ "API tokens allow third-party services to authenticate with our application on your behalf.": "Los tokens API permiten a servicios de terceros autenticarse con nuestra aplicación en su nombre.",
+ "Apply": "Aplicar",
+ "Apply Coupon": "Aplicar cupón",
+ "April": "Abril",
+ "Are you sure you want to delete the selected resources?": "¿Está seguro de que desea eliminar los recursos seleccionados?",
+ "Are you sure you want to delete this file?": "¿Está seguro de que desea eliminar este archivo?",
+ "Are you sure you want to delete this resource?": "¿Está seguro de que desea eliminar este recurso?",
+ "Are you sure you want to delete this team? Once a team is deleted, all of its resources and data will be permanently deleted.": "¿Está seguro que desea eliminar este equipo? Una vez que se elimina un equipo, todos sus recursos y datos se eliminarán de forma permanente.",
+ "Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "¿Está seguro que desea eliminar su cuenta? Una vez que se elimine su cuenta, todos sus recursos y datos se eliminarán de forma permanente. Ingrese su contraseña para confirmar que desea eliminar su cuenta de forma permanente.",
+ "Are you sure you want to detach the selected resources?": "¿Está seguro que desea desvincular los recursos seleccionados?",
+ "Are you sure you want to detach this resource?": "¿Está seguro que desea desvincular este recurso?",
+ "Are you sure you want to force delete the selected resources?": "¿Está seguro que desea forzar la eliminación de los recurso seleccionados?",
+ "Are you sure you want to force delete this resource?": "¿Está seguro que desea forzar la eliminación de este recurso?",
+ "Are you sure you want to restore the selected resources?": "¿Está seguro que desea restaurar los recursos seleccionados?",
+ "Are you sure you want to restore this resource?": "¿Está seguro que desea restaurar este recurso?",
+ "Are you sure you want to run this action?": "¿Está seguro que desea ejecutar esta acción?",
+ "Are you sure you would like to delete this API token?": "¿Está seguro que desea eliminar este token API?",
+ "Are you sure you would like to leave this team?": "¿Está seguro que le gustaría abandonar este equipo?",
+ "Are you sure you would like to remove this person from the team?": "¿Está seguro que desea retirar a esta persona del equipo?",
+ "Argentina": "Argentina",
+ "Armenia": "Armenia",
+ "Aruba": "Aruba",
+ "Attach": "Adjuntar",
+ "Attach & Attach Another": "Adjuntar & adjuntar otro",
+ "Attach :resource": "Adjuntar :resource",
+ "August": "Agosto",
+ "Australia": "Australia",
+ "Austria": "Austria",
+ "Azerbaijan": "Azerbaijan",
+ "Bahamas": "Bahamas",
+ "Bahrain": "Bahrain",
+ "Bangladesh": "Bangladesh",
+ "Barbados": "Barbados",
+ "Belarus": "Bielorrusia",
+ "Belgium": "Bélgica",
+ "Belize": "Belice",
+ "Benin": "Benin",
+ "Bermuda": "Bermuda",
+ "Bhutan": "Bután",
+ "Billing Information": "Información de facturación",
+ "Billing Management": "Gestión de facturación",
+ "Bolivia": "Bolivia",
+ "Bolivia, Plurinational State of": "Bolivia, Estado Plurinacional de",
+ "Bonaire, Sint Eustatius and Saba": "Bonaire, San Eustaquio y Saba",
+ "Bosnia And Herzegovina": "Bosnia y Herzegovina",
+ "Bosnia and Herzegovina": "Bosnia y Herzegovina",
+ "Botswana": "Botswana",
+ "Bouvet Island": "Isla Bouvet",
+ "Brazil": "Brasil",
+ "British Indian Ocean Territory": "Territorio Británico del Océano Índico",
+ "Browser Sessions": "Sesiones del navegador",
+ "Brunei Darussalam": "Brunei",
+ "Bulgaria": "Bulgaria",
+ "Burkina Faso": "Burkina Faso",
+ "Burundi": "Burundi",
+ "Cambodia": "Camboya",
+ "Cameroon": "Camerún",
+ "Canada": "Canadá",
+ "Cancel": "Cancelar",
+ "Cancel Subscription": "Cancelar suscripción",
+ "Cape Verde": "Cabo Verde",
+ "Card": "Tarjeta",
+ "Cayman Islands": "Islas Caimán",
+ "Central African Republic": "República Centroafricana",
+ "Chad": "Chad",
+ "Change Subscription Plan": "Cambiar plan de suscripción",
+ "Changes": "Cambios",
+ "Chile": "Chile",
+ "China": "China",
+ "Choose": "Elija",
+ "Choose :field": "Elija :field",
+ "Choose :resource": "Elija :resource",
+ "Choose an option": "Elija una opción",
+ "Choose date": "Elija fecha",
+ "Choose File": "Elija archivo",
+ "Choose Type": "Elija tipo",
+ "Christmas Island": "Isla de Navidad",
+ "City": "Ciudad",
+ "Click to choose": "Haga click para elegir",
+ "Close": "Cerrar",
+ "Cocos (Keeling) Islands": "Islas Cocos (Keeling)",
+ "Code": "Código",
+ "Colombia": "Colombia",
+ "Comoros": "Comoros",
+ "Confirm": "Confirmar",
+ "Confirm Payment": "Confirmar pago",
+ "Confirm your :amount payment": "Confirme su pago de :amount",
+ "Congo": "Congo",
+ "Congo, Democratic Republic": "República democrática del Congo",
+ "Congo, the Democratic Republic of the": "Congo, República Democrática del",
+ "Constant": "Constante",
+ "Cook Islands": "Islas Cook",
+ "Costa Rica": "Costa Rica",
+ "Cote D'Ivoire": "Costa de Marfil",
+ "could not be found.": "no se pudo encontrar.",
+ "Country": "País",
+ "Coupon": "Cupón",
+ "Create": "Crear",
+ "Create & Add Another": "Crear & Añadir otro",
+ "Create :resource": "Crear :resource",
+ "Create a new team to collaborate with others on projects.": "Cree un nuevo equipo para colaborar con otros en proyectos.",
+ "Create Account": "Crear cuenta",
+ "Create API Token": "Crear Token API",
+ "Create New Team": "Crear nuevo equipo",
+ "Create Team": "Crear equipo",
+ "Created.": "Creado.",
+ "Croatia": "Croacia",
+ "Cuba": "Cuba",
+ "Curaçao": "Curazao",
+ "Current Password": "Contraseña actual",
+ "Current Subscription Plan": "Plan de suscripción actual",
+ "Currently Subscribed": "Suscrito actualmente",
+ "Customize": "Personalizar ",
+ "Cyprus": "Chipre",
+ "Czech Republic": "República Checa",
+ "Côte d'Ivoire": "Costa de Marfil",
+ "Dashboard": "Panel",
+ "December": "Diciembre",
+ "Decrease": "Disminuir",
+ "Delete": "Eliminar",
+ "Delete Account": "Borrar cuenta",
+ "Delete API Token": "Borrar token API",
+ "Delete File": "Borrar archivo",
+ "Delete Resource": "Eliminar recurso",
+ "Delete Selected": "Eliminar seleccionado",
+ "Delete Team": "Borrar equipo",
+ "Denmark": "Dinamarca",
+ "Detach": "Desvincular",
+ "Detach Resource": "Desvincular recurso",
+ "Detach Selected": "Desvincular selección",
+ "Details": "Detalles",
+ "Disable": "Deshabilitar",
+ "Djibouti": "Yibuti",
+ "Do you really want to leave? You have unsaved changes.": "¿Realmente desea salir? Aún hay cambios sin guardar.",
+ "Dominica": "Dominica",
+ "Dominican Republic": "República Dominicana",
+ "Done.": "Hecho.",
+ "Download": "Descargar",
+ "Download Receipt": "Descargar recibo",
+ "Ecuador": "Ecuador",
+ "Edit": "Editar",
+ "Edit :resource": "Editar :resource",
+ "Edit Attached": "Editar Adjunto",
+ "Egypt": "Egipto",
+ "El Salvador": "El Salvador",
+ "Email": "Correo electrónico",
+ "Email Address": "Correo electrónico",
+ "Email Addresses": "Correos electrónicos",
+ "Email Password Reset Link": "Enviar enlace para restablecer contraseña",
+ "Enable": "Habilitar",
+ "Ensure your account is using a long, random password to stay secure.": "Asegúrese que su cuenta esté usando una contraseña larga y aleatoria para mantenerse seguro.",
+ "Equatorial Guinea": "Guinea Ecuatorial",
+ "Eritrea": "Eritrea",
+ "Estonia": "Estonia",
+ "Ethiopia": "Etiopía",
+ "ex VAT": "sin VAT",
+ "Extra Billing Information": "Información de facturación adicional",
+ "Extra confirmation is needed to process your payment. Please confirm your payment by filling out your payment details below.": "Se necesita confirmación adicional para procesar su pago. Confirme su pago completando los detalles a continuación.",
+ "Extra confirmation is needed to process your payment. Please continue to the payment page by clicking on the button below.": "Se necesita confirmación adicional para procesar su pago. Continúe a la página de pago haciendo clic en el botón de abajo.",
+ "Falkland Islands (Malvinas)": "Malvinas (Falkland Islands)",
+ "Faroe Islands": "Islas Feroe",
+ "February": "Febrero",
+ "Fiji": "Fiyi",
+ "Finland": "Finlandia",
+ "For your security, please confirm your password to continue.": "Por su seguridad, confirme su contraseña para continuar.",
+ "Force Delete": "Forzar la eliminación",
+ "Force Delete Resource": "Forzar la eliminación del recurso",
+ "Force Delete Selected": "Forzar la eliminación de la selección",
+ "Forgot your password?": "¿Olvidó su contraseña?",
+ "Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.": "¿Olvidó su contraseña? No hay problema. Simplemente déjenos saber su dirección de correo electrónico y le enviaremos un enlace para restablecer la contraseña que le permitirá elegir una nueva.",
+ "France": "Francia",
+ "French Guiana": "Guayana Francesa",
+ "French Polynesia": "Polinesia Francesa",
+ "French Southern Territories": "Tierras Australes y Antárticas Francesas",
+ "Full name": "Nombre completo",
+ "Gabon": "Gabón",
+ "Gambia": "Gambia",
+ "Georgia": "Georgia",
+ "Germany": "Alemania",
+ "Ghana": "Ghana",
+ "Gibraltar": "Gibraltar",
+ "Go back": "Ir atrás",
+ "Go to page :page": "Ir a la página :page",
+ "Great! You have accepted the invitation to join the :team team.": "¡Genial! Usted ha aceptado la invitación para unirse al equipo :team.",
+ "Greece": "Grecia",
+ "Greenland": "Groenlandia",
+ "Grenada": "Grenada",
+ "Guadeloupe": "Guadalupe",
+ "Guam": "Guam",
+ "Guatemala": "Guatemala",
+ "Guernsey": "Guernsey",
+ "Guinea": "Guinea",
+ "Guinea-Bissau": "Guinea-Bisáu",
+ "Guyana": "Guyana",
+ "Haiti": "Haití",
+ "Have a coupon code?": "¿Tiene un código de descuento?",
+ "Having second thoughts about cancelling your subscription? You can instantly reactive your subscription at any time until the end of your current billing cycle. After your current billing cycle ends, you may choose an entirely new subscription plan.": "¿Tiene dudas sobre la cancelación de su suscripción? Puede reactivar instantáneamente su suscripción en cualquier momento hasta el final de su ciclo de facturación actual. Una vez que finalice su ciclo de facturación actual, puede elegir un plan de suscripción completamente nuevo.",
+ "Heard Island & Mcdonald Islands": "Islas Heard y McDonald",
+ "Heard Island and McDonald Islands": "Islas Heard y McDonald",
+ "Hide Content": "Ocultar contenido",
+ "Hold Up!": "En espera!",
+ "Holy See (Vatican City State)": "Ciudad del Vaticano",
+ "Honduras": "Honduras",
+ "Hong Kong": "Hong Kong",
+ "Hungary": "Hungría",
+ "I accept the terms of service": "Acepto los términos del servicio",
+ "I agree to the :terms_of_service and :privacy_policy": "Acepto los :terms_of_service y la :privacy_policy",
+ "Iceland": "Islandia",
+ "ID": "ID",
+ "If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.": "Si es necesario, puede salir de todas las demás sesiones de otros navegadores en todos sus dispositivos. Algunas de sus sesiones recientes se enumeran a continuación; sin embargo, es posible que esta lista no sea exhaustiva. Si cree que su cuenta se ha visto comprometida, también debería actualizar su contraseña.",
+ "If you already have an account, you may accept this invitation by clicking the button below:": "Si ya tiene una cuenta, puede aceptar esta invitación haciendo clic en el botón de abajo:",
+ "If you did not expect to receive an invitation to this team, you may discard this email.": "Si no esperaba recibir una invitación para este equipo, puede descartar este correo electrónico.",
+ "If you do not have an account, you may create one by clicking the button below. After creating an account, you may click the invitation acceptance button in this email to accept the team invitation:": "Si no tiene una cuenta, puede crear una haciendo clic en el botón de abajo. Después de crear una cuenta, puede hacer clic en el botón de aceptación de la invitación en este correo electrónico para aceptar la invitación del equipo:",
+ "If you need to add specific contact or tax information to your receipts, like your full business name, VAT identification number, or address of record, you may add it here.": "Si necesita agregar información de contacto específica o de impuestos a sus recibos, como su nombre comercial completo, número de identificación VAT o dirección de registro, puede agregarlo aquí.",
+ "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Si tiene problemas para hacer clic en el botón \":actionText\", copie y pegue la siguiente URL \nen su navegador web:",
+ "Increase": "Incrementar",
+ "India": "India",
+ "Indonesia": "Indonesia",
+ "Iran, Islamic Republic Of": "República Islámica de Irán",
+ "Iran, Islamic Republic of": "Irán, República Islámica de",
+ "Iraq": "Iraq",
+ "Ireland": "Irlanda",
+ "Isle Of Man": "Isla de Man",
+ "Isle of Man": "Isla de Man",
+ "Israel": "Israel",
+ "It looks like you do not have an active subscription. You may choose one of the subscription plans below to get started. Subscription plans may be changed or cancelled at your convenience.": "Parece que no tiene una suscripción activa. Puede elegir uno de los planes de suscripción a continuación para comenzar. Los planes de suscripción se pueden cambiar o cancelar según su conveniencia.",
+ "Italy": "Italia",
+ "Jamaica": "Jamaica",
+ "Jane Doe": "Jane Doe",
+ "January": "Enero",
+ "Japan": "Japón",
+ "Jersey": "Jersey",
+ "Jordan": "Jordán",
+ "July": "Julio",
+ "June": "Junio",
+ "Kazakhstan": "Kazajistán",
+ "Kenya": "Kenya",
+ "Key": "Clave",
+ "Kiribati": "Kiribati",
+ "Korea": "Corea del Sur",
+ "Korea, Democratic People's Republic of": "Corea del Norte",
+ "Korea, Republic of": "Corea, República de",
+ "Kosovo": "Kosovo",
+ "Kuwait": "Kuwait",
+ "Kyrgyzstan": "Kirguistán",
+ "Lao People's Democratic Republic": "Laos, República Democrática Popular de",
+ "Last active": "Activo por última vez",
+ "Last used": "Usado por última vez",
+ "Latvia": "Letonia",
+ "Leave": "Abandonar",
+ "Leave Team": "Abandonar equipo",
+ "Lebanon": "Líbano",
+ "Lens": "Lens",
+ "Lesotho": "Lesoto",
+ "Liberia": "Liberia",
+ "Libyan Arab Jamahiriya": "Libia",
+ "Liechtenstein": "Liechtenstein",
+ "Lithuania": "Lituania",
+ "Load :perPage More": "Cargar :perPage Mas",
+ "Log in": "Iniciar sesión",
+ "Log Out": "Cerrar sesión",
+ "Log Out Other Browser Sessions": "Cerrar las demás sesiones",
+ "Logout": "Cerrar sesión",
+ "Luxembourg": "Luxemburgo",
+ "Macao": "Macao",
+ "Macedonia": "Macedonia",
+ "Macedonia, the former Yugoslav Republic of": "Macedonia, ex República Yugoslava de",
+ "Madagascar": "Madagascar",
+ "Malawi": "Malaui",
+ "Malaysia": "Malasia",
+ "Maldives": "Maldivas",
+ "Mali": "Malí",
+ "Malta": "Malta",
+ "Manage Account": "Administrar cuenta",
+ "Manage and log out your active sessions on other browsers and devices.": "Administre y cierre sus sesiones activas en otros navegadores y dispositivos.",
+ "Manage API Tokens": "Administrar Tokens API",
+ "Manage Role": "Administrar rol",
+ "Manage Team": "Administrar equipo",
+ "Managing billing for :billableName": "Gestionando la facturación de :billableName",
+ "March": "Marzo",
+ "Marshall Islands": "Islas Marshall",
+ "Martinique": "Martinica",
+ "Mauritania": "Mauritania",
+ "Mauritius": "Mauricio",
+ "May": "Mayo",
+ "Mayotte": "Mayotte",
+ "Mexico": "México",
+ "Micronesia, Federated States Of": "Micronesia, Estados Federados de",
+ "Micronesia, Federated States of": "Micronesia, Estados Federados de",
+ "Moldova": "Moldavia",
+ "Moldova, Republic of": "Moldavia, República de",
+ "Monaco": "Mónaco",
+ "Mongolia": "Mongolia",
+ "Montenegro": "Montenegro",
+ "Month To Date": "Mes hasta la fecha",
+ "Monthly": "Mensual",
+ "monthly": "mensual",
+ "Montserrat": "Montserrat",
+ "Morocco": "Marruecos",
+ "Mozambique": "Mozambique",
+ "Myanmar": "Myanmar",
+ "Namibia": "Namibia",
+ "Nauru": "Nauru",
+ "Nepal": "Nepal",
+ "Netherlands": "Países Bajos",
+ "Netherlands Antilles": "Antillas Holandesas",
+ "Nevermind, I'll keep my old plan": "No importa, mantendré mi antiguo plan",
+ "New": "Nuevo",
+ "New :resource": "Nuevo :resource",
+ "New Caledonia": "Nueva Caledonia",
+ "New Password": "Nueva Contraseña",
+ "New Zealand": "Nueva Zelanda",
+ "Next": "Siguiente",
+ "Nicaragua": "Nicaragua",
+ "Niger": "Níger",
+ "Nigeria": "Nigeria",
+ "Niue": "Niue",
+ "No": "No",
+ "No :resource matched the given criteria.": "Ningún :resource coincide con los criterios.",
+ "No additional information...": "Sin información adicional...",
+ "No Current Data": "Sin datos actuales",
+ "No Data": "No hay datos",
+ "no file selected": "no se seleccionó el archivo",
+ "No Increase": "No incrementar",
+ "No Prior Data": "No hay datos previos",
+ "No Results Found.": "No se encontraron resultados.",
+ "Norfolk Island": "Isla Norfolk",
+ "Northern Mariana Islands": "Islas Marianas del Norte",
+ "Norway": "Noruega",
+ "Not Found": "No encontrado",
+ "Nova User": "Usuario Nova",
+ "November": "Noviembre",
+ "October": "Octubre",
+ "of": "de",
+ "Oman": "Omán",
+ "Once a team is deleted, all of its resources and data will be permanently deleted. Before deleting this team, please download any data or information regarding this team that you wish to retain.": "Una vez que se elimina un equipo, todos sus recursos y datos se eliminarán de forma permanente. Antes de eliminar este equipo, descargue cualquier dato o información sobre este equipo que desee conservar.",
+ "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "Una vez su cuenta sea borrada, todos sus recursos y datos se eliminarán de forma permanente. Antes de borrar su cuenta, por favor descargue cualquier dato o información que desee conservar.",
+ "Only Trashed": "Solo en papelera",
+ "Original": "Original",
+ "Our billing management portal allows you to conveniently manage your subscription plan, payment method, and download your recent invoices.": "Nuestro portal de administración de facturación le permite administrar cómodamente su plan de suscripción, método de pago y descargar sus facturas recientes.",
+ "Pagination Navigation": "Navegación por los enlaces de paginación",
+ "Pakistan": "Pakistán",
+ "Palau": "Palau",
+ "Palestinian Territory, Occupied": "Territorios Palestinos",
+ "Panama": "Panamá",
+ "Papua New Guinea": "Papúa Nueva Guinea",
+ "Paraguay": "Paraguay",
+ "Pay :amount": "Pague :amount",
+ "Payment Cancelled": "Pago cancelado",
+ "Payment Confirmation": "Confirmación de pago",
+ "Payment Information": "Información del pago",
+ "Payment Method": "Método de pago",
+ "Payment Successful": "Pago exitoso",
+ "Pending Team Invitations": "Invitaciones de equipo pendientes",
+ "Per Page": "Por Página",
+ "Permanently delete this team.": "Eliminar este equipo de forma permanente",
+ "Permanently delete your account.": "Eliminar su cuenta de forma permanente.",
+ "Permissions": "Permisos",
+ "Peru": "Perú",
+ "Philippines": "Filipinas",
+ "Photo": "Foto",
+ "Pitcairn": "Islas Pitcairn",
+ "Please accept the terms of service.": "Por favor acepte los términos del servicio.",
+ "Please confirm access to your account by entering one of your emergency recovery codes.": "Por favor confirme el acceso a su cuenta ingresando uno de sus códigos de recuperación de emergencia.",
+ "Please confirm access to your account by entering the authentication code provided by your authenticator application.": "Por favor confirme el acceso a su cuenta digitando el código de autenticación provisto por su aplicación autenticadora.",
+ "Please copy your new API token. For your security, it won't be shown again.": "Por favor copie su nuevo token API. Por su seguridad, no se volverá a mostrar.",
+ "Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.": "Por favor ingrese su contraseña para confirmar que desea cerrar las demás sesiones de otros navegadores en todos sus dispositivos.",
+ "Please provide a maximum of three receipt emails addresses.": "Proporcione un máximo de tres direcciones para recibir correo electrónico.",
+ "Please provide the email address of the person you would like to add to this team.": "Por favor proporcione la dirección de correo electrónico de la persona que le gustaría agregar a este equipo.",
+ "Please provide your name.": "Por favor proporcione su nombre.",
+ "Poland": "Polonia",
+ "Portugal": "Portugal",
+ "Press / to search": "Presione / para buscar",
+ "Preview": "Previsualizar",
+ "Previous": "Previo",
+ "Privacy Policy": "Política de Privacidad",
+ "Profile": "Perfil",
+ "Profile Information": "Información de perfil",
+ "Puerto Rico": "Puerto Rico",
+ "Qatar": "Qatar",
+ "Quarter To Date": "Trimestre hasta la fecha",
+ "Receipt Email Addresses": "Direcciones para recibir correo electrónico",
+ "Receipts": "Recibos",
+ "Recovery Code": "Código de recuperación",
+ "Regenerate Recovery Codes": "Regenerar códigos de recuperación",
+ "Reload": "Recargar",
+ "Remember me": "Mantener sesión activa",
+ "Remove": "Eliminar",
+ "Remove Photo": "Eliminar foto",
+ "Remove Team Member": "Eliminar miembro del equipo",
+ "Resend Verification Email": "Reenviar correo de verificación",
+ "Reset Filters": "Restablecer filtros",
+ "resource": "recurso",
+ "Resources": "Recursos",
+ "resources": "recursos",
+ "Restore": "Restaurar",
+ "Restore Resource": "Restaurar Recursos",
+ "Restore Selected": "Restaurar Selección",
+ "results": "resultados",
+ "Resume Subscription": "Reanudar suscripción",
+ "Return to :appName": "Regresar a :appName",
+ "Reunion": "Reunión",
+ "Role": "Rol",
+ "Romania": "Rumania",
+ "Run Action": "Ejecutar Acción",
+ "Russian Federation": "Federación Rusa",
+ "Rwanda": "Ruanda",
+ "Réunion": "Reunión",
+ "Saint Barthelemy": "San Bartolomé",
+ "Saint Barthélemy": "San Bartolomé",
+ "Saint Helena": "Santa Helena",
+ "Saint Kitts And Nevis": "San Cristóbal y Nieves",
+ "Saint Kitts and Nevis": "Saint Kitts y Nevis",
+ "Saint Lucia": "Santa Lucía",
+ "Saint Martin": "San Martín",
+ "Saint Martin (French part)": "San Martín (parte francesa)",
+ "Saint Pierre And Miquelon": "San Pedro y Miquelón",
+ "Saint Pierre and Miquelon": "San Pedro y Miquelón",
+ "Saint Vincent And Grenadines": "San Vicente y las Granadinas",
+ "Saint Vincent and the Grenadines": "San Vicente y las Granadinas",
+ "Samoa": "Samoa",
+ "San Marino": "San Marino",
+ "Sao Tome And Principe": "Santo Tomé y Príncipe",
+ "Sao Tome and Principe": "Santo Tomé y Príncipe",
+ "Saudi Arabia": "Arabia Saudita",
+ "Save": "Guardar",
+ "Saved.": "Guardado.",
+ "Search": "Buscar",
+ "Select": "Seleccione",
+ "Select a different plan": "Seleccione un plan diferente",
+ "Select A New Photo": "Seleccione una nueva foto",
+ "Select Action": "Seleccione una Acción",
+ "Select All": "Seleccione Todo",
+ "Select All Matching": "Seleccione Todas las coincidencias",
+ "Senegal": "Senegal",
+ "September": "Septiembre",
+ "Serbia": "Serbia",
+ "Server Error": "Error del servidor",
+ "Seychelles": "Seychelles",
+ "Show All Fields": "Mostrar todos los campos",
+ "Show Content": "Mostrar contenido",
+ "Show Recovery Codes": "Mostrar códigos de recuperación",
+ "Showing": "Mostrando",
+ "Sierra Leone": "Sierra Leona",
+ "Signed in as": "Registrado como",
+ "Singapore": "Singapur",
+ "Sint Maarten (Dutch part)": "San Martín",
+ "Slovakia": "Eslovaquia",
+ "Slovenia": "Eslovenia",
+ "Solomon Islands": "Islas Salomón",
+ "Somalia": "Somalia",
+ "Something went wrong.": "Algo salió mal.",
+ "Sorry! You are not authorized to perform this action.": "¡Lo siento! Usted no está autorizado para ejecutar esta acción.",
+ "Sorry, your session has expired.": "Lo siento, su sesión ha caducado.",
+ "South Africa": "Sudáfrica",
+ "South Georgia And Sandwich Isl.": "Islas Georgias del Sur y Sandwich del Sur",
+ "South Georgia and the South Sandwich Islands": "Georgia del sur y las islas Sandwich del sur",
+ "South Sudan": "Sudán del Sur",
+ "Spain": "España",
+ "Sri Lanka": "Sri Lanka",
+ "Standalone Actions": "Acciones independientes",
+ "Start Polling": "Iniciar encuesta",
+ "State / County": "Estado / País",
+ "Stop Polling": "Detener encuesta",
+ "Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.": "Guarde estos códigos de recuperación en un administrador de contraseñas seguro. Se pueden utilizar para recuperar el acceso a su cuenta si pierde su dispositivo de autenticación de dos factores.",
+ "Subscribe": "Suscriba",
+ "Subscription Information": "Información de suscripción",
+ "Subscription Pending": "Suscripción pendiente",
+ "Sudan": "Sudán",
+ "Suriname": "Suriname",
+ "Svalbard And Jan Mayen": "Svalbard y Jan Mayen",
+ "Svalbard and Jan Mayen": "Svalbard y Jan Mayen",
+ "Swaziland": "Eswatini",
+ "Sweden": "Suecia",
+ "Switch Teams": "Cambiar de equipo",
+ "Switzerland": "Suiza",
+ "Syrian Arab Republic": "Siria",
+ "Taiwan": "Taiwán",
+ "Taiwan, Province of China": "Taiwan, provincia de China",
+ "Tajikistan": "Tayikistán",
+ "Tanzania": "Tanzania",
+ "Tanzania, United Republic of": "Tanzania, República Unida de",
+ "Team Details": "Detalles del equipo",
+ "Team Invitation": "Invitación de equipo",
+ "Team Members": "Miembros del equipo",
+ "Team Name": "Nombre del equipo",
+ "Team Owner": "Propietario del equipo",
+ "Team Settings": "Ajustes del equipo",
+ "Terms of Service": "Términos del servicio",
+ "Thailand": "Tailandia",
+ "Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn't receive the email, we will gladly send you another.": "¡Gracias por registrarse! Antes de comenzar, ¿podría verificar su dirección de correo electrónico haciendo clic en el enlace que le acabamos de enviar? Si no recibió el correo electrónico, con gusto le enviaremos otro.",
+ "Thanks for your continued support. We've attached a copy of your invoice for your records. Please let us know if you have any questions or concerns.": "Gracias por su apoyo continuo. Hemos adjuntado una copia de su factura para sus registros. Háganos saber si tiene alguna pregunta o inquietud.",
+ "Thanks,": "Gracias,",
+ "The :attribute must be a valid role.": ":Attribute debe ser un rol válido.",
+ "The :attribute must be at least :length characters and contain at least one number.": "La :attribute debe tener al menos :length caracteres y contener por lo menos un número.",
+ "The :attribute must be at least :length characters and contain at least one special character and one number.": "La :attribute debe tener al menos :length caracteres y contener por lo menos un caracter especial y un número.",
+ "The :attribute must be at least :length characters and contain at least one special character.": "La :attribute debe tener al menos :length caracteres y contener por lo menos un carácter especial.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character and one number.": "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula y un número.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character and one special character.": "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula y un carácter especial.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character.": "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula, un número y un carácter especial.",
+ "The :attribute must be at least :length characters and contain at least one uppercase character.": "La :attribute debe tener al menos :length caracteres y contener por lo menos una letra mayúscula.",
+ "The :attribute must be at least :length characters.": "La :attribute debe tener al menos :length caracteres.",
+ "The :attribute must contain at least one letter.": "La :attribute debe contener al menos una letra.",
+ "The :attribute must contain at least one number.": "La :attribute debe contener al menos un número.",
+ "The :attribute must contain at least one symbol.": "La :attribute debe contener al menos un símbolo.",
+ "The :attribute must contain at least one uppercase and one lowercase letter.": "La :attribute debe contener al menos una letra mayúscula y una minúscula.",
+ "The :resource was created!": "¡El :resource fue creado!",
+ "The :resource was deleted!": "¡El :resource fue eliminado!",
+ "The :resource was restored!": "¡El :resource fue restaurado!",
+ "The :resource was updated!": "¡El :resource fue actualizado!",
+ "The action ran successfully!": "¡La acción se ejecutó correctamente!",
+ "The file was deleted!": "¡El archivo fue eliminado!",
+ "The given :attribute has appeared in a data leak. Please choose a different :attribute.": "La :attribute proporcionada se ha visto comprometida en una filtración de datos (data leak). Elija una :attribute diferente.",
+ "The government won't let us show you what's behind these doors": "El gobierno no nos permitirá mostrarle lo que hay detrás de estas puertas",
+ "The HasOne relationship has already been filled.": "La relación HasOne ya fué completada.",
+ "The password is incorrect.": "La contraseña es incorrecta.",
+ "The payment was successful.": "El pago fue exitoso.",
+ "The provided coupon code is invalid.": "El código de cupón proporcionado no es válido.",
+ "The provided password does not match your current password.": "La contraseña proporcionada no coincide con su contraseña actual.",
+ "The provided password was incorrect.": "La contraseña proporcionada no es correcta.",
+ "The provided two factor authentication code was invalid.": "El código de autenticación de dos factores proporcionado no es válido.",
+ "The provided VAT number is invalid.": "El número VAT proporcionado no es válido.",
+ "The receipt emails must be valid email addresses.": "Los correos electrónicos de recepción deben ser direcciones válidas.",
+ "The resource was updated!": "¡El recurso fue actualizado!",
+ "The selected country is invalid.": "El país seleccionado no es válido.",
+ "The selected plan is invalid.": "El plan seleccionado no es válido.",
+ "The team's name and owner information.": "Nombre del equipo e información del propietario.",
+ "There are no available options for this resource.": "No hay opciones disponibles para este recurso.",
+ "There is no active subscription.": "No hay una suscripción activa.",
+ "There was a problem executing the action.": "Hubo un problema ejecutando la acción.",
+ "There was a problem submitting the form.": "Hubo un problema al enviar el formulario.",
+ "These people have been invited to your team and have been sent an invitation email. They may join the team by accepting the email invitation.": "Estas personas han sido invitadas a su equipo y se les ha enviado un correo electrónico de invitación. Pueden unirse al equipo aceptando la invitación por correo electrónico.",
+ "This account does not have an active subscription.": "Esta cuenta no tiene una suscripción activa.",
+ "This action is unauthorized.": "Esta acción no está autorizada.",
+ "This device": "Este dispositivo",
+ "This file field is read-only.": "Este campo de archivo es de solo lectura.",
+ "This image": "Esta imagen",
+ "This is a secure area of the application. Please confirm your password before continuing.": "Esta es un área segura de la aplicación. Confirme su contraseña antes de continuar.",
+ "This password does not match our records.": "Esta contraseña no coincide con nuestros registros.",
+ "This payment was already successfully confirmed.": "Este pago ya se confirmó con éxito.",
+ "This payment was cancelled.": "Este pago fue cancelado.",
+ "This resource no longer exists": "Este recurso ya no existe",
+ "This subscription cannot be resumed. Please create a new subscription.": "Esta suscripción no se puede reanudar. Por favor cree una nueva suscripción.",
+ "This subscription has expired and cannot be resumed. Please create a new subscription.": "Esta suscripción ha caducado y no se puede reanudar. Cree una nueva suscripción.",
+ "This user already belongs to the team.": "Este usuario ya pertenece al equipo.",
+ "This user has already been invited to the team.": "Este usuario ya ha sido invitado al equipo.",
+ "Timor-Leste": "Timor Oriental",
+ "to": "al",
+ "Today": "Hoy",
+ "Togo": "Togo",
+ "Tokelau": "Tokelau",
+ "Token Name": "Nombre del token",
+ "Tonga": "Tonga",
+ "total": "total",
+ "Total:": "Total:",
+ "Trashed": "Desechado",
+ "Trinidad And Tobago": "Trinidad y Tobago",
+ "Trinidad and Tobago": "Trinidad y Tobago",
+ "Tunisia": "Tunisia",
+ "Turkey": "Turquía",
+ "Turkmenistan": "Turkmenistán",
+ "Turks And Caicos Islands": "Islas Turcas y Caicos",
+ "Turks and Caicos Islands": "Islas Turcas y Caicos",
+ "Tuvalu": "Tuvalu",
+ "Two Factor Authentication": "Autenticación de dos factores",
+ "Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application.": "La autenticación de dos factores ahora está habilitada. Escanee el siguiente código QR usando la aplicación de autenticación de su teléfono.",
+ "Scan the following QR code using your phone's authenticator application and confirm it with the generated OTP code.": "Escanee el siguiente código QR usando la aplicación de autenticación de su teléfono y confírmelo con el código OTP generado.",
+ "Uganda": "Uganda",
+ "Ukraine": "Ucrania",
+ "United Arab Emirates": "Emiratos Árabes Unidos",
+ "United Kingdom": "Reino Unido",
+ "United States": "Estados Unidos",
+ "United States Minor Outlying Islands": "Islas Ultramarinas Menores de los Estados Unidos",
+ "United States Outlying Islands": "Islas Ultramarinas Menores de los Estados Unidos",
+ "Update": "Actualizar",
+ "Update & Continue Editing": "Actualice & Continúe Editando",
+ "Update :resource": "Actualizar :resource",
+ "Update :resource: :title": "Actualice el :title del :resource:",
+ "Update attached :resource: :title": "Actualice el :title del :resource: adjuntado",
+ "Update Password": "Actualizar contraseña",
+ "Update Payment Information": "Actualizar la información de pago",
+ "Update Payment Method": "Actualizar método de pago",
+ "Update your account's profile information and email address.": "Actualice la información de su cuenta y la dirección de correo electrónico",
+ "Uruguay": "Uruguay",
+ "Use a recovery code": "Use un código de recuperación",
+ "Use an authentication code": "Use un código de autenticación",
+ "Uzbekistan": "Uzbekistan",
+ "Value": "Valor",
+ "Vanuatu": "Vanuatu",
+ "VAT Number": "Número VAT",
+ "Venezuela": "Venezuela",
+ "Venezuela, Bolivarian Republic of": "Venezuela, República Bolivariana de",
+ "Viet Nam": "Vietnam",
+ "View": "Vista",
+ "View Receipt": "Ver recibo",
+ "Virgin Islands, British": "Islas Vírgenes Británicas",
+ "Virgin Islands, U.S.": "Islas Vírgenes Estadounidenses",
+ "Wallis And Futuna": "Wallis y Futuna",
+ "Wallis and Futuna": "Wallis y Futuna",
+ "We are processing your subscription. Once the subscription has successfully processed, this page will update automatically. Typically, this process should only take a few seconds.": "Estamos procesando su suscripción. Una vez que la suscripción se haya procesado correctamente esta página se actualizará automáticamente. Normalmente, este proceso solo debería llevar unos segundos.",
+ "We are unable to process your payment. Please contact customer support.": "No podemos procesar su pago. Comuníquese con el servicio de atención al cliente.",
+ "We were unable to find a registered user with this email address.": "No pudimos encontrar un usuario registrado con esta dirección de correo electrónico.",
+ "We will send a receipt download link to the email addresses that you specify below. You may separate multiple email addresses using commas.": "Enviaremos un enlace de descarga de recibo a las direcciones de correo electrónico que especifique a continuación. Puede separar varias direcciones de correo electrónico con comas.",
+ "We're lost in space. The page you were trying to view does not exist.": "Estamos perdidos en el espacio. La página que intenta buscar no existe.",
+ "Welcome Back!": "¡Bienvenido de nuevo!",
+ "Western Sahara": "Sahara Occidental",
+ "When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone's Google Authenticator application.": "Cuando la autenticación de dos factores esté habilitada, le pediremos un token aleatorio seguro durante la autenticación. Puede recuperar este token desde la aplicación Google Authenticator de su teléfono.",
+ "Whoops": "Ups",
+ "Whoops! Something went wrong.": "¡Ups! Algo salió mal.",
+ "With Trashed": "Incluida la papelera",
+ "Write": "Escriba",
+ "Year To Date": "Año hasta la fecha",
+ "Yearly": "Anual",
+ "Yemen": "Yemen",
+ "Yes": "Sí",
+ "You are already subscribed.": "Usted ya está suscrito.",
+ "You are currently within your free trial period. Your trial will expire on :date.": "Actualmente se encuentra dentro de su período de prueba gratuito. Su prueba vencerá el :date.",
+ "You have been invited to join the :team team!": "¡Usted ha sido invitado a unirse al equipo :team!",
+ "You are enabling two factor authentication.": "Estás habilitando la autenticación de dos factores.",
+ "You have enabled two factor authentication.": "Ha habilitado la autenticación de dos factores.",
+ "You have not enabled two factor authentication.": "No ha habilitado la autenticación de dos factores.",
+ "You may accept this invitation by clicking the button below:": "Puede aceptar esta invitación haciendo clic en el botón de abajo:",
+ "You may cancel your subscription at any time. Once your subscription has been cancelled, you will have the option to resume the subscription until the end of your current billing cycle.": "Puedes cancelar tu subscripción en cualquier momento. Una vez que su suscripción haya sido cancelada, tendrá la opción de reanudar la suscripción hasta el final de su ciclo de facturación actual.",
+ "You may delete any of your existing tokens if they are no longer needed.": "Puede eliminar cualquiera de sus tokens existentes si ya no los necesita.",
+ "You may not delete your personal team.": "No se puede borrar su equipo personal.",
+ "You may not leave a team that you created.": "No se puede abandonar un equipo que usted creó.",
+ "Your :invoiceName invoice is now available!": "¡Su factura :invoiceName ya está disponible!",
+ "Your card was declined. Please contact your card issuer for more information.": "Su tarjeta fue rechazada. Comuníquese con el emisor de su tarjeta para obtener más información.",
+ "Your current payment method is :paypal.": "Su método de pago actual es :paypal.",
+ "Your current payment method is a credit card ending in :lastFour that expires on :expiration.": "Su método de pago actual es una tarjeta de crédito que termina en :lastFour que vence el :expiration.",
+ "Your registered VAT Number is :vatNumber.": "Su número VAT registrado es :vatNumber.",
+ "Zambia": "Zambia",
+ "Zimbabwe": "Zimbabwe",
+ "Zip / Postal Code": "Zip / Código postal",
+ "Åland Islands": "Islas Åland"
+}
\ No newline at end of file
diff --git a/resources/scss/app.scss b/resources/scss/app.scss
new file mode 100644
index 0000000..9b45e49
--- /dev/null
+++ b/resources/scss/app.scss
@@ -0,0 +1,415 @@
+@import 'tailwindcss/base';
+@import 'tailwindcss/components';
+@import 'tailwindcss/utilities';
+
+.menu-horizontal-wrapper > .menu-inner > .menu-item:last-child {
+ padding-right: 70px;
+}
+
+.bg-menu-theme.menu-horizontal .menu-sub .menu-sub > .menu-item .menu-link .menu-icon {
+ display: none;
+}
+
+.user-nav .user-name {
+ letter-spacing: 0.03rem;
+ font-weight: 600;
+}
+.user-nav .user-email {
+ letter-spacing: 0.05rem;
+ font-size: smaller;
+ font-weight: 100;
+}
+
+.app-brand-logo.demo {
+ height: inherit;
+}
+
+.app-brand-text {
+ flex-shrink: 1 !important;
+}
+
+.nav-tabs .nav-link,
+.nav-pills .nav-link {
+ text-transform: inherit !important;
+}
+
+.image-wrapper-16x16 {
+ width: 28px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+ padding: 5px;
+}
+.image-wrapper-16x16 img {
+ width: 16px;
+ height: 16px;
+ display: block;
+}
+
+.image-wrapper-76x76 {
+ width: 92px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+ padding: 5px;
+}
+.image-wrapper-76x76 img {
+ width: 76px;
+ height: 76px;
+ display: block;
+}
+
+.image-wrapper-120x120 {
+ width: 140px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-120x120 img {
+ width: 120px;
+ height: 120px;
+ display: block;
+}
+
+.image-wrapper-152x152 {
+ width: 172px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-152x152 img {
+ width: 152px;
+ height: 152px;
+ display: block;
+}
+
+.image-wrapper-180x180 {
+ width: 202px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-180x180 img {
+ width: 180px;
+ height: 180px;
+ display: block;
+}
+
+.image-wrapper-192x192 {
+ width: 214px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-192x192 img {
+ width: 192px;
+ height: 192px;
+ display: block;
+}
+
+.image-wrapper-380x380 {
+ width: 396px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-380x380 img {
+ width: 380px;
+ height: 380px;
+ display: block;
+}
+
+.image-wrapper-520x520 {
+ width: 536px;
+ aspect-ratio: 1/1; /* Proporción 1:1 para que sea cuadrado */
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-520x520 img {
+ width: 520px;
+ height: 520px;
+ display: block;
+}
+
+/*
+.dark-style .layout-navbar .navbar-dropdown.dropdown-shortcuts .dropdown-shortcuts-item.active {
+ background-color: #3a3d53;
+}
+.light-style .layout-navbar .navbar-dropdown.dropdown-shortcuts .dropdown-shortcuts-item.active {
+ background-color: #f3f2f3;
+}
+
+.max-w-full {
+ max-width: 100%;
+}
+
+
+.collapse {
+ visibility: initial;
+}
+
+#admin-crm--view-520x520 .nav-pills .nav-link {
+ text-transform: none;
+}
+#admin-crm--view-520x520 .nav-tabs .nav-link {
+ text-transform: none;
+ padding-top: 13px;
+ padding-bottom: 13px;
+}
+
+html.light-style .fixed-table-container {
+ background-color: white;
+}
+html.dark-style .fixed-table-container {
+ background-color: #202332;
+}
+
+.form-floating > label {
+ border: none !important;
+}
+
+.form-control:read-only:not(.flatpickr-input) {
+ color: #acaab1;
+ background-color: #f3f2f3;
+ border-color: #cdccd0;
+ opacity: 1;
+}
+
+.dark-style .fixed-columns,
+.dark-style .fixed-columns-right {
+ background-color: #25293c !important;
+}
+
+.bootstrap-table .acction-buttons .footer-actions {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+.mini-dropzone .dz-message:before {
+ top: 2rem !important;
+}
+.mini-dropzone .dz-message {
+ margin: 6rem 0 2rem !important;
+}
+.dz-preview {
+ margin-bottom: 38px;
+}
+
+.image-wrapper-16x16 {
+ max-width: 36px;
+ aspect-ratio: 1/1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-16x16 img {
+ max-width: 16px;
+ max-height: 16px;
+ display: block;
+}
+
+.image-wrapper-76x76 {
+ max-width: 96px;
+ aspect-ratio: 1/1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-76x76 img {
+ max-width: 76px;
+ max-height: 76px;
+ display: block;
+}
+
+.image-wrapper-120x120 {
+ max-width: 140px;
+ aspect-ratio: 1/1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-120x120 img {
+ max-width: 120px;
+ max-height: 120px;
+ display: block;
+}
+
+.image-wrapper-152x152 {
+ max-width: 172px;
+ aspect-ratio: 1/1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-152x152 img {
+ max-width: 152px;
+ max-height: 152px;
+ display: block;
+}
+
+.image-wrapper-180x180 {
+ max-width: 200px;
+ aspect-ratio: 1/1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-180x180 img {
+ max-width: 180px;
+ max-height: 180px;
+ display: block;
+}
+
+.image-wrapper-192x192 {
+ max-width: 202px;
+ aspect-ratio: 1/1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-192x192 img {
+ max-width: 192px;
+ max-height: 192px;
+ display: block;
+}
+
+.image-wrapper-380x380 {
+ max-width: 400px;
+ aspect-ratio: 1/1;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-380x380 img {
+ max-width: 380px;
+ max-height: 380px;
+ display: block;
+}
+
+.image-wrapper-520x520 {
+ max-width: 540px;
+ aspect-ratio: 1/1;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border: 1px solid #eee;
+}
+.image-wrapper-520x520 img {
+ max-width: 520px;
+ max-height: 520px;
+ display: block;
+}
+
+.custom-option-item-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+}
+
+.custom-options-checkable {
+ --bs-gutter-x: 1rem !important;
+}
+.custom-options-checkable .custom-option-item {
+ width: 100%;
+ cursor: pointer;
+ border-radius: 0.42rem;
+ color: #82868b;
+ background-color: rgba(130, 134, 139, 0.06);
+ border: 1px solid #ebe9f1;
+}
+.custom-option-item-check:checked + .custom-option-item {
+ color: #175cc3;
+ background-color: rgba(23, 92, 195, 0.12);
+ border-color: #175cc3;
+}
+.custom-options-checkable .custom-option-item span {
+ margin: 0 auto;
+}
+*/
+
+
+
+.if_local_address_show {
+ display: none;
+}
+
+
+.form-floating > textarea.form-control,
+.form-floating > textarea.form-control-plaintext,
+.form-floating > textarea.form-select{
+ height: auto !important;
+}
+
+
+.dropzone .dz-message {
+ padding: 0 10px;
+}
+
+
+.dropzone-md .dz-message:before {
+ top: 1.5rem;
+}
+.dropzone-md .dz-message {
+ margin: 5rem 0 1.5rem;
+}
+
+
+.dropzone-sm .dz-message:before {
+ top: 1.5rem;
+}
+.dropzone-sm .dz-message {
+ margin: 5rem 0 1.5rem;
+}
+
+.dropzone-sm .dz-message:before,
+.dropzone-xs .dz-message:before {
+ display: none;
+}
+
+.dropzone-sm .dz-message {
+ margin: 1rem 0 1rem;
+ font-size: 1rem;
+}
+.dropzone-sm .dz-message .note {
+ font-size: 1rem;
+}
+
+.dropzone-xs .dz-message {
+ margin: .5rem 0 .5rem;
+ font-size: .8rem;
+}
+.dropzone-xs .dz-message .note {
+ font-size: .65rem;
+ margin-top: 0.25rem;
+}
+
+
+
+
+
+
diff --git a/resources/scss/pages/page-account-settings.scss b/resources/scss/pages/page-account-settings.scss
new file mode 100644
index 0000000..c6abbe1
--- /dev/null
+++ b/resources/scss/pages/page-account-settings.scss
@@ -0,0 +1,16 @@
+// * Account Settings
+// *******************************************************************************
+
+@import '../../assets/vendor/scss/_custom-variables/pages';
+@import '../../assets/vendor/scss/_bootstrap-extended/include';
+
+.api-key-actions {
+ position: absolute !important;
+ top: 0.75rem;
+ @include app-ltr() {
+ right: 0.5rem;
+ }
+ @include app-rtl() {
+ left: 0.5rem;
+ }
+}
diff --git a/resources/scss/pages/page-auth.scss b/resources/scss/pages/page-auth.scss
new file mode 100644
index 0000000..00dc08e
--- /dev/null
+++ b/resources/scss/pages/page-auth.scss
@@ -0,0 +1,169 @@
+// * Authentication
+// *******************************************************************************
+
+@use '../../assets/vendor/scss/_bootstrap-extended/include' as light;
+@use '../../assets/vendor/scss/_bootstrap-extended/include-dark' as dark;
+@import '../../assets/vendor/scss/_custom-variables/pages';
+
+$authentication-1-inner-max-width: 460px !default;
+
+.authentication-wrapper {
+ display: flex;
+ flex-basis: 100%;
+ min-height: 100vh;
+ width: 100%;
+
+ .authentication-inner {
+ width: 100%;
+ }
+
+ &.authentication-basic {
+ align-items: center;
+ justify-content: center;
+ .card-body {
+ padding: 3rem;
+ @include light.media-breakpoint-down(sm) {
+ padding: 2rem;
+ }
+ }
+ }
+
+ &.authentication-cover {
+ align-items: flex-start;
+ .authentication-inner {
+ height: 100%;
+ margin: auto 0;
+
+ @include light.media-breakpoint-down(lg) {
+ height: 100vh;
+ }
+ // authentication cover background styles
+ .auth-cover-bg {
+ width: 100%;
+ height: 100vh;
+ position: relative;
+
+ // authentication cover illustration height
+ .auth-illustration {
+ max-height: 65%;
+ max-width: 65%;
+ z-index: 1;
+ }
+ }
+
+ // authentication cover platform bg styles
+ .platform-bg {
+ position: absolute;
+ width: 100%;
+ bottom: 0%;
+ left: 0%;
+ height: 35%;
+ }
+
+ // authentication multisteps styles
+ .auth-multisteps-bg-height {
+ height: 100vh;
+
+ // z-index for illustration
+ & > img:first-child {
+ z-index: 1;
+ }
+ }
+ }
+ }
+
+ &.authentication-basic .authentication-inner {
+ max-width: $authentication-1-inner-max-width;
+ position: relative;
+ &:before {
+ @include light.media-breakpoint-down(sm) {
+ display: none;
+ }
+ width: 238px;
+ height: 233px;
+ content: ' ';
+ position: absolute;
+ top: -35px;
+ left: -45px;
+ background-image: url("data:image/svg+xml,%3Csvg width='239' height='234' viewBox='0 0 239 234' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='88.5605' y='0.700195' width='149' height='149' rx='19.5' stroke='%237367F0' stroke-opacity='0.16'/%3E%3Crect x='0.621094' y='33.761' width='200' height='200' rx='10' fill='%237367F0' fill-opacity='0.08'/%3E%3C/svg%3E%0A");
+ }
+ &:after {
+ @include light.media-breakpoint-down(sm) {
+ display: none;
+ }
+ width: 180px;
+ height: 180px;
+ content: ' ';
+ position: absolute;
+ z-index: -1;
+ bottom: -30px;
+ right: -56px;
+ background-image: url("data:image/svg+xml,%3Csvg width='181' height='181' viewBox='0 0 181 181' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1.30469' y='1.44312' width='178' height='178' rx='19' stroke='%237367F0' stroke-opacity='0.16' stroke-width='2' stroke-dasharray='8 8'/%3E%3Crect x='22.8047' y='22.9431' width='135' height='135' rx='10' fill='%237367F0' fill-opacity='0.08'/%3E%3C/svg%3E");
+ }
+ }
+
+ // For two-steps auth
+ .auth-input-wrapper .auth-input {
+ max-width: 50px;
+ padding-left: 0.4rem;
+ padding-right: 0.4rem;
+ font-size: light.$large-font-size;
+ }
+}
+
+// authentication multisteps responsive styles
+@media (max-height: 636px) {
+ .auth-multisteps-bg-height {
+ height: 100% !important;
+ }
+}
+
+// Two-steps auth responsive style
+@include light.media-breakpoint-down(sm) {
+ .authentication-wrapper {
+ .auth-input-wrapper .auth-input {
+ font-size: light.$h5-font-size;
+ }
+ }
+}
+
+// Two Steps Verification
+// ? Used for validation specific style as we have validated hidden field
+#twoStepsForm {
+ .fv-plugins-bootstrap5-row-invalid .form-control {
+ border-color: light.$form-feedback-invalid-color;
+ border-width: light.$input-focus-border-width;
+ }
+}
+@include light.media-breakpoint-down(sm) {
+ .numeral-mask-wrapper .numeral-mask {
+ padding: 0 !important;
+ }
+ .numeral-mask {
+ margin-inline: 1px !important;
+ }
+}
+
+// Light Layout
+@if $enable-light-style {
+ .light-style {
+ .authentication-wrapper .authentication-bg {
+ background-color: light.$white;
+ }
+ .auth-cover-bg-color {
+ background-color: light.$body-bg;
+ }
+ }
+}
+
+// Dark Layout
+@if $enable-dark-style {
+ .dark-style {
+ .authentication-wrapper .authentication-bg {
+ background-color: dark.$card-bg;
+ }
+ .auth-cover-bg-color {
+ background-color: dark.$body-bg;
+ }
+ }
+}
diff --git a/resources/scss/pages/page-misc.scss b/resources/scss/pages/page-misc.scss
new file mode 100644
index 0000000..e7c1693
--- /dev/null
+++ b/resources/scss/pages/page-misc.scss
@@ -0,0 +1,34 @@
+@use '../../assets/vendor/scss/_bootstrap-extended/include';
+
+.misc-wrapper {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ min-height: calc(100vh - 1.5rem * 2);
+ text-align: center;
+}
+// Misc Image Wrapper
+.misc-bg-wrapper {
+ position: relative;
+ img {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 100%;
+ z-index: -1;
+ }
+}
+
+// media query for width
+@media (max-width: 1499.98px) {
+ // All Misc Pages
+ .misc-bg-wrapper img {
+ height: 250px;
+ }
+ // Under Maintenance
+ .misc-under-maintenance-bg-wrapper img {
+ height: 270px !important;
+ }
+}
diff --git a/resources/scss/pages/page-profile.scss b/resources/scss/pages/page-profile.scss
new file mode 100644
index 0000000..51087a3
--- /dev/null
+++ b/resources/scss/pages/page-profile.scss
@@ -0,0 +1,66 @@
+// * Help center
+// *******************************************************************************
+
+@use '../../assets/vendor/scss/_bootstrap-extended/include' as light;
+@use '../../assets/vendor/scss/_bootstrap-extended/include-dark' as dark;
+@import '../../assets/vendor/scss/_custom-variables/pages';
+
+$user-profile-banner-size: 250px !default;
+$user-profile-banner-sm-size: 150px !default;
+$user-image-size: 120px !default;
+$user-image-sm-size: 100px !default;
+
+.user-profile-header-banner {
+ img {
+ width: 100%;
+ object-fit: cover;
+ height: $user-profile-banner-size;
+ }
+}
+.user-profile-header {
+ margin-top: -2rem;
+ .user-profile-img {
+ border: 5px solid;
+ width: $user-image-size;
+ }
+}
+
+//Light style
+@if $enable-light-style {
+ .light-style {
+ .user-profile-header .user-profile-img {
+ border-color: light.$white;
+ }
+ }
+}
+
+//Dark style
+@if $enable-dark-style {
+ .dark-style {
+ .user-profile-header .user-profile-img {
+ border-color: dark.$card-bg;
+ }
+ }
+}
+
+// Datatable search margin
+.dataTables_wrapper {
+ .card-header .dataTables_filter label {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+}
+
+// Responsive style
+@include light.media-breakpoint-down(md) {
+ .user-profile-header-banner {
+ img {
+ height: $user-profile-banner-sm-size;
+ }
+ }
+ .user-profile-header {
+ .user-profile-img {
+ width: $user-image-sm-size;
+ }
+ }
+}
diff --git a/resources/scss/pages/page-user-view.scss b/resources/scss/pages/page-user-view.scss
new file mode 100644
index 0000000..c4f73cf
--- /dev/null
+++ b/resources/scss/pages/page-user-view.scss
@@ -0,0 +1,104 @@
+// * Help center
+// *******************************************************************************
+
+@use '../../assets/vendor/scss/_bootstrap-extended/include' as light;
+@use '../../assets/vendor/scss/_bootstrap-extended/include-dark' as dark;
+@import '../../assets/vendor/scss/_custom-variables/pages';
+
+.user-card {
+ .user-info-title {
+ min-width: 100px;
+ }
+}
+
+.card.primary-shadow {
+ box-shadow: 0 0.125rem 0.375rem 0 rgba(light.$primary, 0.3) !important;
+}
+// Light style
+@if $enable-light-style {
+ .light-style {
+ @include light.media-breakpoint-up(xl) {
+ .user-card {
+ .border-container-lg {
+ border-right: 1px solid light.$border-color;
+ }
+ }
+ @include app-rtl-style() {
+ .user-card {
+ .border-container-lg {
+ border-right: 0;
+ border-left: 1px solid light.$border-color;
+ }
+ }
+ }
+ }
+ @include light.media-breakpoint-down(xl) {
+ .user-card {
+ .border-container-lg {
+ padding-bottom: 1rem;
+ }
+ }
+ }
+ @include light.media-breakpoint-up(sm) {
+ .user-card {
+ .border-container {
+ border-right: 1px solid light.$border-color;
+ }
+ }
+ .timeline {
+ .break-text {
+ width: calc(100% - 90px);
+ }
+ }
+ @include app-rtl-style() {
+ .user-card {
+ .border-container {
+ border-right: 0;
+ border-left: 1px solid light.$border-color;
+ }
+ }
+ }
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ @include dark.media-breakpoint-up(lg) {
+ .user-card {
+ .border-container-lg {
+ border-right: 1px solid dark.$border-color;
+ }
+ }
+ @include app-rtl-style() {
+ .user-card {
+ .border-container-lg {
+ border-right: 0;
+ border-left: 1px solid dark.$border-color;
+ }
+ }
+ }
+ }
+ @include dark.media-breakpoint-up(sm) {
+ .user-card {
+ .border-container {
+ border-right: 1px solid dark.$border-color;
+ }
+ }
+ .timeline {
+ .break-text {
+ width: calc(100% - 90px);
+ }
+ }
+ @include app-rtl-style() {
+ .user-card {
+ .border-container {
+ border-right: 0;
+ border-left: 1px solid dark.$border-color;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/resources/views/admin-settings/smtp-settings.blade.php b/resources/views/admin-settings/smtp-settings.blade.php
new file mode 100644
index 0000000..589818f
--- /dev/null
+++ b/resources/views/admin-settings/smtp-settings.blade.php
@@ -0,0 +1,36 @@
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Servidor de correo SMTP')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite('vendor/koneko/laravel-vuexy-admin/resources/js/pages/smtp-settings-scripts.js')
+@endpush
+
+@section('content')
+
+
+
+ @livewire('mail-smtp-settings')
+
+
+
+
+ @livewire('mail-sender-response-settings')
+
+
+
+@endsection
diff --git a/resources/views/admin-settings/webapp-general-settings.blade.php b/resources/views/admin-settings/webapp-general-settings.blade.php
new file mode 100644
index 0000000..5794f2a
--- /dev/null
+++ b/resources/views/admin-settings/webapp-general-settings.blade.php
@@ -0,0 +1,30 @@
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Ajustes generales')
+
+@push('page-script')
+ @vite('vendor/koneko/laravel-vuexy-admin/resources/js/pages/admin-settings-scripts.js')
+@endpush
+
+@section('content')
+
+
+
+
+ @livewire('application-settings')
+
+
+
+
+
+ @livewire('general-settings')
+
+
+
+
+
+ @livewire('interface-settings')
+
+
+
+@endsection
diff --git a/resources/views/auth/auth-register-multisteps.blade.php b/resources/views/auth/auth-register-multisteps.blade.php
new file mode 100644
index 0000000..30d04e8
--- /dev/null
+++ b/resources/views/auth/auth-register-multisteps.blade.php
@@ -0,0 +1,356 @@
+@php
+$customizerHidden = 'customizer-hide';
+$configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Multi Steps Sign-up - Pages')
+
+@section('vendor-style')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bs-stepper/bs-stepper.scss',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.scss',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+])
+@endsection
+
+@push('page-style')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+])
+@endsection
+
+@section('vendor-script')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/cleavejs/cleave.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/cleavejs/cleave-phone.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/bs-stepper/bs-stepper.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/select2/select2.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+])
+@endsection
+
+@push('page-script')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth-multisteps.js'
+])
+@endpush
+
+@section('content')
+
+
+
+@endsection
diff --git a/resources/views/auth/auth-two-steps-basic.blade.php b/resources/views/auth/auth-two-steps-basic.blade.php
new file mode 100644
index 0000000..21859a5
--- /dev/null
+++ b/resources/views/auth/auth-two-steps-basic.blade.php
@@ -0,0 +1,86 @@
+@php
+$customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Two Steps Verifications Basic - Pages')
+
+@section('vendor-style')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+])
+@endsection
+
+@push('page-style')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+])
+@endsection
+
+@section('vendor-script')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/cleavejs/cleave.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+])
+@endsection
+
+@push('page-script')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth-two-steps.js'
+])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+
+
+
Two Step Verification 💬
+
+ We sent a verification code to your mobile. Enter the code from the mobile in the field below.
+ ******1234
+
+
Type your 6 digit security code
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/auth-two-steps-cover.blade.php b/resources/views/auth/auth-two-steps-cover.blade.php
new file mode 100644
index 0000000..e1762ab
--- /dev/null
+++ b/resources/views/auth/auth-two-steps-cover.blade.php
@@ -0,0 +1,96 @@
+@php
+$customizerHidden = 'customizer-hide';
+$configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Two Steps Verifications Cover - Pages')
+
+@section('vendor-style')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+])
+@endsection
+
+@push('page-style')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+])
+@endsection
+
+@section('vendor-script')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/cleavejs/cleave.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+])
+@endsection
+
+@push('page-script')
+@vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth-two-steps.js'
+])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+ {{ config('koneko.templateName') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Two Step Verification 💬
+
+ We sent a verification code to your mobile. Enter the code from the mobile in the field below.
+ ******1234
+
+
Type your 6 digit security code
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/auth-verify-email-basic.blade.php b/resources/views/auth/auth-verify-email-basic.blade.php
new file mode 100644
index 0000000..5f7a85c
--- /dev/null
+++ b/resources/views/auth/auth-verify-email-basic.blade.php
@@ -0,0 +1,47 @@
+@php
+$customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Verify Email Basic - Pages')
+
+@push('page-style')
+
+@vite('vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss')
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
Verify your email ✉️
+
+ Account activation link sent to your email address: hello@example.com Please follow the link inside to continue.
+
+
+ Skip for now
+
+
Didn't get the mail?
+
+ Resend
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/auth-verify-email-cover.blade.php b/resources/views/auth/auth-verify-email-cover.blade.php
new file mode 100644
index 0000000..14ebe31
--- /dev/null
+++ b/resources/views/auth/auth-verify-email-cover.blade.php
@@ -0,0 +1,57 @@
+@php
+$customizerHidden = 'customizer-hide';
+$configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Verify Email Cover - Pages')
+
+@push('page-style')
+
+@vite('vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss')
+@endsection
+
+@section('content')
+
+@endsection
diff --git a/resources/views/auth/forgot-password-basic.blade.php b/resources/views/auth/forgot-password-basic.blade.php
new file mode 100644
index 0000000..5a02f77
--- /dev/null
+++ b/resources/views/auth/forgot-password-basic.blade.php
@@ -0,0 +1,97 @@
+@php
+ $customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Recuperar Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js'
+ ])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
¿Olvidaste tu Contraseña? 🔒
+
Ingresa tu correo electrónico y te enviaremos instrucciones para restablecer tu contraseña
+
+ @if (session('status'))
+
+ {{ session('status') }}
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/forgot-password-cover.blade.php b/resources/views/auth/forgot-password-cover.blade.php
new file mode 100644
index 0000000..4b0d9c2
--- /dev/null
+++ b/resources/views/auth/forgot-password-cover.blade.php
@@ -0,0 +1,104 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Recuperar Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js'
+ ])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+ {{ $_admin['app_name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
¿Olvidaste tu Contraseña? 🔒
+
Ingresa tu correo electrónico y te enviaremos instrucciones para restablecer tu contraseña
+
+ @if (session('status'))
+
+ {{ session('status') }}
+
+ @endif
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/login-basic.blade.php b/resources/views/auth/login-basic.blade.php
new file mode 100644
index 0000000..ff5236c
--- /dev/null
+++ b/resources/views/auth/login-basic.blade.php
@@ -0,0 +1,134 @@
+@php
+use Laravel\Fortify\Features;
+
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Iniciar sesión')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/vuexy-admin/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/vuexy-admin/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/vuexy-admin/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/vuexy-admin/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/vuexy-admin/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/vuexy-admin/js/auth/pages-auth.js'
+ ])
+@endpush
+
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
¡Bienvenido a {{ $_admin['app_name'] }}! 👋
+
Inicie sesión en su cuenta y comience la aventura
+
+
+
+
+ @if (Features::enabled(Features::registration()))
+ ¿Nuevo en nuestra plataforma?
+
+ Crea una cuenta
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/login-cover.blade.php b/resources/views/auth/login-cover.blade.php
new file mode 100644
index 0000000..1604ca5
--- /dev/null
+++ b/resources/views/auth/login-cover.blade.php
@@ -0,0 +1,133 @@
+@php
+ use Laravel\Fortify\Features;
+
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Iniciar sesión')
+
+@section('vendor-style')
+ @vite('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss')
+@endsection
+
+@push('page-style')
+ @vite('vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss')
+@endpush
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite('vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js')
+@endpush
+
+@section('content')
+
+
+
+
+
+
+ {{ $_admin['app_name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
¡Bienvenido a {{ $_admin['app_name'] }}! 👋
+
Inicie sesión en su cuenta y comience la aventura
+
+
+
+
+ @if (Features::enabled(Features::registration()))
+ ¿Nuevo en nuestra plataforma?
+
+ Crea una cuenta
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/register-basic.blade.php b/resources/views/auth/register-basic.blade.php
new file mode 100644
index 0000000..3e6be29
--- /dev/null
+++ b/resources/views/auth/register-basic.blade.php
@@ -0,0 +1,151 @@
+@php
+ $customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Registro de usuarios')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js'
+ ])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
Empieza tu aventura 🚀
+
¡Gestiona tu aplicación de manera sencilla y divertida!
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/register-cover.blade.php b/resources/views/auth/register-cover.blade.php
new file mode 100644
index 0000000..1097b6b
--- /dev/null
+++ b/resources/views/auth/register-cover.blade.php
@@ -0,0 +1,132 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Registro de usuarios')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js'
+ ])
+@endpush
+
+@section('content')
+
+@endsection
diff --git a/resources/views/auth/reset-password-basic.blade.php b/resources/views/auth/reset-password-basic.blade.php
new file mode 100644
index 0000000..98100a5
--- /dev/null
+++ b/resources/views/auth/reset-password-basic.blade.php
@@ -0,0 +1,130 @@
+@php
+ $customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Restablecer Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js'
+ ])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
Restablecer Contraseña 🔒
+
Tu nueva contraseña debe ser diferente de las contraseñas utilizadas anteriormente
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/auth/reset-password-cover.blade.php b/resources/views/auth/reset-password-cover.blade.php
new file mode 100644
index 0000000..0fd555d
--- /dev/null
+++ b/resources/views/auth/reset-password-cover.blade.php
@@ -0,0 +1,137 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Restablecer Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@push('page-style')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/scss/pages/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/popular.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@push('page-script')
+ @vite([
+ 'vendor/koneko/laravel-vuexy-admin/resources/js/auth/pages-auth.js'
+ ])
+@endpush
+
+@section('content')
+
+
+
+
+
+
+ {{ $_admin['app_name'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Restablecer Contraseña 🔒
+
Tu nueva contraseña debe ser diferente de las contraseñas utilizadas anteriormente
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/cache-manager/index.blade.php b/resources/views/cache-manager/index.blade.php
new file mode 100644
index 0000000..8350c85
--- /dev/null
+++ b/resources/views/cache-manager/index.blade.php
@@ -0,0 +1,41 @@
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Ajustes de caché')
+
+@push('page-script')
+ @vite('vendor/koneko/laravel-vuexy-admin/resources/js/pages/cache-manager-scripts.js')
+@endpush
+
+@section('content')
+
+
+
+ @livewire('cache-stats')
+
+
+ @livewire('session-stats')
+
+
+
+
+ @livewire('cache-functions')
+
+
+ @if($configCache['redisInUse'])
+
+
+ @livewire('redis-stats')
+
+
+ @endif
+ @if($configCache['memcachedInUse'])
+
+
+ @livewire('memcached-stats')
+
+
+ @endif
+
+
+
+@endsection
diff --git a/resources/views/components/button/basic.blade.php b/resources/views/components/button/basic.blade.php
new file mode 100644
index 0000000..f4e84bb
--- /dev/null
+++ b/resources/views/components/button/basic.blade.php
@@ -0,0 +1,63 @@
+@props([
+ 'type' => 'button', // Tipo de botón: button, submit, reset (solo para botones)
+ 'href' => null, // URL si es un enlace
+ 'route' => null, // URL si es un enlace
+ 'target' => '_self', // Target del enlace (_self, _blank, etc.)
+ 'label' => '', // Texto del botón
+ 'size' => 'md', // Tamaño: xs, sm, md, lg, xl
+ 'variant' => 'primary', // Color del botón (primary, secondary, success, danger, warning, info, dark)
+ 'labelStyle' => false, // Usa `btn-label-*`
+ 'outline' => false, // Habilitar estilo outline
+ 'textStyle' => false, // Habilitar estilo de texto
+ 'rounded' => false, // Habilitar bordes redondeados
+ 'block' => false, // Convertir en botón de ancho completo
+ 'waves' => true, // Habilitar efecto Vuexy (waves-effect)
+ 'icon' => '', // Clases del ícono (ej: 'ti ti-home')
+ 'iconOnly' => false, // Botón solo con ícono
+ 'iconPosition' => 'left', // Posición del ícono: left, right
+ 'active' => false, // Activar estado de botón
+ 'disabled' => false, // Deshabilitar botón
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]), // Atributos adicionales
+])
+
+@php
+ // Generar clases dinámicas
+ $classes = [
+ 'btn',
+ $labelStyle ? "btn-label-$variant" : '',
+ $outline ? "btn-outline-$variant" : '',
+ $textStyle ? "btn-text-$variant" : '',
+ $labelStyle || $outline || $textStyle ? '' : "btn-$variant",
+ $rounded ? 'rounded-pill' : '',
+ $block ? 'd-block w-100' : '',
+ $waves ? 'waves-effect' : '',
+ $size !== 'md' ? "btn-$size" : '',
+ $active ? 'active' : '',
+ $disabled ? 'disabled' : '',
+ $iconOnly ? 'btn-icon' : '',
+ ];
+@endphp
+
+@if ($href || $route)
+ {{-- Si es un enlace --}}
+
merge(['class' => implode(' ', array_filter($classes)), 'href' => ($href?? route($route)), 'target' => $target]) }}>
+ @if ($icon && $iconPosition === 'left')
+
+ @endif
+ {{ $label }}
+ @if ($icon && $iconPosition === 'right')
+
+ @endif
+
+@else
+ {{-- Si es un botón --}}
+
merge(['class' => implode(' ', array_filter($classes))]) }}>
+ @if ($icon && $iconPosition === 'left')
+
+ @endif
+ {{ $label }}
+ @if ($icon && $iconPosition === 'right')
+
+ @endif
+
+@endif
diff --git a/resources/views/components/button/group.blade.php b/resources/views/components/button/group.blade.php
new file mode 100644
index 0000000..d6a9658
--- /dev/null
+++ b/resources/views/components/button/group.blade.php
@@ -0,0 +1,46 @@
+@props([
+ 'buttons' => [], // Lista de botones en formato de array
+ 'toolbar' => false, // Si es un grupo de botones estilo "toolbar"
+ 'nesting' => false, // Si hay un grupo anidado con dropdown
+ 'class' => '', // Clases adicionales
+])
+
+@php
+ // Determinar si es un toolbar o un grupo simple
+ $groupClass = $toolbar ? 'btn-toolbar' : 'btn-group';
+@endphp
+
+
+ @foreach($buttons as $button)
+ @if(isset($button['dropdown']))
+ {{-- Botón con dropdown anidado --}}
+
+
+ @if(isset($button['icon'])) @endif
+ {{ $button['label'] ?? 'Dropdown' }}
+
+
+
+ @else
+ {{-- Botón normal o ancla --}}
+ @if(isset($button['href']))
+
+ @if(isset($button['icon'])) @endif
+ {{ $button['label'] }}
+
+ @else
+
+ @if(isset($button['icon'])) @endif
+ {{ $button['label'] }}
+
+ @endif
+ @endif
+ @endforeach
+
diff --git a/resources/views/components/button/index-off-canvas.blade.php b/resources/views/components/button/index-off-canvas.blade.php
new file mode 100644
index 0000000..8de62cd
--- /dev/null
+++ b/resources/views/components/button/index-off-canvas.blade.php
@@ -0,0 +1,30 @@
+@php
+ use Illuminate\Support\Str;
+@endphp
+
+@props([
+ 'label' => '',
+ 'tagName' => '',
+ 'icon' => 'ti ti-pencil-plus',
+])
+
+@php
+ $tagOffcanvas = ucfirst(Str::camel($tagName));
+ $helperTag = Str::kebab($tagName);
+
+ $ariaControls = "'offcanvas{$tagOffcanvas}";
+ $dataBsToggle = 'offcanvas';
+ $dataBsTarget = "#offcanvas{$tagOffcanvas}";
+ $onclick = "window.formHelpers['{$helperTag}'].reloadOffcanvas('create')";
+@endphp
+
+
+ {{ ucfirst($label) }}
+
diff --git a/resources/views/components/button/offcanvas-buttons.blade.php b/resources/views/components/button/offcanvas-buttons.blade.php
new file mode 100644
index 0000000..4fa40e0
--- /dev/null
+++ b/resources/views/components/button/offcanvas-buttons.blade.php
@@ -0,0 +1,18 @@
+@props([
+ 'tagName' => '',
+ 'mode' => 'create',
+])
+
+@php
+ $helperTag = Str::kebab($tagName);
+
+ $onclick = "window.formHelpers['{$helperTag}'].reloadOffcanvas('reset')";
+@endphp
+
+
+
+ Cancelar
+
+@if($mode == 'delete')
+
+@endif
diff --git a/resources/views/components/card/basic.blade.php b/resources/views/components/card/basic.blade.php
new file mode 100644
index 0000000..6302a66
--- /dev/null
+++ b/resources/views/components/card/basic.blade.php
@@ -0,0 +1,76 @@
+@props([
+ 'title' => '',
+ 'subtitle' => '',
+ 'image' => null,
+ 'bgColor' => '', // primary, secondary, success, danger, etc.
+ 'borderColor' => '', // primary, secondary, etc.
+ 'textColor' => 'text-dark',
+ 'shadow' => true, // true / false
+ 'dropdown' => [], // Opciones para el menú
+ 'footer' => '',
+ 'footerClass' => '', // Clase CSS personalizada para el footer
+ 'footerAlign' => 'start', // Alineación: start, center, end
+ 'footerButtons' => [], // Botones de acción
+ 'class' => 'mb-6',
+])
+
+@php
+ $cardClass = 'card ' . ($shadow ? '' : 'shadow-none') . ' ' . ($bgColor ? "bg-$bgColor text-white" : '') . ' ' . ($borderColor ? "border border-$borderColor" : '') . " $class";
+ $footerAlignment = match ($footerAlign) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => 'text-start'
+ };
+@endphp
+
+
+ @if ($image)
+
+ @endif
+
+ @if ($title || $subtitle || $dropdown)
+
+ @endif
+
+
+ {{ $slot }}
+
+
+ {{-- Footer flexible --}}
+ @if ($footer || !empty($footerButtons))
+
+ @endif
+
diff --git a/resources/views/components/file/dropzone.blade.php b/resources/views/components/file/dropzone.blade.php
new file mode 100644
index 0000000..c8d8dab
--- /dev/null
+++ b/resources/views/components/file/dropzone.blade.php
@@ -0,0 +1,70 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelo para Livewire
+ 'model' => '',
+
+ // Etiqueta y Texto de ayuda
+ 'message' => '',
+ 'note' => '',
+
+ // Clases generales
+ 'size' => 'md', // Tamaño del textarea (xxs, xs, sm, md)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+])
+
+@php
+ // **Configuración de Name, ID y Model**
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $attributes->get('name', $livewireModel);
+ $inputId = $attributes->get('id', $name . '_' . $uid);
+
+ // **Manejo de errores**
+ $errorKey = $livewireModel ?: $name;
+ $hasError = $errors->has($errorKey);
+ $errorClass = $hasError ? 'is-invalid' : '';
+
+ // **Clases dinámicas**
+ $sizeClassDropzone = match ($size) {
+ 'sm' => 'dropzone-sm',
+ 'xs' => 'dropzone-xs',
+ 'md' => 'dropzone-md',
+ default => '',
+ };
+
+ $sizeClassButton = match ($size) {
+ 'sm' => 'btn-sm',
+ 'xs' => 'btn-xs',
+ default => '',
+ };
+@endphp
+
+
+
+
+
+
+ {{-- Mensaje de error --}}
+ @if ($hasError)
+
{{ $errors->first($errorKey) }}
+ @endif
+
diff --git a/resources/views/components/form/checkbox-group.blade.php b/resources/views/components/form/checkbox-group.blade.php
new file mode 100644
index 0000000..59840ce
--- /dev/null
+++ b/resources/views/components/form/checkbox-group.blade.php
@@ -0,0 +1,148 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelos para Livewire
+ 'checkboxModel' => '',
+ 'textModel' => '',
+
+ // Etiqueta y clases de la etiqueta
+ 'label' => '',
+ 'labelClass' => '',
+
+ // Clases generales
+ 'align' => 'start',
+ 'size' => '', // Tamaño del input (sm, lg)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Elementos opcionales antes/después del input
+ 'prefix' => null,
+ 'suffix' => null,
+
+ // Íconos dentro del input
+ 'icon' => null, // Ícono fijo
+ 'clickableIcon' => null, // Ícono con botón
+
+ // Configuración del checkbox
+ 'checked' => false,
+ 'disabled' => false,
+
+ // Configuración del input de texto
+ 'disableOnOffCheckbox' => true, // Deshabilita input hasta que el checkbox esté activo
+ 'focusOnCheck' => true, // Hace foco en el input al activar el checkbox
+
+ // Texto de ayuda
+ 'helperText' => '',
+
+ // Atributos adicionales para el input de texto
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Generación de Name, ID y Model**
+ $livewireCheckbox = $checkboxModel ? "wire:model=$checkboxModel" : '';
+ $livewireText = $textModel ? "wire:model=$textModel" : '';
+
+ $nameCheckbox = $checkboxModel;
+ $nameText = $attributes->get('name', $textModel);
+
+ $checkboxId = $attributes->get('id', 'chk_' . $uid);
+ $textInputId = 'txt_' . $uid;
+
+ // **Placeholder del input de texto**
+ $placeholder = $attributes->get('placeholder', 'Ingrese información');
+
+ // **Clases dinámicas**
+ $sizeClass = match ($size) {
+ 'sm' => 'form-control-sm',
+ 'lg' => 'form-control-lg',
+ default => '',
+ };
+
+ $fullClass = trim("form-control $sizeClass");
+
+ // **Fusionar atributos del input de texto**
+ $inputAttributes = $attributes->merge([
+ 'id' => $textInputId,
+ 'name' => $nameText,
+ 'placeholder' => $placeholder,
+ ])->class($fullClass);
+@endphp
+
+{{-- ============================ CHECKBOX CON INPUT GROUP ============================ --}}
+
+ @if ($label)
+
{{ $label }}
+ @endif
+
+
+
+ {{-- Texto de ayuda opcional --}}
+ @if ($helperText)
+
{{ $helperText }}
+ @endif
+
+
+{{-- ============================ JAVASCRIPT PURO ============================ --}}
+
diff --git a/resources/views/components/form/checkbox.blade.php b/resources/views/components/form/checkbox.blade.php
new file mode 100644
index 0000000..059efa1
--- /dev/null
+++ b/resources/views/components/form/checkbox.blade.php
@@ -0,0 +1,133 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelo de Livewire (si aplica)
+ 'model' => '',
+
+ // Etiqueta y clases de la etiqueta
+ 'label' => '',
+ 'labelClass' => '',
+
+ // Clases generales
+ 'align' => 'start',
+ 'size' => 'md', // Tamaño del checkbox/switch: sm, md, lg
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Estilos del checkbox
+ 'switch' => false, // Cambiar a modo switch
+ 'switchType' => 'default', // 'default' o 'square'
+ 'color' => 'primary', // Bootstrap color: primary, secondary, success, danger, etc.
+ 'withIcon' => false, // Si el switch usa íconos en On/Off
+
+ // Diseño de disposición
+ 'inline' => false, // Modo inline en lugar de bloque
+
+ // Texto de ayuda
+ 'helperText' => '',
+
+ // Atributos adicionales
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Configuración de valores base**
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $attributes->get('name', $livewireModel);
+ $inputId = $attributes->get('id', $name . '_' . $uid);
+ $checked = $attributes->get('checked', false);
+ $disabled = $attributes->get('disabled', false);
+
+ // **Manejo de errores**
+ $errorKey = $livewireModel ?: $name;
+ $hasError = $errors->has($errorKey);
+ $errorClass = $hasError ? 'is-invalid' : '';
+
+ // **Clases dinámicas**
+ $alignClass = match ($align) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => '',
+ };
+
+ $sizeClass = match ($size) {
+ 'sm' => 'switch-sm',
+ 'lg' => 'switch-lg',
+ default => '',
+ };
+
+ $switchTypeClass = $switchType === 'square' ? 'switch-square' : '';
+ $switchColorClass = "switch-{$color}";
+ $checkColorClass = "form-check-{$color}";
+
+ // **Fusionar atributos con clases dinámicas**
+ $checkboxAttributes = $attributes->merge([
+ 'id' => $inputId,
+ 'name' => $name,
+ 'type' => 'checkbox',
+ ]);
+
+ // **Detectar si se usa input-group**
+ $requiresInputGroup = $attributes->get('inline');
+@endphp
+
+@if ($switch)
+ {{-- ============================ MODO SWITCH ============================ --}}
+
+
+ class("switch-input $errorClass")->toHtml() !!}
+ />
+ {{-- El Switch Slider --}}
+
+ @if ($withIcon)
+
+
+
+
+
+
+ @endif
+
+ {{-- Etiqueta textual a la derecha del switch --}}
+
+ {{ $label }}
+
+
+
+ {{-- Texto de ayuda y error --}}
+ @isset($helperText)
+
{{ $helperText }}
+ @endisset
+ @if ($hasError)
+
{{ $errors->first($errorKey) }}
+ @endif
+
+
+@else
+ {{-- ============================ MODO CHECKBOX ============================ --}}
+
+@endif
diff --git a/resources/views/components/form/custom-option.blade.php b/resources/views/components/form/custom-option.blade.php
new file mode 100644
index 0000000..e814ee8
--- /dev/null
+++ b/resources/views/components/form/custom-option.blade.php
@@ -0,0 +1,54 @@
+@props([
+ 'uid' => uniqid(),
+ 'id' => '',
+ 'model' => '',
+ 'name' => '',
+ 'type' => 'checkbox', // checkbox o radio
+ 'title' => '',
+ 'description' => '',
+ 'icon' => null, // Clases de iconos (ej: ti ti-rocket)
+ 'image' => null, // URL de imagen
+ 'checked' => false,
+ 'disabled' => false,
+ 'helperText' => '', // Texto de ayuda opcional
+])
+
+@php
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $name ?: $livewireModel;
+ $inputId = $id ?: ($uid ? $name . '_' . $uid : $name);
+ $errorClass = $errors->has($model) ? 'is-invalid' : '';
+ $checkedAttribute = $checked ? 'checked' : '';
+ $visualContent = $icon
+ ? "
"
+ : ($image ? "
" : '');
+@endphp
+
+
diff --git a/resources/views/components/form/form.blade.php b/resources/views/components/form/form.blade.php
new file mode 100644
index 0000000..3d75b77
--- /dev/null
+++ b/resources/views/components/form/form.blade.php
@@ -0,0 +1,48 @@
+@props([
+ 'id' => uniqid(), // ID único del formulario
+ 'uniqueId' => '', // ID único del formulario
+ 'mode' => 'create', // Modo actual ('create', 'edit', 'delete')
+ 'method' => 'POST', // Método del formulario (POST, GET, PUT, DELETE)
+ 'action' => '', // URL de acción
+ 'enctype' => false, // Para envío de archivos
+ 'wireSubmit' => false, // Usar wire:submit.prevent
+ 'class' => '', // Clases adicionales para el formulario
+ 'actionPosition' => 'bottom', // Posición de acciones: top, bottom, both, none
+])
+
+@php
+ $formAttributes = [
+ 'id' => $id,
+ 'method' => $method,
+ 'action' => $action,
+ 'class' => "fv-plugins-bootstrap5 $class",
+ ];
+
+ if ($wireSubmit) {
+ $formAttributes['wire:submit.prevent'] = $wireSubmit;
+ }
+
+ if ($enctype) {
+ $formAttributes['enctype'] = 'multipart/form-data';
+ }
+@endphp
+
+
diff --git a/resources/views/components/form/input.blade copy.php b/resources/views/components/form/input.blade copy.php
new file mode 100644
index 0000000..6f0f635
--- /dev/null
+++ b/resources/views/components/form/input.blade copy.php
@@ -0,0 +1,184 @@
+@props([
+ 'uid' => uniqid(),
+
+
+ 'model' => '',
+
+
+ 'label' => '',
+ 'labelClass' => '',
+
+
+ 'class' => '',
+
+ 'align' => 'start',
+ 'size' => '',
+ 'mb-0' => false,
+
+
+
+
+
+ 'parentClass' => '',
+
+
+ 'prefix' => null,
+ 'suffix' => null,
+
+ 'icon' => null,
+ 'clickableIcon' => null,
+
+ 'inline' => false,
+
+ 'labelCol' => 4,
+ 'inputCol' => 8,
+
+ 'floatLabel' => false,
+ 'helperText' => '',
+
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]), // Atributos adicionales
+])
+
+@php
+ // Configuración dinámica de atributos y clases CSS
+ $livewireModel = $attributes->get('wire:model', $model); // Permitir uso directo de wire:model en el atributo
+ $name = $name ?: $livewireModel; // Si no se proporciona el nombre, toma el nombre del modelo
+ $inputId = $id ?: ($uid ? $name . '_' . $uid : $name); // ID generado si no se proporciona uno
+
+
+ // Obtener los atributos actuales en un array
+ $attributesArray = array_merge([
+ 'type' => $type,
+ 'id' => $inputId,
+ 'name' => $name,
+ ]);
+
+
+ // Agregar wire:model solo si existe
+ if ($livewireModel) {
+ $attributesArray['wire:model'] = $livewireModel;
+ }
+
+
+ $attributesArray = array_merge($attributesArray, $attributes->getAttributes());
+
+
+ // Reconstruir el ComponentAttributeBag con los atributos modificados
+ $inputAttributes = new \Illuminate\View\ComponentAttributeBag($attributesArray);
+
+ dump($inputAttributes);
+
+
+ // Manejo de errores de validación
+ $errorKey = $livewireModel ?: $name;
+ $errorClass = $errors->has($errorKey) ? 'is-invalid' : '';
+
+ // Definir el tamaño del input basado en la clase seleccionada
+ $sizeClass = $size === 'small' ? 'form-control-sm' : ($size === 'large' ? 'form-control-lg' : '');
+
+ // Alineación del texto
+ $alignClass = match ($align) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => ''
+ };
+
+ // Clases combinadas para el input
+ $fullClass = trim("form-control $sizeClass $alignClass $errorClass $class");
+
+ // Detectar si se necesita usar input-group
+ $requiresInputGroup = $prefix || $suffix || $icon || $clickableIcon;
+@endphp
+
+{{-- Input oculto sin estilos --}}
+@if($type === 'hidden')
+
+@elseif($floatLabel)
+ {{-- Input con etiqueta flotante --}}
+
+@else
+ {{-- Input con formato clásico --}}
+
+ @isset($label)
+
{{ $label }}
+ @endisset
+
+
+@endif
diff --git a/resources/views/components/form/input.blade.php b/resources/views/components/form/input.blade.php
new file mode 100644
index 0000000..0e6b77e
--- /dev/null
+++ b/resources/views/components/form/input.blade.php
@@ -0,0 +1,169 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelo de Livewire
+ 'model' => '',
+
+ // Etiqueta y Clases
+ 'label' => '',
+ 'labelClass' => '',
+ 'placeholder' => '',
+
+ // Clases Generales
+ 'align' => 'start',
+ 'size' => '', // Tamaño del input (sm, lg)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Elementos opcionales antes/después del input
+ 'prefix' => null,
+ 'suffix' => null,
+
+ // Íconos dentro del input
+ 'icon' => null,
+ 'clickableIcon' => null,
+
+ // Configuración especial
+ 'phoneMode' => false, // "national", "international", "both"
+
+ // Diseño de disposición (columnas)
+ 'inline' => false,
+ 'labelCol' => 4,
+ 'inputCol' => 8,
+
+ // Configuración de etiquetas flotantes y texto de ayuda
+ 'floatLabel' => false,
+ 'helperText' => '',
+
+ // Atributos adicionales
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Configuración de Name, ID y Model**
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $attributes->get('name', $livewireModel);
+ $inputId = $attributes->get('id', $name . '_' . $uid);
+ $type = $attributes->get('type', 'text');
+
+ // **Definir formato de teléfono según `phoneMode`**
+ if ($phoneMode) {
+ $type = 'tel';
+ $attributes = $attributes->merge([
+ 'autocomplete' => 'tel',
+ 'inputmode' => 'tel',
+ ]);
+
+ switch ($phoneMode) {
+ case 'national':
+ $attributes = $attributes->merge([
+ 'pattern' => '^(?:\D*\d){10,}$',
+ 'placeholder' => $placeholder !== false ? ($placeholder ?: 'Ej. (55) 1234-5678') : null,
+ ]);
+ break;
+
+ case 'international':
+ $attributes = $attributes->merge([
+ 'pattern' => '^\+?[1-9]\d{1,14}$',
+ 'placeholder' => $placeholder !== false ? ($placeholder ?: 'Ej. +52 1 55 1234-5678') : null,
+ ]);
+ break;
+
+ case 'both':
+ $attributes = $attributes->merge([
+ 'pattern' => '(^(?:\D*\d){10,}$)|(^\+?[1-9]\d{1,14}$)',
+ 'placeholder' => $placeholder !== false ? ($placeholder ?: 'Ej. (55) 1234-5678 o +52 1 55 1234-5678') : null,
+ ]);
+ break;
+ }
+ }
+
+ // **Manejo del Placeholder si no lo estableció `phoneMode`**
+ if (!$attributes->has('placeholder')) {
+ if ($placeholder === false) {
+ // No agregar `placeholder`
+ $placeholderAttr = [];
+ } elseif (empty($placeholder)) {
+ // Generar automáticamente desde el `label`
+ $placeholderAttr = ['placeholder' => 'Ingrese ' . strtolower($label)];
+ } else {
+ // Usar `placeholder` definido manualmente
+ $placeholderAttr = ['placeholder' => $placeholder];
+ }
+
+ // Fusionar el placeholder si no fue definido en `phoneMode`
+ $attributes = $attributes->merge($placeholderAttr);
+ }
+
+ // **Manejo de errores**
+ $errorKey = $livewireModel ?: $name;
+ $hasError = $errors->has($errorKey);
+ $errorClass = $hasError ? 'is-invalid' : '';
+
+ // **Clases dinámicas**
+ $sizeClass = match ($size) {
+ 'sm' => 'form-control-sm',
+ 'lg' => 'form-control-lg',
+ default => '',
+ };
+
+ $alignClass = match ($align) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => '',
+ };
+
+ // **Fusionar atributos**
+ $inputAttributes = $attributes->merge([
+ 'type' => $type,
+ 'id' => $inputId,
+ 'name' => $name,
+ ])->class("form-control $sizeClass $alignClass $errorClass");
+@endphp
+
+{{-- Estructura del Input --}}
+
+ {{-- Etiqueta --}}
+ @if ($label)
+
{{ $label }}
+ @endif
+
+ {{-- Input con Prefijos, Sufijos o Íconos --}}
+ @if ($prefix || $suffix || $icon || $clickableIcon)
+
+ @isset($prefix)
+ {{ $prefix }}
+ @endisset
+
+ @isset($icon)
+
+ @endisset
+
+
+
+ @isset($suffix)
+ {{ $suffix }}
+ @endisset
+
+ @isset($clickableIcon)
+
+
+
+ @endisset
+
+ @else
+ {{-- Input Simple --}}
+
+ @endif
+
+ {{-- Texto de ayuda --}}
+ @if ($helperText)
+
{{ $helperText }}
+ @endif
+
+ {{-- Mensajes de error --}}
+ @if ($hasError)
+
{{ $errors->first($errorKey) }}
+ @endif
+
diff --git a/resources/views/components/form/radio-group.blade.php b/resources/views/components/form/radio-group.blade.php
new file mode 100644
index 0000000..23ddab2
--- /dev/null
+++ b/resources/views/components/form/radio-group.blade.php
@@ -0,0 +1,149 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelos para Livewire
+ 'radioModel' => '',
+ 'textModel' => '',
+
+ // Etiqueta y clases de la etiqueta
+ 'label' => '',
+ 'labelClass' => '',
+
+ // Clases generales
+ 'align' => 'start',
+ 'size' => '', // Tamaño del input (sm, lg)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Elementos opcionales antes/después del input
+ 'prefix' => null,
+ 'suffix' => null,
+
+ // Íconos dentro del input
+ 'icon' => null, // Ícono fijo
+ 'clickableIcon' => null, // Ícono con botón
+
+ // Configuración del radio
+ 'checked' => false,
+ 'disabled' => false,
+ 'name' => '', // Grupo del radio
+
+ // Configuración del input de texto
+ 'disableOnOffRadio' => true, // Deshabilita input hasta que el radio esté seleccionado
+ 'focusOnCheck' => true, // Hace foco en el input al seleccionar el radio
+
+ // Texto de ayuda
+ 'helperText' => '',
+
+ // Atributos adicionales para el input de texto
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Generación de Name, ID y Model**
+ $livewireRadio = $radioModel ? "wire:model=$radioModel" : '';
+ $livewireText = $textModel ? "wire:model=$textModel" : '';
+
+ $nameRadio = $attributes->get('name', $radioModel ?: $name);
+ $nameText = $attributes->get('name', $textModel);
+
+ $radioId = $attributes->get('id', 'radio_' . $uid);
+ $textInputId = 'txt_' . $uid;
+
+ // **Placeholder del input de texto**
+ $placeholder = $attributes->get('placeholder', 'Ingrese información');
+
+ // **Clases dinámicas**
+ $sizeClass = match ($size) {
+ 'sm' => 'form-control-sm',
+ 'lg' => 'form-control-lg',
+ default => '',
+ };
+
+ $fullClass = trim("form-control $sizeClass");
+
+ // **Fusionar atributos del input de texto**
+ $inputAttributes = $attributes->merge([
+ 'id' => $textInputId,
+ 'name' => $nameText,
+ 'placeholder' => $placeholder,
+ ])->class($fullClass);
+@endphp
+
+{{-- ============================ RADIO BUTTON CON INPUT GROUP ============================ --}}
+
+ @if ($label)
+
{{ $label }}
+ @endif
+
+
+
+ {{-- Texto de ayuda opcional --}}
+ @if ($helperText)
+
{{ $helperText }}
+ @endif
+
+
+{{-- ============================ JAVASCRIPT PURO ============================ --}}
+
diff --git a/resources/views/components/form/radio.blade.php b/resources/views/components/form/radio.blade.php
new file mode 100644
index 0000000..afaf38e
--- /dev/null
+++ b/resources/views/components/form/radio.blade.php
@@ -0,0 +1,125 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelo de Livewire (si aplica)
+ 'model' => '',
+
+ // Etiqueta y clases de la etiqueta
+ 'label' => '',
+ 'labelClass' => '',
+
+ // Clases generales
+ 'align' => 'start',
+ 'size' => '', // Tamaño del radio (sm, lg)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Modo de visualización
+ 'switch' => false, // Convertir en switch
+ 'switchType' => 'default', // 'default' o 'square'
+ 'color' => 'primary', // Colores personalizados (Bootstrap)
+ 'stacked' => false, // Apilar radios en lugar de inline
+ 'inline' => false, // Mostrar radios en línea
+
+ // Texto de ayuda
+ 'helperText' => '',
+
+ // Atributos adicionales
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Configuración de valores base**
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $attributes->get('name', $livewireModel);
+ $inputId = $attributes->get('id', $name . '_' . $uid);
+ $checked = $attributes->get('checked', false);
+ $disabled = $attributes->get('disabled', false);
+
+ // **Manejo de errores**
+ $errorKey = $livewireModel ?: $name;
+ $hasError = $errors->has($errorKey);
+ $errorClass = $hasError ? 'is-invalid' : '';
+
+ // **Clases dinámicas**
+ $alignClass = match ($align) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => '',
+ };
+
+ $sizeClass = match ($size) {
+ 'sm' => 'form-check-sm',
+ 'lg' => 'form-check-lg',
+ default => '',
+ };
+
+ $switchTypeClass = $switchType === 'square' ? 'switch-square' : '';
+ $switchColorClass = "switch-{$color}";
+ $radioColorClass = "form-check-{$color}";
+
+ // **Fusionar atributos con clases dinámicas**
+ $radioAttributes = $attributes->merge([
+ 'id' => $inputId,
+ 'name' => $name,
+ 'type' => 'radio',
+ ]);
+
+ // **Detectar si se usa `inline` o `stacked`**
+ $layoutClass = $stacked ? 'switches-stacked' : 'form-check';
+@endphp
+
+@if ($switch)
+ {{-- ============================ MODO SWITCH ============================ --}}
+
+
+ class("switch-input $errorClass")->toHtml() !!}
+ />
+ {{-- El Switch Slider --}}
+
+
+
+
+ {{-- Etiqueta textual a la derecha del switch --}}
+
+ {{ $label }}
+
+
+
+ {{-- Texto de ayuda y error --}}
+ @isset($helperText)
+
{{ $helperText }}
+ @endisset
+ @if ($hasError)
+
{{ $errors->first($errorKey) }}
+ @endif
+
+
+@else
+ {{-- ============================ MODO RADIO ============================ --}}
+
+@endif
diff --git a/resources/views/components/form/select.blade copy.php b/resources/views/components/form/select.blade copy.php
new file mode 100644
index 0000000..2617c07
--- /dev/null
+++ b/resources/views/components/form/select.blade copy.php
@@ -0,0 +1,86 @@
+@props([
+ 'uid' => uniqid(),
+ 'id' => '',
+ 'model' => '',
+ 'name' => '',
+ 'label' => '',
+ 'labelClass' => 'form-label',
+ 'placeholder' => '',
+ 'options' => [],
+ 'selected' => null,
+ 'class' => '',
+ 'parentClass' => '',
+ 'multiple' => false,
+ 'disabled' => false,
+ 'prefixLabel' => null,
+ 'suffixLabel' => null,
+ 'buttonBefore' => null,
+ 'buttonAfter' => null,
+ 'inline' => false, // Si es en línea
+ 'labelCol' => 2, // Columnas que ocupa el label (Bootstrap grid)
+ 'inputCol' => 10, // Columnas que ocupa el input (Bootstrap grid)
+ 'helperText' => '', // Texto de ayuda opcional
+ 'select2' => false, // Activar Select2 automáticamente
+])
+
+@php
+ $name = $name ?: $model;
+ $inputId = $id ?: ($uid ? str_replace('.', '_', $name) . '_' . $uid : $name);
+ $placeholder = $placeholder ?: 'Seleccione ' . strtolower($label);
+ $errorClass = $errors->has($model) ? 'is-invalid' : '';
+ $options = is_array($options) ? collect($options) : $options;
+ $select2Class = $select2 ? 'select2' : ''; // Agrega la clase select2 si está habilitado
+@endphp
+
+
+ @if($label != null)
+
{{ $label }}
+ @endif
+
+
+
diff --git a/resources/views/components/form/select.blade.php b/resources/views/components/form/select.blade.php
new file mode 100644
index 0000000..87576cf
--- /dev/null
+++ b/resources/views/components/form/select.blade.php
@@ -0,0 +1,151 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelo de Livewire (si aplica)
+ 'model' => '',
+
+ // Etiqueta y clases de la etiqueta
+ 'label' => '',
+ 'labelClass' => '',
+
+ // Clases generales
+ 'align' => 'start',
+ 'size' => '', // Tamaño del select (small, large)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Activar Select2 automáticamente
+ 'select2' => false,
+
+ // Prefijos y sufijos en input-group
+ 'prefixLabel' => null,
+ 'suffixLabel' => null,
+ 'buttonBefore' => null,
+ 'buttonAfter' => null,
+
+ // Diseño de disposición (columnas)
+ 'inline' => false,
+ 'labelCol' => 4,
+ 'inputCol' => 8,
+
+ // Texto de ayuda
+ 'helperText' => '',
+
+ // Opciones del select
+ 'options' => [],
+
+ // Atributos adicionales
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Configuración de valores base**
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $attributes->get('name', $livewireModel);
+ $inputId = $attributes->get('id', $name . '_' . $uid);
+ $placeholder = $attributes->get('placeholder', 'Seleccione ' . strtolower($label));
+ $selected = $attributes->get('selected', null);
+
+ // **Manejo de errores**
+ $errorKey = $livewireModel ?: $name;
+ $hasError = $errors->has($errorKey);
+ $errorClass = $hasError ? 'is-invalid' : '';
+
+ // **Clases dinámicas**
+ $select2Class = $select2 ? 'select2' : ''; // Agrega la clase `select2` si está habilitado
+ $sizeClass = match ($size) {
+ 'sm' => 'form-select-sm',
+ 'lg' => 'form-select-lg',
+ default => '',
+ };
+ $alignClass = match ($align) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => '',
+ };
+
+ // **Construcción de clases dinámicas**
+ $fullClass = trim("form-select $select2Class $sizeClass $alignClass $errorClass");
+ $fullLabelClass = trim(($inline ? 'col-form-label col-md-' . $labelCol : 'form-label') . ' ' . $labelClass);
+ $containerClass = trim(($inline ? 'row' : '') . ' fv-row ' . ($mb0 ? '' : 'mb-4') . " $alignClass $parentClass");
+
+ // **Fusionar atributos con clases dinámicas**
+ $selectAttributes = $attributes->merge([
+ 'id' => $inputId,
+ 'name' => $name,
+ ])->class($fullClass);
+
+ // **Detectar si se necesita input-group**
+ $requiresInputGroup = $prefixLabel || $suffixLabel || $buttonBefore || $buttonAfter;
+@endphp
+
+
+ {{-- Etiqueta del select --}}
+ @if($label)
+
{{ $label }}
+ @endif
+
+ @if($inline)
+
+ @endif
+
diff --git a/resources/views/components/form/textarea.blade.php b/resources/views/components/form/textarea.blade.php
new file mode 100644
index 0000000..9234034
--- /dev/null
+++ b/resources/views/components/form/textarea.blade.php
@@ -0,0 +1,178 @@
+@props([
+ // Identificador único
+ 'uid' => uniqid(),
+
+ // Modelo para Livewire
+ 'model' => '',
+
+ // Etiqueta y clases de la etiqueta
+ 'label' => '',
+ 'labelClass' => '',
+
+ // Clases generales
+ 'align' => 'start', // Alineación del textarea (start, end)
+ 'size' => 'md', // Tamaño del textarea (sm, md, lg)
+ 'mb0' => false, // Remover margen inferior
+ 'parentClass' => '',
+
+ // Elementos opcionales antes/después del textarea
+ 'prefix' => null,
+ 'suffix' => null,
+
+ // Íconos dentro del input
+ 'prefixIcon' => null, // Ícono fijo a la izquierda
+ 'prefixClickableIcon' => null, // Ícono con botón a la izquierda
+ 'suffixIcon' => null, // Ícono fijo a la derecha
+ 'suffixClickableIcon' => null, // Ícono con botón a la derecha
+
+ // Configuración del textarea
+ 'rows' => 3,
+ 'maxlength' => null,
+ 'autosize' => false, // Autoajuste de altura
+ 'resize' => true, // Permitir redimensionar
+
+ // Soporte para etiquetas flotantes
+ 'floating' => false, // Si la etiqueta es flotante
+
+ // Texto de ayuda
+ 'helperText' => '',
+
+ // Atributos adicionales para el textarea
+ 'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
+])
+
+@php
+ // **Generación de Name, ID y Model**
+ $livewireModel = $attributes->get('wire:model', $model);
+ $name = $attributes->get('name', $livewireModel);
+ $inputId = $attributes->get('id', $name . '_' . $uid);
+
+ // **Placeholder obligatorio si es flotante**
+ $placeholder = $attributes->get('placeholder', $floating ? ' ' : 'Ingrese ' . strtolower($label));
+
+ // **Manejo de errores**
+ $errorKey = $livewireModel ?: $name;
+ $hasError = $errors->has($errorKey);
+ $errorClass = $hasError ? 'is-invalid' : '';
+
+ // **Clases dinámicas**
+ $sizeClass = match ($size) {
+ 'sm' => 'form-control-sm',
+ 'lg' => 'form-control-lg',
+ default => '',
+ };
+
+ $alignClass = match ($align) {
+ 'center' => 'text-center',
+ 'end' => 'text-end',
+ default => '',
+ };
+
+ // **Control de redimensionamiento**
+ $resizeClass = $resize ? '' : 'resize-none';
+
+ // **Fusionar atributos del textarea**
+ $textareaAttributes = $attributes->merge([
+ 'id' => $inputId,
+ 'name' => $name,
+ 'rows' => $rows,
+ 'placeholder' => $placeholder,
+ 'maxlength' => $maxlength,
+ ])->class("form-control $sizeClass $resizeClass $errorClass");
+
+ // **Clases del contenedor flotante**
+ $floatingClass = $floating ? 'form-floating' : '';
+
+ // **Detectar si necesita Input-Group**
+ $requiresInputGroup = $prefix || $suffix || $prefixIcon || $suffixIcon || $prefixClickableIcon || $suffixClickableIcon;
+@endphp
+
+{{-- ============================ TEXTAREA ============================ --}}
+
+ @if (!$floating && $label)
+
{{ $label }}
+ @endif
+
+ @if ($requiresInputGroup)
+ {{-- Textarea con Input-Group --}}
+
+ {{-- Prefijos (Izquierda) --}}
+ @if ($prefix)
+ {{ $prefix }}
+ @endif
+
+ @if ($prefixIcon)
+
+ @endif
+
+ @if ($prefixClickableIcon)
+
+
+
+ @endif
+
+ {{-- Textarea --}}
+
+
+ {{-- Sufijos (Derecha) --}}
+ @if ($suffixClickableIcon)
+
+
+
+ @endif
+
+ @if ($suffixIcon)
+
+ @endif
+
+ @if ($suffix)
+ {{ $suffix }}
+ @endif
+
+ @else
+ {{-- Textarea simple o flotante --}}
+
+ @endif
+
+ {{-- Etiqueta flotante --}}
+ @if ($floating)
+
{{ $label }}
+ @endif
+
+ {{-- Longitud máxima permitida --}}
+ @if ($maxlength)
+
Máximo {{ $maxlength }} caracteres
+ @endif
+
+ {{-- Texto de ayuda --}}
+ @if ($helperText)
+
{{ $helperText }}
+ @endif
+
+ {{-- Mensaje de error --}}
+ @if ($hasError)
+
{{ $errors->first($errorKey) }}
+ @endif
+
+
+{{-- ============================ JAVASCRIPT PARA AUTOSIZE ============================ --}}
+@if ($autosize)
+
+@endif
diff --git a/resources/views/components/offcanvas/basic.blade.php b/resources/views/components/offcanvas/basic.blade.php
new file mode 100644
index 0000000..5cfdc7e
--- /dev/null
+++ b/resources/views/components/offcanvas/basic.blade.php
@@ -0,0 +1,78 @@
+@php
+ use Illuminate\Support\Str;
+@endphp
+
+@props([
+ 'id' => '', // ID único para el offcanvas
+ 'title' => '', // Título del offcanvas
+ 'position' => 'end', // Posición: 'start', 'end', 'top', 'bottom'
+ 'size' => 'md', // Tamaño: sm, md, lg, xl
+ 'backdrop' => true, // Si se debe mostrar backdrop
+ 'wireIgnore' => true, // Ignorar eventos wire (Livewire)
+ 'listener' => '', // Nombre del listener para reload
+ 'tagName' => '', // Etiqueta del formHelpers
+])
+
+@php
+ $offcanvasClasses = "offcanvas offcanvas-{$position}";
+
+ $offcanvasSize = match ($size) {
+ 'sm' => 'offcanvas-sm',
+ 'lg' => 'offcanvas-lg',
+ 'xl' => 'offcanvas-xl',
+ default => '',
+ };
+
+ $helperTag = Str::kebab($tagName);
+@endphp
+
+
+
+ {{-- HEADER --}}
+
+
+ {{-- BODY --}}
+
+ {{ $slot }}
+
+
+ {{-- FOOTER SLOT OPCIONAL --}}
+ @if (isset($footer))
+
+ @endif
+
+
+@push('page-script')
+
+@endpush
diff --git a/resources/views/components/table/bootstrap/manager.blade.php b/resources/views/components/table/bootstrap/manager.blade.php
new file mode 100644
index 0000000..2be36da
--- /dev/null
+++ b/resources/views/components/table/bootstrap/manager.blade.php
@@ -0,0 +1,66 @@
+@php
+ use Illuminate\Support\Str;
+@endphp
+
+@props([
+ 'id' => uniqid(),
+ 'tagName' => '',
+ 'datatableConfig' => [],
+ 'routes' => [],
+ 'noFilterButtons' => false
+])
+
+@php
+ if($tagName)
+ $id = 'bt-' . Str::kebab($tagName) . 's';
+@endphp
+
+
+ {{-- Contenedor de notificaciones --}}
+
+
+ {{-- Toolbar con filtros, agrupación y herramientas --}}
+
+
+ {{-- Tabla con Bootstrap Table --}}
+
+
+
+@push('page-script')
+
+ @isset($routes)
+
+ @endisset
+@endpush
diff --git a/resources/views/errors/400.blade.php b/resources/views/errors/400.blade.php
new file mode 100644
index 0000000..27b6ffa
--- /dev/null
+++ b/resources/views/errors/400.blade.php
@@ -0,0 +1,38 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', '400 Bad Request')
+
+@push('page-style')
+
+ @vite(['/resources/scss/pages/page-misc.scss'])
+@endsection
+
+@section('content')
+
+
+
+
400
+
Solicitud incorrecta ⚠️
+
+ @if (!empty($exception->getMessage()))
+ {{ __($exception->getMessage()) }}
+ @else
+ {{ __('errors.bad_request') }}
+ @endif
+
+
Regresar al inicio
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/errors/401.blade.php b/resources/views/errors/401.blade.php
new file mode 100644
index 0000000..a2d55e3
--- /dev/null
+++ b/resources/views/errors/401.blade.php
@@ -0,0 +1,38 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', '401 Unauthorized')
+
+@push('page-style')
+
+ @vite(['/resources/scss/pages/page-misc.scss'])
+@endsection
+
+@section('content')
+
+
+
+
401
+
¡No estás autorizado! 🔐
+
+ @if (!empty($exception->getMessage()))
+ {{ __($exception->getMessage()) }}
+ @else
+ {{ __('errors.unauthorized') }}
+ @endif
+
+
Regresar al inicio
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php
new file mode 100644
index 0000000..9a4246a
--- /dev/null
+++ b/resources/views/errors/403.blade.php
@@ -0,0 +1,38 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', '403 Forbidden')
+
+@push('page-style')
+
+ @vite(['/resources/scss/pages/page-misc.scss'])
+@endsection
+
+@section('content')
+
+
+
+
403
+
¡No estás autorizado! 🔐
+
+ @if (!empty($exception->getMessage()))
+ {{ __($exception->getMessage()) }}
+ @else
+ {{ __('errors.forbidden') }}
+ @endif
+
+
Regresar al inicio
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php
new file mode 100644
index 0000000..dc83f27
--- /dev/null
+++ b/resources/views/errors/404.blade.php
@@ -0,0 +1,34 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.layoutMaster')
+
+@section('title', '404 Not Found')
+
+@push('page-style')
+
+ @vite(['/resources/scss/pages/page-misc.scss'])
+@endsection
+
+@section('content')
+
+
+
+
404
+
Página no encontrada ⚠️
+
+ {{ __('errors.page_not_found') }}
+
+
Regresar al inicio
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/layouts/vuexy/blankLayout.blade.php b/resources/views/layouts/vuexy/blankLayout.blade.php
new file mode 100644
index 0000000..131634e
--- /dev/null
+++ b/resources/views/layouts/vuexy/blankLayout.blade.php
@@ -0,0 +1,17 @@
+@isset($pageConfigs)
+{!! Helper::updatePageConfig($pageConfigs) !!}
+@endisset
+@php
+$configData = Helper::appClasses();
+
+/* Display elements */
+$customizerHidden = ($customizerHidden ?? '');
+@endphp
+
+@extends('vuexy-admin::layouts.vuexy.commonMaster' )
+
+@section('layoutContent')
+
+ @yield('content')
+
+@endsection
diff --git a/resources/views/layouts/vuexy/commonMaster.blade.php b/resources/views/layouts/vuexy/commonMaster.blade.php
new file mode 100644
index 0000000..374f081
--- /dev/null
+++ b/resources/views/layouts/vuexy/commonMaster.blade.php
@@ -0,0 +1,58 @@
+
+@php
+use Illuminate\Support\Facades\Route;
+
+$menuFixed = ($configData['layout'] === 'vertical') ? ($menuFixed ?? '') : (($configData['layout'] === 'front') ? '' : $configData['headerType']);
+$navbarType = ($configData['layout'] === 'vertical') ? ($configData['navbarType'] ?? '') : (($configData['layout'] === 'front') ? 'layout-navbar-fixed': '');
+$isFront = ($isFront ?? '') == true ? 'Front' : '';
+$contentLayout = (isset($container) ? (($container === 'container-xxl') ? "layout-compact" : "layout-wide") : "");
+@endphp
+
+
+
+
+
+
+
+
@hasSection('title') @yield('title') | @endif {{ $_admin['title'] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @include('vuexy-admin::layouts.vuexy.sections.styles' . $isFront)
+
+
+
+ @include('vuexy-admin::layouts.vuexy.sections.scriptsIncludes' . $isFront)
+
+
+
+ @yield('layoutContent')
+
+
+
+
+ @include('vuexy-admin::layouts.vuexy.sections.scripts' . $isFront)
+
+
diff --git a/resources/views/layouts/vuexy/contentNavbarLayout.blade.php b/resources/views/layouts/vuexy/contentNavbarLayout.blade.php
new file mode 100644
index 0000000..b232ec5
--- /dev/null
+++ b/resources/views/layouts/vuexy/contentNavbarLayout.blade.php
@@ -0,0 +1,89 @@
+@isset($pageConfigs)
+{!! Helper::updatePageConfig($pageConfigs) !!}
+@endisset
+@php
+$configData = Helper::appClasses();
+@endphp
+@extends('vuexy-admin::layouts.vuexy.commonMaster' )
+
+@php
+/* Display elements */
+$contentNavbar = ($contentNavbar ?? true);
+$containerNav = ($containerNav ?? 'container-xxl');
+$isNavbar = ($isNavbar ?? true);
+$isMenu = ($isMenu ?? true);
+$isFlex = ($isFlex ?? false);
+$isFooter = ($isFooter ?? true);
+$customizerHidden = ($customizerHidden ?? '');
+
+/* HTML Classes */
+$navbarDetached = 'navbar-detached';
+$menuFixed = (isset($configData['menuFixed']) ? $configData['menuFixed'] : '');
+if(isset($navbarType)) {
+ $configData['navbarType'] = $navbarType;
+}
+$navbarType = (isset($configData['navbarType']) ? $configData['navbarType'] : '');
+$footerFixed = (isset($configData['footerFixed']) ? $configData['footerFixed'] : '');
+$menuCollapsed = (isset($configData['menuCollapsed']) ? $configData['menuCollapsed'] : '');
+
+/* Content classes */
+$container = (isset($configData['contentLayout']) && $configData['contentLayout'] === 'compact') ? 'container-xxl' : 'container-fluid';
+@endphp
+
+@section('layoutContent')
+