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/.env.example b/.env.example
new file mode 100644
index 0000000..ea94251
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,52 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_TIMEZONE=America/Mexico_City
+APP_URL=http://localhost
+
+APP_LOCALE=es
+APP_FALLBACK_LOCALE=en
+APP_FAKER_LOCALE=es_MX
+
+BCRYPT_ROUNDS=12
+
+LOG_CHANNEL=stack
+LOG_STACK=single
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=sqlite
+DB_HOST=
+DB_PORT=
+DB_DATABASE=
+DB_USERNAME=
+DB_PASSWORD=
+
+CACHE_STORE=file
+SESSION_DRIVER=file
+
+SESSION_CONNECTION=
+SESSION_LIFETIME=120
+
+BROADCAST_CONNECTION=log
+FILESYSTEM_DISK=local
+
+MEMCACHED_HOST=127.0.0.1
+MEMCACHED_PORT=11211
+MEMCACHED_USERNAME=null
+MEMCACHED_PASSWORD=null
+
+REDIS_CLIENT=phpredis
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+REDIS_DB=
+REDIS_CACHE_DB=
+REDIS_SESSION_DB=
+
+MAIL_MAILER=smtp
+MAIL_SANDBOX=
+
+VITE_APP_NAME="${APP_NAME}"
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..fcb21d3
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,11 @@
+* 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
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9cdd67c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,28 @@
+/.phpunit.cache
+/node_modules
+
+/public/build
+/public/hot
+/public/storage
+/storage/*.key
+/vendor
+
+.env
+.env.backup
+.env.production
+.phpunit.result.cache
+
+docker-compose.override.yml
+
+Homestead.json
+Homestead.yaml
+npm-debug.log
+yarn-error.log
+/.fleet
+/.idea
+/.vscode
+
+!/public/assets
+!/public/assets/*
+/public/css
+/public/js
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..2d77136
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,3 @@
+dist
+node_modules
+build
\ No newline at end of file
diff --git a/.prettierrc.json b/.prettierrc.json
new file mode 100644
index 0000000..bf2ca97
--- /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": [
+ "modules/Admin/Resources/assets/vendor/js/*.js"
+ ],
+ "options": {
+ "semi": false
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
new file mode 100644
index 0000000..d127e91
--- /dev/null
+++ b/app/Http/Controllers/Controller.php
@@ -0,0 +1,8 @@
+session()->put('locale', $locale);
+ }
+
+ App::setLocale($locale);
+
+ return redirect()->back();
+ }
+}
diff --git a/app/Http/Middleware/LocaleMiddleware.php b/app/Http/Middleware/LocaleMiddleware.php
new file mode 100644
index 0000000..95d5f01
--- /dev/null
+++ b/app/Http/Middleware/LocaleMiddleware.php
@@ -0,0 +1,25 @@
+has('locale') && in_array(session()->get('locale'), ['en', 'es', 'fr', 'ar', 'de'])) {
+ app()->setLocale(session()->get('locale'));
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/WebsiteMiddleware.php b/app/Http/Middleware/WebsiteMiddleware.php
new file mode 100644
index 0000000..cad1aba
--- /dev/null
+++ b/app/Http/Middleware/WebsiteMiddleware.php
@@ -0,0 +1,32 @@
+is('admin/*')) {
+ return $next($request);
+ }
+
+ // Compartir variables globalmente solo si es una solicitud HTML
+ if (str_contains($request->header('Accept'), 'text/html')) {
+ $webVars = app(WebsiteTemplateService::class)->getWebsiteVars();
+
+ View::share('_web', $webVars);
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Services/WebsiteTemplateService.php b/app/Services/WebsiteTemplateService.php
new file mode 100644
index 0000000..5644ad1
--- /dev/null
+++ b/app/Services/WebsiteTemplateService.php
@@ -0,0 +1,272 @@
+ $key],
+ ['value' => trim($value)]
+ );
+
+ return $setting->save();
+ }
+
+ /**
+ * Obtiene las variables del sitio web desde el caché o la base de datos.
+ */
+ public function getWebsiteVars(String $setting = ''): array
+ {
+ try {
+ $webVars = Cache::remember('website_settings', $this->cacheTTL, function () {
+ $settings = Setting::global()
+ ->where(function ($query) {
+ $query->where('key', 'LIKE', 'website_%')
+ ->orWhere('key', 'LIKE', 'google_%')
+ ->orWhere('key', 'LIKE', 'chat_%');
+ })
+ ->pluck('value', 'key')
+ ->toArray();
+
+ return [
+ 'title' => $settings['website_title'] ?? config('_var.appTitle'),
+ 'author' => config('_var.author'),
+ 'description' => $settings['website_description'] ?? config('_var.appDescription'),
+ 'favicon' => $this->getFaviconPaths($settings),
+ 'app_name' => $settings['website_app_name'] ?? config('_var.appName'),
+ 'image_logo' => $this->getImageLogoPaths($settings),
+ 'template' => $this->getTemplateVars($settings),
+ 'google' => $this->getGoogleVars($settings),
+ 'chat' => $this->getChatVars($settings),
+ 'contact' => $this->getContactVars(),
+ 'social' => $this->getSocialVars(),
+ ];
+ });
+
+ return $setting
+ ? $webVars[$setting]
+ : $webVars;
+ } catch (\Exception $e) {
+ echo __METHOD__;
+ echo "
" . $e->getMessage() . "
";
+ die('You must configure the database.');
+ }
+ }
+
+ /**
+ * Obtiene los paths de favicon en distintos tamaños.
+ */
+ private function getFaviconPaths(array $settings): array
+ {
+ $defaultFavicon = config('_var.appFavicon');
+ $namespace = $settings['website_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('_var.appLogo');
+
+ return [
+ 'small' => $this->getImagePath($settings, 'website_image_logo_small', $defaultLogo),
+ 'medium' => $this->getImagePath($settings, 'website_image_logo_medium', $defaultLogo),
+ 'large' => $this->getImagePath($settings, 'website_image_logo', $defaultLogo),
+ 'small_dark' => $this->getImagePath($settings, 'website_image_logo_small_dark', $defaultLogo),
+ 'medium_dark' => $this->getImagePath($settings, 'website_image_logo_medium_dark', $defaultLogo),
+ 'large_dark' => $this->getImagePath($settings, 'website_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;
+ }
+
+ /**
+ * Obtiene las configuraciones de plantilla.
+ */
+ private function getTemplateVars(array $settings): array
+ {
+ return [
+ 'style_switcher' => (bool)($settings['website_tpl_style_switcher'] ?? false),
+ 'footer_text' => $settings['website_tpl_footer_text'] ?? '',
+ ];
+ }
+
+ /**
+ * Obtiene las configuraciones de Google Analytics.
+ */
+ private function getGoogleVars(array $settings): array
+ {
+ return [
+ 'analytics' => [
+ 'enabled' => (bool)($settings['google_analytics_enabled'] ?? false),
+ 'id' => $settings['google_analytics_id'] ?? '',
+ ]
+ ];
+ }
+
+ /**
+ * Obtiene las configuraciones del proveedor de Chat.
+ */
+ private function getChatVars(array $settings): array
+ {
+ return [
+ 'provider' => $settings['chat_provider'] ?? '',
+ 'whatsapp_number' => $settings['chat_whatsapp_number'] ?? '',
+ 'whatsapp_message' => $settings['chat_whatsapp_message'] ?? '',
+ ];
+ }
+
+ /**
+ * Obtiene las variables de contacto.
+ */
+ public function getContactVars(): array
+ {
+ $settings = Setting::global()
+ ->where('key', 'LIKE', 'contact_%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ return [
+ 'phone_number' => isset($settings['contact_phone_number'])
+ ? preg_replace('/\D/', '', $settings['contact_phone_number']) // Elimina todo lo que no sea un número
+ : '',
+ 'phone_number_text' => $settings['contact_phone_number'] ?? '',
+ 'phone_number_ext' => $settings['contact_phone_number_ext'] ?? '',
+ 'email' => $settings['contact_email'] ?? '',
+ 'direccion' => $settings['contact_direccion'] ?? '',
+ 'horario' => $settings['contact_horario'] ?? '',
+ 'location' => [
+ 'lat' => $settings['contact_location_lat'] ?? '',
+ 'lng' => $settings['contact_location_lng'] ?? '',
+ ],
+ 'form' => [
+ 'email' => $settings['contact_form_email'] ?? '',
+ 'email_cc' => $settings['contact_form_email_cc'] ?? '',
+ 'subject' => $settings['contact_form_subject'] ?? '',
+ ],
+ ];
+ }
+
+ /**
+ * Obtiene las variables de redes sociales.
+ */
+ public function getSocialVars(): array
+ {
+ $social = Setting::global()
+ ->where('key', 'LIKE', 'social_%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ return [
+ 'whatsapp' => $social['social_whatsapp'] ?? '',
+ 'whatsapp_message' => $social['social_whatsapp_message'] ?? '',
+ 'facebook' => $social['social_facebook'] ?? '',
+ 'instagram' => $social['social_instagram'] ?? '',
+ 'linkedin' => $social['social_linkedin'] ?? '',
+ 'tiktok' => $social['social_tiktok'] ?? '',
+ 'x_twitter' => $social['social_x_twitter'] ?? '',
+ 'google' => $social['social_google'] ?? '',
+ 'pinterest' => $social['social_pinterest'] ?? '',
+ 'youtube' => $social['social_youtube'] ?? '',
+ 'vimeo' => $social['social_vimeo'] ?? '',
+ ];
+ }
+
+ /**
+ * Limpia el caché de las variables del sitio web.
+ */
+ public static function clearWebsiteVarsCache(): void
+ {
+ Cache::forget('website_settings');
+ }
+
+ /**
+ * Obtiene las variables legales.
+ */
+ public function getLegalVars($legalDocument = false)
+ {
+ $legal = Setting::global()
+ ->where('key', 'LIKE', 'legal_%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ $legalDocuments = [
+ 'legal_terminos_y_condiciones' => [
+ 'title' => 'Términos y condiciones',
+ 'enabled' => (bool)($legal['legal_terminos_y_condiciones_enabled'] ?? false),
+ 'content' => $legal['legal_terminos_y_condiciones_content'] ?? '',
+ ],
+ 'legal_aviso_de_privacidad' => [
+ 'title' => 'Aviso de privacidad',
+ 'enabled' => (bool)($legal['legal_aviso_de_privacidad_enabled'] ?? false),
+ 'content' => $legal['legal_aviso_de_privacidad_content'] ?? '',
+ ],
+ 'legal_politica_de_devoluciones' => [
+ 'title' => 'Política de devoluciones y reembolsos',
+ 'enabled' => (bool)($legal['legal_politica_de_devoluciones_enabled'] ?? false),
+ 'content' => $legal['legal_politica_de_devoluciones_content'] ?? '',
+ ],
+ 'legal_politica_de_envios' => [
+ 'title' => 'Política de envíos',
+ 'enabled' => (bool)($legal['legal_politica_de_envios_enabled'] ?? false),
+ 'content' => $legal['legal_politica_de_envios_content'] ?? '',
+ ],
+ 'legal_politica_de_cookies' => [
+ 'title' => 'Política de cookies',
+ 'enabled' => (bool)($legal['legal_politica_de_cookies_enabled'] ?? false),
+ 'content' => $legal['legal_politica_de_cookies_content'] ?? '',
+ ],
+ 'legal_autorizaciones_y_licencias' => [
+ 'title' => 'Autorizaciones y licencias',
+ 'enabled' => (bool)($legal['legal_autorizaciones_y_licencias_enabled'] ?? false),
+ 'content' => $legal['legal_autorizaciones_y_licencias_content'] ?? '',
+ ],
+ 'legal_informacion_comercial' => [
+ 'title' => 'Información comercial',
+ 'enabled' => (bool)($legal['legal_informacion_comercial_enabled'] ?? false),
+ 'content' => $legal['legal_informacion_comercial_content'] ?? '',
+ ],
+ 'legal_consentimiento_para_el_login_de_terceros' => [
+ 'title' => 'Consentimiento para el login de terceros',
+ 'enabled' => (bool)($legal['legal_consentimiento_para_el_login_de_terceros_enabled'] ?? false),
+ 'content' => $legal['legal_consentimiento_para_el_login_de_terceros_content'] ?? '',
+ ],
+ 'legal_leyendas_de_responsabilidad' => [
+ 'title' => 'Leyendas de responsabilidad',
+ 'enabled' => (bool)($legal['legal_leyendas_de_responsabilidad_enabled'] ?? false),
+ 'content' => $legal['legal_leyendas_de_responsabilidad_content'] ?? '',
+ ],
+ ];
+
+ return $legalDocument
+ ? $legalDocuments[$legalDocument]
+ : $legalDocuments;
+ }
+}
diff --git a/artisan b/artisan
new file mode 100644
index 0000000..8e04b42
--- /dev/null
+++ b/artisan
@@ -0,0 +1,15 @@
+#!/usr/bin/env php
+handleCommand(new ArgvInput);
+
+exit($status);
diff --git a/bootstrap/app.php b/bootstrap/app.php
new file mode 100644
index 0000000..24cf9a9
--- /dev/null
+++ b/bootstrap/app.php
@@ -0,0 +1,59 @@
+withRouting(
+ web: __DIR__ . '/../routes/web.php',
+ commands: __DIR__ . '/../routes/console.php',
+ health: '/up',
+ )
+ ->withMiddleware(function (Middleware $middleware) {
+ $middleware->web(WebsiteMiddleware::class);
+ $middleware->web(LocaleMiddleware::class);
+ })
+ ->withExceptions(function (Exceptions $exceptions) {
+ $exceptions->render(function (HttpException $exception, Request $request) {
+ // Verificar si estamos en el contexto de admin
+ $isAdminContext = $request->is(['admin', 'admin/*']);
+
+ if ($isAdminContext) {
+ $pageConfigs = ['myLayout' => 'blank'];
+ $_admin = app(AdminTemplateService::class)->getAdminVars(); // Obtener las variables del administrador
+
+ switch ($exception->getStatusCode()) {
+ case 400:
+ return response()->view("admin::errors.400", compact('pageConfigs', 'exception', '_admin'), 400);
+ case 401:
+ return response()->view("admin::errors.401", compact('pageConfigs', 'exception', '_admin'), 401);
+ case 403:
+ return response()->view("admin::errors.403", compact('pageConfigs', 'exception', '_admin'), 403);
+ case 404:
+ return response()->view("admin::errors.404", compact('pageConfigs', 'exception', '_admin'), 404);
+ }
+ }
+
+ // Si no es el contexto admin, entonces manejar las excepciones normalmente
+ $_web = app(WebsiteTemplateService::class)->getWebsiteVars(); // Obtener las variables del sitio web
+
+ switch ($exception->getStatusCode()) {
+ case 400:
+ return response()->view("errors.400", compact('exception', '_web'), 400);
+ case 401:
+ return response()->view("errors.401", compact('exception', '_web'), 401);
+ case 403:
+ return response()->view("errors.403", compact('exception', '_web'), 403);
+ case 404:
+ return response()->view("errors.404", compact('exception', '_web'), 404);
+ }
+ });
+ })
+ ->create();
diff --git a/bootstrap/cache/packages.php b/bootstrap/cache/packages.php
new file mode 100755
index 0000000..777fd49
--- /dev/null
+++ b/bootstrap/cache/packages.php
@@ -0,0 +1,131 @@
+
+ array (
+ 'aliases' =>
+ array (
+ 'Debugbar' => 'Barryvdh\\Debugbar\\Facades\\Debugbar',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Barryvdh\\Debugbar\\ServiceProvider',
+ ),
+ ),
+ 'intervention/image-laravel' =>
+ array (
+ 'aliases' =>
+ array (
+ 'Image' => 'Intervention\\Image\\Laravel\\Facades\\Image',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Intervention\\Image\\Laravel\\ServiceProvider',
+ ),
+ ),
+ 'laravel/fortify' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Laravel\\Fortify\\FortifyServiceProvider',
+ ),
+ ),
+ 'laravel/sail' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Laravel\\Sail\\SailServiceProvider',
+ ),
+ ),
+ 'laravel/sanctum' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Laravel\\Sanctum\\SanctumServiceProvider',
+ ),
+ ),
+ 'laravel/tinker' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Laravel\\Tinker\\TinkerServiceProvider',
+ ),
+ ),
+ 'livewire/livewire' =>
+ array (
+ 'aliases' =>
+ array (
+ 'Livewire' => 'Livewire\\Livewire',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Livewire\\LivewireServiceProvider',
+ ),
+ ),
+ 'maatwebsite/excel' =>
+ array (
+ 'aliases' =>
+ array (
+ 'Excel' => 'Maatwebsite\\Excel\\Facades\\Excel',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+ ),
+ ),
+ 'nesbot/carbon' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Carbon\\Laravel\\ServiceProvider',
+ ),
+ ),
+ 'nunomaduro/collision' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+ ),
+ ),
+ 'nunomaduro/termwind' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Termwind\\Laravel\\TermwindServiceProvider',
+ ),
+ ),
+ 'owen-it/laravel-auditing' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'OwenIt\\Auditing\\AuditingServiceProvider',
+ ),
+ ),
+ 'spatie/laravel-ignition' =>
+ array (
+ 'aliases' =>
+ array (
+ 'Flare' => 'Spatie\\LaravelIgnition\\Facades\\Flare',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
+ ),
+ ),
+ 'spatie/laravel-permission' =>
+ array (
+ 'providers' =>
+ array (
+ 0 => 'Spatie\\Permission\\PermissionServiceProvider',
+ ),
+ ),
+ 'yajra/laravel-datatables-oracle' =>
+ array (
+ 'aliases' =>
+ array (
+ 'DataTables' => 'Yajra\\DataTables\\Facades\\DataTables',
+ ),
+ 'providers' =>
+ array (
+ 0 => 'Yajra\\DataTables\\DataTablesServiceProvider',
+ ),
+ ),
+);
\ No newline at end of file
diff --git a/bootstrap/cache/services.php b/bootstrap/cache/services.php
new file mode 100755
index 0000000..00584c9
--- /dev/null
+++ b/bootstrap/cache/services.php
@@ -0,0 +1,274 @@
+
+ array (
+ 0 => 'Illuminate\\Auth\\AuthServiceProvider',
+ 1 => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
+ 2 => 'Illuminate\\Bus\\BusServiceProvider',
+ 3 => 'Illuminate\\Cache\\CacheServiceProvider',
+ 4 => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 5 => 'Illuminate\\Concurrency\\ConcurrencyServiceProvider',
+ 6 => 'Illuminate\\Cookie\\CookieServiceProvider',
+ 7 => 'Illuminate\\Database\\DatabaseServiceProvider',
+ 8 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
+ 9 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
+ 10 => 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider',
+ 11 => 'Illuminate\\Hashing\\HashServiceProvider',
+ 12 => 'Illuminate\\Mail\\MailServiceProvider',
+ 13 => 'Illuminate\\Notifications\\NotificationServiceProvider',
+ 14 => 'Illuminate\\Pagination\\PaginationServiceProvider',
+ 15 => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
+ 16 => 'Illuminate\\Pipeline\\PipelineServiceProvider',
+ 17 => 'Illuminate\\Queue\\QueueServiceProvider',
+ 18 => 'Illuminate\\Redis\\RedisServiceProvider',
+ 19 => 'Illuminate\\Session\\SessionServiceProvider',
+ 20 => 'Illuminate\\Translation\\TranslationServiceProvider',
+ 21 => 'Illuminate\\Validation\\ValidationServiceProvider',
+ 22 => 'Illuminate\\View\\ViewServiceProvider',
+ 23 => 'Barryvdh\\Debugbar\\ServiceProvider',
+ 24 => 'Intervention\\Image\\Laravel\\ServiceProvider',
+ 25 => 'Laravel\\Fortify\\FortifyServiceProvider',
+ 26 => 'Laravel\\Sail\\SailServiceProvider',
+ 27 => 'Laravel\\Sanctum\\SanctumServiceProvider',
+ 28 => 'Laravel\\Tinker\\TinkerServiceProvider',
+ 29 => 'Livewire\\LivewireServiceProvider',
+ 30 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+ 31 => 'Carbon\\Laravel\\ServiceProvider',
+ 32 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+ 33 => 'Termwind\\Laravel\\TermwindServiceProvider',
+ 34 => 'OwenIt\\Auditing\\AuditingServiceProvider',
+ 35 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
+ 36 => 'Spatie\\Permission\\PermissionServiceProvider',
+ 37 => 'Yajra\\DataTables\\DataTablesServiceProvider',
+ 38 => 'Modules\\Admin\\ModuleServiceProvider',
+ ),
+ 'eager' =>
+ array (
+ 0 => 'Illuminate\\Auth\\AuthServiceProvider',
+ 1 => 'Illuminate\\Cookie\\CookieServiceProvider',
+ 2 => 'Illuminate\\Database\\DatabaseServiceProvider',
+ 3 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
+ 4 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
+ 5 => 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider',
+ 6 => 'Illuminate\\Notifications\\NotificationServiceProvider',
+ 7 => 'Illuminate\\Pagination\\PaginationServiceProvider',
+ 8 => 'Illuminate\\Session\\SessionServiceProvider',
+ 9 => 'Illuminate\\View\\ViewServiceProvider',
+ 10 => 'Barryvdh\\Debugbar\\ServiceProvider',
+ 11 => 'Intervention\\Image\\Laravel\\ServiceProvider',
+ 12 => 'Laravel\\Fortify\\FortifyServiceProvider',
+ 13 => 'Laravel\\Sanctum\\SanctumServiceProvider',
+ 14 => 'Livewire\\LivewireServiceProvider',
+ 15 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
+ 16 => 'Carbon\\Laravel\\ServiceProvider',
+ 17 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
+ 18 => 'Termwind\\Laravel\\TermwindServiceProvider',
+ 19 => 'OwenIt\\Auditing\\AuditingServiceProvider',
+ 20 => 'Spatie\\LaravelIgnition\\IgnitionServiceProvider',
+ 21 => 'Spatie\\Permission\\PermissionServiceProvider',
+ 22 => 'Yajra\\DataTables\\DataTablesServiceProvider',
+ 23 => 'Modules\\Admin\\ModuleServiceProvider',
+ ),
+ 'deferred' =>
+ array (
+ 'Illuminate\\Broadcasting\\BroadcastManager' => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
+ 'Illuminate\\Contracts\\Broadcasting\\Factory' => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
+ 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => 'Illuminate\\Broadcasting\\BroadcastServiceProvider',
+ 'Illuminate\\Bus\\Dispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
+ 'Illuminate\\Contracts\\Bus\\Dispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
+ 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
+ 'Illuminate\\Bus\\BatchRepository' => 'Illuminate\\Bus\\BusServiceProvider',
+ 'Illuminate\\Bus\\DatabaseBatchRepository' => 'Illuminate\\Bus\\BusServiceProvider',
+ 'cache' => 'Illuminate\\Cache\\CacheServiceProvider',
+ 'cache.store' => 'Illuminate\\Cache\\CacheServiceProvider',
+ 'cache.psr6' => 'Illuminate\\Cache\\CacheServiceProvider',
+ 'memcached.connector' => 'Illuminate\\Cache\\CacheServiceProvider',
+ 'Illuminate\\Cache\\RateLimiter' => 'Illuminate\\Cache\\CacheServiceProvider',
+ 'Illuminate\\Foundation\\Console\\AboutCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Cache\\Console\\ClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Cache\\Console\\ForgetCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ClearCompiledCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Auth\\Console\\ClearResetsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ConfigCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ConfigClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ConfigShowCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\DbCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\MonitorCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\PruneCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\ShowCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\TableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\WipeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\DownCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EnvironmentCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EnvironmentDecryptCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EnvironmentEncryptCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EventCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EventClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EventListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Concurrency\\Console\\InvokeSerializedClosureCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\KeyGenerateCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\OptimizeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\OptimizeClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\PackageDiscoverCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Cache\\Console\\PruneStaleTagsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\ClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\ListFailedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\FlushFailedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\ForgetFailedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\ListenCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\MonitorCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\PruneBatchesCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\PruneFailedJobsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\RestartCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\RetryCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\RetryBatchCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\WorkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\RouteCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\RouteClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\RouteListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\DumpCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Seeds\\SeedCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleFinishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleRunCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleClearCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleTestCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleWorkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Console\\Scheduling\\ScheduleInterruptCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\ShowModelCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\StorageLinkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\StorageUnlinkCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\UpCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ViewCacheCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ViewClearCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ApiInstallCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\BroadcastingInstallCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Cache\\Console\\CacheTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\CastMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ChannelListCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ChannelMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ClassMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ComponentMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ConfigPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ConsoleMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Routing\\Console\\ControllerMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\DocsCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EnumMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EventGenerateCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\EventMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ExceptionMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Factories\\FactoryMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\InterfaceMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\JobMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\JobMiddlewareMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\LangPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ListenerMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\MailMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Routing\\Console\\MiddlewareMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ModelMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\NotificationMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Notifications\\Console\\NotificationTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ObserverMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\PolicyMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ProviderMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\FailedTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\TableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Queue\\Console\\BatchesTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\RequestMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ResourceMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\RuleMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ScopeMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Seeds\\SeederMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Session\\Console\\SessionTableCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ServeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\StubPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\TestMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\TraitMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\VendorPublishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Foundation\\Console\\ViewMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'migrator' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'migration.repository' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'migration.creator' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\MigrateCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\FreshCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\InstallCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\RefreshCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\ResetCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\RollbackCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\StatusCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Database\\Console\\Migrations\\MigrateMakeCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'composer' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
+ 'Illuminate\\Concurrency\\ConcurrencyManager' => 'Illuminate\\Concurrency\\ConcurrencyServiceProvider',
+ 'hash' => 'Illuminate\\Hashing\\HashServiceProvider',
+ 'hash.driver' => 'Illuminate\\Hashing\\HashServiceProvider',
+ 'mail.manager' => 'Illuminate\\Mail\\MailServiceProvider',
+ 'mailer' => 'Illuminate\\Mail\\MailServiceProvider',
+ 'Illuminate\\Mail\\Markdown' => 'Illuminate\\Mail\\MailServiceProvider',
+ 'auth.password' => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
+ 'auth.password.broker' => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
+ 'Illuminate\\Contracts\\Pipeline\\Hub' => 'Illuminate\\Pipeline\\PipelineServiceProvider',
+ 'pipeline' => 'Illuminate\\Pipeline\\PipelineServiceProvider',
+ 'queue' => 'Illuminate\\Queue\\QueueServiceProvider',
+ 'queue.connection' => 'Illuminate\\Queue\\QueueServiceProvider',
+ 'queue.failer' => 'Illuminate\\Queue\\QueueServiceProvider',
+ 'queue.listener' => 'Illuminate\\Queue\\QueueServiceProvider',
+ 'queue.worker' => 'Illuminate\\Queue\\QueueServiceProvider',
+ 'redis' => 'Illuminate\\Redis\\RedisServiceProvider',
+ 'redis.connection' => 'Illuminate\\Redis\\RedisServiceProvider',
+ 'translator' => 'Illuminate\\Translation\\TranslationServiceProvider',
+ 'translation.loader' => 'Illuminate\\Translation\\TranslationServiceProvider',
+ 'validator' => 'Illuminate\\Validation\\ValidationServiceProvider',
+ 'validation.presence' => 'Illuminate\\Validation\\ValidationServiceProvider',
+ 'Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => 'Illuminate\\Validation\\ValidationServiceProvider',
+ 'Laravel\\Sail\\Console\\InstallCommand' => 'Laravel\\Sail\\SailServiceProvider',
+ 'Laravel\\Sail\\Console\\PublishCommand' => 'Laravel\\Sail\\SailServiceProvider',
+ 'command.tinker' => 'Laravel\\Tinker\\TinkerServiceProvider',
+ ),
+ 'when' =>
+ array (
+ 'Illuminate\\Broadcasting\\BroadcastServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Bus\\BusServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Cache\\CacheServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Concurrency\\ConcurrencyServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Hashing\\HashServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Mail\\MailServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Pipeline\\PipelineServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Queue\\QueueServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Redis\\RedisServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Translation\\TranslationServiceProvider' =>
+ array (
+ ),
+ 'Illuminate\\Validation\\ValidationServiceProvider' =>
+ array (
+ ),
+ 'Laravel\\Sail\\SailServiceProvider' =>
+ array (
+ ),
+ 'Laravel\\Tinker\\TinkerServiceProvider' =>
+ array (
+ ),
+ ),
+);
\ No newline at end of file
diff --git a/bootstrap/providers.php b/bootstrap/providers.php
new file mode 100644
index 0000000..73e0ac3
--- /dev/null
+++ b/bootstrap/providers.php
@@ -0,0 +1,6 @@
+=5.0.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^4.0.0",
+ "nesbot/carbon": "^2.71.0 || ^3.0.0",
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KyleKatarn",
+ "email": "kylekatarnls@gmail.com"
+ }
+ ],
+ "description": "Types to use Carbon in Doctrine",
+ "keywords": [
+ "carbon",
+ "date",
+ "datetime",
+ "doctrine",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-09T16:56:22+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-19T14:15:21+00:00"
+ },
+ {
+ "name": "dasprid/enum",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/DASPRiD/Enum.git",
+ "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90",
+ "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1 <9.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
+ "squizlabs/php_codesniffer": "*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DASPRiD\\Enum\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ben Scholzen 'DASPRiD'",
+ "email": "mail@dasprids.de",
+ "homepage": "https://dasprids.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP 7.1 enum implementation",
+ "keywords": [
+ "enum",
+ "map"
+ ],
+ "support": {
+ "issues": "https://github.com/DASPRiD/Enum/issues",
+ "source": "https://github.com/DASPRiD/Enum/tree/1.0.6"
+ },
+ "time": "2024-08-09T14:30:48+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
+ },
+ "time": "2024-07-08T12:26:09+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11.0",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.3",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "vimeo/psalm": "^4.25 || ^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.0.10"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-18T20:23:39+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-05T11:56:58+00:00"
+ },
+ {
+ "name": "dragonmantank/cron-expression",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "8c784d071debd117328803d86b2097615b457500"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500",
+ "reference": "8c784d071debd117328803d86b2097615b457500",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "webmozart/assert": "^1.0"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.0",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Cron\\": "src/Cron/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Tankersley",
+ "email": "chris@ctankersley.com",
+ "homepage": "https://github.com/dragonmantank"
+ }
+ ],
+ "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+ "keywords": [
+ "cron",
+ "schedule"
+ ],
+ "support": {
+ "issues": "https://github.com/dragonmantank/cron-expression/issues",
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-09T13:47:03+00:00"
+ },
+ {
+ "name": "egulias/email-validator",
+ "version": "4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "b115554301161fa21467629f1e1391c1936de517"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517",
+ "reference": "b115554301161fa21467629f1e1391c1936de517",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.2",
+ "vimeo/psalm": "^5.12"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eduardo Gulias Davis"
+ }
+ ],
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
+ "keywords": [
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/egulias/EmailValidator/issues",
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-27T00:36:43+00:00"
+ },
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.18.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "cb56001e54359df7ae76dc522d08845dc741621b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
+ "reference": "cb56001e54359df7ae76dc522d08845dc741621b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
+ },
+ "require-dev": {
+ "cerdic/css-tidy": "^1.7 || ^2.0",
+ "simpletest/simpletest": "dev-master"
+ },
+ "suggest": {
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
+ "ext-tidy": "Used for pretty-printing HTML"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ],
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "exclude-from-classmap": [
+ "/library/HTMLPurifier/Language/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ],
+ "support": {
+ "issues": "https://github.com/ezyang/htmlpurifier/issues",
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
+ },
+ "time": "2024-11-01T03:51:45+00:00"
+ },
+ {
+ "name": "fruitcake/php-cors",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruitcake/php-cors.git",
+ "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b",
+ "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0",
+ "symfony/http-foundation": "^4.4|^5.4|^6|^7"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "phpunit/phpunit": "^9",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fruitcake\\Cors\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
+ },
+ {
+ "name": "Barryvdh",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Cross-origin resource sharing library for the Symfony HttpFoundation",
+ "homepage": "https://github.com/fruitcake/php-cors",
+ "keywords": [
+ "cors",
+ "laravel",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/fruitcake/php-cors/issues",
+ "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2023-10-12T05:21:21+00:00"
+ },
+ {
+ "name": "graham-campbell/result-type",
+ "version": "v1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "3ba905c11371512af9d9bdd27d99b782216b6945"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945",
+ "reference": "3ba905c11371512af9d9bdd27d99b782216b6945",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-20T21:45:45+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^2.7.0",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ext-curl": "*",
+ "guzzle/client-integration-tests": "3.0.2",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-24T11:22:20+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-17T10:06:22+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-18T11:15:46+00:00"
+ },
+ {
+ "name": "guzzlehttp/uri-template",
+ "version": "v1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/uri-template.git",
+ "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c",
+ "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "symfony/polyfill-php80": "^1.24"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+ "uri-template/tests": "1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\UriTemplate\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ }
+ ],
+ "description": "A polyfill class for uri_template of PHP",
+ "keywords": [
+ "guzzlehttp",
+ "uri-template"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/uri-template/issues",
+ "source": "https://github.com/guzzle/uri-template/tree/v1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-12-03T19:50:20+00:00"
+ },
+ {
+ "name": "intervention/gif",
+ "version": "4.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/gif.git",
+ "reference": "6addac2c68b4bc0e37d0d3ccedda57eb84729c49"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/gif/zipball/6addac2c68b4bc0e37d0d3ccedda57eb84729c49",
+ "reference": "6addac2c68b4bc0e37d0d3ccedda57eb84729c49",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^10.0 || ^11.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Gif\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "Native PHP GIF Encoder/Decoder",
+ "homepage": "https://github.com/intervention/gif",
+ "keywords": [
+ "animation",
+ "gd",
+ "gif",
+ "image"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/gif/issues",
+ "source": "https://github.com/Intervention/gif/tree/4.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2025-01-05T10:52:39+00:00"
+ },
+ {
+ "name": "intervention/image",
+ "version": "3.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/image.git",
+ "reference": "6b9ce4fc4485d30117e13935b25bc55a8b894a79"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/6b9ce4fc4485d30117e13935b25bc55a8b894a79",
+ "reference": "6b9ce4fc4485d30117e13935b25bc55a8b894a79",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "intervention/gif": "^4.2",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.6",
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^10.0 || ^11.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "suggest": {
+ "ext-exif": "Recommended to be able to read EXIF data properly."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "PHP image manipulation",
+ "homepage": "https://image.intervention.io/",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "resize",
+ "thumbnail",
+ "watermark"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/image/issues",
+ "source": "https://github.com/Intervention/image/tree/3.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2025-01-18T15:42:14+00:00"
+ },
+ {
+ "name": "intervention/image-laravel",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Intervention/image-laravel.git",
+ "reference": "6ee3d2266b823127497345c0aaf958223d0f4c84"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Intervention/image-laravel/zipball/6ee3d2266b823127497345c0aaf958223d0f4c84",
+ "reference": "6ee3d2266b823127497345c0aaf958223d0f4c84",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/support": "^8|^9|^10|^11",
+ "intervention/image": "^3.11",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "orchestra/testbench": "^8.18",
+ "phpunit/phpunit": "^10.0 || ^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Image": "Intervention\\Image\\Laravel\\Facades\\Image"
+ },
+ "providers": [
+ "Intervention\\Image\\Laravel\\ServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Intervention\\Image\\Laravel\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oliver Vogel",
+ "email": "oliver@intervention.io",
+ "homepage": "https://intervention.io/"
+ }
+ ],
+ "description": "Laravel Integration of Intervention Image",
+ "homepage": "https://image.intervention.io/",
+ "keywords": [
+ "gd",
+ "image",
+ "imagick",
+ "laravel",
+ "resize",
+ "thumbnail",
+ "watermark"
+ ],
+ "support": {
+ "issues": "https://github.com/Intervention/image-laravel/issues",
+ "source": "https://github.com/Intervention/image-laravel/tree/1.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://paypal.me/interventionio",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/Intervention",
+ "type": "github"
+ },
+ {
+ "url": "https://ko-fi.com/interventionphp",
+ "type": "ko_fi"
+ }
+ ],
+ "time": "2025-01-18T15:56:47+00:00"
+ },
+ {
+ "name": "laravel/fortify",
+ "version": "v1.25.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/fortify.git",
+ "reference": "ee35e5b8ea25cc51f8323e27a839283becd44160"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/fortify/zipball/ee35e5b8ea25cc51f8323e27a839283becd44160",
+ "reference": "ee35e5b8ea25cc51f8323e27a839283becd44160",
+ "shasum": ""
+ },
+ "require": {
+ "bacon/bacon-qr-code": "^3.0",
+ "ext-json": "*",
+ "illuminate/support": "^10.0|^11.0",
+ "php": "^8.1",
+ "pragmarx/google2fa": "^8.0",
+ "symfony/console": "^6.0|^7.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^8.16|^9.0",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.4"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Fortify\\FortifyServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Fortify\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Backend controllers and scaffolding for Laravel authentication.",
+ "keywords": [
+ "auth",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/fortify/issues",
+ "source": "https://github.com/laravel/fortify"
+ },
+ "time": "2025-01-17T15:17:57+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v11.40.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "599a28196d284fee158cc10086fd56ac625ad7a3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/599a28196d284fee158cc10086fd56ac625ad7a3",
+ "reference": "599a28196d284fee158cc10086fd56ac625ad7a3",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12",
+ "composer-runtime-api": "^2.2",
+ "doctrine/inflector": "^2.0.5",
+ "dragonmantank/cron-expression": "^3.4",
+ "egulias/email-validator": "^3.2.1|^4.0",
+ "ext-ctype": "*",
+ "ext-filter": "*",
+ "ext-hash": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "ext-session": "*",
+ "ext-tokenizer": "*",
+ "fruitcake/php-cors": "^1.3",
+ "guzzlehttp/guzzle": "^7.8.2",
+ "guzzlehttp/uri-template": "^1.0",
+ "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0",
+ "laravel/serializable-closure": "^1.3|^2.0",
+ "league/commonmark": "^2.6",
+ "league/flysystem": "^3.25.1",
+ "league/flysystem-local": "^3.25.1",
+ "league/uri": "^7.5.1",
+ "monolog/monolog": "^3.0",
+ "nesbot/carbon": "^2.72.6|^3.8.4",
+ "nunomaduro/termwind": "^2.0",
+ "php": "^8.2",
+ "psr/container": "^1.1.1|^2.0.1",
+ "psr/log": "^1.0|^2.0|^3.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "ramsey/uuid": "^4.7",
+ "symfony/console": "^7.0.3",
+ "symfony/error-handler": "^7.0.3",
+ "symfony/finder": "^7.0.3",
+ "symfony/http-foundation": "^7.2.0",
+ "symfony/http-kernel": "^7.0.3",
+ "symfony/mailer": "^7.0.3",
+ "symfony/mime": "^7.0.3",
+ "symfony/polyfill-php83": "^1.31",
+ "symfony/process": "^7.0.3",
+ "symfony/routing": "^7.0.3",
+ "symfony/uid": "^7.0.3",
+ "symfony/var-dumper": "^7.0.3",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.5",
+ "vlucas/phpdotenv": "^5.6.1",
+ "voku/portable-ascii": "^2.0.2"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "psr/log-implementation": "1.0|2.0|3.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0"
+ },
+ "replace": {
+ "illuminate/auth": "self.version",
+ "illuminate/broadcasting": "self.version",
+ "illuminate/bus": "self.version",
+ "illuminate/cache": "self.version",
+ "illuminate/collections": "self.version",
+ "illuminate/concurrency": "self.version",
+ "illuminate/conditionable": "self.version",
+ "illuminate/config": "self.version",
+ "illuminate/console": "self.version",
+ "illuminate/container": "self.version",
+ "illuminate/contracts": "self.version",
+ "illuminate/cookie": "self.version",
+ "illuminate/database": "self.version",
+ "illuminate/encryption": "self.version",
+ "illuminate/events": "self.version",
+ "illuminate/filesystem": "self.version",
+ "illuminate/hashing": "self.version",
+ "illuminate/http": "self.version",
+ "illuminate/log": "self.version",
+ "illuminate/macroable": "self.version",
+ "illuminate/mail": "self.version",
+ "illuminate/notifications": "self.version",
+ "illuminate/pagination": "self.version",
+ "illuminate/pipeline": "self.version",
+ "illuminate/process": "self.version",
+ "illuminate/queue": "self.version",
+ "illuminate/redis": "self.version",
+ "illuminate/routing": "self.version",
+ "illuminate/session": "self.version",
+ "illuminate/support": "self.version",
+ "illuminate/testing": "self.version",
+ "illuminate/translation": "self.version",
+ "illuminate/validation": "self.version",
+ "illuminate/view": "self.version",
+ "spatie/once": "*"
+ },
+ "require-dev": {
+ "ably/ably-php": "^1.0",
+ "aws/aws-sdk-php": "^3.322.9",
+ "ext-gmp": "*",
+ "fakerphp/faker": "^1.24",
+ "guzzlehttp/promises": "^2.0.3",
+ "guzzlehttp/psr7": "^2.4",
+ "laravel/pint": "^1.18",
+ "league/flysystem-aws-s3-v3": "^3.25.1",
+ "league/flysystem-ftp": "^3.25.1",
+ "league/flysystem-path-prefixing": "^3.25.1",
+ "league/flysystem-read-only": "^3.25.1",
+ "league/flysystem-sftp-v3": "^3.25.1",
+ "mockery/mockery": "^1.6.10",
+ "orchestra/testbench-core": "^9.6",
+ "pda/pheanstalk": "^5.0.6",
+ "php-http/discovery": "^1.15",
+ "phpstan/phpstan": "^1.11.5",
+ "phpunit/phpunit": "^10.5.35|^11.3.6",
+ "predis/predis": "^2.3",
+ "resend/resend-php": "^0.10.0",
+ "symfony/cache": "^7.0.3",
+ "symfony/http-client": "^7.0.3",
+ "symfony/psr-http-message-bridge": "^7.0.3",
+ "symfony/translation": "^7.0.3"
+ },
+ "suggest": {
+ "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).",
+ "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).",
+ "ext-apcu": "Required to use the APC cache driver.",
+ "ext-fileinfo": "Required to use the Filesystem class.",
+ "ext-ftp": "Required to use the Flysystem FTP driver.",
+ "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
+ "ext-memcached": "Required to use the memcache cache driver.",
+ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.",
+ "ext-pdo": "Required to use all database features.",
+ "ext-posix": "Required to use all features of the queue worker.",
+ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "filp/whoops": "Required for friendly error pages in development (^2.14.3).",
+ "laravel/tinker": "Required to use the tinker console command (^2.0).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).",
+ "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).",
+ "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).",
+ "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)",
+ "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).",
+ "mockery/mockery": "Required to use mocking (^1.6).",
+ "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
+ "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^10.5|^11.0).",
+ "predis/predis": "Required to use the predis connector (^2.3).",
+ "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
+ "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^7.0).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).",
+ "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).",
+ "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).",
+ "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).",
+ "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "11.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Illuminate/Collections/functions.php",
+ "src/Illuminate/Collections/helpers.php",
+ "src/Illuminate/Events/functions.php",
+ "src/Illuminate/Filesystem/functions.php",
+ "src/Illuminate/Foundation/helpers.php",
+ "src/Illuminate/Log/functions.php",
+ "src/Illuminate/Support/functions.php",
+ "src/Illuminate/Support/helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\": "src/Illuminate/",
+ "Illuminate\\Support\\": [
+ "src/Illuminate/Macroable/",
+ "src/Illuminate/Collections/",
+ "src/Illuminate/Conditionable/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Laravel Framework.",
+ "homepage": "https://laravel.com",
+ "keywords": [
+ "framework",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2025-01-24T16:17:42+00:00"
+ },
+ {
+ "name": "laravel/prompts",
+ "version": "v0.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/prompts.git",
+ "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/749395fcd5f8f7530fe1f00dfa84eb22c83d94ea",
+ "reference": "749395fcd5f8f7530fe1f00dfa84eb22c83d94ea",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "ext-mbstring": "*",
+ "php": "^8.1",
+ "symfony/console": "^6.2|^7.0"
+ },
+ "conflict": {
+ "illuminate/console": ">=10.17.0 <10.25.0",
+ "laravel/framework": ">=10.17.0 <10.25.0"
+ },
+ "require-dev": {
+ "illuminate/collections": "^10.0|^11.0",
+ "mockery/mockery": "^1.5",
+ "pestphp/pest": "^2.3|^3.4",
+ "phpstan/phpstan": "^1.11",
+ "phpstan/phpstan-mockery": "^1.1"
+ },
+ "suggest": {
+ "ext-pcntl": "Required for the spinner to be animated."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.3.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Laravel\\Prompts\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Add beautiful and user-friendly forms to your command-line applications.",
+ "support": {
+ "issues": "https://github.com/laravel/prompts/issues",
+ "source": "https://github.com/laravel/prompts/tree/v0.3.3"
+ },
+ "time": "2024-12-30T15:53:31+00:00"
+ },
+ {
+ "name": "laravel/sanctum",
+ "version": "v4.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/sanctum.git",
+ "reference": "698064236a46df016e64a7eb059b1414e0b281df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/sanctum/zipball/698064236a46df016e64a7eb059b1414e0b281df",
+ "reference": "698064236a46df016e64a7eb059b1414e0b281df",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "illuminate/console": "^11.0",
+ "illuminate/contracts": "^11.0",
+ "illuminate/database": "^11.0",
+ "illuminate/support": "^11.0",
+ "php": "^8.2",
+ "symfony/console": "^7.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.6",
+ "orchestra/testbench": "^9.0",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Sanctum\\SanctumServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Sanctum\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.",
+ "keywords": [
+ "auth",
+ "laravel",
+ "sanctum"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/sanctum/issues",
+ "source": "https://github.com/laravel/sanctum"
+ },
+ "time": "2024-12-11T16:40:21+00:00"
+ },
+ {
+ "name": "laravel/serializable-closure",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/serializable-closure.git",
+ "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8",
+ "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "illuminate/support": "^10.0|^11.0",
+ "nesbot/carbon": "^2.67|^3.0",
+ "pestphp/pest": "^2.36",
+ "phpstan/phpstan": "^2.0",
+ "symfony/var-dumper": "^6.2.0|^7.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\SerializableClosure\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ },
+ {
+ "name": "Nuno Maduro",
+ "email": "nuno@laravel.com"
+ }
+ ],
+ "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.",
+ "keywords": [
+ "closure",
+ "laravel",
+ "serializable"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/serializable-closure/issues",
+ "source": "https://github.com/laravel/serializable-closure"
+ },
+ "time": "2024-12-16T15:26:28+00:00"
+ },
+ {
+ "name": "laravel/tinker",
+ "version": "v2.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/tinker.git",
+ "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5",
+ "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "php": "^7.2.5|^8.0",
+ "psy/psysh": "^0.11.1|^0.12.0",
+ "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.3|^1.4.2",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
+ },
+ "suggest": {
+ "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Tinker\\TinkerServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Tinker\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Powerful REPL for the Laravel framework.",
+ "keywords": [
+ "REPL",
+ "Tinker",
+ "laravel",
+ "psysh"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/tinker/issues",
+ "source": "https://github.com/laravel/tinker/tree/v2.10.0"
+ },
+ "time": "2024-09-23T13:32:56+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "d990688c91cedfb69753ffc2512727ec646df2ad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad",
+ "reference": "d990688c91cedfb69753ffc2512727ec646df2ad",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.31.1",
+ "commonmark/commonmark.js": "0.31.1",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4 || ^2.0",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0 | ^7.0",
+ "symfony/process": "^5.4 | ^6.0 | ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-29T14:10:59+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-11T20:36:23+00:00"
+ },
+ {
+ "name": "league/flysystem",
+ "version": "3.29.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319",
+ "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319",
+ "shasum": ""
+ },
+ "require": {
+ "league/flysystem-local": "^3.0.0",
+ "league/mime-type-detection": "^1.0.0",
+ "php": "^8.0.2"
+ },
+ "conflict": {
+ "async-aws/core": "<1.19.0",
+ "async-aws/s3": "<1.14.0",
+ "aws/aws-sdk-php": "3.209.31 || 3.210.0",
+ "guzzlehttp/guzzle": "<7.0",
+ "guzzlehttp/ringphp": "<1.1.1",
+ "phpseclib/phpseclib": "3.0.15",
+ "symfony/http-client": "<5.2"
+ },
+ "require-dev": {
+ "async-aws/s3": "^1.5 || ^2.0",
+ "async-aws/simple-s3": "^1.1 || ^2.0",
+ "aws/aws-sdk-php": "^3.295.10",
+ "composer/semver": "^3.0",
+ "ext-fileinfo": "*",
+ "ext-ftp": "*",
+ "ext-mongodb": "^1.3",
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.5",
+ "google/cloud-storage": "^1.23",
+ "guzzlehttp/psr7": "^2.6",
+ "microsoft/azure-storage-blob": "^1.1",
+ "mongodb/mongodb": "^1.2",
+ "phpseclib/phpseclib": "^3.0.36",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^9.5.11|^10.0",
+ "sabre/dav": "^4.6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "File storage abstraction for PHP",
+ "keywords": [
+ "WebDAV",
+ "aws",
+ "cloud",
+ "file",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "s3",
+ "sftp",
+ "storage"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/flysystem/issues",
+ "source": "https://github.com/thephpleague/flysystem/tree/3.29.1"
+ },
+ "time": "2024-10-08T08:58:34+00:00"
+ },
+ {
+ "name": "league/flysystem-local",
+ "version": "3.29.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem-local.git",
+ "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27",
+ "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "league/flysystem": "^3.0.0",
+ "league/mime-type-detection": "^1.0.0",
+ "php": "^8.0.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\Local\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "Local filesystem adapter for Flysystem.",
+ "keywords": [
+ "Flysystem",
+ "file",
+ "files",
+ "filesystem",
+ "local"
+ ],
+ "support": {
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0"
+ },
+ "time": "2024-08-09T21:24:39+00:00"
+ },
+ {
+ "name": "league/mime-type-detection",
+ "version": "1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/mime-type-detection.git",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "phpstan/phpstan": "^0.12.68",
+ "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\MimeTypeDetection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "Mime-type detection for Flysystem",
+ "support": {
+ "issues": "https://github.com/thephpleague/mime-type-detection/issues",
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-21T08:32:55+00:00"
+ },
+ {
+ "name": "league/uri",
+ "version": "7.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/81fb5145d2644324614cc532b28efd0215bda430",
+ "reference": "81fb5145d2644324614cc532b28efd0215bda430",
+ "shasum": ""
+ },
+ "require": {
+ "league/uri-interfaces": "^7.5",
+ "php": "^8.1"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-fileinfo": "to create Data URI from file contennts",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
+ "league/uri-components": "Needed to easily manipulate URI objects components",
+ "php-64bit": "to improve IPV4 host parsing",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri/tree/7.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-08T08:40:02+00:00"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "7.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/08cfc6c4f3d811584fb09c37e2849e6a7f9b0742",
+ "reference": "08cfc6c4f3d811584fb09c37e2849e6a7f9b0742",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^8.1",
+ "psr/http-factory": "^1",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "suggest": {
+ "ext-bcmath": "to improve IPV4 host parsing",
+ "ext-gmp": "to improve IPV4 host parsing",
+ "ext-intl": "to handle IDN host with the best performance",
+ "php-64bit": "to improve IPV4 host parsing",
+ "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common interfaces and classes for URI representation and interaction",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri-src/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-08T08:18:47+00:00"
+ },
+ {
+ "name": "livewire/livewire",
+ "version": "v3.5.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/livewire/livewire.git",
+ "reference": "62f0fa6b340a467c25baa590a567d9a134b357da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/livewire/livewire/zipball/62f0fa6b340a467c25baa590a567d9a134b357da",
+ "reference": "62f0fa6b340a467c25baa590a567d9a134b357da",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/database": "^10.0|^11.0",
+ "illuminate/routing": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
+ "illuminate/validation": "^10.0|^11.0",
+ "laravel/prompts": "^0.1.24|^0.2|^0.3",
+ "league/mime-type-detection": "^1.9",
+ "php": "^8.1",
+ "symfony/console": "^6.0|^7.0",
+ "symfony/http-kernel": "^6.2|^7.0"
+ },
+ "require-dev": {
+ "calebporzio/sushi": "^2.1",
+ "laravel/framework": "^10.15.0|^11.0",
+ "mockery/mockery": "^1.3.1",
+ "orchestra/testbench": "^8.21.0|^9.0",
+ "orchestra/testbench-dusk": "^8.24|^9.1",
+ "phpunit/phpunit": "^10.4",
+ "psy/psysh": "^0.11.22|^0.12"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Livewire": "Livewire\\Livewire"
+ },
+ "providers": [
+ "Livewire\\LivewireServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Livewire\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Caleb Porzio",
+ "email": "calebporzio@gmail.com"
+ }
+ ],
+ "description": "A front-end framework for Laravel.",
+ "support": {
+ "issues": "https://github.com/livewire/livewire/issues",
+ "source": "https://github.com/livewire/livewire/tree/v3.5.18"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/livewire",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-23T15:05:02+00:00"
+ },
+ {
+ "name": "maatwebsite/excel",
+ "version": "3.1.62",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/SpartnerNL/Laravel-Excel.git",
+ "reference": "decfb9140161fcc117571e47e35ddf27983189ce"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/decfb9140161fcc117571e47e35ddf27983189ce",
+ "reference": "decfb9140161fcc117571e47e35ddf27983189ce",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^3.3",
+ "ext-json": "*",
+ "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0",
+ "php": "^7.0||^8.0",
+ "phpoffice/phpspreadsheet": "^1.29.7",
+ "psr/simple-cache": "^1.0||^2.0||^3.0"
+ },
+ "require-dev": {
+ "laravel/scout": "^7.0||^8.0||^9.0||^10.0",
+ "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0",
+ "predis/predis": "^1.1"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Excel": "Maatwebsite\\Excel\\Facades\\Excel"
+ },
+ "providers": [
+ "Maatwebsite\\Excel\\ExcelServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Maatwebsite\\Excel\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Patrick Brouwers",
+ "email": "patrick@spartner.nl"
+ }
+ ],
+ "description": "Supercharged Excel exports and imports in Laravel",
+ "keywords": [
+ "PHPExcel",
+ "batch",
+ "csv",
+ "excel",
+ "export",
+ "import",
+ "laravel",
+ "php",
+ "phpspreadsheet"
+ ],
+ "support": {
+ "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues",
+ "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.62"
+ },
+ "funding": [
+ {
+ "url": "https://laravel-excel.com/commercial-support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/patrickbrouwers",
+ "type": "github"
+ }
+ ],
+ "time": "2025-01-04T12:14:36+00:00"
+ },
+ {
+ "name": "maennchen/zipstream-php",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maennchen/ZipStream-PHP.git",
+ "reference": "6187e9cc4493da94b9b63eb2315821552015fca9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9",
+ "reference": "6187e9cc4493da94b9b63eb2315821552015fca9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "ext-zlib": "*",
+ "php-64bit": "^8.1"
+ },
+ "require-dev": {
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.16",
+ "guzzlehttp/guzzle": "^7.5",
+ "mikey179/vfsstream": "^1.6",
+ "php-coveralls/php-coveralls": "^2.5",
+ "phpunit/phpunit": "^10.0",
+ "vimeo/psalm": "^5.0"
+ },
+ "suggest": {
+ "guzzlehttp/psr7": "^2.4",
+ "psr/http-message": "^2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ZipStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paul Duncan",
+ "email": "pabs@pablotron.org"
+ },
+ {
+ "name": "Jonatan Männchen",
+ "email": "jonatan@maennchen.ch"
+ },
+ {
+ "name": "Jesse Donat",
+ "email": "donatj@gmail.com"
+ },
+ {
+ "name": "András Kolesár",
+ "email": "kolesar@kolesar.hu"
+ }
+ ],
+ "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.",
+ "keywords": [
+ "stream",
+ "zip"
+ ],
+ "support": {
+ "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
+ "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/maennchen",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-10T12:33:01+00:00"
+ },
+ {
+ "name": "markbaker/complex",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MarkBaker/PHPComplex.git",
+ "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+ "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+ "squizlabs/php_codesniffer": "^3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Complex\\": "classes/src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker",
+ "email": "mark@lange.demon.co.uk"
+ }
+ ],
+ "description": "PHP Class for working with complex numbers",
+ "homepage": "https://github.com/MarkBaker/PHPComplex",
+ "keywords": [
+ "complex",
+ "mathematics"
+ ],
+ "support": {
+ "issues": "https://github.com/MarkBaker/PHPComplex/issues",
+ "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2"
+ },
+ "time": "2022-12-06T16:21:08+00:00"
+ },
+ {
+ "name": "markbaker/matrix",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MarkBaker/PHPMatrix.git",
+ "reference": "728434227fe21be27ff6d86621a1b13107a2562c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c",
+ "reference": "728434227fe21be27ff6d86621a1b13107a2562c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpdocumentor/phpdocumentor": "2.*",
+ "phploc/phploc": "^4.0",
+ "phpmd/phpmd": "2.*",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+ "sebastian/phpcpd": "^4.0",
+ "squizlabs/php_codesniffer": "^3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matrix\\": "classes/src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker",
+ "email": "mark@demon-angel.eu"
+ }
+ ],
+ "description": "PHP Class for working with matrices",
+ "homepage": "https://github.com/MarkBaker/PHPMatrix",
+ "keywords": [
+ "mathematics",
+ "matrix",
+ "vector"
+ ],
+ "support": {
+ "issues": "https://github.com/MarkBaker/PHPMatrix/issues",
+ "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1"
+ },
+ "time": "2022-12-02T22:17:43+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "3.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
+ "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
+ },
+ "provide": {
+ "psr/log-implementation": "3.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2 || ^2.0",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
+ "predis/predis": "^1.1 || ^2",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "ext-openssl": "Required to send log messages using SSL",
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/3.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-05T17:15:07+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "3.8.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon.git",
+ "reference": "129700ed449b1f02d70272d2ac802357c8c30c58"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/129700ed449b1f02d70272d2ac802357c8c30c58",
+ "reference": "129700ed449b1f02d70272d2ac802357c8c30c58",
+ "shasum": ""
+ },
+ "require": {
+ "carbonphp/carbon-doctrine-types": "<100.0",
+ "ext-json": "*",
+ "php": "^8.1",
+ "psr/clock": "^1.0",
+ "symfony/clock": "^6.3 || ^7.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6.3 || ^4.0",
+ "doctrine/orm": "^2.15.2 || ^3.0",
+ "friendsofphp/php-cs-fixer": "^3.57.2",
+ "kylekatarnls/multi-tester": "^2.5.3",
+ "ondrejmirtes/better-reflection": "^6.25.0.4",
+ "phpmd/phpmd": "^2.15.0",
+ "phpstan/extension-installer": "^1.3.1",
+ "phpstan/phpstan": "^1.11.2",
+ "phpunit/phpunit": "^10.5.20",
+ "squizlabs/php_codesniffer": "^3.9.0"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev",
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "https://markido.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "https://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "https://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "docs": "https://carbon.nesbot.com/docs",
+ "issues": "https://github.com/briannesbitt/Carbon/issues",
+ "source": "https://github.com/briannesbitt/Carbon"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-27T09:25:35+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d",
+ "reference": "da801d52f0354f70a638673c4a0f04e16529431d",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.5.2",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.3.2"
+ },
+ "time": "2024-10-06T23:10:23+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+ "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+ "shasum": ""
+ },
+ "require": {
+ "php": "8.0 - 8.4"
+ },
+ "conflict": {
+ "nette/finder": "<3",
+ "nette/schema": "<1.2.2"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "^2.5",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v4.0.5"
+ },
+ "time": "2024-08-07T15:39:19+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494",
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0"
+ },
+ "time": "2024-12-30T11:07:19+00:00"
+ },
+ {
+ "name": "nunomaduro/termwind",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/termwind.git",
+ "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda",
+ "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^8.2",
+ "symfony/console": "^7.1.8"
+ },
+ "require-dev": {
+ "illuminate/console": "^11.33.2",
+ "laravel/pint": "^1.18.2",
+ "mockery/mockery": "^1.6.12",
+ "pestphp/pest": "^2.36.0",
+ "phpstan/phpstan": "^1.12.11",
+ "phpstan/phpstan-strict-rules": "^1.6.1",
+ "symfony/var-dumper": "^7.1.8",
+ "thecodingmachine/phpstan-strict-rules": "^1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Termwind\\Laravel\\TermwindServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Functions.php"
+ ],
+ "psr-4": {
+ "Termwind\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Its like Tailwind CSS, but for the console.",
+ "keywords": [
+ "cli",
+ "console",
+ "css",
+ "package",
+ "php",
+ "style"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/termwind/issues",
+ "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/xiCO2k",
+ "type": "github"
+ }
+ ],
+ "time": "2024-11-21T10:39:51+00:00"
+ },
+ {
+ "name": "owen-it/laravel-auditing",
+ "version": "v13.6.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/owen-it/laravel-auditing.git",
+ "reference": "559b391e2ebf46a734b3f82d4f18faf425107054"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/559b391e2ebf46a734b3f82d4f18faf425107054",
+ "reference": "559b391e2ebf46a734b3f82d4f18faf425107054",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "illuminate/console": "^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/database": "^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/filesystem": "^7.0|^8.0|^9.0|^10.0|^11.0",
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "laravel/legacy-factories": "*",
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "phpunit/phpunit": "^9.6|^10.5|^11.0"
+ },
+ "suggest": {
+ "irazasyed/larasupport": "Needed to publish the package configuration in Lumen"
+ },
+ "type": "package",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "OwenIt\\Auditing\\AuditingServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "v13-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "OwenIt\\Auditing\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Antério Vieira",
+ "email": "anteriovieira@gmail.com"
+ },
+ {
+ "name": "Raphael França",
+ "email": "raphaelfrancabsb@gmail.com"
+ },
+ {
+ "name": "Morten D. Hansen",
+ "email": "morten@visia.dk"
+ }
+ ],
+ "description": "Audit changes of your Eloquent models in Laravel/Lumen",
+ "homepage": "https://laravel-auditing.com",
+ "keywords": [
+ "Accountability",
+ "Audit",
+ "auditing",
+ "changes",
+ "eloquent",
+ "history",
+ "laravel",
+ "log",
+ "logging",
+ "lumen",
+ "observer",
+ "record",
+ "revision",
+ "tracking"
+ ],
+ "support": {
+ "issues": "https://github.com/owen-it/laravel-auditing/issues",
+ "source": "https://github.com/owen-it/laravel-auditing"
+ },
+ "time": "2024-12-27T15:04:04+00:00"
+ },
+ {
+ "name": "paragonie/constant_time_encoding",
+ "version": "v3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/constant_time_encoding.git",
+ "reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
+ "reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9",
+ "vimeo/psalm": "^4|^5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Steve 'Sc00bz' Thomas",
+ "email": "steve@tobtu.com",
+ "homepage": "https://www.tobtu.com",
+ "role": "Original Developer"
+ }
+ ],
+ "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
+ "keywords": [
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/constant_time_encoding/issues",
+ "source": "https://github.com/paragonie/constant_time_encoding"
+ },
+ "time": "2024-05-08T12:36:18+00:00"
+ },
+ {
+ "name": "phpoffice/phpspreadsheet",
+ "version": "1.29.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
+ "reference": "089ffdfc04b5fcf25a3503d81a4e589f247e20e3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/089ffdfc04b5fcf25a3503d81a4e589f247e20e3",
+ "reference": "089ffdfc04b5fcf25a3503d81a4e589f247e20e3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-dom": "*",
+ "ext-fileinfo": "*",
+ "ext-gd": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-xml": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "ext-zip": "*",
+ "ext-zlib": "*",
+ "ezyang/htmlpurifier": "^4.15",
+ "maennchen/zipstream-php": "^2.1 || ^3.0",
+ "markbaker/complex": "^3.0",
+ "markbaker/matrix": "^3.0",
+ "php": "^7.4 || ^8.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "dev-main",
+ "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0",
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "mitoteam/jpgraph": "^10.3",
+ "mpdf/mpdf": "^8.1.1",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpstan/phpstan": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^8.5 || ^9.0",
+ "squizlabs/php_codesniffer": "^3.7",
+ "tecnickcom/tcpdf": "^6.5"
+ },
+ "suggest": {
+ "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+ "ext-intl": "PHP Internationalization Functions",
+ "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+ "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
+ "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maarten Balliauw",
+ "homepage": "https://blog.maartenballiauw.be"
+ },
+ {
+ "name": "Mark Baker",
+ "homepage": "https://markbakeruk.net"
+ },
+ {
+ "name": "Franck Lefevre",
+ "homepage": "https://rootslabs.net"
+ },
+ {
+ "name": "Erik Tilt"
+ },
+ {
+ "name": "Adrien Crivelli"
+ }
+ ],
+ "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+ "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
+ "keywords": [
+ "OpenXML",
+ "excel",
+ "gnumeric",
+ "ods",
+ "php",
+ "spreadsheet",
+ "xls",
+ "xlsx"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
+ "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.8"
+ },
+ "time": "2025-01-12T03:16:27+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.9.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54",
+ "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpOption\\": "src/PhpOption/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "support": {
+ "issues": "https://github.com/schmittjoh/php-option/issues",
+ "source": "https://github.com/schmittjoh/php-option/tree/1.9.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-20T21:41:07+00:00"
+ },
+ {
+ "name": "pragmarx/google2fa",
+ "version": "v8.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/antonioribeiro/google2fa.git",
+ "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad",
+ "reference": "6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^1.0|^2.0|^3.0",
+ "php": "^7.1|^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.9",
+ "phpunit/phpunit": "^7.5.15|^8.5|^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PragmaRX\\Google2FA\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Antonio Carlos Ribeiro",
+ "email": "acr@antoniocarlosribeiro.com",
+ "role": "Creator & Designer"
+ }
+ ],
+ "description": "A One Time Password Authentication package, compatible with Google Authenticator.",
+ "keywords": [
+ "2fa",
+ "Authentication",
+ "Two Factor Authentication",
+ "google2fa"
+ ],
+ "support": {
+ "issues": "https://github.com/antonioribeiro/google2fa/issues",
+ "source": "https://github.com/antonioribeiro/google2fa/tree/v8.0.3"
+ },
+ "time": "2024-09-05T11:56:40+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
+ },
+ "time": "2021-10-29T13:26:27+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.12.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
+ "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nikic/php-parser": "^5.0 || ^4.0",
+ "php": "^8.0 || ^7.4",
+ "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4",
+ "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4"
+ },
+ "conflict": {
+ "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.2"
+ },
+ "suggest": {
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-main": "0.12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "support": {
+ "issues": "https://github.com/bobthecow/psysh/issues",
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.7"
+ },
+ "time": "2024-12-10T01:58:33+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "captainhook/plugin-composer": "^5.3",
+ "ergebnis/composer-normalize": "^2.28.3",
+ "fakerphp/faker": "^1.21",
+ "hamcrest/hamcrest-php": "^2.0",
+ "jangregor/phpstan-prophecy": "^1.0",
+ "mockery/mockery": "^1.5",
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpcsstandards/phpcsutils": "^1.0.0-rc1",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1.2",
+ "phpstan/phpstan": "^1.9",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5",
+ "psalm/plugin-mockery": "^1.1",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "ramsey/coding-standard": "^2.0.3",
+ "ramsey/conventional-commits": "^1.3",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ },
+ "ramsey/conventional-commits": {
+ "configFile": "conventional-commits.json"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/collection/issues",
+ "source": "https://github.com/ramsey/collection/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-31T21:50:55+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.7.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "91039bc1faa45ba123c4328958e620d382ec7088"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088",
+ "reference": "91039bc1faa45ba123c4328958e620d382ec7088",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12",
+ "ext-json": "*",
+ "php": "^8.0",
+ "ramsey/collection": "^1.2 || ^2.0"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.10",
+ "captainhook/plugin-composer": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "ergebnis/composer-normalize": "^2.15",
+ "mockery/mockery": "^1.3",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock": "^2.2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^1.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "ramsey/composer-repl": "^1.4",
+ "slevomat/coding-standard": "^8.4",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.9"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/uuid/issues",
+ "source": "https://github.com/ramsey/uuid/tree/4.7.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-27T21:32:50+00:00"
+ },
+ {
+ "name": "spatie/laravel-permission",
+ "version": "6.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/laravel-permission.git",
+ "reference": "8bb69d6d67387f7a00d93a2f5fab98860f06e704"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/8bb69d6d67387f7a00d93a2f5fab98860f06e704",
+ "reference": "8bb69d6d67387f7a00d93a2f5fab98860f06e704",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/auth": "^8.12|^9.0|^10.0|^11.0",
+ "illuminate/container": "^8.12|^9.0|^10.0|^11.0",
+ "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0",
+ "illuminate/database": "^8.12|^9.0|^10.0|^11.0",
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "larastan/larastan": "^1.0|^2.0",
+ "laravel/passport": "^11.0|^12.0",
+ "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0",
+ "phpunit/phpunit": "^9.4|^10.1"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Spatie\\Permission\\PermissionServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-main": "6.x-dev",
+ "dev-master": "6.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Spatie\\Permission\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Permission handling for Laravel 8.0 and up",
+ "homepage": "https://github.com/spatie/laravel-permission",
+ "keywords": [
+ "acl",
+ "laravel",
+ "permission",
+ "permissions",
+ "rbac",
+ "roles",
+ "security",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/laravel-permission/issues",
+ "source": "https://github.com/spatie/laravel-permission/tree/6.10.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-11-08T18:45:41+00:00"
+ },
+ {
+ "name": "symfony/clock",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/clock": "^1.0",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/now.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Clock\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Decouples applications from the system clock",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clock",
+ "psr20",
+ "time"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/clock/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
+ "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/dotenv": "<6.4",
+ "symfony/event-dispatcher": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/process": "<6.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-11T03:49:26+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2",
+ "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Converts CSS selectors to XPath expressions",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/css-selector/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "6150b89186573046167796fa5f3f76601d5145f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8",
+ "reference": "6150b89186573046167796fa5f3f76601d5145f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/deprecation-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4"
+ },
+ "require-dev": {
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0"
+ },
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:50:44+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
+ "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
+ "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v7.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "87a71856f2f56e4100373e92529eed3171695cfb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb",
+ "reference": "87a71856f2f56e4100373e92529eed3171695cfb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v7.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-30T19:00:17+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v7.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62d1a43796ca3fea3f83a8470dfe63a4af3bc588",
+ "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php83": "^1.27"
+ },
+ "conflict": {
+ "doctrine/dbal": "<3.6",
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.6|^4",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/cache": "^6.4.12|^7.1.5",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/mime": "^6.4|^7.0",
+ "symfony/rate-limiter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v7.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-30T19:00:17+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v7.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3c432966bd8c7ec7429663105f5a02d7e75b4306",
+ "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<6.4",
+ "symfony/cache": "<6.4",
+ "symfony/config": "<6.4",
+ "symfony/console": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/doctrine-bridge": "<6.4",
+ "symfony/form": "<6.4",
+ "symfony/http-client": "<6.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/mailer": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/translation": "<6.4",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<6.4",
+ "symfony/validator": "<6.4",
+ "symfony/var-dumper": "<6.4",
+ "twig/twig": "<3.12"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^6.4|^7.0",
+ "symfony/clock": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/css-selector": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/dom-crawler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/property-access": "^7.1",
+ "symfony/routing": "^6.4|^7.0",
+ "symfony/serializer": "^7.1",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^6.4|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0",
+ "symfony/var-exporter": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a structured process for converting a Request into a Response",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-kernel/tree/v7.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-31T14:59:40+00:00"
+ },
+ {
+ "name": "symfony/mailer",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailer.git",
+ "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc",
+ "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc",
+ "shasum": ""
+ },
+ "require": {
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "php": ">=8.2",
+ "psr/event-dispatcher": "^1",
+ "psr/log": "^1|^2|^3",
+ "symfony/event-dispatcher": "^6.4|^7.0",
+ "symfony/mime": "^7.2",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/mime": "<6.4",
+ "symfony/twig-bridge": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/twig-bridge": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps sending emails",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailer/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-25T15:21:05+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v7.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283",
+ "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0"
+ },
+ "conflict": {
+ "egulias/email-validator": "~3.0.0",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/mailer": "<6.4",
+ "symfony/serializer": "<6.4.3|>7.0,<7.0.3"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3.1|^4",
+ "league/html-to-markdown": "^5.0",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/property-info": "^6.4|^7.0",
+ "symfony/serializer": "^6.4.3|^7.0.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mime\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows manipulating MIME messages",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mime",
+ "mime-type"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/mime/tree/v7.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:50:44+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
+ "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php83",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php83\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-uuid",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-uuid.git",
+ "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2",
+ "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-uuid": "*"
+ },
+ "suggest": {
+ "ext-uuid": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Uuid\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Grégoire Pineau",
+ "email": "lyrixx@lyrixx.info"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for uuid functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "uuid"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
+ "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-06T14:24:19+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e",
+ "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/config": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps an HTTP request to a set of configuration variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-25T11:08:51+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
+ "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-13T13:31:26+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v7.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/e2674a30132b7cc4d74540d6c2573aa363f05923",
+ "reference": "e2674a30132b7cc4d74540d6c2573aa363f05923",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation-contracts": "^2.5|^3.0"
+ },
+ "conflict": {
+ "symfony/config": "<6.4",
+ "symfony/console": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4",
+ "symfony/service-contracts": "<2.5",
+ "symfony/twig-bundle": "<6.4",
+ "symfony/yaml": "<6.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3|3.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.18|^5.0",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v7.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-07T08:18:10+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "4667ff3bd513750603a09c8dedbea942487fb07c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c",
+ "reference": "4667ff3bd513750603a09c8dedbea942487fb07c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:20:29+00:00"
+ },
+ {
+ "name": "symfony/uid",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/uid.git",
+ "reference": "2d294d0c48df244c71c105a169d0190bfb080426"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426",
+ "reference": "2d294d0c48df244c71c105a169d0190bfb080426",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-uuid": "^1.15"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Uid\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Grégoire Pineau",
+ "email": "lyrixx@lyrixx.info"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to generate and represent UIDs",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "UID",
+ "ulid",
+ "uuid"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/uid/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c",
+ "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/uid": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-08T15:48:14+00:00"
+ },
+ {
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "0d72ac1c00084279c1816675284073c5a337c20d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d",
+ "reference": "0d72ac1c00084279c1816675284073c5a337c20d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": "^7.4 || ^8.0",
+ "symfony/css-selector": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^8.5.21 || ^9.5.10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "TijsVerkoyen\\CssToInlineStyles\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Tijs Verkoyen",
+ "email": "css_to_inline_styles@verkoyen.eu",
+ "role": "Developer"
+ }
+ ],
+ "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+ "support": {
+ "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
+ "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0"
+ },
+ "time": "2024-12-21T16:25:41+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2",
+ "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.1.3",
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9.3",
+ "symfony/polyfill-ctype": "^1.24",
+ "symfony/polyfill-mbstring": "^1.24",
+ "symfony/polyfill-php80": "^1.24"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-master": "5.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Vance Lucas",
+ "email": "vance@vancelucas.com",
+ "homepage": "https://github.com/vlucas"
+ }
+ ],
+ "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "issues": "https://github.com/vlucas/phpdotenv/issues",
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-20T21:52:34+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "https://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-21T01:49:47+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ },
+ {
+ "name": "yajra/laravel-datatables-oracle",
+ "version": "v11.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/yajra/laravel-datatables.git",
+ "reference": "b48eb614d0474c23a9c8041563beef9dda39656d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/b48eb614d0474c23a9c8041563beef9dda39656d",
+ "reference": "b48eb614d0474c23a9c8041563beef9dda39656d",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/database": "^11",
+ "illuminate/filesystem": "^11",
+ "illuminate/http": "^11",
+ "illuminate/support": "^11",
+ "illuminate/view": "^11",
+ "php": "^8.2"
+ },
+ "require-dev": {
+ "algolia/algoliasearch-client-php": "^3.4.1",
+ "larastan/larastan": "^2.9.1",
+ "laravel/pint": "^1.14",
+ "laravel/scout": "^10.8.3",
+ "meilisearch/meilisearch-php": "^1.6.1",
+ "orchestra/testbench": "^9",
+ "rector/rector": "^1.0"
+ },
+ "suggest": {
+ "yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.",
+ "yajra/laravel-datatables-editor": "Plugin to use DataTables Editor (requires a license).",
+ "yajra/laravel-datatables-export": "Plugin for server-side exporting using livewire and queue worker.",
+ "yajra/laravel-datatables-fractal": "Plugin for server-side response using Fractal.",
+ "yajra/laravel-datatables-html": "Plugin for server-side HTML builder of dataTables."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "DataTables": "Yajra\\DataTables\\Facades\\DataTables"
+ },
+ "providers": [
+ "Yajra\\DataTables\\DataTablesServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "11.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helper.php"
+ ],
+ "psr-4": {
+ "Yajra\\DataTables\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Arjay Angeles",
+ "email": "aqangeles@gmail.com"
+ }
+ ],
+ "description": "jQuery DataTables API for Laravel",
+ "keywords": [
+ "datatables",
+ "jquery",
+ "laravel",
+ "yajra"
+ ],
+ "support": {
+ "issues": "https://github.com/yajra/laravel-datatables/issues",
+ "source": "https://github.com/yajra/laravel-datatables/tree/v11.1.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/yajra",
+ "type": "github"
+ }
+ ],
+ "time": "2025-01-21T03:15:46+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "barryvdh/laravel-debugbar",
+ "version": "v3.14.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-debugbar.git",
+ "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56b9bd235e3fe62e250124804009ce5bab97cc63",
+ "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/routing": "^9|^10|^11",
+ "illuminate/session": "^9|^10|^11",
+ "illuminate/support": "^9|^10|^11",
+ "maximebf/debugbar": "~1.23.0",
+ "php": "^8.0",
+ "symfony/finder": "^6|^7"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.3.3",
+ "orchestra/testbench-dusk": "^5|^6|^7|^8|^9",
+ "phpunit/phpunit": "^9.6|^10.5",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar"
+ },
+ "providers": [
+ "Barryvdh\\Debugbar\\ServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "3.14-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Barryvdh\\Debugbar\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "PHP Debugbar integration for Laravel",
+ "keywords": [
+ "debug",
+ "debugbar",
+ "laravel",
+ "profiler",
+ "webprofiler"
+ ],
+ "support": {
+ "issues": "https://github.com/barryvdh/laravel-debugbar/issues",
+ "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.10"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-23T10:10:42+00:00"
+ },
+ {
+ "name": "fakerphp/faker",
+ "version": "v1.24.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "psr/container": "^1.0 || ^2.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "conflict": {
+ "fzaninotto/faker": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "doctrine/persistence": "^1.3 || ^2.0",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
+ },
+ "suggest": {
+ "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+ "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+ "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+ "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+ "ext-mbstring": "Required for multibyte Unicode string functionality."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "support": {
+ "issues": "https://github.com/FakerPHP/Faker/issues",
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
+ },
+ "time": "2024-11-21T13:46:39+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "befcdc0e5dce67252aa6322d82424be928214fa2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2",
+ "reference": "befcdc0e5dce67252aa6322d82424be928214fa2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.16.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-25T12:00:00+00:00"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3|^7.0|^8.0"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "support": {
+ "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+ },
+ "time": "2020-07-09T08:09:16+00:00"
+ },
+ {
+ "name": "laravel/pint",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/pint.git",
+ "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
+ "reference": "53072e8ea22213a7ed168a8a15b96fbb8b82d44b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-tokenizer": "*",
+ "ext-xml": "*",
+ "php": "^8.1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.66.0",
+ "illuminate/view": "^10.48.25",
+ "larastan/larastan": "^2.9.12",
+ "laravel-zero/framework": "^10.48.25",
+ "mockery/mockery": "^1.6.12",
+ "nunomaduro/termwind": "^1.17.0",
+ "pestphp/pest": "^2.36.0"
+ },
+ "bin": [
+ "builds/pint"
+ ],
+ "type": "project",
+ "autoload": {
+ "psr-4": {
+ "App\\": "app/",
+ "Database\\Seeders\\": "database/seeders/",
+ "Database\\Factories\\": "database/factories/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "An opinionated code formatter for PHP.",
+ "homepage": "https://laravel.com",
+ "keywords": [
+ "format",
+ "formatter",
+ "lint",
+ "linter",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/pint/issues",
+ "source": "https://github.com/laravel/pint"
+ },
+ "time": "2025-01-14T16:20:53+00:00"
+ },
+ {
+ "name": "laravel/sail",
+ "version": "v1.40.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/sail.git",
+ "reference": "237e70656d8eface4839de51d101284bd5d0cf71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/sail/zipball/237e70656d8eface4839de51d101284bd5d0cf71",
+ "reference": "237e70656d8eface4839de51d101284bd5d0cf71",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^9.52.16|^10.0|^11.0",
+ "illuminate/contracts": "^9.52.16|^10.0|^11.0",
+ "illuminate/support": "^9.52.16|^10.0|^11.0",
+ "php": "^8.0",
+ "symfony/console": "^6.0|^7.0",
+ "symfony/yaml": "^6.0|^7.0"
+ },
+ "require-dev": {
+ "orchestra/testbench": "^7.0|^8.0|^9.0",
+ "phpstan/phpstan": "^1.10"
+ },
+ "bin": [
+ "bin/sail"
+ ],
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Sail\\SailServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Sail\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Docker files for running a basic Laravel application.",
+ "keywords": [
+ "docker",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/sail/issues",
+ "source": "https://github.com/laravel/sail"
+ },
+ "time": "2025-01-13T16:57:11+00:00"
+ },
+ {
+ "name": "maximebf/debugbar",
+ "version": "v1.23.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-debugbar/php-debugbar.git",
+ "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/eeabd61a1f19ba5dcd5ac4585a477130ee03ce25",
+ "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^4|^5|^6|^7"
+ },
+ "require-dev": {
+ "dbrekelmans/bdi": "^1",
+ "phpunit/phpunit": "^8|^9",
+ "symfony/panther": "^1|^2.1",
+ "twig/twig": "^1.38|^2.7|^3.0"
+ },
+ "suggest": {
+ "kriswallsmith/assetic": "The best way to manage assets",
+ "monolog/monolog": "Log using Monolog",
+ "predis/predis": "Redis storage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.23-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "DebugBar\\": "src/DebugBar/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maxime Bouroumeau-Fuseau",
+ "email": "maxime.bouroumeau@gmail.com",
+ "homepage": "http://maximebf.com"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Debug bar in the browser for php application",
+ "homepage": "https://github.com/maximebf/php-debugbar",
+ "keywords": [
+ "debug",
+ "debugbar"
+ ],
+ "support": {
+ "issues": "https://github.com/php-debugbar/php-debugbar/issues",
+ "source": "https://github.com/php-debugbar/php-debugbar/tree/v1.23.5"
+ },
+ "time": "2024-12-15T19:20:42+00:00"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "1.6.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=7.3"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.6.17",
+ "symplify/easy-coding-standard": "^12.1.14"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "library/helpers.php",
+ "library/Mockery.php"
+ ],
+ "psr-4": {
+ "Mockery\\": "library/Mockery"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "https://github.com/padraic",
+ "role": "Author"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "https://davedevelopment.co.uk",
+ "role": "Developer"
+ },
+ {
+ "name": "Nathanael Esayeas",
+ "email": "nathanael.esayeas@protonmail.com",
+ "homepage": "https://github.com/ghostwriter",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework",
+ "homepage": "https://github.com/mockery/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "support": {
+ "docs": "https://docs.mockery.io/",
+ "issues": "https://github.com/mockery/mockery/issues",
+ "rss": "https://github.com/mockery/mockery/releases.atom",
+ "security": "https://github.com/mockery/mockery/security/advisories",
+ "source": "https://github.com/mockery/mockery"
+ },
+ "time": "2024-05-16T03:13:13+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.12.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
+ "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-08T17:47:46+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v8.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "86f003c132143d5a2ab214e19933946409e0cae7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/86f003c132143d5a2ab214e19933946409e0cae7",
+ "reference": "86f003c132143d5a2ab214e19933946409e0cae7",
+ "shasum": ""
+ },
+ "require": {
+ "filp/whoops": "^2.16.0",
+ "nunomaduro/termwind": "^2.3.0",
+ "php": "^8.2.0",
+ "symfony/console": "^7.2.1"
+ },
+ "conflict": {
+ "laravel/framework": "<11.39.1 || >=13.0.0",
+ "phpunit/phpunit": "<11.5.3 || >=12.0.0"
+ },
+ "require-dev": {
+ "larastan/larastan": "^2.9.12",
+ "laravel/framework": "^11.39.1",
+ "laravel/pint": "^1.20.0",
+ "laravel/sail": "^1.40.0",
+ "laravel/sanctum": "^4.0.7",
+ "laravel/tinker": "^2.10.0",
+ "orchestra/testbench-core": "^9.9.2",
+ "pestphp/pest": "^3.7.3",
+ "sebastian/environment": "^6.1.0 || ^7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-8.x": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "./src/Adapters/Phpunit/Autoload.php"
+ ],
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "dev",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/collision/issues",
+ "source": "https://github.com/nunomaduro/collision"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2025-01-23T13:41:43+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "11.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "418c59fd080954f8c4aa5631d9502ecda2387118"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/418c59fd080954f8c4aa5631d9502ecda2387118",
+ "reference": "418c59fd080954f8c4aa5631d9502ecda2387118",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^5.3.1",
+ "php": ">=8.2",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-text-template": "^4.0.1",
+ "sebastian/code-unit-reverse-lookup": "^4.0.1",
+ "sebastian/complexity": "^4.0.1",
+ "sebastian/environment": "^7.2.0",
+ "sebastian/lines-of-code": "^3.0.1",
+ "sebastian/version": "^5.0.2",
+ "theseer/tokenizer": "^1.2.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.5.0"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "11.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-11T12:34:27+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-27T05:02:59+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "5.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^11.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:07:44+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:08:43+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "7.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:09:35+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "11.5.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "30e319e578a7b5da3543073e30002bf82042f701"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/30e319e578a7b5da3543073e30002bf82042f701",
+ "reference": "30e319e578a7b5da3543073e30002bf82042f701",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.12.1",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.2",
+ "phpunit/php-code-coverage": "^11.0.8",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-invoker": "^5.0.1",
+ "phpunit/php-text-template": "^4.0.1",
+ "phpunit/php-timer": "^7.0.1",
+ "sebastian/cli-parser": "^3.0.2",
+ "sebastian/code-unit": "^3.0.2",
+ "sebastian/comparator": "^6.3.0",
+ "sebastian/diff": "^6.0.2",
+ "sebastian/environment": "^7.2.0",
+ "sebastian/exporter": "^6.3.0",
+ "sebastian/global-state": "^7.0.2",
+ "sebastian/object-enumerator": "^6.0.1",
+ "sebastian/type": "^5.1.0",
+ "sebastian/version": "^5.0.2",
+ "staabm/side-effects-detector": "^1.0.5"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "11.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.3"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-13T09:36:00+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:41:36+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca",
+ "reference": "ee88b0cdbe74cf8dd3b54940ff17643c0d6543ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "security": "https://github.com/sebastianbergmann/code-unit/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-12T09:59:06+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:45:54+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d4e47a769525c4dd38cea90e5dcd435ddbbc7115",
+ "reference": "d4e47a769525c4dd38cea90e5dcd435ddbbc7115",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.2",
+ "sebastian/diff": "^6.0",
+ "sebastian/exporter": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.4"
+ },
+ "suggest": {
+ "ext-bcmath": "For comparing BcMath\\Number objects"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-01-06T10:28:19+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:49:50+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:53:05+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
+ "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "https://github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:54:44+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3",
+ "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=8.2",
+ "sebastian/recursion-context": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-05T09:17:50+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "7.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "https://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:57:36+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T04:58:38+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "6.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:00:13+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:01:32+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16",
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-03T05:10:34+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac",
+ "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^11.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "security": "https://github.com/sebastianbergmann/type/security/policy",
+ "source": "https://github.com/sebastianbergmann/type/tree/5.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-17T13:12:04+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "security": "https://github.com/sebastianbergmann/version/security/policy",
+ "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-09T05:16:32+00:00"
+ },
+ {
+ "name": "spatie/backtrace",
+ "version": "1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/backtrace.git",
+ "reference": "0f2477c520e3729de58e061b8192f161c99f770b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b",
+ "reference": "0f2477c520e3729de58e061b8192f161c99f770b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3 || ^8.0"
+ },
+ "require-dev": {
+ "ext-json": "*",
+ "laravel/serializable-closure": "^1.3 || ^2.0",
+ "phpunit/phpunit": "^9.3 || ^11.4.3",
+ "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6",
+ "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Backtrace\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van de Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "A better backtrace",
+ "homepage": "https://github.com/spatie/backtrace",
+ "keywords": [
+ "Backtrace",
+ "spatie"
+ ],
+ "support": {
+ "source": "https://github.com/spatie/backtrace/tree/1.7.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/spatie",
+ "type": "github"
+ },
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "other"
+ }
+ ],
+ "time": "2024-12-02T13:28:15+00:00"
+ },
+ {
+ "name": "spatie/error-solutions",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/error-solutions.git",
+ "reference": "d239a65235a1eb128dfa0a4e4c4ef032ea11b541"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/error-solutions/zipball/d239a65235a1eb128dfa0a4e4c4ef032ea11b541",
+ "reference": "d239a65235a1eb128dfa0a4e4c4ef032ea11b541",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "illuminate/broadcasting": "^10.0|^11.0",
+ "illuminate/cache": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
+ "livewire/livewire": "^2.11|^3.3.5",
+ "openai-php/client": "^0.10.1",
+ "orchestra/testbench": "^7.0|8.22.3|^9.0",
+ "pestphp/pest": "^2.20",
+ "phpstan/phpstan": "^1.11",
+ "psr/simple-cache": "^3.0",
+ "psr/simple-cache-implementation": "^3.0",
+ "spatie/ray": "^1.28",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "vlucas/phpdotenv": "^5.5"
+ },
+ "suggest": {
+ "openai-php/client": "Require get solutions from OpenAI",
+ "simple-cache-implementation": "To cache solutions from OpenAI"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Ignition\\": "legacy/ignition",
+ "Spatie\\ErrorSolutions\\": "src",
+ "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ruben Van Assche",
+ "email": "ruben@spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "This is my package error-solutions",
+ "homepage": "https://github.com/spatie/error-solutions",
+ "keywords": [
+ "error-solutions",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/error-solutions/issues",
+ "source": "https://github.com/spatie/error-solutions/tree/1.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-11T09:51:56+00:00"
+ },
+ {
+ "name": "spatie/flare-client-php",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/flare-client-php.git",
+ "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/140a42b2c5d59ac4ecf8f5b493386a4f2eb28272",
+ "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0",
+ "php": "^8.0",
+ "spatie/backtrace": "^1.6.1",
+ "symfony/http-foundation": "^5.2|^6.0|^7.0",
+ "symfony/mime": "^5.2|^6.0|^7.0",
+ "symfony/process": "^5.2|^6.0|^7.0",
+ "symfony/var-dumper": "^5.2|^6.0|^7.0"
+ },
+ "require-dev": {
+ "dms/phpunit-arraysubset-asserts": "^0.5.0",
+ "pestphp/pest": "^1.20|^2.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "spatie/pest-plugin-snapshots": "^1.0|^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Spatie\\FlareClient\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Send PHP errors to Flare",
+ "homepage": "https://github.com/spatie/flare-client-php",
+ "keywords": [
+ "exception",
+ "flare",
+ "reporting",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/flare-client-php/issues",
+ "source": "https://github.com/spatie/flare-client-php/tree/1.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-02T14:30:06+00:00"
+ },
+ {
+ "name": "spatie/ignition",
+ "version": "1.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/ignition.git",
+ "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/ignition/zipball/e3a68e137371e1eb9edc7f78ffa733f3b98991d2",
+ "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "php": "^8.0",
+ "spatie/error-solutions": "^1.0",
+ "spatie/flare-client-php": "^1.7",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "require-dev": {
+ "illuminate/cache": "^9.52|^10.0|^11.0",
+ "mockery/mockery": "^1.4",
+ "pestphp/pest": "^1.20|^2.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "psr/simple-cache-implementation": "*",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "vlucas/phpdotenv": "^5.5"
+ },
+ "suggest": {
+ "openai-php/client": "Require get solutions from OpenAI",
+ "simple-cache-implementation": "To cache solutions from OpenAI"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Ignition\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Spatie",
+ "email": "info@spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "A beautiful error page for PHP applications.",
+ "homepage": "https://flareapp.io/ignition",
+ "keywords": [
+ "error",
+ "flare",
+ "laravel",
+ "page"
+ ],
+ "support": {
+ "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction",
+ "forum": "https://twitter.com/flareappio",
+ "issues": "https://github.com/spatie/ignition/issues",
+ "source": "https://github.com/spatie/ignition"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-06-12T14:55:22+00:00"
+ },
+ {
+ "name": "spatie/laravel-ignition",
+ "version": "2.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/laravel-ignition.git",
+ "reference": "62042df15314b829d0f26e02108f559018e2aad0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/62042df15314b829d0f26e02108f559018e2aad0",
+ "reference": "62042df15314b829d0f26e02108f559018e2aad0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "illuminate/support": "^10.0|^11.0",
+ "php": "^8.1",
+ "spatie/ignition": "^1.15",
+ "symfony/console": "^6.2.3|^7.0",
+ "symfony/var-dumper": "^6.2.3|^7.0"
+ },
+ "require-dev": {
+ "livewire/livewire": "^2.11|^3.3.5",
+ "mockery/mockery": "^1.5.1",
+ "openai-php/client": "^0.8.1",
+ "orchestra/testbench": "8.22.3|^9.0",
+ "pestphp/pest": "^2.34",
+ "phpstan/extension-installer": "^1.3.1",
+ "phpstan/phpstan-deprecation-rules": "^1.1.1",
+ "phpstan/phpstan-phpunit": "^1.3.16",
+ "vlucas/phpdotenv": "^5.5"
+ },
+ "suggest": {
+ "openai-php/client": "Require get solutions from OpenAI",
+ "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare"
+ },
+ "providers": [
+ "Spatie\\LaravelIgnition\\IgnitionServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Spatie\\LaravelIgnition\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Spatie",
+ "email": "info@spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "A beautiful error page for Laravel applications.",
+ "homepage": "https://flareapp.io/ignition",
+ "keywords": [
+ "error",
+ "flare",
+ "laravel",
+ "page"
+ ],
+ "support": {
+ "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction",
+ "forum": "https://twitter.com/flareappio",
+ "issues": "https://github.com/spatie/laravel-ignition/issues",
+ "source": "https://github.com/spatie/laravel-ignition"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-02T08:43:31+00:00"
+ },
+ {
+ "name": "staabm/side-effects-detector",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/staabm/side-effects-detector.git",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.6",
+ "phpunit/phpunit": "^9.6.21",
+ "symfony/var-dumper": "^5.4.43",
+ "tomasvotruba/type-coverage": "1.0.0",
+ "tomasvotruba/unused-public": "1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A static analysis tool to detect side effects in PHP code",
+ "keywords": [
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/staabm/side-effects-detector/issues",
+ "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-20T05:08:20+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "099581e99f557e9f16b43c5916c26380b54abb22"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22",
+ "reference": "099581e99f557e9f16b43c5916c26380b54abb22",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v7.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-10-23T06:56:12+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:36:25+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.2"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
+}
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000..df1d3df
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,128 @@
+ env('APP_NAME', 'Laravel'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Environment
+ |--------------------------------------------------------------------------
+ |
+ | This value determines the "environment" your application is currently
+ | running in. This may determine how you prefer to configure various
+ | services the application utilizes. Set this in your ".env" file.
+ |
+ */
+
+ 'env' => env('APP_ENV', 'production'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Debug Mode
+ |--------------------------------------------------------------------------
+ |
+ | When your application is in debug mode, detailed error messages with
+ | stack traces will be shown on every error that occurs within your
+ | application. If disabled, a simple generic error page is shown.
+ |
+ */
+
+ 'debug' => (bool) env('APP_DEBUG', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application URL
+ |--------------------------------------------------------------------------
+ |
+ | This URL is used by the console to properly generate URLs when using
+ | the Artisan command line tool. You should set this to the root of
+ | the application so that it's available within Artisan commands.
+ |
+ */
+
+ 'url' => env('APP_URL', 'http://localhost'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Timezone
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the default timezone for your application, which
+ | will be used by the PHP date and date-time functions. The timezone
+ | is set to "UTC" by default as it is suitable for most use cases.
+ |
+ */
+
+ 'timezone' => env('APP_TIMEZONE', 'UTC'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Locale Configuration
+ |--------------------------------------------------------------------------
+ |
+ | The application locale determines the default locale that will be used
+ | by Laravel's translation / localization methods. This option can be
+ | set to any locale for which you plan to have translation strings.
+ |
+ */
+
+ 'locale' => env('APP_LOCALE', 'en'),
+
+ 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
+
+ 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Encryption Key
+ |--------------------------------------------------------------------------
+ |
+ | This key is utilized by Laravel's encryption services and should be set
+ | to a random, 32 character string to ensure that all encrypted values
+ | are secure. You should do this prior to deploying the application.
+ |
+ */
+
+ 'cipher' => 'AES-256-CBC',
+
+ 'key' => env('APP_KEY'),
+
+ 'previous_keys' => [
+ ...array_filter(
+ explode(',', env('APP_PREVIOUS_KEYS', ''))
+ ),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Maintenance Mode Driver
+ |--------------------------------------------------------------------------
+ |
+ | These configuration options determine the driver used to determine and
+ | manage Laravel's "maintenance mode" status. The "cache" driver will
+ | allow maintenance mode to be controlled across multiple machines.
+ |
+ | Supported drivers: "file", "cache"
+ |
+ */
+
+ 'maintenance' => [
+ 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
+ 'store' => env('APP_MAINTENANCE_STORE', 'database'),
+ ],
+
+ 'aliases' => [],
+
+];
diff --git a/config/audit.php b/config/audit.php
new file mode 100644
index 0000000..d6cee42
--- /dev/null
+++ b/config/audit.php
@@ -0,0 +1,198 @@
+ env('AUDITING_ENABLED', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Implementation
+ |--------------------------------------------------------------------------
+ |
+ | Define which Audit model implementation should be used.
+ |
+ */
+
+ 'implementation' => OwenIt\Auditing\Models\Audit::class,
+
+ /*
+ |--------------------------------------------------------------------------
+ | User Morph prefix & Guards
+ |--------------------------------------------------------------------------
+ |
+ | Define the morph prefix and authentication guards for the User resolver.
+ |
+ */
+
+ 'user' => [
+ 'morph_prefix' => 'user',
+ 'guards' => [
+ 'web',
+ 'api'
+ ],
+ 'resolver' => OwenIt\Auditing\Resolvers\UserResolver::class
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Resolvers
+ |--------------------------------------------------------------------------
+ |
+ | Define the IP Address, User Agent and URL resolver implementations.
+ |
+ */
+ 'resolvers' => [
+ 'ip_address' => OwenIt\Auditing\Resolvers\IpAddressResolver::class,
+ 'user_agent' => OwenIt\Auditing\Resolvers\UserAgentResolver::class,
+ 'url' => OwenIt\Auditing\Resolvers\UrlResolver::class,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Events
+ |--------------------------------------------------------------------------
+ |
+ | The Eloquent events that trigger an Audit.
+ |
+ */
+
+ 'events' => [
+ 'created',
+ 'updated',
+ 'deleted',
+ 'restored'
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Strict Mode
+ |--------------------------------------------------------------------------
+ |
+ | Enable the strict mode when auditing?
+ |
+ */
+
+ 'strict' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Global exclude
+ |--------------------------------------------------------------------------
+ |
+ | Have something you always want to exclude by default? - add it here.
+ | Note that this is overwritten (not merged) with local exclude
+ |
+ */
+
+ 'exclude' => [],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Empty Values
+ |--------------------------------------------------------------------------
+ |
+ | Should Audit records be stored when the recorded old_values & new_values
+ | are both empty?
+ |
+ | Some events may be empty on purpose. Use allowed_empty_values to exclude
+ | those from the empty values check. For example when auditing
+ | model retrieved events which will never have new and old values.
+ |
+ |
+ */
+
+ 'empty_values' => true,
+ 'allowed_empty_values' => [
+ 'retrieved'
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Allowed Array Values
+ |--------------------------------------------------------------------------
+ |
+ | Should the array values be audited?
+ |
+ | By default, array values are not allowed. This is to prevent performance
+ | issues when storing large amounts of data. You can override this by
+ | setting allow_array_values to true.
+ */
+ 'allowed_array_values' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Timestamps
+ |--------------------------------------------------------------------------
+ |
+ | Should the created_at, updated_at and deleted_at timestamps be audited?
+ |
+ */
+
+ 'timestamps' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Threshold
+ |--------------------------------------------------------------------------
+ |
+ | Specify a threshold for the amount of Audit records a model can have.
+ | Zero means no limit.
+ |
+ */
+
+ 'threshold' => 0,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Driver
+ |--------------------------------------------------------------------------
+ |
+ | The default audit driver used to keep track of changes.
+ |
+ */
+
+ 'driver' => 'database',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Driver Configurations
+ |--------------------------------------------------------------------------
+ |
+ | Available audit drivers and respective configurations.
+ |
+ */
+
+ 'drivers' => [
+ 'database' => [
+ 'table' => 'audits',
+ 'connection' => null,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Queue Configurations
+ |--------------------------------------------------------------------------
+ |
+ | Available audit queue configurations.
+ |
+ */
+
+ 'queue' => [
+ 'enable' => false,
+ 'connection' => 'sync',
+ 'queue' => 'default',
+ 'delay' => 0,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Audit Console
+ |--------------------------------------------------------------------------
+ |
+ | Whether console events should be audited (eg. php artisan db:seed).
+ |
+ */
+
+ 'console' => false,
+];
diff --git a/config/auth.php b/config/auth.php
new file mode 100644
index 0000000..84b4665
--- /dev/null
+++ b/config/auth.php
@@ -0,0 +1,115 @@
+ [
+ 'guard' => env('AUTH_GUARD', 'web'),
+ 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Guards
+ |--------------------------------------------------------------------------
+ |
+ | Next, you may define every authentication guard for your application.
+ | Of course, a great default configuration has been defined for you
+ | which utilizes session storage plus the Eloquent user provider.
+ |
+ | All authentication guards have a user provider, which defines how the
+ | users are actually retrieved out of your database or other storage
+ | system used by the application. Typically, Eloquent is utilized.
+ |
+ | Supported: "session"
+ |
+ */
+
+ 'guards' => [
+ 'web' => [
+ 'driver' => 'session',
+ 'provider' => 'users',
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | User Providers
+ |--------------------------------------------------------------------------
+ |
+ | All authentication guards have a user provider, which defines how the
+ | users are actually retrieved out of your database or other storage
+ | system used by the application. Typically, Eloquent is utilized.
+ |
+ | If you have multiple user tables or models you may configure multiple
+ | providers to represent the model / table. These providers may then
+ | be assigned to any extra authentication guards you have defined.
+ |
+ | Supported: "database", "eloquent"
+ |
+ */
+
+ 'providers' => [
+ 'users' => [
+ 'driver' => 'eloquent',
+ 'model' => env('AUTH_MODEL', Modules\Admin\App\Models\User::class),
+ ],
+
+ // 'users' => [
+ // 'driver' => 'database',
+ // 'table' => 'users',
+ // ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Resetting Passwords
+ |--------------------------------------------------------------------------
+ |
+ | These configuration options specify the behavior of Laravel's password
+ | reset functionality, including the table utilized for token storage
+ | and the user provider that is invoked to actually retrieve users.
+ |
+ | The expiry time is the number of minutes that each reset token will be
+ | considered valid. This security feature keeps tokens short-lived so
+ | they have less time to be guessed. You may change this as needed.
+ |
+ | The throttle setting is the number of seconds a user must wait before
+ | generating more password reset tokens. This prevents the user from
+ | quickly generating a very large amount of password reset tokens.
+ |
+ */
+
+ 'passwords' => [
+ 'users' => [
+ 'provider' => 'users',
+ 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
+ 'expire' => 60,
+ 'throttle' => 60,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Password Confirmation Timeout
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define the amount of seconds before a password confirmation
+ | window expires and users are asked to re-enter their password via the
+ | confirmation screen. By default, the timeout lasts for three hours.
+ |
+ */
+
+ 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
+
+];
diff --git a/config/cache.php b/config/cache.php
new file mode 100644
index 0000000..f4a6293
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,107 @@
+ env('CACHE_STORE', 'database'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Stores
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define all of the cache "stores" for your application as
+ | well as their drivers. You may even define multiple stores for the
+ | same cache driver to group types of items stored in your caches.
+ |
+ | Supported drivers: "apc", "array", "database", "file", "memcached",
+ | "redis", "dynamodb", "octane", "null"
+ |
+ */
+
+ 'stores' => [
+
+ 'array' => [
+ 'driver' => 'array',
+ 'serialize' => false,
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'table' => env('DB_CACHE_TABLE', 'cache'),
+ 'connection' => env('DB_CACHE_CONNECTION', null),
+ 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION', null),
+ ],
+
+ 'file' => [
+ 'driver' => 'file',
+ 'path' => storage_path('framework/cache/data'),
+ 'lock_path' => storage_path('framework/cache/data'),
+ ],
+
+ 'memcached' => [
+ 'driver' => 'memcached',
+ 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
+ 'sasl' => [
+ env('MEMCACHED_USERNAME'),
+ env('MEMCACHED_PASSWORD'),
+ ],
+ 'options' => [
+ // Memcached::OPT_CONNECT_TIMEOUT => 2000,
+ ],
+ 'servers' => [
+ [
+ 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
+ 'port' => env('MEMCACHED_PORT', 11211),
+ 'weight' => 100,
+ ],
+ ],
+ ],
+
+ 'redis' => [
+ 'driver' => 'redis',
+ 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
+ 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
+ ],
+
+ 'dynamodb' => [
+ 'driver' => 'dynamodb',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
+ 'endpoint' => env('DYNAMODB_ENDPOINT'),
+ ],
+
+ 'octane' => [
+ 'driver' => 'octane',
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Key Prefix
+ |--------------------------------------------------------------------------
+ |
+ | When utilizing the APC, database, memcached, Redis, and DynamoDB cache
+ | stores, there might be other applications using the same cache. For
+ | that reason, you may prefix every cache key to avoid collisions.
+ |
+ */
+
+ 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'),
+
+];
\ No newline at end of file
diff --git a/config/database.php b/config/database.php
new file mode 100644
index 0000000..4fcc08b
--- /dev/null
+++ b/config/database.php
@@ -0,0 +1,179 @@
+ env('DB_CONNECTION', 'sqlite'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Connections
+ |--------------------------------------------------------------------------
+ |
+ | Below are all of the database connections defined for your application.
+ | An example configuration is provided for each database system which
+ | is supported by Laravel. You're free to add / remove connections.
+ |
+ */
+
+ 'connections' => [
+
+ 'sqlite' => [
+ 'driver' => 'sqlite',
+ 'url' => env('DB_URL'),
+ 'database' => env('DB_DATABASE', database_path('database.sqlite')),
+ 'prefix' => '',
+ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
+ ],
+
+ 'mysql' => [
+ 'driver' => 'mysql',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'unix_socket' => env('DB_SOCKET', ''),
+ 'charset' => env('DB_CHARSET', 'utf8mb4'),
+ 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'strict' => true,
+ 'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
+
+ 'mariadb' => [
+ 'driver' => 'mariadb',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'unix_socket' => env('DB_SOCKET', ''),
+ 'charset' => env('DB_CHARSET', 'utf8mb4'),
+ 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'strict' => true,
+ 'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
+
+ 'pgsql' => [
+ 'driver' => 'pgsql',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '5432'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => env('DB_CHARSET', 'utf8'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'search_path' => 'public',
+ 'sslmode' => 'prefer',
+ ],
+
+ 'sqlsrv' => [
+ 'driver' => 'sqlsrv',
+ 'url' => env('DB_URL'),
+ 'host' => env('DB_HOST', 'localhost'),
+ 'port' => env('DB_PORT', '1433'),
+ 'database' => env('DB_DATABASE', 'laravel'),
+ 'username' => env('DB_USERNAME', 'root'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => env('DB_CHARSET', 'utf8'),
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ // 'encrypt' => env('DB_ENCRYPT', 'yes'),
+ // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Migration Repository Table
+ |--------------------------------------------------------------------------
+ |
+ | This table keeps track of all the migrations that have already run for
+ | your application. Using this information, we can determine which of
+ | the migrations on disk haven't actually been run on the database.
+ |
+ */
+
+ 'migrations' => [
+ 'table' => 'migrations',
+ 'update_date_on_publish' => true,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Redis Databases
+ |--------------------------------------------------------------------------
+ |
+ | Redis is an open source, fast, and advanced key-value store that also
+ | provides a richer body of commands than a typical key-value system
+ | such as Memcached. You may define your connection settings here.
+ |
+ */
+
+ 'redis' => [
+
+ 'client' => env('REDIS_CLIENT', 'phpredis'),
+
+ 'options' => [
+ 'cluster' => env('REDIS_CLUSTER', 'redis'),
+ 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
+ ],
+
+ 'default' => [
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'username' => env('REDIS_USERNAME'),
+ 'password' => env('REDIS_PASSWORD'),
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_DB', '0'),
+ ],
+
+ 'cache' => [
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'username' => env('REDIS_USERNAME'),
+ 'password' => env('REDIS_PASSWORD'),
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_CACHE_DB', '1'),
+ ],
+
+ 'sessions' => [
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'username' => env('REDIS_USERNAME'),
+ 'password' => env('REDIS_PASSWORD'),
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_SESSION_DB', '2'), // Base de datos específica para sesiones
+ ],
+
+ ],
+
+];
diff --git a/config/datatables.php b/config/datatables.php
new file mode 100644
index 0000000..0891264
--- /dev/null
+++ b/config/datatables.php
@@ -0,0 +1,127 @@
+ [
+ /*
+ * Smart search will enclose search keyword with wildcard string "%keyword%".
+ * SQL: column LIKE "%keyword%"
+ */
+ 'smart' => true,
+
+ /*
+ * Multi-term search will explode search keyword using spaces resulting into multiple term search.
+ */
+ 'multi_term' => true,
+
+ /*
+ * Case insensitive will search the keyword in lower case format.
+ * SQL: LOWER(column) LIKE LOWER(keyword)
+ */
+ 'case_insensitive' => true,
+
+ /*
+ * Wild card will add "%" in between every characters of the keyword.
+ * SQL: column LIKE "%k%e%y%w%o%r%d%"
+ */
+ 'use_wildcards' => false,
+
+ /*
+ * Perform a search which starts with the given keyword.
+ * SQL: column LIKE "keyword%"
+ */
+ 'starts_with' => false,
+ ],
+
+ /*
+ * DataTables internal index id response column name.
+ */
+ 'index_column' => 'DT_RowIndex',
+
+ /*
+ * List of available builders for DataTables.
+ * This is where you can register your custom dataTables builder.
+ */
+ 'engines' => [
+ 'eloquent' => Yajra\DataTables\EloquentDataTable::class,
+ 'query' => Yajra\DataTables\QueryDataTable::class,
+ 'collection' => Yajra\DataTables\CollectionDataTable::class,
+ 'resource' => Yajra\DataTables\ApiResourceDataTable::class,
+ ],
+
+ /*
+ * DataTables accepted builder to engine mapping.
+ * This is where you can override which engine a builder should use
+ * Note, only change this if you know what you are doing!
+ */
+ 'builders' => [
+ //Illuminate\Database\Eloquent\Relations\Relation::class => 'eloquent',
+ //Illuminate\Database\Eloquent\Builder::class => 'eloquent',
+ //Illuminate\Database\Query\Builder::class => 'query',
+ //Illuminate\Support\Collection::class => 'collection',
+ ],
+
+ /*
+ * Nulls last sql pattern for PostgreSQL & Oracle.
+ * For MySQL, use 'CASE WHEN :column IS NULL THEN 1 ELSE 0 END, :column :direction'
+ */
+ 'nulls_last_sql' => ':column :direction NULLS LAST',
+
+ /*
+ * User friendly message to be displayed on user if error occurs.
+ * Possible values:
+ * null - The exception message will be used on error response.
+ * 'throw' - Throws a \Yajra\DataTables\Exceptions\Exception. Use your custom error handler if needed.
+ * 'custom message' - Any friendly message to be displayed to the user. You can also use translation key.
+ */
+ 'error' => env('DATATABLES_ERROR', null),
+
+ /*
+ * Default columns definition of dataTable utility functions.
+ */
+ 'columns' => [
+ /*
+ * List of columns hidden/removed on json response.
+ */
+ 'excess' => ['rn', 'row_num'],
+
+ /*
+ * List of columns to be escaped. If set to *, all columns are escape.
+ * Note: You can set the value to empty array to disable XSS protection.
+ */
+ 'escape' => '*',
+
+ /*
+ * List of columns that are allowed to display html content.
+ * Note: Adding columns to list will make us available to XSS attacks.
+ */
+ 'raw' => ['action'],
+
+ /*
+ * List of columns are forbidden from being searched/sorted.
+ */
+ 'blacklist' => ['password', 'remember_token'],
+
+ /*
+ * List of columns that are only allowed fo search/sort.
+ * If set to *, all columns are allowed.
+ */
+ 'whitelist' => '*',
+ ],
+
+ /*
+ * JsonResponse header and options config.
+ */
+ 'json' => [
+ 'header' => [],
+ 'options' => 0,
+ ],
+
+ /*
+ * Default condition to determine if a parameter is a callback or not.
+ * Callbacks needs to start by those terms, or they will be cast to string.
+ */
+ 'callback' => ['$', '$.', 'function'],
+];
diff --git a/config/excel.php b/config/excel.php
new file mode 100644
index 0000000..c1fd34a
--- /dev/null
+++ b/config/excel.php
@@ -0,0 +1,380 @@
+ [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Chunk size
+ |--------------------------------------------------------------------------
+ |
+ | When using FromQuery, the query is automatically chunked.
+ | Here you can specify how big the chunk should be.
+ |
+ */
+ 'chunk_size' => 1000,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pre-calculate formulas during export
+ |--------------------------------------------------------------------------
+ */
+ 'pre_calculate_formulas' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Enable strict null comparison
+ |--------------------------------------------------------------------------
+ |
+ | When enabling strict null comparison empty cells ('') will
+ | be added to the sheet.
+ */
+ 'strict_null_comparison' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | CSV Settings
+ |--------------------------------------------------------------------------
+ |
+ | Configure e.g. delimiter, enclosure and line ending for CSV exports.
+ |
+ */
+ 'csv' => [
+ 'delimiter' => ',',
+ 'enclosure' => '"',
+ 'line_ending' => PHP_EOL,
+ 'use_bom' => false,
+ 'include_separator_line' => false,
+ 'excel_compatibility' => false,
+ 'output_encoding' => '',
+ 'test_auto_detect' => true,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Worksheet properties
+ |--------------------------------------------------------------------------
+ |
+ | Configure e.g. default title, creator, subject,...
+ |
+ */
+ 'properties' => [
+ 'creator' => '',
+ 'lastModifiedBy' => '',
+ 'title' => '',
+ 'description' => '',
+ 'subject' => '',
+ 'keywords' => '',
+ 'category' => '',
+ 'manager' => '',
+ 'company' => '',
+ ],
+ ],
+
+ 'imports' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Read Only
+ |--------------------------------------------------------------------------
+ |
+ | When dealing with imports, you might only be interested in the
+ | data that the sheet exists. By default we ignore all styles,
+ | however if you want to do some logic based on style data
+ | you can enable it by setting read_only to false.
+ |
+ */
+ 'read_only' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Ignore Empty
+ |--------------------------------------------------------------------------
+ |
+ | When dealing with imports, you might be interested in ignoring
+ | rows that have null values or empty strings. By default rows
+ | containing empty strings or empty values are not ignored but can be
+ | ignored by enabling the setting ignore_empty to true.
+ |
+ */
+ 'ignore_empty' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading Row Formatter
+ |--------------------------------------------------------------------------
+ |
+ | Configure the heading row formatter.
+ | Available options: none|slug|custom
+ |
+ */
+ 'heading_row' => [
+ 'formatter' => 'slug',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | CSV Settings
+ |--------------------------------------------------------------------------
+ |
+ | Configure e.g. delimiter, enclosure and line ending for CSV imports.
+ |
+ */
+ 'csv' => [
+ 'delimiter' => null,
+ 'enclosure' => '"',
+ 'escape_character' => '\\',
+ 'contiguous' => false,
+ 'input_encoding' => Csv::GUESS_ENCODING,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Worksheet properties
+ |--------------------------------------------------------------------------
+ |
+ | Configure e.g. default title, creator, subject,...
+ |
+ */
+ 'properties' => [
+ 'creator' => '',
+ 'lastModifiedBy' => '',
+ 'title' => '',
+ 'description' => '',
+ 'subject' => '',
+ 'keywords' => '',
+ 'category' => '',
+ 'manager' => '',
+ 'company' => '',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cell Middleware
+ |--------------------------------------------------------------------------
+ |
+ | Configure middleware that is executed on getting a cell value
+ |
+ */
+ 'cells' => [
+ 'middleware' => [
+ //\Maatwebsite\Excel\Middleware\TrimCellValue::class,
+ //\Maatwebsite\Excel\Middleware\ConvertEmptyCellValuesToNull::class,
+ ],
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Extension detector
+ |--------------------------------------------------------------------------
+ |
+ | Configure here which writer/reader type should be used when the package
+ | needs to guess the correct type based on the extension alone.
+ |
+ */
+ 'extension_detector' => [
+ 'xlsx' => Excel::XLSX,
+ 'xlsm' => Excel::XLSX,
+ 'xltx' => Excel::XLSX,
+ 'xltm' => Excel::XLSX,
+ 'xls' => Excel::XLS,
+ 'xlt' => Excel::XLS,
+ 'ods' => Excel::ODS,
+ 'ots' => Excel::ODS,
+ 'slk' => Excel::SLK,
+ 'xml' => Excel::XML,
+ 'gnumeric' => Excel::GNUMERIC,
+ 'htm' => Excel::HTML,
+ 'html' => Excel::HTML,
+ 'csv' => Excel::CSV,
+ 'tsv' => Excel::TSV,
+
+ /*
+ |--------------------------------------------------------------------------
+ | PDF Extension
+ |--------------------------------------------------------------------------
+ |
+ | Configure here which Pdf driver should be used by default.
+ | Available options: Excel::MPDF | Excel::TCPDF | Excel::DOMPDF
+ |
+ */
+ 'pdf' => Excel::DOMPDF,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Value Binder
+ |--------------------------------------------------------------------------
+ |
+ | PhpSpreadsheet offers a way to hook into the process of a value being
+ | written to a cell. In there some assumptions are made on how the
+ | value should be formatted. If you want to change those defaults,
+ | you can implement your own default value binder.
+ |
+ | Possible value binders:
+ |
+ | [x] Maatwebsite\Excel\DefaultValueBinder::class
+ | [x] PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class
+ | [x] PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder::class
+ |
+ */
+ 'value_binder' => [
+ 'default' => Maatwebsite\Excel\DefaultValueBinder::class,
+ ],
+
+ 'cache' => [
+ /*
+ |--------------------------------------------------------------------------
+ | Default cell caching driver
+ |--------------------------------------------------------------------------
+ |
+ | By default PhpSpreadsheet keeps all cell values in memory, however when
+ | dealing with large files, this might result into memory issues. If you
+ | want to mitigate that, you can configure a cell caching driver here.
+ | When using the illuminate driver, it will store each value in the
+ | cache store. This can slow down the process, because it needs to
+ | store each value. You can use the "batch" store if you want to
+ | only persist to the store when the memory limit is reached.
+ |
+ | Drivers: memory|illuminate|batch
+ |
+ */
+ 'driver' => 'memory',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Batch memory caching
+ |--------------------------------------------------------------------------
+ |
+ | When dealing with the "batch" caching driver, it will only
+ | persist to the store when the memory limit is reached.
+ | Here you can tweak the memory limit to your liking.
+ |
+ */
+ 'batch' => [
+ 'memory_limit' => 60000,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Illuminate cache
+ |--------------------------------------------------------------------------
+ |
+ | When using the "illuminate" caching driver, it will automatically use
+ | your default cache store. However if you prefer to have the cell
+ | cache on a separate store, you can configure the store name here.
+ | You can use any store defined in your cache config. When leaving
+ | at "null" it will use the default store.
+ |
+ */
+ 'illuminate' => [
+ 'store' => null,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Time-to-live (TTL)
+ |--------------------------------------------------------------------------
+ |
+ | The TTL of items written to cache. If you want to keep the items cached
+ | indefinitely, set this to null. Otherwise, set a number of seconds,
+ | a \DateInterval, or a callable.
+ |
+ | Allowable types: callable|\DateInterval|int|null
+ |
+ */
+ 'default_ttl' => 10800,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Transaction Handler
+ |--------------------------------------------------------------------------
+ |
+ | By default the import is wrapped in a transaction. This is useful
+ | for when an import may fail and you want to retry it. With the
+ | transactions, the previous import gets rolled-back.
+ |
+ | You can disable the transaction handler by setting this to null.
+ | Or you can choose a custom made transaction handler here.
+ |
+ | Supported handlers: null|db
+ |
+ */
+ 'transactions' => [
+ 'handler' => 'db',
+ 'db' => [
+ 'connection' => null,
+ ],
+ ],
+
+ 'temporary_files' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Local Temporary Path
+ |--------------------------------------------------------------------------
+ |
+ | When exporting and importing files, we use a temporary file, before
+ | storing reading or downloading. Here you can customize that path.
+ | permissions is an array with the permission flags for the directory (dir)
+ | and the create file (file).
+ |
+ */
+ 'local_path' => storage_path('framework/cache/laravel-excel'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Local Temporary Path Permissions
+ |--------------------------------------------------------------------------
+ |
+ | Permissions is an array with the permission flags for the directory (dir)
+ | and the create file (file).
+ | If omitted the default permissions of the filesystem will be used.
+ |
+ */
+ 'local_permissions' => [
+ // 'dir' => 0755,
+ // 'file' => 0644,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Remote Temporary Disk
+ |--------------------------------------------------------------------------
+ |
+ | When dealing with a multi server setup with queues in which you
+ | cannot rely on having a shared local temporary path, you might
+ | want to store the temporary file on a shared disk. During the
+ | queue executing, we'll retrieve the temporary file from that
+ | location instead. When left to null, it will always use
+ | the local path. This setting only has effect when using
+ | in conjunction with queued imports and exports.
+ |
+ */
+ 'remote_disk' => null,
+ 'remote_prefix' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Force Resync
+ |--------------------------------------------------------------------------
+ |
+ | When dealing with a multi server setup as above, it's possible
+ | for the clean up that occurs after entire queue has been run to only
+ | cleanup the server that the last AfterImportJob runs on. The rest of the server
+ | would still have the local temporary file stored on it. In this case your
+ | local storage limits can be exceeded and future imports won't be processed.
+ | To mitigate this you can set this config value to be true, so that after every
+ | queued chunk is processed the local temporary file is deleted on the server that
+ | processed it.
+ |
+ */
+ 'force_resync_remote' => null,
+ ],
+];
diff --git a/config/filesystems.php b/config/filesystems.php
new file mode 100644
index 0000000..30e7af4
--- /dev/null
+++ b/config/filesystems.php
@@ -0,0 +1,76 @@
+ env('FILESYSTEM_DISK', 'local'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Filesystem Disks
+ |--------------------------------------------------------------------------
+ |
+ | Below you may configure as many filesystem disks as necessary, and you
+ | may even configure multiple disks for the same driver. Examples for
+ | most supported storage drivers are configured here for reference.
+ |
+ | Supported Drivers: "local", "ftp", "sftp", "s3"
+ |
+ */
+
+ 'disks' => [
+
+ 'local' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app'),
+ 'throw' => false,
+ ],
+
+ 'public' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app/public'),
+ 'url' => env('APP_URL') . '/storage',
+ 'visibility' => 'public',
+ 'throw' => false,
+ ],
+
+ 's3' => [
+ 'driver' => 's3',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION'),
+ 'bucket' => env('AWS_BUCKET'),
+ 'url' => env('AWS_URL'),
+ 'endpoint' => env('AWS_ENDPOINT'),
+ 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
+ 'throw' => false,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Symbolic Links
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the symbolic links that will be created when the
+ | `storage:link` Artisan command is executed. The array keys should be
+ | the locations of the links and the values should be their targets.
+ |
+ */
+
+ 'links' => [
+ public_path('storage') => storage_path('app/public'),
+ ],
+
+];
\ No newline at end of file
diff --git a/config/fortify.php b/config/fortify.php
new file mode 100644
index 0000000..f2659f1
--- /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' => '/',
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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/livewire.php b/config/livewire.php
new file mode 100644
index 0000000..0d2ba89
--- /dev/null
+++ b/config/livewire.php
@@ -0,0 +1,160 @@
+ 'App\\Livewire',
+
+ /*
+ |---------------------------------------------------------------------------
+ | View Path
+ |---------------------------------------------------------------------------
+ |
+ | This value is used to specify where Livewire component Blade templates are
+ | stored when running file creation commands like `artisan make:livewire`.
+ | It is also used if you choose to omit a component's render() method.
+ |
+ */
+
+ 'view_path' => resource_path('views/livewire'),
+
+ /*
+ |---------------------------------------------------------------------------
+ | Layout
+ |---------------------------------------------------------------------------
+ | The view that will be used as the layout when rendering a single component
+ | as an entire page via `Route::get('/post/create', CreatePost::class);`.
+ | In this case, the view returned by CreatePost will render into $slot.
+ |
+ */
+
+ 'layout' => 'components.layouts.app',
+
+ /*
+ |---------------------------------------------------------------------------
+ | Lazy Loading Placeholder
+ |---------------------------------------------------------------------------
+ | Livewire allows you to lazy load components that would otherwise slow down
+ | the initial page load. Every component can have a custom placeholder or
+ | you can define the default placeholder view for all components below.
+ |
+ */
+
+ 'lazy_placeholder' => null,
+
+ /*
+ |---------------------------------------------------------------------------
+ | Temporary File Uploads
+ |---------------------------------------------------------------------------
+ |
+ | Livewire handles file uploads by storing uploads in a temporary directory
+ | before the file is stored permanently. All file uploads are directed to
+ | a global endpoint for temporary storage. You may configure this below:
+ |
+ */
+
+ 'temporary_file_upload' => [
+ 'disk' => null, // Example: 'local', 's3' | Default: 'default'
+ 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
+ 'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
+ 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
+ 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
+ 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
+ 'mov', 'avi', 'wmv', 'mp3', 'm4a',
+ 'jpg', 'jpeg', 'mpga', 'webp', 'wma',
+ ],
+ 'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
+ 'cleanup' => true, // Should cleanup temporary uploads older than 24 hrs...
+ ],
+
+ /*
+ |---------------------------------------------------------------------------
+ | Render On Redirect
+ |---------------------------------------------------------------------------
+ |
+ | This value determines if Livewire will run a component's `render()` method
+ | after a redirect has been triggered using something like `redirect(...)`
+ | Setting this to true will render the view once more before redirecting
+ |
+ */
+
+ 'render_on_redirect' => false,
+
+ /*
+ |---------------------------------------------------------------------------
+ | Eloquent Model Binding
+ |---------------------------------------------------------------------------
+ |
+ | Previous versions of Livewire supported binding directly to eloquent model
+ | properties using wire:model by default. However, this behavior has been
+ | deemed too "magical" and has therefore been put under a feature flag.
+ |
+ */
+
+ 'legacy_model_binding' => false,
+
+ /*
+ |---------------------------------------------------------------------------
+ | Auto-inject Frontend Assets
+ |---------------------------------------------------------------------------
+ |
+ | By default, Livewire automatically injects its JavaScript and CSS into the
+ |
and of pages containing Livewire components. By disabling
+ | this behavior, you need to use @livewireStyles and @livewireScripts.
+ |
+ */
+
+ 'inject_assets' => true,
+
+ /*
+ |---------------------------------------------------------------------------
+ | Navigate (SPA mode)
+ |---------------------------------------------------------------------------
+ |
+ | By adding `wire:navigate` to links in your Livewire application, Livewire
+ | will prevent the default link handling and instead request those pages
+ | via AJAX, creating an SPA-like effect. Configure this behavior here.
+ |
+ */
+
+ 'navigate' => [
+ 'show_progress_bar' => true,
+ 'progress_bar_color' => '#2299dd',
+ ],
+
+ /*
+ |---------------------------------------------------------------------------
+ | HTML Morph Markers
+ |---------------------------------------------------------------------------
+ |
+ | Livewire intelligently "morphs" existing HTML into the newly rendered HTML
+ | after each update. To make this process more reliable, Livewire injects
+ | "markers" into the rendered Blade surrounding @if, @class & @foreach.
+ |
+ */
+
+ 'inject_morph_markers' => true,
+
+ /*
+ |---------------------------------------------------------------------------
+ | Pagination Theme
+ |---------------------------------------------------------------------------
+ |
+ | When enabling Livewire's pagination feature by using the `WithPagination`
+ | trait, Livewire will use Tailwind templates to render pagination views
+ | on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
+ |
+ */
+
+ 'pagination_theme' => 'tailwind',
+];
diff --git a/config/logging.php b/config/logging.php
new file mode 100644
index 0000000..a505f66
--- /dev/null
+++ b/config/logging.php
@@ -0,0 +1,132 @@
+ env('LOG_CHANNEL', 'stack'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Deprecations Log Channel
+ |--------------------------------------------------------------------------
+ |
+ | This option controls the log channel that should be used to log warnings
+ | regarding deprecated PHP and library features. This allows you to get
+ | your application ready for upcoming major versions of dependencies.
+ |
+ */
+
+ 'deprecations' => [
+ 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
+ 'trace' => env('LOG_DEPRECATIONS_TRACE', false),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Log Channels
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the log channels for your application. Laravel
+ | utilizes the Monolog PHP logging library, which includes a variety
+ | of powerful log handlers and formatters that you're free to use.
+ |
+ | Available Drivers: "single", "daily", "slack", "syslog",
+ | "errorlog", "monolog", "custom", "stack"
+ |
+ */
+
+ 'channels' => [
+
+ 'stack' => [
+ 'driver' => 'stack',
+ 'channels' => explode(',', env('LOG_STACK', 'single')),
+ 'ignore_exceptions' => false,
+ ],
+
+ 'single' => [
+ 'driver' => 'single',
+ 'path' => storage_path('logs/laravel.log'),
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'replace_placeholders' => true,
+ ],
+
+ 'daily' => [
+ 'driver' => 'daily',
+ 'path' => storage_path('logs/laravel.log'),
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'days' => env('LOG_DAILY_DAYS', 14),
+ 'replace_placeholders' => true,
+ ],
+
+ 'slack' => [
+ 'driver' => 'slack',
+ 'url' => env('LOG_SLACK_WEBHOOK_URL'),
+ 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'),
+ 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
+ 'level' => env('LOG_LEVEL', 'critical'),
+ 'replace_placeholders' => true,
+ ],
+
+ 'papertrail' => [
+ 'driver' => 'monolog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
+ 'handler_with' => [
+ 'host' => env('PAPERTRAIL_URL'),
+ 'port' => env('PAPERTRAIL_PORT'),
+ 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'),
+ ],
+ 'processors' => [PsrLogMessageProcessor::class],
+ ],
+
+ 'stderr' => [
+ 'driver' => 'monolog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'handler' => StreamHandler::class,
+ 'formatter' => env('LOG_STDERR_FORMATTER'),
+ 'with' => [
+ 'stream' => 'php://stderr',
+ ],
+ 'processors' => [PsrLogMessageProcessor::class],
+ ],
+
+ 'syslog' => [
+ 'driver' => 'syslog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
+ 'replace_placeholders' => true,
+ ],
+
+ 'errorlog' => [
+ 'driver' => 'errorlog',
+ 'level' => env('LOG_LEVEL', 'debug'),
+ 'replace_placeholders' => true,
+ ],
+
+ 'null' => [
+ 'driver' => 'monolog',
+ 'handler' => NullHandler::class,
+ ],
+
+ 'emergency' => [
+ 'path' => storage_path('logs/laravel.log'),
+ ],
+
+ ],
+
+];
\ No newline at end of file
diff --git a/config/mail.php b/config/mail.php
new file mode 100644
index 0000000..a629fd6
--- /dev/null
+++ b/config/mail.php
@@ -0,0 +1,103 @@
+ env('MAIL_MAILER', 'log'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Mailer Configurations
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure all of the mailers used by your application plus
+ | their respective settings. Several examples have been configured for
+ | you and you are free to add your own as your application requires.
+ |
+ | Laravel supports a variety of mail "transport" drivers that can be used
+ | when delivering an email. You may specify which one you're using for
+ | your mailers below. You may also add additional mailers if needed.
+ |
+ | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
+ | "postmark", "log", "array", "failover", "roundrobin"
+ |
+ */
+
+ 'mailers' => [
+
+ 'smtp' => [
+ 'transport' => 'smtp',
+ 'url' => env('MAIL_URL'),
+ 'host' => env('MAIL_HOST', '127.0.0.1'),
+ 'port' => env('MAIL_PORT', 2525),
+ 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
+ 'username' => env('MAIL_USERNAME'),
+ 'password' => env('MAIL_PASSWORD'),
+ 'timeout' => null,
+ 'local_domain' => env('MAIL_EHLO_DOMAIN'),
+ ],
+
+ 'ses' => [
+ 'transport' => 'ses',
+ ],
+
+ 'postmark' => [
+ 'transport' => 'postmark',
+ // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
+ // 'client' => [
+ // 'timeout' => 5,
+ // ],
+ ],
+
+ 'sendmail' => [
+ 'transport' => 'sendmail',
+ 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
+ ],
+
+ 'log' => [
+ 'transport' => 'log',
+ 'channel' => env('MAIL_LOG_CHANNEL'),
+ ],
+
+ 'array' => [
+ 'transport' => 'array',
+ ],
+
+ 'failover' => [
+ 'transport' => 'failover',
+ 'mailers' => [
+ 'smtp',
+ 'log',
+ ],
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Global "From" Address
+ |--------------------------------------------------------------------------
+ |
+ | You may wish for all emails sent by your application to be sent from
+ | the same address. Here you may specify a name and address that is
+ | used globally for all emails that are sent by your application.
+ |
+ */
+
+ 'from' => [
+ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
+ 'name' => env('MAIL_FROM_NAME', 'Example'),
+ ],
+
+];
\ No newline at end of file
diff --git a/config/permission.php b/config/permission.php
new file mode 100644
index 0000000..2a520f3
--- /dev/null
+++ b/config/permission.php
@@ -0,0 +1,186 @@
+ [
+
+ /*
+ * When using the "HasPermissions" trait from this package, we need to know which
+ * Eloquent model should be used to retrieve your permissions. Of course, it
+ * is often just the "Permission" model but you may use whatever you like.
+ *
+ * The model you want to use as a Permission model needs to implement the
+ * `Spatie\Permission\Contracts\Permission` contract.
+ */
+
+ 'permission' => Spatie\Permission\Models\Permission::class,
+
+ /*
+ * When using the "HasRoles" trait from this package, we need to know which
+ * Eloquent model should be used to retrieve your roles. Of course, it
+ * is often just the "Role" model but you may use whatever you like.
+ *
+ * The model you want to use as a Role model needs to implement the
+ * `Spatie\Permission\Contracts\Role` contract.
+ */
+
+ 'role' => Spatie\Permission\Models\Role::class,
+
+ ],
+
+ 'table_names' => [
+
+ /*
+ * When using the "HasRoles" trait from this package, we need to know which
+ * table should be used to retrieve your roles. We have chosen a basic
+ * default value but you may easily change it to any table you like.
+ */
+
+ 'roles' => 'roles',
+
+ /*
+ * When using the "HasPermissions" trait from this package, we need to know which
+ * table should be used to retrieve your permissions. We have chosen a basic
+ * default value but you may easily change it to any table you like.
+ */
+
+ 'permissions' => 'permissions',
+
+ /*
+ * When using the "HasPermissions" trait from this package, we need to know which
+ * table should be used to retrieve your models permissions. We have chosen a
+ * basic default value but you may easily change it to any table you like.
+ */
+
+ 'model_has_permissions' => 'model_has_permissions',
+
+ /*
+ * When using the "HasRoles" trait from this package, we need to know which
+ * table should be used to retrieve your models roles. We have chosen a
+ * basic default value but you may easily change it to any table you like.
+ */
+
+ 'model_has_roles' => 'model_has_roles',
+
+ /*
+ * When using the "HasRoles" trait from this package, we need to know which
+ * table should be used to retrieve your roles permissions. We have chosen a
+ * basic default value but you may easily change it to any table you like.
+ */
+
+ 'role_has_permissions' => 'role_has_permissions',
+ ],
+
+ 'column_names' => [
+ /*
+ * Change this if you want to name the related pivots other than defaults
+ */
+ 'role_pivot_key' => null, //default 'role_id',
+ 'permission_pivot_key' => null, //default 'permission_id',
+
+ /*
+ * Change this if you want to name the related model primary key other than
+ * `model_id`.
+ *
+ * For example, this would be nice if your primary keys are all UUIDs. In
+ * that case, name this `model_uuid`.
+ */
+
+ 'model_morph_key' => 'model_id',
+
+ /*
+ * Change this if you want to use the teams feature and your related model's
+ * foreign key is other than `team_id`.
+ */
+
+ 'team_foreign_key' => 'team_id',
+ ],
+
+ /*
+ * When set to true, the method for checking permissions will be registered on the gate.
+ * Set this to false if you want to implement custom logic for checking permissions.
+ */
+
+ 'register_permission_check_method' => true,
+
+ /*
+ * When set to true, Laravel\Octane\Events\OperationTerminated event listener will be registered
+ * this will refresh permissions on every TickTerminated, TaskTerminated and RequestTerminated
+ * NOTE: This should not be needed in most cases, but an Octane/Vapor combination benefited from it.
+ */
+ 'register_octane_reset_listener' => false,
+
+ /*
+ * Teams Feature.
+ * When set to true the package implements teams using the 'team_foreign_key'.
+ * If you want the migrations to register the 'team_foreign_key', you must
+ * set this to true before doing the migration.
+ * If you already did the migration then you must make a new migration to also
+ * add 'team_foreign_key' to 'roles', 'model_has_roles', and 'model_has_permissions'
+ * (view the latest version of this package's migration file)
+ */
+
+ 'teams' => false,
+
+ /*
+ * Passport Client Credentials Grant
+ * When set to true the package will use Passports Client to check permissions
+ */
+
+ 'use_passport_client_credentials' => false,
+
+ /*
+ * When set to true, the required permission names are added to exception messages.
+ * This could be considered an information leak in some contexts, so the default
+ * setting is false here for optimum safety.
+ */
+
+ 'display_permission_in_exception' => false,
+
+ /*
+ * When set to true, the required role names are added to exception messages.
+ * This could be considered an information leak in some contexts, so the default
+ * setting is false here for optimum safety.
+ */
+
+ 'display_role_in_exception' => false,
+
+ /*
+ * By default wildcard permission lookups are disabled.
+ * See documentation to understand supported syntax.
+ */
+
+ 'enable_wildcard_permission' => false,
+
+ /*
+ * The class to use for interpreting wildcard permissions.
+ * If you need to modify delimiters, override the class and specify its name here.
+ */
+ // 'permission.wildcard_permission' => Spatie\Permission\WildcardPermission::class,
+
+ /* Cache-specific settings */
+
+ 'cache' => [
+
+ /*
+ * By default all permissions are cached for 24 hours to speed up performance.
+ * When permissions or roles are updated the cache is flushed automatically.
+ */
+
+ 'expiration_time' => \DateInterval::createFromDateString('24 hours'),
+
+ /*
+ * The cache key used to store all permissions.
+ */
+
+ 'key' => 'spatie.permission.cache',
+
+ /*
+ * You may optionally indicate a specific cache driver to use for permission and
+ * role caching using any of the `store` drivers listed in the cache.php config
+ * file. Using 'default' here means to use the `default` set in cache.php.
+ */
+
+ 'store' => 'default',
+ ],
+];
diff --git a/config/queue.php b/config/queue.php
new file mode 100644
index 0000000..c53f253
--- /dev/null
+++ b/config/queue.php
@@ -0,0 +1,112 @@
+ env('QUEUE_CONNECTION', 'database'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Queue Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the connection options for every queue backend
+ | used by your application. An example configuration is provided for
+ | each backend supported by Laravel. You're also free to add more.
+ |
+ | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
+ |
+ */
+
+ 'connections' => [
+
+ 'sync' => [
+ 'driver' => 'sync',
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'connection' => env('DB_QUEUE_CONNECTION', null),
+ 'table' => env('DB_QUEUE_TABLE', 'jobs'),
+ 'queue' => env('DB_QUEUE', 'default'),
+ 'retry_after' => env('DB_QUEUE_RETRY_AFTER', 90),
+ 'after_commit' => false,
+ ],
+
+ 'beanstalkd' => [
+ 'driver' => 'beanstalkd',
+ 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
+ 'queue' => env('BEANSTALKD_QUEUE', 'default'),
+ 'retry_after' => env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
+ 'block_for' => 0,
+ 'after_commit' => false,
+ ],
+
+ 'sqs' => [
+ 'driver' => 'sqs',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
+ 'queue' => env('SQS_QUEUE', 'default'),
+ 'suffix' => env('SQS_SUFFIX'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ 'after_commit' => false,
+ ],
+
+ 'redis' => [
+ 'driver' => 'redis',
+ 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
+ 'queue' => env('REDIS_QUEUE', 'default'),
+ 'retry_after' => env('REDIS_QUEUE_RETRY_AFTER', 90),
+ 'block_for' => null,
+ 'after_commit' => false,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Job Batching
+ |--------------------------------------------------------------------------
+ |
+ | The following options configure the database and table that store job
+ | batching information. These options can be updated to any database
+ | connection and table which has been defined by your application.
+ |
+ */
+
+ 'batching' => [
+ 'database' => env('DB_CONNECTION', 'sqlite'),
+ 'table' => 'job_batches',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Failed Queue Jobs
+ |--------------------------------------------------------------------------
+ |
+ | These options configure the behavior of failed queue job logging so you
+ | can control how and where failed jobs are stored. Laravel ships with
+ | support for storing failed jobs in a simple file or in a database.
+ |
+ | Supported drivers: "database-uuids", "dynamodb", "file", "null"
+ |
+ */
+
+ 'failed' => [
+ 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
+ 'database' => env('DB_CONNECTION', 'sqlite'),
+ 'table' => 'failed_jobs',
+ ],
+
+];
\ No newline at end of file
diff --git a/config/sanctum.php b/config/sanctum.php
new file mode 100644
index 0000000..764a82f
--- /dev/null
+++ b/config/sanctum.php
@@ -0,0 +1,83 @@
+ explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
+ '%s%s',
+ 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
+ Sanctum::currentApplicationUrlWithPort()
+ ))),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sanctum Guards
+ |--------------------------------------------------------------------------
+ |
+ | This array contains the authentication guards that will be checked when
+ | Sanctum is trying to authenticate a request. If none of these guards
+ | are able to authenticate the request, Sanctum will use the bearer
+ | token that's present on an incoming request for authentication.
+ |
+ */
+
+ 'guard' => ['web'],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Expiration Minutes
+ |--------------------------------------------------------------------------
+ |
+ | This value controls the number of minutes until an issued token will be
+ | considered expired. This will override any values set in the token's
+ | "expires_at" attribute, but first-party sessions are not affected.
+ |
+ */
+
+ 'expiration' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Token Prefix
+ |--------------------------------------------------------------------------
+ |
+ | Sanctum can prefix new tokens in order to take advantage of numerous
+ | security scanning initiatives maintained by open source platforms
+ | that notify developers if they commit tokens into repositories.
+ |
+ | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning
+ |
+ */
+
+ 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sanctum Middleware
+ |--------------------------------------------------------------------------
+ |
+ | When authenticating your first-party SPA with Sanctum you may need to
+ | customize some of the middleware Sanctum uses while processing the
+ | request. You may change the middleware listed below as required.
+ |
+ */
+
+ 'middleware' => [
+ 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
+ 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
+ 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
+ ],
+
+];
diff --git a/config/services.php b/config/services.php
new file mode 100644
index 0000000..57ff191
--- /dev/null
+++ b/config/services.php
@@ -0,0 +1,44 @@
+ [
+ 'token' => env('POSTMARK_TOKEN'),
+ ],
+
+ 'ses' => [
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ ],
+
+ 'slack' => [
+ 'notifications' => [
+ 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
+ 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
+ ],
+ ],
+
+ 'facebook' => [
+ 'client_id' => env('FACEBOOK_CLIENT_ID'),
+ 'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
+ 'redirect' => env('FACEBOOK_REDIRECT'),
+ ],
+ 'google' => [
+ 'client_id' => env('GOOGLE_CLIENT_ID'),
+ 'client_secret' => env('GOOGLE_CLIENT_SECRET'),
+ 'redirect' => env('GOOGLE_CLIENT_SECRET'),
+ ],
+];
diff --git a/config/session.php b/config/session.php
new file mode 100644
index 0000000..3776375
--- /dev/null
+++ b/config/session.php
@@ -0,0 +1,218 @@
+ env('SESSION_DRIVER', 'database'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Lifetime
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the number of minutes that you wish the session
+ | to be allowed to remain idle before it expires. If you want them
+ | to expire immediately when the browser is closed then you may
+ | indicate that via the expire_on_close configuration option.
+ |
+ */
+
+ 'lifetime' => env('SESSION_LIFETIME', 120),
+
+ 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Encryption
+ |--------------------------------------------------------------------------
+ |
+ | This option allows you to easily specify that all of your session data
+ | should be encrypted before it's stored. All encryption is performed
+ | automatically by Laravel and you may use the session like normal.
+ |
+ */
+
+ 'encrypt' => env('SESSION_ENCRYPT', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session File Location
+ |--------------------------------------------------------------------------
+ |
+ | When utilizing the "file" session driver, the session files are placed
+ | on disk. The default storage location is defined here; however, you
+ | are free to provide another location where they should be stored.
+ |
+ */
+
+ 'files' => storage_path('framework/sessions'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Database Connection
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" or "redis" session drivers, you may specify a
+ | connection that should be used to manage these sessions. This should
+ | correspond to a connection in your database configuration options.
+ |
+ */
+
+ 'connection' => env('SESSION_CONNECTION'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Database Table
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" session driver, you may specify the table to
+ | be used to store sessions. Of course, a sensible default is defined
+ | for you; however, you're welcome to change this to another table.
+ |
+ */
+
+ 'table' => env('SESSION_TABLE', 'sessions'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cache Store
+ |--------------------------------------------------------------------------
+ |
+ | When using one of the framework's cache driven session backends, you may
+ | define the cache store which should be used to store the session data
+ | between requests. This must match one of your defined cache stores.
+ |
+ | Affects: "apc", "dynamodb", "memcached", "redis"
+ |
+ */
+
+ 'store' => env('SESSION_STORE'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Sweeping Lottery
+ |--------------------------------------------------------------------------
+ |
+ | Some session drivers must manually sweep their storage location to get
+ | rid of old sessions from storage. Here are the chances that it will
+ | happen on a given request. By default, the odds are 2 out of 100.
+ |
+ */
+
+ 'lottery' => [2, 100],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Name
+ |--------------------------------------------------------------------------
+ |
+ | Here you may change the name of the session cookie that is created by
+ | the framework. Typically, you should not need to change this value
+ | since doing so does not grant a meaningful security improvement.
+ |
+ |
+ */
+
+ 'cookie' => env(
+ 'SESSION_COOKIE',
+ Str::slug(env('APP_NAME', 'laravel'), '_') . '_session'
+ ),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Path
+ |--------------------------------------------------------------------------
+ |
+ | The session cookie path determines the path for which the cookie will
+ | be regarded as available. Typically, this will be the root path of
+ | your application, but you're free to change this when necessary.
+ |
+ */
+
+ 'path' => env('SESSION_PATH', '/'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Domain
+ |--------------------------------------------------------------------------
+ |
+ | This value determines the domain and subdomains the session cookie is
+ | available to. By default, the cookie will be available to the root
+ | domain and all subdomains. Typically, this shouldn't be changed.
+ |
+ */
+
+ 'domain' => env('SESSION_DOMAIN'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | HTTPS Only Cookies
+ |--------------------------------------------------------------------------
+ |
+ | By setting this option to true, session cookies will only be sent back
+ | to the server if the browser has a HTTPS connection. This will keep
+ | the cookie from being sent to you when it can't be done securely.
+ |
+ */
+
+ 'secure' => env('SESSION_SECURE_COOKIE'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | HTTP Access Only
+ |--------------------------------------------------------------------------
+ |
+ | Setting this value to true will prevent JavaScript from accessing the
+ | value of the cookie and the cookie will only be accessible through
+ | the HTTP protocol. It's unlikely you should disable this option.
+ |
+ */
+
+ 'http_only' => env('SESSION_HTTP_ONLY', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Same-Site Cookies
+ |--------------------------------------------------------------------------
+ |
+ | This option determines how your cookies behave when cross-site requests
+ | take place, and can be used to mitigate CSRF attacks. By default, we
+ | will set this value to "lax" to permit secure cross-site requests.
+ |
+ | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
+ |
+ | Supported: "lax", "strict", "none", null
+ |
+ */
+
+ 'same_site' => env('SESSION_SAME_SITE', 'lax'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Partitioned Cookies
+ |--------------------------------------------------------------------------
+ |
+ | Setting this value to true will tie the cookie to the top-level site for
+ | a cross-site context. Partitioned cookies are accepted by the browser
+ | when flagged "secure" and the Same-Site attribute is set to "none".
+ |
+ */
+
+ 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
+
+];
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
new file mode 100644
index 0000000..a735557
--- /dev/null
+++ b/database/seeders/DatabaseSeeder.php
@@ -0,0 +1,17 @@
+call(AdminDatabaseSeeder::class);
+ }
+}
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..caf1e7f
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,55 @@
+version: '3'
+services:
+ laravel.test:
+ build:
+ context: ./docker/8.2
+ dockerfile: Dockerfile
+ args:
+ WWWGROUP: '${WWWGROUP}'
+ image: sail-8.2/app
+ extra_hosts:
+ - 'host.docker.internal:host-gateway'
+ ports:
+ - '${APP_PORT:-80}:80'
+ - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
+ environment:
+ WWWUSER: '${WWWUSER}'
+ LARAVEL_SAIL: 1
+ XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
+ XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
+ volumes:
+ - '.:/var/www/html'
+ networks:
+ - sail
+ depends_on:
+ - mysql
+ mysql:
+ image: 'mysql/mysql-server:8.0'
+ ports:
+ - '${FORWARD_DB_PORT:-3306}:3306'
+ environment:
+ MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
+ MYSQL_ROOT_HOST: '%'
+ MYSQL_DATABASE: '${DB_DATABASE}'
+ MYSQL_USER: '${DB_USERNAME}'
+ MYSQL_PASSWORD: '${DB_PASSWORD}'
+ MYSQL_ALLOW_EMPTY_PASSWORD: 1
+ volumes:
+ - 'sail-mysql:/var/lib/mysql'
+ - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
+ networks:
+ - sail
+ healthcheck:
+ test:
+ - CMD
+ - mysqladmin
+ - ping
+ - '-p${DB_PASSWORD}'
+ retries: 3
+ timeout: 5s
+networks:
+ sail:
+ driver: bridge
+volumes:
+ sail-mysql:
+ driver: local
diff --git a/docker/7.4/Dockerfile b/docker/7.4/Dockerfile
new file mode 100644
index 0000000..f6178e5
--- /dev/null
+++ b/docker/7.4/Dockerfile
@@ -0,0 +1,57 @@
+FROM ubuntu:20.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=16
+ARG POSTGRES_VERSION=13
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php7.4-cli php7.4-dev \
+ php7.4-pgsql php7.4-sqlite3 php7.4-gd php7.4-imagick \
+ php7.4-curl php7.4-memcached \
+ php7.4-imap php7.4-mysql php7.4-mbstring \
+ php7.4-xml php7.4-zip php7.4-bcmath php7.4-soap \
+ php7.4-intl php7.4-readline php7.4-pcov \
+ php7.4-msgpack php7.4-igbinary php7.4-ldap \
+ php7.4-redis php7.4-xdebug \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -sLS https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt focal-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php7.4
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/7.4/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/7.4/php.ini b/docker/7.4/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/7.4/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/7.4/start-container b/docker/7.4/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/7.4/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/7.4/supervisord.conf b/docker/7.4/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/7.4/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/docker/8.0/Dockerfile b/docker/8.0/Dockerfile
new file mode 100644
index 0000000..af8c592
--- /dev/null
+++ b/docker/8.0/Dockerfile
@@ -0,0 +1,59 @@
+FROM ubuntu:20.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=16
+ARG POSTGRES_VERSION=13
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php8.0-cli php8.0-dev \
+ php8.0-pgsql php8.0-sqlite3 php8.0-gd php8.0-imagick \
+ php8.0-curl php8.0-memcached \
+ php8.0-imap php8.0-mysql php8.0-mbstring \
+ php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
+ php8.0-intl php8.0-readline php8.0-pcov \
+ php8.0-msgpack php8.0-igbinary php8.0-ldap \
+ php8.0-redis php8.0-swoole php8.0-xdebug \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -sLS https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt focal-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN update-alternatives --set php /usr/bin/php8.0
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/8.0/php.ini b/docker/8.0/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/8.0/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/8.0/start-container b/docker/8.0/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/8.0/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/8.0/supervisord.conf b/docker/8.0/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/8.0/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/docker/8.1/Dockerfile b/docker/8.1/Dockerfile
new file mode 100644
index 0000000..77589ba
--- /dev/null
+++ b/docker/8.1/Dockerfile
@@ -0,0 +1,58 @@
+FROM ubuntu:22.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=18
+ARG POSTGRES_VERSION=15
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /usr/share/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php8.1-cli php8.1-dev \
+ php8.1-pgsql php8.1-sqlite3 php8.1-gd php8.1-imagick \
+ php8.1-curl \
+ php8.1-imap php8.1-mysql php8.1-mbstring \
+ php8.1-xml php8.1-zip php8.1-bcmath php8.1-soap \
+ php8.1-intl php8.1-readline \
+ php8.1-ldap \
+ php8.1-msgpack php8.1-igbinary php8.1-redis php8.1-swoole \
+ php8.1-memcached php8.1-pcov php8.1-xdebug \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -sLS https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarn.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.1
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/8.1/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/8.1/php.ini b/docker/8.1/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/8.1/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/8.1/start-container b/docker/8.1/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/8.1/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/8.1/supervisord.conf b/docker/8.1/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/8.1/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/docker/8.2/Dockerfile b/docker/8.2/Dockerfile
new file mode 100644
index 0000000..b3ced6a
--- /dev/null
+++ b/docker/8.2/Dockerfile
@@ -0,0 +1,58 @@
+FROM ubuntu:22.04
+
+LABEL maintainer="Taylor Otwell"
+
+ARG WWWGROUP
+ARG NODE_VERSION=18
+ARG POSTGRES_VERSION=15
+
+WORKDIR /var/www/html
+
+ENV DEBIAN_FRONTEND noninteractive
+ENV TZ=UTC
+
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN apt-get update \
+ && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 dnsutils \
+ && curl -sS 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x14aa40ec0831756756d7f66c4f4ea0aae5267a6c' | gpg --dearmor | tee /etc/apt/keyrings/ppa_ondrej_php.gpg > /dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/ppa_ondrej_php.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
+ && apt-get update \
+ && apt-get install -y php8.2-cli php8.2-dev \
+ php8.2-pgsql php8.2-sqlite3 php8.2-gd php8.2-imagick \
+ php8.2-curl \
+ php8.2-imap php8.2-mysql php8.2-mbstring \
+ php8.2-xml php8.2-zip php8.2-bcmath php8.2-soap \
+ php8.2-intl php8.2-readline \
+ php8.2-ldap \
+ php8.2-msgpack php8.2-igbinary php8.2-redis php8.2-swoole \
+ php8.2-memcached php8.2-pcov php8.2-xdebug \
+ && curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \
+ && curl -sLS https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
+ && apt-get install -y nodejs \
+ && npm install -g npm \
+ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /etc/apt/keyrings/yarn.gpg >/dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
+ && curl -sS https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /etc/apt/keyrings/pgdg.gpg >/dev/null \
+ && echo "deb [signed-by=/etc/apt/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt jammy-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
+ && apt-get update \
+ && apt-get install -y yarn \
+ && apt-get install -y mysql-client \
+ && apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get -y autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.2
+
+RUN groupadd --force -g $WWWGROUP sail
+RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
+
+COPY start-container /usr/local/bin/start-container
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+COPY php.ini /etc/php/8.2/cli/conf.d/99-sail.ini
+RUN chmod +x /usr/local/bin/start-container
+
+EXPOSE 8000
+
+ENTRYPOINT ["start-container"]
diff --git a/docker/8.2/php.ini b/docker/8.2/php.ini
new file mode 100644
index 0000000..39dcbca
--- /dev/null
+++ b/docker/8.2/php.ini
@@ -0,0 +1,7 @@
+[PHP]
+post_max_size = 100M
+upload_max_filesize = 100M
+variables_order = EGPCS
+
+[opcache]
+opcache.enable_cli=1
diff --git a/docker/8.2/start-container b/docker/8.2/start-container
new file mode 100644
index 0000000..b864399
--- /dev/null
+++ b/docker/8.2/start-container
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [ ! -z "$WWWUSER" ]; then
+ usermod -u $WWWUSER sail
+fi
+
+if [ ! -d /.composer ]; then
+ mkdir /.composer
+fi
+
+chmod -R ugo+rw /.composer
+
+if [ $# -gt 0 ]; then
+ exec gosu $WWWUSER "$@"
+else
+ exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
+fi
diff --git a/docker/8.2/supervisord.conf b/docker/8.2/supervisord.conf
new file mode 100644
index 0000000..9d28479
--- /dev/null
+++ b/docker/8.2/supervisord.conf
@@ -0,0 +1,14 @@
+[supervisord]
+nodaemon=true
+user=root
+logfile=/var/log/supervisor/supervisord.log
+pidfile=/var/run/supervisord.pid
+
+[program:php]
+command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
+user=sail
+environment=LARAVEL_SAIL="1"
+stdout_logfile=/dev/stdout
+stdout_logfile_maxbytes=0
+stderr_logfile=/dev/stderr
+stderr_logfile_maxbytes=0
diff --git a/modules/Admin/App/Actions/Fortify/CreateNewUser.php b/modules/Admin/App/Actions/Fortify/CreateNewUser.php
new file mode 100644
index 0000000..3489fd5
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Actions/Fortify/PasswordValidationRules.php b/modules/Admin/App/Actions/Fortify/PasswordValidationRules.php
new file mode 100644
index 0000000..5f0d0f1
--- /dev/null
+++ b/modules/Admin/App/Actions/Fortify/PasswordValidationRules.php
@@ -0,0 +1,18 @@
+|string>
+ */
+ protected function passwordRules(): array
+ {
+ return ['required', 'string', Password::default(), 'confirmed'];
+ }
+}
diff --git a/modules/Admin/App/Actions/Fortify/ResetUserPassword.php b/modules/Admin/App/Actions/Fortify/ResetUserPassword.php
new file mode 100644
index 0000000..853b81f
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Actions/Fortify/UpdateUserPassword.php b/modules/Admin/App/Actions/Fortify/UpdateUserPassword.php
new file mode 100644
index 0000000..df98d5f
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Actions/Fortify/UpdateUserProfileInformation.php b/modules/Admin/App/Actions/Fortify/UpdateUserProfileInformation.php
new file mode 100644
index 0000000..d78a6ae
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Console/Commands/CleanInitialAvatars.php b/modules/Admin/App/Console/Commands/CleanInitialAvatars.php
new file mode 100644
index 0000000..e4fa315
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Helpers/Helpers.php b/modules/Admin/App/Helpers/Helpers.php
new file mode 100644
index 0000000..99dae3d
--- /dev/null
+++ b/modules/Admin/App/Helpers/Helpers.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('custom.' . $demo . '.' . $config, $val);
+ }
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Http/Controllers/AdminController.php b/modules/Admin/App/Http/Controllers/AdminController.php
new file mode 100644
index 0000000..e5112a7
--- /dev/null
+++ b/modules/Admin/App/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('admin::admin-settings.webapp-general-settings');
+ }
+
+ public function smtpSettings()
+ {
+ return view('admin::admin-settings.smtp-settings');
+ }
+}
diff --git a/modules/Admin/App/Http/Controllers/AuthController.php b/modules/Admin/App/Http/Controllers/AuthController.php
new file mode 100644
index 0000000..c2889a2
--- /dev/null
+++ b/modules/Admin/App/Http/Controllers/AuthController.php
@@ -0,0 +1,144 @@
+ 'blank'];
+
+ return view("admin::auth.login-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function registerView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+
+
+ public function confirmPasswordView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.confirm-password-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function resetPasswordView()
+ {
+ if (!Features::enabled(Features::resetPasswords()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("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('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("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('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.two-factor-challenge-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function twoFactorRecoveryCodesView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function twoFactorAuthenticationView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+
+
+
+
+ public function verifyEmailView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.verify-email-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function showEmailVerificationForm()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+
+ public function userProfileView()
+ {
+ if (!Features::enabled(Features::registration()))
+ abort(403, 'El registro está deshabilitado.');
+
+ $viewMode = config('custom.custom.authViewMode');
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view("admin::auth.register-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ }
+ */
+}
diff --git a/modules/Admin/App/Http/Controllers/CacheController.php b/modules/Admin/App/Http/Controllers/CacheController.php
new file mode 100644
index 0000000..0bde8bd
--- /dev/null
+++ b/modules/Admin/App/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('admin::cache-manager.index', compact('configCache'));
+ }
+}
diff --git a/modules/Admin/App/Http/Controllers/HomeController.php b/modules/Admin/App/Http/Controllers/HomeController.php
new file mode 100644
index 0000000..6499773
--- /dev/null
+++ b/modules/Admin/App/Http/Controllers/HomeController.php
@@ -0,0 +1,32 @@
+ 'blank'];
+
+ return view('admin::pages.comingsoon', compact('pageConfigs'));
+ }
+
+ public function underMaintenance()
+ {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ return view('admin::pages.under-maintenance', compact('pageConfigs'));
+ }
+}
diff --git a/modules/Admin/App/Http/Controllers/PermissionController.php b/modules/Admin/App/Http/Controllers/PermissionController.php
new file mode 100644
index 0000000..767af5a
--- /dev/null
+++ b/modules/Admin/App/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('admin::permissions.index');
+ }
+}
diff --git a/modules/Admin/App/Http/Controllers/RoleController.php b/modules/Admin/App/Http/Controllers/RoleController.php
new file mode 100644
index 0000000..8bec7c9
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Http/Controllers/SatCatalogController.php b/modules/Admin/App/Http/Controllers/SatCatalogController.php
new file mode 100644
index 0000000..a8bfe49
--- /dev/null
+++ b/modules/Admin/App/Http/Controllers/SatCatalogController.php
@@ -0,0 +1,194 @@
+isMethod('post')) {
+ $validator = Validator::make($request->all(), [
+ 'file' => ['required', 'mimes:xls,xlsx'],
+ ]);
+
+ if ($validator->fails())
+ return back()->withInput()->withErrors($validator);
+
+ $time_start = microtime(true);
+ $results = [
+ 'details' => [],
+ 'total_rows' => 0,
+ 'total_created' => 0,
+ 'total_updated' => 0,
+ 'total_time' => 0,
+ ];
+
+ $import = new SatCatalogsImport();
+ $filePath = request()->file('file');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_FormaPago');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Forma de pago',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_Moneda');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Moneda',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_CodigoPostal_Parte_1');
+ Excel::import($import, $filePath);
+ $import->onlySheets('c_CodigoPostal_Parte_2');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Código postal',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_RegimenFiscal');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Regimen fiscal',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_Pais');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'País',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_UsoCFDI');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Uso de CFDI',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('C_Colonia_1');
+ Excel::import($import, $filePath);
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('C_Colonia_2');
+ Excel::import($import, $filePath);
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('C_Colonia_3');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Colonia',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('c_Estado');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Estado',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('C_Localidad');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Localidad',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $time_sheet_start = microtime(true);
+ $import->onlySheets('C_Municipio');
+ Excel::import($import, $filePath);
+ $results['details'][] = [
+ 'name' => 'Municipio',
+ 'time' => round(microtime(true) - $time_sheet_start, 2),
+ 'created' => session('created'),
+ 'updated' => session('updated'),
+ ];
+ $results['total_rows'] += session('created') + session('updated');
+ $results['total_created'] += session('created');
+ $results['total_updated'] += session('updated');
+
+
+ $results['total_time'] = round(microtime(true) - $time_start, 2);
+
+ return back()->with('results', $results);
+ }
+
+ return view('system::import-sat.index');
+ }
+}
diff --git a/modules/Admin/App/Http/Controllers/UserController.php b/modules/Admin/App/Http/Controllers/UserController.php
new file mode 100644
index 0000000..6d9eaaf
--- /dev/null
+++ b/modules/Admin/App/Http/Controllers/UserController.php
@@ -0,0 +1,182 @@
+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('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 Tiendas
+ //$user->stores()->attach($request->stores);
+
+ if ($request->file('photo'))
+ $user->updateProfilePhoto($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('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 Tiendas
+ //$user->stores()->sync($request->stores);
+
+ // Actualizamos foto de perfil
+ if ($request->file('photo'))
+ $user->updateProfilePhoto($request->file('photo'));
+
+ return response()->json(['success' => 'Se guardo correctamente los cambios.']);
+ }
+
+
+ public function userSettings(User $user)
+ {
+ return view('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/modules/Admin/App/Http/Controllers/WebsiteSettingController.php b/modules/Admin/App/Http/Controllers/WebsiteSettingController.php
new file mode 100644
index 0000000..ea2aabd
--- /dev/null
+++ b/modules/Admin/App/Http/Controllers/WebsiteSettingController.php
@@ -0,0 +1,18 @@
+is('admin/*') && !$request->is('admin')) {
+ return $next($request);
+ }
+
+ // Compartir variables globalmente solo si es una solicitud HTML
+ if (str_contains($request->header('Accept'), 'text/html')) {
+ $adminVars = app(AdminTemplateService::class)->getAdminVars();
+
+ View::share('_admin', $adminVars);
+ }
+
+ return $next($request);
+ }
+}
diff --git a/modules/Admin/App/Http/View/Composers/VuexyTemplateComposer.php b/modules/Admin/App/Http/View/Composers/VuexyTemplateComposer.php
new file mode 100644
index 0000000..cfe56a4
--- /dev/null
+++ b/modules/Admin/App/Http/View/Composers/VuexyTemplateComposer.php
@@ -0,0 +1,27 @@
+vuexyAdminService = $vuexyAdminService;
+ }
+
+ public function compose(View $view)
+ {
+ $view->with([
+ 'vuexyMenu' => $this->vuexyAdminService->getMenu(),
+ 'vuexySearch' => $this->vuexyAdminService->getSearch(),
+ 'vuexyQuickLinks' => $this->vuexyAdminService->getQuickLinks(),
+ 'vuexyNotifications' => $this->vuexyAdminService->getNotifications(),
+ 'vuexyBreadcrumbs' => $this->vuexyAdminService->getBreadcrumbs(),
+ ]);
+ }
+}
diff --git a/modules/Admin/App/Imports/SATCodigoPostalImport.php b/modules/Admin/App/Imports/SATCodigoPostalImport.php
new file mode 100644
index 0000000..f595995
--- /dev/null
+++ b/modules/Admin/App/Imports/SATCodigoPostalImport.php
@@ -0,0 +1,78 @@
+ $row) {
+ if ($key < 7 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_codigo_postal' => $row[0],
+ 'c_estado' => $row[1],
+ 'c_municipio' => $row[2],
+ 'c_localidad' => $row[3],
+ 'estimulo_franja_fronteriza' => $row[4],
+ 'fecha_inicio_de_vigencia' => $row[5] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[5])) :
+ null,
+ 'fecha_fin_de_vigencia' => $row[6] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[6])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_codigo_postal')->upsert(
+ $batchData,
+ [
+ 'c_codigo_postal'
+ ],
+ [
+ 'c_estado',
+ 'c_municipio',
+ 'c_localidad',
+ 'estimulo_franja_fronteriza',
+ 'fecha_inicio_de_vigencia',
+ 'fecha_fin_de_vigencia'
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATColoniaImport.php b/modules/Admin/App/Imports/SATColoniaImport.php
new file mode 100644
index 0000000..2aa8738
--- /dev/null
+++ b/modules/Admin/App/Imports/SATColoniaImport.php
@@ -0,0 +1,68 @@
+ $row) {
+ if ($key < 5 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_colonia' => $row[0],
+ 'c_codigo_postal' => $row[1],
+ 'nombre_del_asentamiento' => $row[2],
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_colonia')->upsert(
+ $batchData,
+ [
+ 'c_colonia',
+ 'c_codigo_postal',
+ ],
+ [
+ 'nombre_del_asentamiento',
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATEstadoImport.php b/modules/Admin/App/Imports/SATEstadoImport.php
new file mode 100644
index 0000000..aac83a7
--- /dev/null
+++ b/modules/Admin/App/Imports/SATEstadoImport.php
@@ -0,0 +1,77 @@
+ $row) {
+ if ($key < 5 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_estado' => $row[0],
+ 'c_pais' => $row[1],
+ 'nombre_del_estado' => $row[2],
+ 'fecha_inicio_de_vigencia' => $row[3] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[3])) :
+ null,
+ 'fecha_fin_de_vigencia' => $row[4] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_estado')->upsert(
+ $batchData,
+ [
+ 'c_estado',
+ 'c_pais',
+ ],
+ [
+ 'nombre_del_estado',
+ 'fecha_inicio_de_vigencia',
+ 'fecha_fin_de_vigencia',
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATFormaPagoImport.php b/modules/Admin/App/Imports/SATFormaPagoImport.php
new file mode 100644
index 0000000..9907b72
--- /dev/null
+++ b/modules/Admin/App/Imports/SATFormaPagoImport.php
@@ -0,0 +1,95 @@
+ $row) {
+ if ($key < 6 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_forma_pago' => $row[0],
+ 'descripcion' => $row[1],
+ 'bancarizado' => $row[2],
+ 'numero_de_operacion' => $row[3],
+ 'rfc_del_emisor_de_la_cuenta_ordenante' => $row[4],
+ 'cuenta_ordenante' => $row[5],
+ 'patron_para_cuenta_ordenante' => $row[6],
+ 'rfc_del_emisor_cuenta_de_beneficiario' => $row[7],
+ 'cuenta_de_benenficiario' => $row[8],
+ 'patron_para_cuenta_beneficiaria' => $row[9],
+ 'tipo_cadena_pago' => $row[10],
+ 'banco_emisor_de_la_cuenta_ordenante' => $row[11],
+ 'fecha_inicio_de_vigencia' => $row[12] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[12])) :
+ null,
+ 'fecha_fin_de_vigencia' => $row[13] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[13])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_forma_pago')->upsert(
+ $batchData,
+ [
+ 'c_forma_pago',
+ ],
+ [
+ 'descripcion',
+ 'bancarizado',
+ 'numero_de_operacion',
+ 'rfc_del_emisor_de_la_cuenta_ordenante',
+ 'cuenta_ordenante',
+ 'patron_para_cuenta_ordenante',
+ 'rfc_del_emisor_cuenta_de_beneficiario',
+ 'cuenta_de_benenficiario',
+ 'patron_para_cuenta_beneficiaria',
+ 'tipo_cadena_pago',
+ 'banco_emisor_de_la_cuenta_ordenante',
+ 'fecha_inicio_de_vigencia',
+ 'fecha_fin_de_vigencia',
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATLocalidadImport.php b/modules/Admin/App/Imports/SATLocalidadImport.php
new file mode 100644
index 0000000..7f1b2ad
--- /dev/null
+++ b/modules/Admin/App/Imports/SATLocalidadImport.php
@@ -0,0 +1,77 @@
+ $row) {
+ if ($key < 5 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_localidad' => $row[0],
+ 'c_estado' => $row[1],
+ 'descripcion' => $row[2],
+ 'fecha_de_inicio_de_vigencia' => $row[3] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[3])) :
+ null,
+ 'fecha_de_fin_de_vigencia' => $row[4] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_localidad')->upsert(
+ $batchData,
+ [
+ 'c_localidad',
+ 'c_estado',
+ ],
+ [
+ 'descripcion',
+ 'fecha_de_inicio_de_vigencia',
+ 'fecha_de_fin_de_vigencia'
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATMonedaImport.php b/modules/Admin/App/Imports/SATMonedaImport.php
new file mode 100644
index 0000000..9373466
--- /dev/null
+++ b/modules/Admin/App/Imports/SATMonedaImport.php
@@ -0,0 +1,79 @@
+ $row) {
+ if ($key < 5 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_moneda' => $row[0],
+ 'descripcion' => $row[1],
+ 'decimales' => $row[2],
+ 'porcentaje_variacion' => $row[3],
+ 'fecha_inicio_de_vigencia' => $row[4] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4])) :
+ null,
+ 'fecha_fin_de_vigencia' => $row[5] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[5])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_moneda')->upsert(
+ $batchData,
+ [
+ 'c_moneda',
+ ],
+ [
+ 'descripcion',
+ 'decimales',
+ 'porcentaje_variacion',
+ 'fecha_inicio_de_vigencia',
+ 'fecha_fin_de_vigencia',
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATMunicipioImport.php b/modules/Admin/App/Imports/SATMunicipioImport.php
new file mode 100644
index 0000000..4819853
--- /dev/null
+++ b/modules/Admin/App/Imports/SATMunicipioImport.php
@@ -0,0 +1,77 @@
+ $row) {
+ if ($key < 5 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_municipio' => $row[0],
+ 'c_estado' => $row[1],
+ 'descripcion' => $row[2],
+ 'fecha_de_inicio_de_vigencia' => $row[3] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[3])) :
+ null,
+ 'fecha_de_fin_de_vigencia' => $row[4] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_municipio')->upsert(
+ $batchData,
+ [
+ 'c_municipio',
+ 'c_estado',
+ ],
+ [
+ 'descripcion',
+ 'fecha_de_inicio_de_vigencia',
+ 'fecha_de_fin_de_vigencia'
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATPaisImport.php b/modules/Admin/App/Imports/SATPaisImport.php
new file mode 100644
index 0000000..e8c2b25
--- /dev/null
+++ b/modules/Admin/App/Imports/SATPaisImport.php
@@ -0,0 +1,74 @@
+ $row) {
+ if ($key < 5 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_pais' => $row[0],
+ 'descripcion' => $row[1],
+ 'formato_de_codigo_postal' => $row[2],
+ 'formato_de_registro_de_identidad_tributaria' => $row[3],
+ 'validacion_del_registro_de_identidad_tributaria' => $row[4],
+ 'agrupaciones' => $row[5],
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_pais')->upsert(
+ $batchData,
+ [
+ 'c_pais',
+ ],
+ [
+ 'descripcion',
+ 'formato_de_codigo_postal',
+ 'formato_de_registro_de_identidad_tributaria',
+ 'validacion_del_registro_de_identidad_tributaria',
+ 'agrupaciones',
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATRegimenFiscalImport.php b/modules/Admin/App/Imports/SATRegimenFiscalImport.php
new file mode 100644
index 0000000..e9d61f2
--- /dev/null
+++ b/modules/Admin/App/Imports/SATRegimenFiscalImport.php
@@ -0,0 +1,79 @@
+ $row) {
+ if ($key < 6 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_regimen_fiscal' => $row[0],
+ 'descripcion' => $row[1],
+ 'fisica' => $row[2],
+ 'moral' => $row[3],
+ 'fecha_de_inicio_de_vigencia' => $row[4] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4])) :
+ null,
+ 'fecha_de_fin_de_vigencia' => $row[5] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[5])) :
+ null,
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_regimen_fiscal')->upsert(
+ $batchData,
+ [
+ 'c_regimen_fiscal',
+ ],
+ [
+ 'descripcion',
+ 'fisica',
+ 'moral',
+ 'fecha_de_inicio_de_vigencia',
+ 'fecha_de_fin_de_vigencia'
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SATUsoCFDIImport.php b/modules/Admin/App/Imports/SATUsoCFDIImport.php
new file mode 100644
index 0000000..a77b4ae
--- /dev/null
+++ b/modules/Admin/App/Imports/SATUsoCFDIImport.php
@@ -0,0 +1,81 @@
+ $row) {
+ if ($key < 6 || !$row[1]) {
+ continue;
+ }
+
+ $requestArray = [
+ 'c_uso_cfdi' => $row[0],
+ 'descripcion' => $row[1],
+ 'aplica_para_tipo_persona_fisica' => $row[2],
+ 'aplica_para_tipo_persona_moral' => $row[3],
+ 'fecha_inicio_de_vigencia' => $row[4] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4])) :
+ null,
+ 'fecha_fin_de_vigencia' => $row[5] ?
+ Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[5])) :
+ null,
+ 'regimen_fiscal_receptor' => $row[6],
+ ];
+
+ $batchData[] = $requestArray;
+ $processedRows++;
+
+ if (count($batchData) >= $batchSize) {
+ $this->insertBatch($batchData);
+ $batchData = [];
+ }
+ }
+
+ if (!empty($batchData)) {
+ $this->insertBatch($batchData);
+ }
+
+ echo "\n\033[32mImport completed: Processed $processedRows rows.\033[0m\n";
+ }
+
+ private function insertBatch(array $batchData)
+ {
+ try {
+ DB::table('sat_uso_cfdi')->upsert(
+ $batchData,
+ [
+ 'c_uso_cfdi',
+ ],
+ [
+ 'descripcion',
+ 'aplica_para_tipo_persona_fisica',
+ 'aplica_para_tipo_persona_moral',
+ 'fecha_inicio_de_vigencia',
+ 'fecha_fin_de_vigencia',
+ 'regimen_fiscal_receptor',
+ ]
+ );
+ } catch (\Exception $e) {
+ echo "Error in batch: " . $e->getMessage() . "\n";
+
+ foreach ($batchData as $row) {
+ echo "Row data: " . json_encode($row) . "\n";
+ }
+ }
+ }
+}
diff --git a/modules/Admin/App/Imports/SatCatalogsImport.php b/modules/Admin/App/Imports/SatCatalogsImport.php
new file mode 100644
index 0000000..cfa01ed
--- /dev/null
+++ b/modules/Admin/App/Imports/SatCatalogsImport.php
@@ -0,0 +1,31 @@
+ new SATFormaPagoImport(),
+ 'c_Moneda' => new SATMonedaImport(),
+ 'c_CodigoPostal_Parte_1' => new SATCodigoPostalImport(),
+ 'c_CodigoPostal_Parte_2' => new SATCodigoPostalImport(),
+ 'c_RegimenFiscal' => new SATRegimenFiscalImport(),
+ 'c_Pais' => new SATPaisImport(),
+ 'c_UsoCFDI' => new SATUsoCFDIImport(),
+ 'C_Colonia_1' => new SATColoniaImport(),
+ 'C_Colonia_2' => new SATColoniaImport(),
+ 'C_Colonia_3' => new SATColoniaImport(),
+ 'c_Estado' => new SATEstadoImport(),
+ 'C_Localidad' => new SATLocalidadImport(),
+ 'C_Municipio' => new SATMunicipioImport(),
+ ];
+ }
+}
diff --git a/modules/Admin/App/Listeners/ClearUserCache.php b/modules/Admin/App/Listeners/ClearUserCache.php
new file mode 100644
index 0000000..02a9769
--- /dev/null
+++ b/modules/Admin/App/Listeners/ClearUserCache.php
@@ -0,0 +1,25 @@
+user) {
+ VuexyAdminService::clearUserMenuCache();
+ VuexyAdminService::clearSearchMenuCache();
+ VuexyAdminService::clearQuickLinksCache();
+ VuexyAdminService::clearNotificationsCache();
+ }
+ }
+}
diff --git a/modules/Admin/App/Listeners/HandleUserLogin.php b/modules/Admin/App/Listeners/HandleUserLogin.php
new file mode 100644
index 0000000..ba7dbe5
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Livewire/AdminSettings/ApplicationSettings.php b/modules/Admin/App/Livewire/AdminSettings/ApplicationSettings.php
new file mode 100644
index 0000000..7e9caa5
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.admin-settings.application-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/AdminSettings/GeneralSettings.php b/modules/Admin/App/Livewire/AdminSettings/GeneralSettings.php
new file mode 100644
index 0000000..55717f8
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.admin-settings.general-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/AdminSettings/InterfaceSettings.php b/modules/Admin/App/Livewire/AdminSettings/InterfaceSettings.php
new file mode 100644
index 0000000..9edc41a
--- /dev/null
+++ b/modules/Admin/App/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.custom.custom.myLayout', $this->vuexy_myLayout);
+ $globalSettingsService->updateSetting('config.custom.custom.myTheme', $this->vuexy_myTheme);
+ $globalSettingsService->updateSetting('config.custom.custom.myStyle', $this->vuexy_myStyle);
+ $globalSettingsService->updateSetting('config.custom.custom.hasCustomizer', $this->vuexy_hasCustomizer);
+ $globalSettingsService->updateSetting('config.custom.custom.displayCustomizer', $this->vuexy_displayCustomizer);
+ $globalSettingsService->updateSetting('config.custom.custom.contentLayout', $this->vuexy_contentLayout);
+ $globalSettingsService->updateSetting('config.custom.custom.navbarType', $this->vuexy_navbarType);
+ $globalSettingsService->updateSetting('config.custom.custom.footerFixed', $this->vuexy_footerFixed);
+ $globalSettingsService->updateSetting('config.custom.custom.menuFixed', $this->vuexy_menuFixed);
+ $globalSettingsService->updateSetting('config.custom.custom.menuCollapsed', $this->vuexy_menuCollapsed);
+ $globalSettingsService->updateSetting('config.custom.custom.headerType', $this->vuexy_headerType);
+ $globalSettingsService->updateSetting('config.custom.custom.showDropdownOnHover', $this->vuexy_showDropdownOnHover);
+ $globalSettingsService->updateSetting('config.custom.custom.authViewMode', $this->vuexy_authViewMode);
+ $globalSettingsService->updateSetting('config.custom.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->clearVuexyCustomConfig();
+
+ // 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('admin::livewire.admin-settings.interface-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/AdminSettings/MailSenderResponseSettings.php b/modules/Admin/App/Livewire/AdminSettings/MailSenderResponseSettings.php
new file mode 100644
index 0000000..aeaa6d9
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.admin-settings.mail-sender-response-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/AdminSettings/MailSmtpSettings.php b/modules/Admin/App/Livewire/AdminSettings/MailSmtpSettings.php
new file mode 100644
index 0000000..285d471
--- /dev/null
+++ b/modules/Admin/App/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(),
+ notificationTimeout: 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('admin::livewire.admin-settings.mail-smtp-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Cache/CacheFunctions.php b/modules/Admin/App/Livewire/Cache/CacheFunctions.php
new file mode 100644
index 0000000..ba95461
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.cache.cache-functions');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Cache/CacheStats.php b/modules/Admin/App/Livewire/Cache/CacheStats.php
new file mode 100644
index 0000000..77f32f6
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.cache.cache-stats');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Cache/MemcachedStats.php b/modules/Admin/App/Livewire/Cache/MemcachedStats.php
new file mode 100644
index 0000000..9c18a5c
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.cache.memcached-stats');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Cache/RedisStats.php b/modules/Admin/App/Livewire/Cache/RedisStats.php
new file mode 100644
index 0000000..0295a01
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.cache.redis-stats');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Cache/SessionStats.php b/modules/Admin/App/Livewire/Cache/SessionStats.php
new file mode 100644
index 0000000..45c4515
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.cache.session-stats');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Rbac/PermissionsIndex.php b/modules/Admin/App/Livewire/Rbac/PermissionsIndex.php
new file mode 100644
index 0000000..5312adf
--- /dev/null
+++ b/modules/Admin/App/Livewire/Rbac/PermissionsIndex.php
@@ -0,0 +1,28 @@
+roles_html_select = "";
+
+ return view('admin::livewire.rbac.permissions-index');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Rbac/RoleCards.php b/modules/Admin/App/Livewire/Rbac/RoleCards.php
new file mode 100644
index 0000000..60fb779
--- /dev/null
+++ b/modules/Admin/App/Livewire/Rbac/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('admin::livewire.rbac.role-cards');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Users/UserCount.php b/modules/Admin/App/Livewire/Users/UserCount.php
new file mode 100644
index 0000000..449589f
--- /dev/null
+++ b/modules/Admin/App/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('admin::livewire.users.user-count');
+ }
+}
diff --git a/modules/Admin/App/Livewire/Users/UserTable.php b/modules/Admin/App/Livewire/Users/UserTable.php
new file mode 100644
index 0000000..410952f
--- /dev/null
+++ b/modules/Admin/App/Livewire/Users/UserTable.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 = "";
+
+ $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('admin::livewire.users.user-table', [
+ 'users' => User::paginate(10),
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/AnalyticsSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/AnalyticsSettings.php
new file mode 100644
index 0000000..6a7d193
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/AnalyticsSettings.php
@@ -0,0 +1,64 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $WebsiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $WebsiteTemplateService->getWebsiteVars('google');
+
+ $this->google_analytics_enabled = $settings['analytics']['enabled'];
+ $this->google_analytics_id = $settings['analytics']['id'];
+ }
+
+ public function save()
+ {
+ if ($this->google_analytics_enabled) {
+ $this->validate([
+ 'google_analytics_id' => 'required|string|min:12|max:30',
+ ]);
+ }
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteSettingsService->updateSetting('google_analytics_enabled', $this->google_analytics_enabled);
+ $websiteSettingsService->updateSetting('google_analytics_id', $this->google_analytics_id);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.analytics-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/ChatSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/ChatSettings.php
new file mode 100644
index 0000000..356a0d6
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/ChatSettings.php
@@ -0,0 +1,68 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars('chat');
+
+ $this->chat_provider = $settings['provider'];
+ $this->chat_whatsapp_number = $settings['whatsapp_number'];
+ $this->chat_whatsapp_message = $settings['whatsapp_message'];
+ }
+
+ public function save()
+ {
+ if ($this->chat_provider == 'whatsapp') {
+ $this->validate([
+ 'chat_whatsapp_number' => 'required|string|max:20',
+ 'chat_whatsapp_message' => 'required|string|max:255',
+ ]);
+ }
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteSettingsService->updateSetting('chat_provider', $this->chat_provider);
+ $websiteSettingsService->updateSetting('chat_whatsapp_number', preg_replace('/\D/', '', $this->chat_whatsapp_number));
+ $websiteSettingsService->updateSetting('chat_whatsapp_message', $this->chat_whatsapp_message);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.chat-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/ContactFormSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/ContactFormSettings.php
new file mode 100644
index 0000000..3980fa6
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/ContactFormSettings.php
@@ -0,0 +1,67 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->contact_form_email = $settings['contact']['form']['email'];
+ $this->contact_form_email_cc = $settings['contact']['form']['email_cc'];
+ $this->contact_form_subject = $settings['contact']['form']['subject'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'contact_form_email' => 'required|email',
+ 'contact_form_email_cc' => 'nullable|email',
+ 'contact_form_subject' => 'required|string'
+ ]);
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteSettingsService->updateSetting('contact_form_email', $this->contact_form_email);
+ $websiteSettingsService->updateSetting('contact_form_email_cc', $this->contact_form_email_cc);
+ $websiteSettingsService->updateSetting('contact_form_subject', $this->contact_form_subject);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.contact-form-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/ContactInfoSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/ContactInfoSettings.php
new file mode 100644
index 0000000..e0972ca
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/ContactInfoSettings.php
@@ -0,0 +1,67 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->contact_phone_number = $settings['contact']['phone_number'];
+ $this->contact_phone_number_ext = $settings['contact']['phone_number_ext'];
+ $this->contact_email = $settings['contact']['email'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'contact_phone_number' => ['nullable', 'string', 'max:20'],
+ 'contact_phone_number_ext' => ['nullable', 'string', 'max:10'],
+ 'contact_email' => ['nullable', 'email']
+ ]);
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteSettingsService->updateSetting('contact_phone_number', $this->contact_phone_number);
+ $websiteSettingsService->updateSetting('contact_phone_number_ext', $this->contact_phone_number_ext);
+ $websiteSettingsService->updateSetting('contact_email', $this->contact_email);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.contact-info-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/FaviconSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/FaviconSettings.php
new file mode 100644
index 0000000..5747cb2
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/FaviconSettings.php
@@ -0,0 +1,72 @@
+loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ $this->upload_image_favicon = null;
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->website_favicon_16x16 = $settings['favicon']['16x16'];
+ $this->website_favicon_76x76 = $settings['favicon']['76x76'];
+ $this->website_favicon_120x120 = $settings['favicon']['120x120'];
+ $this->website_favicon_152x152 = $settings['favicon']['152x152'];
+ $this->website_favicon_180x180 = $settings['favicon']['180x180'];
+ $this->website_favicon_192x192 = $settings['favicon']['192x192'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'upload_image_favicon' => 'required|image|mimes:jpeg,png,jpg,svg,webp|max:20480',
+ ]);
+
+ // Procesar favicon si se ha cargado una imagen
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+ $websiteSettingsService->processAndSaveFavicon($this->upload_image_favicon);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.favicon-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/ImageLogoSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/ImageLogoSettings.php
new file mode 100644
index 0000000..489a791
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/ImageLogoSettings.php
@@ -0,0 +1,75 @@
+loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ $this->upload_image_logo = null;
+ $this->upload_image_logo_dark = null;
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->website_image_logo = $settings['image_logo']['large'];
+ $this->website_image_logo_dark = $settings['image_logo']['large_dark'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ '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',
+ ]);
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+
+ // Procesar favicon si se ha cargado una imagen
+ if ($this->upload_image_logo) {
+ $websiteSettingsService->processAndSaveImageLogo($this->upload_image_logo);
+ }
+
+ if ($this->upload_image_logo_dark) {
+ $websiteSettingsService->processAndSaveImageLogo($this->upload_image_logo_dark, 'dark');
+ }
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.image-logo-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/LegalSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/LegalSettings.php
new file mode 100644
index 0000000..0f82f39
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/LegalSettings.php
@@ -0,0 +1,108 @@
+ 'save',
+ ];
+
+ public function mount()
+ {
+ $this->loadSettings();
+
+ // Seleccionar la primera sección por defecto
+ $this->currentSection = array_key_first($this->legalVars);
+ }
+
+ function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ switch ($this->currentSection) {
+ case 'legal_terminos_y_condiciones':
+ $this->legalVars['legal_terminos_y_condiciones'] = $websiteTemplateService->getLegalVars('legal_terminos_y_condiciones');
+ break;
+
+ case 'legal_aviso_de_privacidad':
+ $this->legalVars['legal_aviso_de_privacidad'] = $websiteTemplateService->getLegalVars('legal_aviso_de_privacidad');
+ break;
+
+ case 'legal_politica_de_devoluciones':
+ $this->legalVars['legal_politica_de_devoluciones'] = $websiteTemplateService->getLegalVars('legal_politica_de_devoluciones');
+ break;
+
+ case 'legal_politica_de_envios':
+ $this->legalVars['legal_politica_de_envios'] = $websiteTemplateService->getLegalVars('legal_politica_de_envios');
+ break;
+
+ case 'legal_politica_de_cookies':
+ $this->legalVars['legal_politica_de_cookies'] = $websiteTemplateService->getLegalVars('legal_politica_de_cookies');
+ break;
+
+ case 'legal_autorizaciones_y_licencias':
+ $this->legalVars['legal_autorizaciones_y_licencias'] = $websiteTemplateService->getLegalVars('legal_autorizaciones_y_licencias');
+ break;
+
+ case 'legal_informacion_comercial':
+ $this->legalVars['legal_informacion_comercial'] = $websiteTemplateService->getLegalVars('legal_informacion_comercial');
+ break;
+
+ case 'legal_consentimiento_para_el_login_de_terceros':
+ $this->legalVars['legal_consentimiento_para_el_login_de_terceros'] = $websiteTemplateService->getLegalVars('legal_consentimiento_para_el_login_de_terceros');
+ break;
+
+ case 'legal_leyendas_de_responsabilidad':
+ $this->legalVars['legal_leyendas_de_responsabilidad'] = $websiteTemplateService->getLegalVars('legal_leyendas_de_responsabilidad');
+ break;
+
+ default:
+ $this->legalVars = $websiteTemplateService->getLegalVars();
+ }
+ }
+
+ public function rules()
+ {
+ $rules = [];
+
+ if ($this->legalVars[$this->currentSection]['enabled']) {
+ $rules["legalVars.{$this->currentSection}.content"] = ['required', 'string', new NotEmptyHtml];
+ }
+
+ $rules["legalVars.{$this->currentSection}.enabled"] = 'boolean';
+
+ return $rules;
+ }
+
+ public function save()
+ {
+ $this->validate($this->rules());
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+ $websiteSettingsService->updateSetting($this->currentSection . '_enabled', $this->legalVars[$this->currentSection]['enabled']);
+ $websiteSettingsService->updateSetting($this->currentSection . '_content', $this->legalVars[$this->currentSection]['content']);
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.legal-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/LocationSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/LocationSettings.php
new file mode 100644
index 0000000..04f7d38
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/LocationSettings.php
@@ -0,0 +1,71 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->contact_direccion = $settings['contact']['direccion'];
+ $this->contact_horario = $settings['contact']['horario'];
+ $this->contact_location_lat = $settings['contact']['location']['lat'];
+ $this->contact_location_lng = $settings['contact']['location']['lng'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'contact_direccion' => ['nullable', 'string', 'max:255'],
+ 'contact_horario' => ['nullable', 'string', 'max:255'],
+ 'contact_location_lat' => ['nullable', 'numeric'],
+ 'contact_location_lng' => ['nullable', 'numeric'],
+ ]);
+
+ $websiteSettingsService = app(WebsiteSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteSettingsService->updateSetting('contact_direccion', $this->contact_direccion);
+ $websiteSettingsService->updateSetting('contact_horario', $this->contact_horario);
+ $websiteSettingsService->updateSetting('contact_location_lat', $this->contact_location_lat);
+ $websiteSettingsService->updateSetting('contact_location_lng', $this->contact_location_lng);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.location-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/SocialSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/SocialSettings.php
new file mode 100644
index 0000000..1a56b2b
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/SocialSettings.php
@@ -0,0 +1,100 @@
+ 'save'];
+
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getSocialVars();
+
+ $this->social_whatsapp = $settings['whatsapp'];
+ $this->social_whatsapp_message = $settings['whatsapp_message'];
+ $this->social_facebook = $settings['facebook'];
+ $this->social_instagram = $settings['instagram'];
+ $this->social_linkedin = $settings['linkedin'];
+ $this->social_tiktok = $settings['tiktok'];
+ $this->social_x_twitter = $settings['x_twitter'];
+ $this->social_google = $settings['google'];
+ $this->social_pinterest = $settings['pinterest'];
+ $this->social_youtube = $settings['youtube'];
+ $this->social_vimeo = $settings['vimeo'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'social_whatsapp' => 'string|max:20',
+ 'social_whatsapp_message' => 'string|max:255',
+ 'social_facebook' => 'url',
+ 'social_instagram' => 'url',
+ 'social_linkedin' => 'url',
+ 'social_tiktok' => 'url',
+ 'social_x_twitter' => 'url',
+ 'social_google' => 'url',
+ 'social_pinterest' => 'url',
+ 'social_youtube' => 'url',
+ 'social_vimeo' => 'url',
+ ]);
+
+ $websiteSettingsService = app(websiteSettingsService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteSettingsService->updateSetting('social_whatsapp', preg_replace('/\D/', '', $this->social_whatsapp));
+ $websiteSettingsService->updateSetting('social_whatsapp_message', $this->social_whatsapp_message);
+ $websiteSettingsService->updateSetting('social_facebook', $this->social_facebook);
+ $websiteSettingsService->updateSetting('social_instagram', $this->social_instagram);
+ $websiteSettingsService->updateSetting('social_linkedin', $this->social_linkedin);
+ $websiteSettingsService->updateSetting('social_tiktok', $this->social_tiktok);
+ $websiteSettingsService->updateSetting('social_x_twitter', $this->social_x_twitter);
+ $websiteSettingsService->updateSetting('social_google', $this->social_google);
+ $websiteSettingsService->updateSetting('social_pinterest', $this->social_pinterest);
+ $websiteSettingsService->updateSetting('social_youtube', $this->social_youtube);
+ $websiteSettingsService->updateSetting('social_vimeo', $this->social_vimeo);
+
+ app(WebsiteTemplateService::class)->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.social-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/TemplateSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/TemplateSettings.php
new file mode 100644
index 0000000..80c0230
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/TemplateSettings.php
@@ -0,0 +1,61 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->website_tpl_style_switcher = $settings['template']['style_switcher'];
+ $this->website_tpl_footer_text = $settings['template']['footer_text'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'website_tpl_footer_text' => 'nullable|string|max:50',
+ ]);
+
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteTemplateService->updateSetting('website_tpl_style_switcher', $this->website_tpl_style_switcher);
+ $websiteTemplateService->updateSetting('website_tpl_footer_text', $this->website_tpl_footer_text);
+
+ $websiteTemplateService->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.template-settings');
+ }
+}
diff --git a/modules/Admin/App/Livewire/WebsiteSettings/WebsiteSettings.php b/modules/Admin/App/Livewire/WebsiteSettings/WebsiteSettings.php
new file mode 100644
index 0000000..4921953
--- /dev/null
+++ b/modules/Admin/App/Livewire/WebsiteSettings/WebsiteSettings.php
@@ -0,0 +1,62 @@
+ 'save'];
+
+ public function mount()
+ {
+ $this->loadSettings();
+ }
+
+ public function loadSettings()
+ {
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Obtener los valores de las configuraciones de la base de datos
+ $settings = $websiteTemplateService->getWebsiteVars();
+
+ $this->website_title = $settings['title'];
+ $this->website_description = $settings['description'];
+ }
+
+ public function save()
+ {
+ $this->validate([
+ 'website_title' => 'string|required|max:50',
+ 'website_description' => 'string|max:160',
+ ]);
+
+ $websiteTemplateService = app(WebsiteTemplateService::class);
+
+ // Guardar título del App en configuraciones
+ $websiteTemplateService->updateSetting('website_title', $this->website_title);
+ $websiteTemplateService->updateSetting('website_description', $this->website_description);
+
+ $websiteTemplateService->clearWebsiteVarsCache();
+
+ $this->loadSettings();
+
+ $this->dispatch(
+ 'notification',
+ target: $this->targetNotify,
+ type: 'success',
+ message: 'Se han guardado los cambios en las configuraciones.'
+ );
+ }
+
+ public function render()
+ {
+ return view('admin::livewire.website-settings.website-settings');
+ }
+}
diff --git a/modules/Admin/App/Models/ContactableAddress.php b/modules/Admin/App/Models/ContactableAddress.php
new file mode 100644
index 0000000..18926f0
--- /dev/null
+++ b/modules/Admin/App/Models/ContactableAddress.php
@@ -0,0 +1,71 @@
+ 'float',
+ 'lng' => 'float',
+ 'preference_level' => 'integer',
+ ];
+
+ /**
+ * Polymorphic relationship to the parent model.
+ */
+ public function contactable()
+ {
+ return $this->morphTo();
+ }
+
+ /**
+ * Relationships to SAT tables.
+ */
+ public function estado()
+ {
+ return $this->belongsTo(Estado::class, 'c_estado', 'c_estado');
+ }
+
+ public function municipio()
+ {
+ return $this->belongsTo(Municipio::class, 'c_municipio', 'c_municipio');
+ }
+
+ public function codigoPostal()
+ {
+ return $this->belongsTo(CodigoPostal::class, 'c_codigo_postal', 'c_codigo_postal');
+ }
+
+ public function colonia()
+ {
+ return $this->belongsTo(Colonia::class, 'c_colonia', 'c_colonia');
+ }
+}
diff --git a/modules/Admin/App/Models/ContactableItem.php b/modules/Admin/App/Models/ContactableItem.php
new file mode 100644
index 0000000..3a18311
--- /dev/null
+++ b/modules/Admin/App/Models/ContactableItem.php
@@ -0,0 +1,35 @@
+ 'boolean',
+ 'preference_level' => 'integer',
+ ];
+
+ /**
+ * Polymorphic relationship to the parent model.
+ */
+ public function contactable()
+ {
+ return $this->morphTo();
+ }
+}
diff --git a/modules/Admin/App/Models/MediaItem.php b/modules/Admin/App/Models/MediaItem.php
new file mode 100644
index 0000000..8780b27
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Models/Sat/Banco.php b/modules/Admin/App/Models/Sat/Banco.php
new file mode 100644
index 0000000..1244508
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Banco.php
@@ -0,0 +1,50 @@
+ 'Habilitado',
+ self::STATUS_DISABLED => 'Deshabilitado',
+ ];
+
+ /**
+ * List of names for each status.
+ * @var array
+ */
+ public static $statusListClass = [
+ self::STATUS_ENABLED => 'success',
+ self::STATUS_DISABLED => 'warning',
+ ];
+
+ /**
+ * The table associated with the model.
+ *
+ * @var string
+ */
+ protected $table = 'sat_banco';
+
+ /**
+ * The attributes that are mass assignable.
+ *
+ * @var string[]
+ */
+ protected $fillable = [
+ 'c_banco',
+ 'descripcion',
+ 'razon_social',
+ 'rfc',
+ 'status',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/ClaveProdServ.php b/modules/Admin/App/Models/Sat/ClaveProdServ.php
new file mode 100644
index 0000000..707a339
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/ClaveProdServ.php
@@ -0,0 +1,33 @@
+ 'datetime',
+ 'fecha_de_fin_de_vigencia' => 'datetime',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/CodigoPostal.php b/modules/Admin/App/Models/Sat/CodigoPostal.php
new file mode 100644
index 0000000..94970bc
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/CodigoPostal.php
@@ -0,0 +1,77 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+
+ /**
+ * Get the estado associated with the CodigoPostal.
+ */
+ public function estado(): HasOne
+ {
+ return $this->hasOne(Estado::class, 'c_estado', 'c_estado');
+ }
+
+ /**
+ * Get the municipio associated with the CodigoPostal.
+ */
+ public function municipio(): HasOne
+ {
+ return $this->hasOne(Municipio::class, 'c_municipio', 'c_municipio')
+ ->where('c_estado', $this->c_estado);
+ }
+
+ /**
+ * Get the localidad associated with the CodigoPostal.
+ */
+ public function localidad(): HasOne
+ {
+ return $this->hasOne(Localidad::class, 'c_estado', 'c_estado')
+ ->where('c_localidad', $this->c_localidad);
+ }
+
+ /**
+ * Get the localidad associated with the CodigoPostal.
+ */
+ public function colonias(): HasMany
+ {
+ return $this->hasMany(Colonia::class, 'c_codigo_postal', 'c_codigo_postal');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/Colonia.php b/modules/Admin/App/Models/Sat/Colonia.php
new file mode 100644
index 0000000..516a636
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Colonia.php
@@ -0,0 +1,39 @@
+where('c_codigo_postal', $c_codigo_postal)
+ ->when($c_colonia, function ($query) use ($c_colonia) {
+ $query->where('c_colonia', $c_colonia);
+ })
+ ->orderBy('nombre_del_asentamiento')
+ ->pluck('nombre_del_asentamiento', 'c_colonia');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/Deduccion.php b/modules/Admin/App/Models/Sat/Deduccion.php
new file mode 100644
index 0000000..40b9671
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Deduccion.php
@@ -0,0 +1,37 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/Estado.php b/modules/Admin/App/Models/Sat/Estado.php
new file mode 100644
index 0000000..831620f
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Estado.php
@@ -0,0 +1,47 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+
+ public static function selectList($pais = 'MEX')
+ {
+ return self::select('c_estado', 'nombre_del_estado')
+ ->where('c_pais', $pais)
+ ->orderBy('nombre_del_estado')
+ ->pluck('nombre_del_estado', 'c_estado');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/FormaPago.php b/modules/Admin/App/Models/Sat/FormaPago.php
new file mode 100644
index 0000000..dd86803
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/FormaPago.php
@@ -0,0 +1,53 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+
+ public static function selectList()
+ {
+ return self::selectRaw('c_forma_pago, CONCAT(c_forma_pago, " - ", descripcion) as value')
+ ->pluck('value', 'c_forma_pago');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/Impuestos.php b/modules/Admin/App/Models/Sat/Impuestos.php
new file mode 100644
index 0000000..21cc104
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Impuestos.php
@@ -0,0 +1,17 @@
+ 'ISR',
+ self::IMPUESTOS_IVA => 'IVA',
+ self::IMPUESTOS_IEPS => 'IEPS',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/Localidad.php b/modules/Admin/App/Models/Sat/Localidad.php
new file mode 100644
index 0000000..62d162b
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Localidad.php
@@ -0,0 +1,39 @@
+ 'datetime',
+ 'fecha_de_fin_de_vigencia' => 'datetime',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/MetodoPago.php b/modules/Admin/App/Models/Sat/MetodoPago.php
new file mode 100644
index 0000000..9c412db
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/MetodoPago.php
@@ -0,0 +1,14 @@
+ 'Pago en una sola exhibición',
+ self::METODO_PAGO_PPD => 'Pago en parcialidades o diferido',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/Moneda.php b/modules/Admin/App/Models/Sat/Moneda.php
new file mode 100644
index 0000000..90ca936
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Moneda.php
@@ -0,0 +1,46 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+
+
+ public static function selectList()
+ {
+ return self::selectRaw('c_moneda, CONCAT_WS(" ", c_moneda, "-", descripcion) as text')
+ ->pluck('text', 'c_moneda');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/Municipio.php b/modules/Admin/App/Models/Sat/Municipio.php
new file mode 100644
index 0000000..f1261bb
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Municipio.php
@@ -0,0 +1,51 @@
+ 'datetime',
+ 'fecha_de_fin_de_vigencia' => 'datetime',
+ ];
+
+
+ public static function selectList($c_estado, $c_municipio = false)
+ {
+ return self::select('c_municipio', 'descripcion')
+ ->where('c_estado', $c_estado)
+ ->when($c_municipio, function ($query) use ($c_municipio) {
+ $query->where('c_municipio', $c_municipio);
+ })
+ ->orderBy('descripcion')
+ ->pluck('descripcion', 'c_municipio');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/ObjetoImp.php b/modules/Admin/App/Models/Sat/ObjetoImp.php
new file mode 100644
index 0000000..a69f105
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/ObjetoImp.php
@@ -0,0 +1,21 @@
+ 'No objeto de impuesto.',
+ self::OBJETO_IMP_SI_OBJETO => 'Sí objeto de impuesto.',
+ self::OBJETO_IMP_SI_OBJETO_NO_DESGLOSE => 'Sí objeto del impuesto y no obligado al desglose.',
+ self::OBJETO_IMP_SI_OBJETO_NO_CAUSA => 'Sí objeto del impuesto y no causa impuesto.',
+ self::OBJETO_IMP_SI_OBJETO_IVA_CREDITO => 'Sí objeto del impuesto, IVA crédito PODEBI.',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/Pais.php b/modules/Admin/App/Models/Sat/Pais.php
new file mode 100644
index 0000000..9869654
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Pais.php
@@ -0,0 +1,39 @@
+get()
+ ->mapWithKeys(function ($item) {
+ return [$item->c_pais => $item->c_pais . ' - ' . $item->descripcion];
+ });
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/Percepcion.php b/modules/Admin/App/Models/Sat/Percepcion.php
new file mode 100644
index 0000000..cc2ccfa
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Percepcion.php
@@ -0,0 +1,37 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/Periodicidad.php b/modules/Admin/App/Models/Sat/Periodicidad.php
new file mode 100644
index 0000000..ef7b948
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/Periodicidad.php
@@ -0,0 +1,21 @@
+ 'Diario',
+ self::PERIODICIDAD_SEMANAL => 'Semanal',
+ self::PERIODICIDAD_QUINCENAL => 'Quincenal',
+ self::PERIODICIDAD_MENSUAL => 'Mensual',
+ self::PERIODICIDAD_BIMESTRAL => 'Bimestral',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/PeriodicidadPago.php b/modules/Admin/App/Models/Sat/PeriodicidadPago.php
new file mode 100644
index 0000000..945391a
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/PeriodicidadPago.php
@@ -0,0 +1,33 @@
+ 'Diario',
+ self::PERIODICIDAD_SEMANAL => 'Semanal',
+ self::PERIODICIDAD_CATORCENAL => 'Catorcenal',
+ self::PERIODICIDAD_QUINCENAL => 'Quincenal',
+ self::PERIODICIDAD_MENSUAL => 'Mensual',
+ self::PERIODICIDAD_BIMESTRAL => 'Bimestral',
+ self::PERIODICIDAD_UNIDAD_OBRA => 'Unidad obra',
+ self::PERIODICIDAD_COMISION => 'Comisión',
+ self::PERIODICIDAD_PRECIO_ALZADO => 'Precio alzado',
+ self::PERIODICIDAD_DECENAL => 'Decenal',
+ self::PERIODICIDAD_OTRA => 'Otra Periodicidad'
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/RegimenFiscal.php b/modules/Admin/App/Models/Sat/RegimenFiscal.php
new file mode 100644
index 0000000..2f9077f
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/RegimenFiscal.php
@@ -0,0 +1,46 @@
+ 'datetime',
+ 'fecha_de_fin_de_vigencia' => 'datetime',
+ ];
+
+ public static function selectList()
+ {
+ return self::selectRaw('c_regimen_fiscal, CONCAT(c_regimen_fiscal, " - ", descripcion) as value')
+ ->pluck('value', 'c_regimen_fiscal');
+ }
+}
diff --git a/modules/Admin/App/Models/Sat/TipoComprobante.php b/modules/Admin/App/Models/Sat/TipoComprobante.php
new file mode 100644
index 0000000..1e103b0
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/TipoComprobante.php
@@ -0,0 +1,21 @@
+ 'Ingreso',
+ self::TIPO_COMPROBANTE_EGRESO => 'Egreso',
+ self::TIPO_COMPROBANTE_TRASLADO => 'Traslado',
+ self::TIPO_COMPROBANTE_NOMINA => 'Nómina',
+ self::TIPO_COMPROBANTE_PAGO => 'Pago',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/TipoFactor.php b/modules/Admin/App/Models/Sat/TipoFactor.php
new file mode 100644
index 0000000..0a2898a
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/TipoFactor.php
@@ -0,0 +1,17 @@
+ 'Tasa',
+ self::TIPO_FACTOR_CUOTA => 'Cuota',
+ self::TIPO_FACTOR_EXENTO => 'Exento',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/TipoRelacion.php b/modules/Admin/App/Models/Sat/TipoRelacion.php
new file mode 100644
index 0000000..19b09da
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/TipoRelacion.php
@@ -0,0 +1,25 @@
+ 'Nota de crédito de los documentos relacionados',
+ self::TIPO_RELACION_NOTA_DEBITO => 'Nota de débito de los documentos relacionados',
+ self::TIPO_RELACION_DEVOLUCION_MERCANCIA => 'Devolución de mercancía sobre facturas o traslados previos',
+ self::TIPO_RELACION_SUSTITUCION_CFDI => 'Sustitución de los CFDI previos',
+ self::TIPO_RELACION_TRASLADOS_FACTURADOS => 'Traslados de mercancías facturados previamente',
+ self::TIPO_RELACION_FACTURA_TRASLADOS => 'Factura generada por los traslados previos',
+ self::TIPO_RELACION_CFDI_ANTICIPO => 'CFDI por aplicación de anticipo',
+ ];
+}
diff --git a/modules/Admin/App/Models/Sat/UsoCfdi.php b/modules/Admin/App/Models/Sat/UsoCfdi.php
new file mode 100644
index 0000000..39c4bb6
--- /dev/null
+++ b/modules/Admin/App/Models/Sat/UsoCfdi.php
@@ -0,0 +1,47 @@
+ 'datetime',
+ 'fecha_fin_de_vigencia' => 'datetime',
+ ];
+
+ public static function selectList()
+ {
+ return self::selectRaw('c_uso_cfdi, CONCAT(c_uso_cfdi, " - ", descripcion) as value')
+ ->pluck('value', 'c_uso_cfdi');
+ }
+}
diff --git a/modules/Admin/App/Models/Setting.php b/modules/Admin/App/Models/Setting.php
new file mode 100644
index 0000000..1a83012
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Models/User.php b/modules/Admin/App/Models/User.php
new file mode 100644
index 0000000..9ed59c1
--- /dev/null
+++ b/modules/Admin/App/Models/User.php
@@ -0,0 +1,392 @@
+ '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 = [
+ 'contact_code',
+ 'name',
+ 'last_name',
+ 'email',
+ 'password',
+ 'profile_photo_path',
+ 'company',
+ 'birth_date',
+ 'hire_date',
+ 'curp',
+ 'nss',
+ 'job_title',
+ 'face_vector',
+ 'rfc',
+ 'nombre_fiscal',
+ 'tipo_persona',
+ 'c_regimen_fiscal',
+ 'domicilio_fiscal',
+ 'c_uso_cfdi',
+ 'is_partner',
+ 'is_employee',
+ 'is_prospect',
+ 'is_customer',
+ 'is_provider',
+ 'is_user',
+ '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',
+ 'face_vector' => 'array',
+ 'birth_date' => 'date',
+ 'hire_date' => 'date',
+ ];
+ }
+
+ /**
+ * 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);
+
+ // 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) {
+ $font->file(base_path('/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Bold.ttf'));
+ $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));
+ }
+
+
+
+
+
+
+
+ /**
+ * Relations
+ */
+
+ // User who created this user
+ public function creator()
+ {
+ return $this->belongsTo(self::class, 'created_by');
+ }
+
+ // Regimen fiscal
+ public function regimenFiscal()
+ {
+ return $this->belongsTo(RegimenFiscal::class, 'c_regimen_fiscal', 'c_regimen_fiscal');
+ }
+
+ // Domicilio fiscal
+ public function domicilioFiscal()
+ {
+ return $this->belongsTo(CodigoPostal::class, 'domicilio_fiscal', 'c_codigo_postal');
+ }
+
+ // Uso de CFDI
+ public function usoCfdi()
+ {
+ return $this->belongsTo(UsoCfdi::class, 'c_uso_cfdi', 'c_uso_cfdi');
+ }
+
+ /**
+ * Helper methods
+ */
+
+ public function isActive()
+ {
+ return $this->status === 1;
+ }
+
+ public function isPartner()
+ {
+ return $this->is_partner === 1;
+ }
+
+ public function isEmployee()
+ {
+ return $this->is_employee === 1;
+ }
+
+ public function isCustomer()
+ {
+ return $this->is_customer === 1;
+ }
+
+ public function isProvider()
+ {
+ return $this->is_provider === 1;
+ }
+}
diff --git a/modules/Admin/App/Models/UserLogin.php b/modules/Admin/App/Models/UserLogin.php
new file mode 100644
index 0000000..3546acf
--- /dev/null
+++ b/modules/Admin/App/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('_var.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('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/modules/Admin/App/Providers/FortifyServiceProvider.php b/modules/Admin/App/Providers/FortifyServiceProvider.php
new file mode 100644
index 0000000..4d0d27d
--- /dev/null
+++ b/modules/Admin/App/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('custom.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("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("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("admin::auth.forgot-password-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+
+ Fortify::resetPasswordView(function ($request) use ($viewMode, $adminVars) {
+ $pageConfigs = ['myLayout' => 'blank'];
+
+ view()->share('_admin', $adminVars);
+
+ return view("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("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("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("admin::auth.two-factor-challenge-{$viewMode}", ['pageConfigs' => $pageConfigs]);
+ });
+ }
+}
diff --git a/modules/Admin/App/Providers/GlobalSettingsProvider.php b/modules/Admin/App/Providers/GlobalSettingsProvider.php
new file mode 100644
index 0000000..53b2d29
--- /dev/null
+++ b/modules/Admin/App/Providers/GlobalSettingsProvider.php
@@ -0,0 +1,27 @@
+mergeConfigFrom(__DIR__ . '/../../Config/_var.php', '_var');
+ $this->mergeConfigFrom(__DIR__ . '/../../Config/custom.php', 'custom');
+ }
+
+ /**
+ * Bootstrap services.
+ */
+ public function boot(GlobalSettingsService $globalSettingsService): void
+ {
+ $globalSettingsService->loadSystemConfig();
+ }
+}
diff --git a/modules/Admin/App/Providers/VuexyAdminProvider.php b/modules/Admin/App/Providers/VuexyAdminProvider.php
new file mode 100644
index 0000000..74fae38
--- /dev/null
+++ b/modules/Admin/App/Providers/VuexyAdminProvider.php
@@ -0,0 +1,39 @@
+alias('Helper', \Modules\Admin\App\Helpers\Helpers::class);
+ }
+
+ /**
+ * Bootstrap any application services.
+ */
+ public function boot(): void
+ {
+ // Register any module-specific event listeners here
+ if ($this->app->runningInConsole()) {
+ $this->commands([
+ CleanInitialAvatars::class,
+ ]);
+
+ return;
+ }
+
+ // Composer para las vistas del módulo Admin
+ View::composer('admin::layouts.vuexy.*', VuexyTemplateComposer::class);
+ }
+}
diff --git a/modules/Admin/App/Rules/NotEmptyHtml.php b/modules/Admin/App/Rules/NotEmptyHtml.php
new file mode 100644
index 0000000..173fcd3
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Services/AdminTemplateService.php b/modules/Admin/App/Services/AdminTemplateService.php
new file mode 100644
index 0000000..80f74e8
--- /dev/null
+++ b/modules/Admin/App/Services/AdminTemplateService.php
@@ -0,0 +1,129 @@
+ $key],
+ ['value' => trim($value)]
+ );
+
+ return $setting->save();
+ }
+
+ public function getAdminVars($adminSetting = false)
+ {
+ try {
+ return Cache::remember('admin_settings', $this->cacheTTL, function () use ($adminSetting) {
+ $settings = Setting::global()
+ ->where('key', 'LIKE', 'admin_%')
+ ->pluck('value', 'key')
+ ->toArray();
+
+ $adminSettings = [
+ 'title' => $settings['admin_title'] ?? config('_var.appTitle'),
+ 'author' => config('_var.author'),
+ 'description' => config('_var.description'),
+ 'favicon' => $this->getFaviconPaths($settings),
+ 'app_name' => $settings['admin_app_name'] ?? config('_var.appName'),
+ 'image_logo' => $this->getImageLogoPaths($settings),
+ ];
+
+ return $adminSetting
+ ? $adminSettings[$adminSetting]
+ : $adminSettings;
+ });
+ } catch (\Exception $e) {
+ echo __METHOD__;
+ echo "
" . $e->getMessage() . "
";
+ die('You must configure the database.');
+ }
+ }
+
+ 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('custom.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('_var.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('_var.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");
+ }
+}
\ No newline at end of file
diff --git a/modules/Admin/App/Services/CacheConfigService.php b/modules/Admin/App/Services/CacheConfigService.php
new file mode 100644
index 0000000..ab68aee
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Services/CacheManagerService.php b/modules/Admin/App/Services/CacheManagerService.php
new file mode 100644
index 0000000..b565497
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Services/GlobalSettingsService.php b/modules/Admin/App/Services/GlobalSettingsService.php
new file mode 100644
index 0000000..b935dc9
--- /dev/null
+++ b/modules/Admin/App/Services/GlobalSettingsService.php
@@ -0,0 +1,244 @@
+ $key],
+ ['value' => trim($value)]
+ );
+
+ return $setting->save();
+ }
+
+ /**
+ * Carga y sobrescribe las configuraciones del sistema.
+ */
+ public function loadSystemConfig(): void
+ {
+ try {
+ $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'),
+ 'custom' => $this->buildVuexyCustomConfig($settings),
+ ];
+ });
+
+ Config::set('services.facebook', $config['servicesFacebook']);
+ Config::set('services.google', $config['servicesGoogle']);
+ Config::set('custom', $config['custom']);
+ } catch (\Exception $e) {
+ echo __METHOD__;
+ echo "
" . $e->getMessage() . "
";
+ die('You must configure the database.');
+ }
+ }
+
+ /**
+ * 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 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 buildVuexyCustomConfig(array $settings): array
+ {
+ // Configuración predeterminada del sistema
+ $defaultCustomConfig = config('custom', []);
+
+ // Convertimos las claves planas a un array multidimensional
+ $settingsNested = Arr::undot($settings);
+
+ // Navegamos hasta la parte relevante del array desanidado
+ $customSettings = $settingsNested['config']['custom'] ?? [];
+
+ // Fusionamos la configuración predeterminada con los valores del sistema
+ $mergedConfig = array_replace_recursive($defaultCustomConfig, $customSettings);
+
+ // 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['custom'][$field])) {
+ $config['custom'][$field] = (bool) $config['custom'][$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.custom.* y limpia global_system_config
+ */
+ public static function clearVuexyCustomConfig(): void
+ {
+ Setting::where('key', 'LIKE', 'config.custom.%')->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'] ?? $defaultMailersSmtpVars['encryption'],
+ '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');
+ }
+
+
+ /*
+ protected function buildFortifyFeatures(array $settings): array
+ {
+ return array_filter([
+ !empty($settings['config.fortify.features.registration']) && $settings['config.fortify.features.registration'] == 1
+ ? \Laravel\Fortify\Features::registration()
+ : null,
+
+ !empty($settings['config.fortify.features.resetPasswords']) && $settings['config.fortify.features.resetPasswords'] == 1
+ ? \Laravel\Fortify\Features::resetPasswords()
+ : null,
+
+ !empty($settings['config.fortify.features.emailVerification']) && $settings['config.fortify.features.emailVerification'] == 1
+ ? \Laravel\Fortify\Features::emailVerification()
+ : null,
+
+ !empty($settings['config.fortify.features.updateProfileInformation']) && $settings['config.fortify.features.updateProfileInformation'] == 1
+ ? \Laravel\Fortify\Features::updateProfileInformation()
+ : null,
+
+ !empty($settings['config.fortify.features.updatePasswords']) && $settings['config.fortify.features.updatePasswords'] == 1
+ ? \Laravel\Fortify\Features::updatePasswords()
+ : null,
+
+ !empty($settings['config.fortify.features.twoFactorAuthentication.confirm']) && $settings['config.fortify.features.twoFactorAuthentication.confirm'] == 1
+ ? \Laravel\Fortify\Features::twoFactorAuthentication([
+ 'confirm' => true,
+ 'confirmPassword' => !empty($settings['config.fortify.features.twoFactorAuthentication.confirmPassword'])
+ && $settings['config.fortify.features.twoFactorAuthentication.confirmPassword'] == 1,
+ 'window' => $settings['config.fortify.features.twoFactorAuthentication.window'] ?? 1,
+ ])
+ : null,
+ ]);
+ }
+
+ protected function loadUserSettings()
+ {
+ if (Auth::check()) {
+ $userId = Auth::id();
+ // Cargar configuraciones del usuario desde la caché
+ return Cache::remember("user_settings_{$userId}", $this->cacheTTL, function () use ($userId) {
+ return \App\Models\Setting::forUser($userId)->pluck('value', 'key')->toArray();
+ });
+ }
+
+ return [];
+ }
+ */
+}
diff --git a/modules/Admin/App/Services/SessionManagerService.php b/modules/Admin/App/Services/SessionManagerService.php
new file mode 100644
index 0000000..a8d87c9
--- /dev/null
+++ b/modules/Admin/App/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/modules/Admin/App/Services/VuexyAdminService.php b/modules/Admin/App/Services/VuexyAdminService.php
new file mode 100644
index 0000000..fc99eff
--- /dev/null
+++ b/modules/Admin/App/Services/VuexyAdminService.php
@@ -0,0 +1,1198 @@
+ 'Inicio',
+ 'route' => 'admin.home.index',
+ ];
+
+ private $user;
+
+ private $orientation;
+
+ public function __construct()
+ {
+ $this->user = Auth::user();
+ $this->vuexySearch = Auth::user() !== null;
+ $this->orientation = config('custom.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.
+ */
+ 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 processMenu($menu)
+ {
+ foreach ($menu as &$item) {
+ // Determinar visibilidad actual (si no está definida, es true por defecto)
+ $item['visible'] = $item['visible'] ?? true;
+
+ // Procesar submenús de manera recursiva
+ if (isset($item['submenu']) && is_array($item['submenu'])) {
+ $item['submenu'] = $this->processMenu($item['submenu']);
+
+ // Un submenú es visible si al menos uno de sus hijos es visible
+ $item['visible'] = collect($item['submenu'])->contains('visible', true);
+ }
+
+ // Generar URL para los elementos del menú que tengan una ruta definida
+ if (isset($item['route']))
+ $item['url'] = Route::has($item['route']) ? route($item['route']) : '#';
+ }
+
+ // Filtrar los elementos del menú que no sean visibles
+ return array_filter($menu, fn($item) => $item['visible']);
+ }
+
+ 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) {
+ // Verificar si el elemento es visible
+ if (isset($item['visible']) && !$item['visible']) {
+ continue;
+ }
+
+ // 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($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();
+
+ $routeName = Route::currentRouteName() ? Route::currentRouteName() : '';
+
+ // Lógica para construir los breadcrumbs
+ $breadcrumbs = $this->findBreadcrumbTrail($originalMenu, $routeName);
+
+ // Asegurar que el primer elemento siempre sea "Inicio"
+ array_unshift($breadcrumbs, $this->homeRoute);
+
+ return $breadcrumbs;
+ }
+
+ private function findBreadcrumbTrail(array $menu, string $routeName, array $breadcrumbs = []): array
+ {
+ foreach ($menu as $title => $item) {
+ $skipBreadcrumb = isset($item['breadcrumbs']) && $item['breadcrumbs'] === false;
+
+ if (isset($item['route']) && $item['route'] === $routeName) {
+ 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'], $routeName, $newBreadcrumbs);
+
+ if ($found)
+ return $found;
+ }
+ }
+
+ return [];
+ }
+
+
+
+ private function getMenuArray()
+ {
+ if ($this->orientation === 'horizontal') {
+ return $this->processMenu($this->getHorizontalMenu());
+ } else {
+ return $this->processMenu($this->getVerticalMenu());
+ }
+ }
+
+ private function getVerticalMenu()
+ {
+ return $this->getHorizontalMenu();
+ }
+
+ private function getHorizontalMenu()
+ {
+ return [
+ 'Inicio' => [
+ 'breadcrumbs' => false,
+ 'icon' => 'menu-icon tf-icons ti ti-home',
+ 'submenu' => [
+ 'Inicio' => [
+ 'route' => 'admin.home.index',
+ 'icon' => 'menu-icon tf-icons ti ti-home',
+ ],
+ 'Ajustes' => [
+ 'icon' => 'menu-icon tf-icons ti ti-settings-cog',
+ 'submenu' => [
+ 'Aplicación' => [
+ 'submenu' => [
+ 'Ajustes generales' => [
+ 'route' => 'admin.webapp.general-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-adjustments-alt',
+ 'visible' => $this->canUserAccess('webapp.general-settings.allow'),
+ ],
+ 'Ajustes de caché' => [
+ 'route' => 'admin.webapp.cache-manager.index',
+ 'icon' => 'menu-icon tf-icons ti ti-cpu',
+ 'visible' => $this->canUserAccess('webapp.cache-manager.view'),
+ ],
+ 'API BANXICO' => [
+ 'route' => 'admin.webapp.api-banxico.index',
+ 'icon' => 'menu-icon tf-icons ti ti-building-bank',
+ 'visible' => $this->canUserAccess('webapp.api-banxico.allow'),
+ ],
+ 'Servidor de correo SMTP' => [
+ 'route' => 'admin.webapp.smtp-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-mail-cog',
+ 'visible' => $this->canUserAccess('webapp.smtp-settings.allow'),
+ ],
+ 'Catálogos' => [
+ 'route' => 'admin.webapp.catalogs.index',
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'visible' => $this->canUserAccess('webapp.catalogs.view'),
+ ],
+ ],
+ ],
+ 'Sitio Web' => [
+ 'submenu' => [
+ 'Ajustes generales' => [
+ 'route' => 'admin.website.general-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-tools',
+ 'visible' => $this->canUserAccess('website.general-settings.allow'),
+ ],
+ 'Avisos legales' => [
+ 'route' => 'admin.website.legal.index',
+ 'icon' => 'menu-icon tf-icons ti ti-writing-sign',
+ 'visible' => $this->canUserAccess('website.legal.view'),
+ ],
+ ],
+ ],
+ 'Empresa' => [
+ 'submenu' => [
+ 'Información general' => [
+ 'route' => 'admin.company.general-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-adjustments-alt',
+ 'visible' => $this->canUserAccess('company.general-settings.allow'),
+ ],
+ 'Sucursales' => [
+ 'route' => 'admin.company.stores.index',
+ 'icon' => 'menu-icon tf-icons ti ti-building',
+ 'visible' => $this->canUserAccess('company.stores.view'),
+ ],
+ 'Centros de trabajo' => [
+ 'route' => 'admin.company.workcenters.index',
+ 'icon' => 'menu-icon tf-icons ti ti-map-pin-cog',
+ 'visible' => $this->canUserAccess('company.stores.view'),
+ ],
+ 'Catálogos' => [
+ 'route' => 'admin.company.catalogs.index',
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'visible' => $this->canUserAccess('company.catalogs.view'),
+ ],
+ ]
+ ],
+ 'Punto de venta' => [
+ 'submenu' => [
+ 'Listas de precios' => [
+ 'route' => 'admin.pos.pricelists-config.index',
+ 'icon' => 'menu-icon tf-icons ti ti-list-search',
+ 'visible' => $this->canUserAccess('pos.pricelists-config.allow'),
+ ],
+ 'Ticket' => [
+ 'route' => 'admin.pos.ticket-config.index',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt',
+ 'visible' => $this->canUserAccess('pos.ticket-config.allow'),
+ ],
+ 'Catálogos' => [
+ 'route' => 'admin.pos.catalogs.index',
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'visible' => $this->canUserAccess('pos.catalogs.view'),
+ ],
+ ]
+ ],
+ 'Facturación' => [
+ 'submenu' => [
+ 'Configuraciones' => [
+ 'route' => 'admin.billing.general-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-tool',
+ 'visible' => $this->canUserAccess('billing.general-settings.allow'),
+ ],
+ 'Certificados de Sello Digital' => [
+ 'route' => 'admin.billing.csds-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-certificate-2',
+ 'visible' => $this->canUserAccess('billing.csds-settings.allow'),
+ ],
+ 'Paquete de timbrado' => [
+ 'route' => 'admin.billing.stamping-package.index',
+ 'icon' => 'menu-icon tf-icons ti ti-bell-cog',
+ 'visible' => $this->canUserAccess('billing.stamping-package.allow'),
+ ],
+ 'Servidor de correo SMTP' => [
+ 'route' => 'admin.billing.smtp-settings.index',
+ 'icon' => 'menu-icon tf-icons ti ti-mail-cog',
+ 'visible' => $this->canUserAccess('billing.smtp-settings.allow'),
+ ],
+ ]
+ ],
+ ]
+ ],
+ 'Sistema' => [
+ 'icon' => 'menu-icon tf-icons ti ti-user-cog',
+ 'submenu' => [
+ 'Usuarios' => [
+ 'route' => 'admin.system.users.index',
+ 'icon' => 'menu-icon tf-icons ti ti-users',
+ 'visible' => $this->canUserAccess('system.users.view'),
+ ],
+ 'Roles y permisos' => [
+ 'submenu' => [
+ 'Roles' => [
+ 'route' => 'admin.system.roles.index',
+ 'icon' => 'menu-icon tf-icons ti ti-user-shield',
+ 'visible' => $this->canUserAccess('system.roles.view'),
+ ],
+ 'Permisos' => [
+ 'route' => 'admin.system.permissions.index',
+ 'icon' => 'menu-icon tf-icons ti ti-user-star',
+ 'visible' => $this->canUserAccess('system.permissions.view'),
+ ]
+ ]
+ ],
+ 'Importar' => [
+ 'submenu' => [
+ 'Catálogos SAT' => [
+ 'route' => 'admin.import.catalogs-sat.index',
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'visible' => $this->canUserAccess('import.catalogs-sat.allow'),
+ ],
+ ]
+ ],
+ ]
+ ],
+ env('APP_URL') => [
+ 'url' => env('APP_URL'),
+ 'icon' => 'menu-icon tf-icons ti ti-world-www',
+ ],
+ /*
+ 'Exportar' => [
+ 'icon' => 'menu-icon tf-icons ti ti-database-export',
+ 'submenu' => [
+ 'Catálogos SAT' => [
+ 'route' => 'admin.export.customers.index',
+ 'visible' => $this->canUserAccess('export.customers.allow'),
+ ],
+ ]
+ ],
+ */
+ 'Acerca de' => [
+ 'route' => 'admin.about.index',
+ 'icon' => 'menu-icon tf-icons ti ti-cat',
+ ],
+ ],
+ ],
+
+ 'Recursos humanos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-users-group',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.human-resources.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'visible' => $this->canUserAccess('human-resources.dashboard.allow'),
+ ],
+ 'Empleados' => [
+ 'route' => 'admin.human-resources.employees.index',
+ 'icon' => 'menu-icon tf-icons ti ti-id-badge-2',
+ 'visible' => $this->canUserAccess('human-resources.employees.view'),
+ ],
+ 'Puestos de trabajo' => [
+ 'route' => 'admin.human-resources.jobs.index',
+ 'icon' => 'menu-icon tf-icons ti ti-tie',
+ 'visible' => $this->canUserAccess('human-resources.jobs.view'),
+ ],
+ ]
+ ],
+
+ 'Nómina' => [
+ 'icon' => 'menu-icon tf-icons ti ti-user-dollar',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.payrolls.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'visible' => $this->canUserAccess('payrolls.dashboard.allow'),
+ ],
+ 'Contratos' => [
+ 'route' => 'admin.payrolls.contracts.index',
+ 'icon' => 'menu-icon tf-icons ti ti-writing-sign',
+ 'visible' => $this->canUserAccess('payrolls.contracts.view'),
+ ],
+ 'Asistencias' => [
+ 'route' => 'admin.payrolls.assistance.index',
+ 'icon' => 'menu-icon tf-icons ti ti-calendar-exclamation',
+ 'visible' => $this->canUserAccess('payrolls.assistance.view'),
+ ],
+ 'CFDI Nómina' => [
+ 'route' => 'admin.payrolls.billing.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'visible' => $this->canUserAccess('billing.nomina.view'),
+ ],
+ ]
+ ],
+
+ 'Activos fijos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-building',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.assets.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'visible' => $this->canUserAccess('assets.dashboard.allow'),
+ ],
+ 'Activos fijos' => [
+ 'route' => 'admin.assets.assets.index',
+ 'icon' => 'menu-icon tf-icons ti ti-building',
+ 'visible' => $this->canUserAccess('assets.assets.view'),
+ ],
+ 'Eventos relacionados' => [
+ 'route' => 'admin.assets.events.index',
+ 'icon' => 'menu-icon tf-icons ti ti-list-check',
+ 'visible' => $this->canUserAccess('assets.events.view'),
+ ],
+ ]
+ ],
+
+ 'CRM' => [
+ 'icon' => 'menu-icon tf-icons ti ti-users',
+ 'submenu' => [
+ 'Contactos' => [
+ 'route' => 'admin.crm.contacts.index',
+ 'icon' => 'menu-icon tf-icons ti ti-users',
+ 'visible' => $this->canUserAccess('crm.contacts.view'),
+ ],
+ 'Campañas de marketing' => [
+ 'route' => 'admin.crm.marketing-campaigns.index',
+ 'icon' => 'menu-icon tf-icons ti ti-ad-2',
+ 'visible' => $this->canUserAccess('crm.marketing-campaigns.view'),
+ ],
+ 'Oportunidades ' => [
+ 'route' => 'admin.crm.leads.index',
+ 'icon' => 'menu-icon tf-icons ti ti-target-arrow',
+ 'visible' => $this->canUserAccess('crm.leads.view'),
+ ],
+ 'Newsletter' => [
+ 'route' => 'admin.crm.newsletter.index',
+ 'icon' => 'menu-icon tf-icons ti ti-notebook',
+ 'visible' => $this->canUserAccess('crm.newsletter.view'),
+ ],
+ ]
+ ],
+
+ 'Productos y servicios' => [
+ 'icon' => 'menu-icon tf-icons ti ti-package',
+ 'submenu' => [
+ 'Categorias' => [
+ 'route' => 'admin.products.categories.index',
+ 'icon' => 'menu-icon tf-icons ti ti-category',
+ 'visible' => $this->canUserAccess('products.categories.view'),
+ ],
+ 'Catálogos' => [
+ 'route' => 'admin.products.catalogs.index',
+ 'icon' => 'menu-icon tf-icons ti ti-library',
+ 'visible' => $this->canUserAccess('products.catalogs.view'),
+ ],
+ 'Productos y servicios' => [
+ 'route' => 'admin.products.products.index',
+ 'icon' => 'menu-icon tf-icons ti ti-packages',
+ 'visible' => $this->canUserAccess('products.products.view'),
+ ],
+ 'Agregar producto o servicio' => [
+ 'route' => 'admin.products.products.create',
+ 'icon' => 'menu-icon tf-icons ti ti-package',
+ 'visible' => $this->canUserAccess('products.products.create'),
+ ],
+ ]
+ ],
+
+ 'Compras y Gastos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-2',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.purchases.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'visible' => $this->canUserAccess('purchases.dashboard.allow'),
+ ],
+ 'Proveedores' => [
+ 'route' => 'admin.purchases.supplier.index',
+ 'icon' => 'menu-icon tf-icons ti ti-truck',
+ 'visible' => $this->canUserAccess('purchases.supplier.view'),
+ ],
+ 'Ordenes de compra' => [
+ 'icon' => 'menu-icon tf-icons ti ti-list-details',
+ 'submenu' => [
+ 'Nueva ordenes de compra' => [
+ 'route' => 'admin.purchases.orders.create',
+ 'icon' => 'menu-icon tf-icons ti ti-basket-check',
+ 'visible' => $this->canUserAccess('purchases.orders.create'),
+ ],
+ 'Ordenes de compra' => [
+ 'route' => 'admin.purchases.orders.index',
+ 'icon' => 'menu-icon tf-icons ti ti-basket-check',
+ 'visible' => $this->canUserAccess('purchases.orders.view'),
+ ],
+ 'Ordenes de compra por producto o servicio' => [
+ 'route' => 'admin.purchases.orders-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-basket-check',
+ 'visible' => $this->canUserAccess('purchases.orders.view'),
+ ],
+ ]
+ ],
+ 'Compras y gastos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-2',
+ 'submenu' => [
+ 'Nueva compras o gastos' => [
+ 'route' => 'admin.purchases.purchases.create',
+ 'icon' => 'menu-icon tf-icons ti ti-basket-dollar',
+ 'visible' => $this->canUserAccess('purchases.purchases.create'),
+ ],
+ 'Compras y gastos' => [
+ 'route' => 'admin.purchases.purchases.index',
+ 'icon' => 'menu-icon tf-icons ti ti-basket-dollar',
+ 'visible' => $this->canUserAccess('purchases.purchases.view'),
+ ],
+ 'Compras y gastos por producto o servicio' => [
+ 'route' => 'admin.purchases.purchases-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-basket-dollar',
+ 'visible' => $this->canUserAccess('purchases.purchases.view'),
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ 'Ventas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.pos.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'visible' => $this->canUserAccess('pos.dashboard.allow'),
+ ],
+ 'Clientes' => [
+ 'route' => 'admin.pos.customers.index',
+ 'icon' => 'menu-icon tf-icons ti ti-users-group',
+ 'visible' => $this->canUserAccess('pos.customers.view'),
+ ],
+ 'Lista de precios' => [
+ 'route' => 'admin.pos.pricelist.index',
+ 'icon' => 'menu-icon tf-icons ti ti-report-search',
+ 'visible' => $this->canUserAccess('pos.sales.view'),
+ ],
+ 'Cotizaciones' => [
+ 'route' => 'admin.pos.quotes.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-dollar',
+ 'visible' => $this->canUserAccess('pos.quotes.view'),
+ ],
+ 'Ventas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'submenu' => [
+ 'Crear venta' => [
+ 'route' => 'admin.pos.sales.create',
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'visible' => $this->canUserAccess('pos.sales.create'),
+ ],
+ 'Ventas' => [
+ 'route' => 'admin.pos.sales.index',
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'visible' => $this->canUserAccess('pos.sales.view'),
+ ],
+ 'Ventas por producto o servicio' => [
+ 'route' => 'admin.pos.sales-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'visible' => $this->canUserAccess('pos.sales.view'),
+ ],
+ ]
+ ],
+ 'Remisiones' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt',
+ 'submenu' => [
+ 'Crear remisión' => [
+ 'route' => 'admin.pos.remissions.create',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt',
+ 'visible' => $this->canUserAccess('pos.remissions.create'),
+ ],
+ 'Remisiones' => [
+ 'route' => 'admin.pos.remissions.index',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt',
+ 'visible' => $this->canUserAccess('pos.remissions.view'),
+ ],
+ 'Remisiones por producto o servicio' => [
+ 'route' => 'admin.pos.remissions-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt',
+ 'visible' => $this->canUserAccess('pos.remissions.view'),
+ ],
+ ]
+ ],
+ 'Notas de crédito' => [
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
+ 'submenu' => [
+ 'Crear nota de crédito' => [
+ 'route' => 'admin.pos.credit-notes.create',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
+ 'visible' => $this->canUserAccess('pos.credit-notes.create'),
+ ],
+ 'Notas de créditos' => [
+ 'route' => 'admin.pos.credit-notes.index',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
+ 'visible' => $this->canUserAccess('pos.credit-notes.view'),
+ ],
+ 'Notas de crédito por producto o servicio' => [
+ 'route' => 'admin.pos.credit-notes-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-receipt-refund',
+ 'visible' => $this->canUserAccess('pos.credit-notes.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',
+ 'visible' => $this->canUserAccess('billing.dashboard.allow'),
+ ],
+ 'Ingresos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'submenu' => [
+ 'Facturar ventas' => [
+ 'route' => 'admin.billing.ingresos-stamp.index',
+ 'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
+ 'visible' => $this->canUserAccess('billing.ingresos.create'),
+ ],
+ 'CFDI Ingresos' => [
+ 'route' => 'admin.billing.ingresos.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-invoice',
+ 'visible' => $this->canUserAccess('billing.ingresos.view'),
+ ],
+ 'CFDI Ingresos por producto o servicio' => [
+ 'route' => 'admin.billing.ingresos-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-invoice',
+ 'visible' => $this->canUserAccess('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',
+ 'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
+ 'visible' => $this->canUserAccess('billing.egresos.create'),
+ ],
+ 'CFDI Engresos' => [
+ 'route' => 'admin.billing.egresos.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-invoice',
+ 'visible' => $this->canUserAccess('billing.egresos.view'),
+ ],
+ 'CFDI Engresos por producto o servicio' => [
+ 'route' => 'admin.billing.egresos-by-product.index',
+ 'icon' => 'menu-icon tf-icons ti ti-lisfile-invoicet',
+ 'visible' => $this->canUserAccess('billing.egresos.view'),
+ ],
+ ]
+ ],
+ 'Pagos' => [
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'submenu' => [
+ 'Facturar pagos' => [
+ 'route' => 'admin.billing.pagos-stamp.index',
+ 'icon' => 'menu-icon tf-icons ti ti-rubber-stamp',
+ 'visible' => $this->canUserAccess('billing.pagos.created'),
+ ],
+ 'CFDI Pagos' => [
+ 'route' => 'admin.billing.pagos.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-invoice',
+ 'visible' => $this->canUserAccess('billing.pagos.view'),
+ ],
+ ]
+ ],
+ 'CFDI Nómina' => [
+ 'route' => 'admin.billing.nomina.index',
+ 'icon' => 'menu-icon tf-icons ti ti-file-certificate',
+ 'visible' => $this->canUserAccess('billing.nomina.view'),
+ ],
+ 'Verificador de CFDI 4.0' => [
+ 'route' => 'admin.billing.verify-cfdi.index',
+ 'icon' => 'menu-icon tf-icons ti ti-rosette-discount-check',
+ 'visible' => $this->canUserAccess('billing.verify-cfdi.allow'),
+ ],
+ ]
+ ],
+
+ 'Finanzas' => [
+ 'icon' => 'menu-icon tf-icons ti ti-coins',
+ 'submenu' => [
+ 'Tablero' => [
+ 'route' => 'admin.finance.dashboard.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-infographic',
+ 'visible' => $this->canUserAccess('finance.dashboard.allow'),
+ ],
+ 'Catálogos de cuentas contables' => [
+ 'route' => 'admin.finance.accounting-charts.index',
+ 'icon' => 'menu-icon tf-icons ti ti-chart-histogram',
+ 'visible' => $this->canUserAccess('finance.accounting-charts.view'),
+ ],
+ 'Cuentas por pagar' => [
+ 'route' => 'admin.finance.accounts-payable.index',
+ 'icon' => 'menu-icon tf-icons ti ti-businessplan',
+ 'visible' => $this->canUserAccess('finance.accounts-payable.view'),
+ ],
+ 'Cuentas por cobrar' => [
+ 'route' => 'admin.finance.accounts-receivable.index',
+ 'icon' => 'menu-icon tf-icons ti ti-cash-register',
+ 'visible' => $this->canUserAccess('finance.accounts-receivable.view'),
+ ],
+ ]
+ ],
+
+ 'Sitio Web' => [
+ 'icon' => 'menu-icon tf-icons ti ti-wand',
+ 'submenu' => [
+ 'Slider' => [
+ 'route' => 'admin.website.slider.index',
+ 'icon' => 'menu-icon tf-icons ti ti-table-row',
+ 'visible' => $this->canUserAccess('website.slider.view'),
+ ],
+ 'Concierge Magazine' => [
+ 'route' => 'admin.website.cmagazine.index',
+ 'icon' => 'menu-icon tf-icons ti ti-book',
+ 'visible' => $this->canUserAccess('website.cmagazine.view'),
+ ],
+ 'Preguntas frecuentes' => [
+ 'route' => 'admin.website.faq.index',
+ 'icon' => 'menu-icon tf-icons ti ti-bubble-text',
+ 'visible' => $this->canUserAccess('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',
+ 'visible' => $this->canUserAccess('blog.categories.view'),
+ ],
+ 'Etiquetas' => [
+ 'route' => 'admin.blog.tags.index',
+ 'icon' => 'menu-icon tf-icons ti ti-tags',
+ 'visible' => $this->canUserAccess('blog.tags.view'),
+ ],
+ 'Articulos' => [
+ 'route' => 'admin.blog.articles.index',
+ 'icon' => 'menu-icon tf-icons ti ti-news',
+ 'visible' => $this->canUserAccess('blog.articles.view'),
+ ],
+ 'Comentarios' => [
+ 'route' => 'admin.blog.comments.index',
+ 'icon' => 'menu-icon tf-icons ti ti-message',
+ 'visible' => $this->canUserAccess('blog.comments.view'),
+ ],
+ ]
+ ],
+
+ 'Iniciar sesión' => [
+ 'route' => 'login',
+ 'icon' => 'menu-icon tf-icons ti ti-login',
+ 'visible' => $this->user === null,
+ ],
+
+ 'Recuperar contraseña' => [
+ 'route' => 'password.request',
+ 'icon' => 'menu-icon tf-icons ti ti-key',
+ 'visible' => !$this->user === null,
+ ],
+ ];
+ }
+
+ private function canUserAccess($permission)
+ {
+ return $this->user && $this->user->can($permission);
+ }
+}
diff --git a/modules/Admin/App/Services/WebsiteSettingsService.php b/modules/Admin/App/Services/WebsiteSettingsService.php
new file mode 100644
index 0000000..b04908d
--- /dev/null
+++ b/modules/Admin/App/Services/WebsiteSettingsService.php
@@ -0,0 +1,213 @@
+ [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) en Base64
+ private $imageLogoMaxPixels3 = 230400; // Tercera versión (px^2)
+
+ 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('website_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('website_favicon_ns', $this->favicon_basePath . $imageName);
+ }
+
+ protected function deleteOldFavicons(): void
+ {
+ // Obtener el favicon actual desde la base de datos
+ $currentFavicon = Setting::where('key', 'website_favicon')->value('value');
+
+ if ($currentFavicon) {
+ $filePaths = [
+ $this->imageDisk . '/' . $currentFavicon,
+ $this->imageDisk . '/' . $currentFavicon . '_16x16.png',
+ $this->imageDisk . '/' . $currentFavicon . '_192x192.png',
+ $this->imageDisk . '/' . $currentFavicon . '_76x76.png',
+ $this->imageDisk . '/' . $currentFavicon . '_120x120.png',
+ $this->imageDisk . '/' . $currentFavicon . '_152x152.png',
+ $this->imageDisk . '/' . $currentFavicon . '_180x180.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->imageLogoMaxPixels3); // 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 = 'website_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(
+ "website_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 = [
+ "website_image_logo{$suffix}",
+ "website_image_logo_small{$suffix}",
+ "website_image_logo_medium{$suffix}",
+ "website_image_logo_base64{$suffix}",
+ ];
+
+ foreach ($imageKeys as $key) {
+ // Obtener la ruta de la imagen actual desde la base de datos
+ $currentImage = Setting::where('key', $key)->value('value');
+
+ // Si es una imagen en disco, eliminarla
+ if ($currentImage && !str_starts_with($currentImage, 'data:image')) {
+ $filePath = $this->imageDisk . '/' . $currentImage;
+ if (Storage::exists($filePath)) {
+ Storage::delete($filePath);
+ }
+ }
+
+ // Opcional: Eliminar la configuración de la base de datos
+ Setting::where('key', $key)->delete();
+ }
+ }
+}
diff --git a/modules/Admin/Config/_var.php b/modules/Admin/Config/_var.php
new file mode 100644
index 0000000..52e7b24
--- /dev/null
+++ b/modules/Admin/Config/_var.php
@@ -0,0 +1,14 @@
+ "koneko.mx",
+ "appTitle" => "Koneko Soluciones Tecnológicas",
+ "appDescription" => "Koneko Soluciones Tecnológicas",
+ "appLogo" => "../assets/img/logo/koneko-04.png",
+ "appFavicon" => "../assets/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/modules/Admin/Config/custom.php b/modules/Admin/Config/custom.php
new file mode 100644
index 0000000..ab4980f
--- /dev/null
+++ b/modules/Admin/Config/custom.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/modules/Admin/Database/data/catCFDI_V_4_20241121.xls b/modules/Admin/Database/data/catCFDI_V_4_20241121.xls
new file mode 100644
index 0000000..fca7517
Binary files /dev/null and b/modules/Admin/Database/data/catCFDI_V_4_20241121.xls differ
diff --git a/modules/Admin/Database/data/catalog-sat_bancos.json b/modules/Admin/Database/data/catalog-sat_bancos.json
new file mode 100644
index 0000000..dd4fea8
--- /dev/null
+++ b/modules/Admin/Database/data/catalog-sat_bancos.json
@@ -0,0 +1,467 @@
+[
+ {
+ "c_banco": "002",
+ "descripcion": "BANAMEX",
+ "razon_social": "Banco Nacional de México, S.A., Institución de Banca Múltiple, Grupo Financiero Banamex"
+ },
+ {
+ "c_banco": "006",
+ "descripcion": "BANCOMEXT",
+ "razon_social": "Banco Nacional de Comercio Exterior, Sociedad Nacional de Crédito, Institución de Banca de Desarrollo"
+ },
+ {
+ "c_banco": "009",
+ "descripcion": "BANOBRAS",
+ "razon_social": "Banco Nacional de Obras y Servicios Públicos, Sociedad Nacional de Crédito, Institución de Banca de Desarrollo"
+ },
+ {
+ "c_banco": "012",
+ "descripcion": "BBVA BANCOMER",
+ "razon_social": "BBVA Bancomer, S.A., Institución de Banca Múltiple, Grupo Financiero BBVA Bancomer"
+ },
+ {
+ "c_banco": "014",
+ "descripcion": "SANTANDER",
+ "razon_social": "Banco Santander (México), S.A., Institución de Banca Múltiple, Grupo Financiero Santander"
+ },
+ {
+ "c_banco": "019",
+ "descripcion": "BANJERCITO",
+ "razon_social": "Banco Nacional del Ejército, Fuerza Aérea y Armada, Sociedad Nacional de Crédito, Institución de Banca de Desarrollo"
+ },
+ {
+ "c_banco": "021",
+ "descripcion": "HSBC",
+ "razon_social": "HSBC México, S.A., institución De Banca Múltiple, Grupo Financiero HSBC"
+ },
+ {
+ "c_banco": "030",
+ "descripcion": "BAJIO",
+ "razon_social": "Banco del Bajío, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "032",
+ "descripcion": "IXE",
+ "razon_social": "IXE Banco, S.A., Institución de Banca Múltiple, IXE Grupo Financiero"
+ },
+ {
+ "c_banco": "036",
+ "descripcion": "INBURSA",
+ "razon_social": "Banco Inbursa, S.A., Institución de Banca Múltiple, Grupo Financiero Inbursa"
+ },
+ {
+ "c_banco": "037",
+ "descripcion": "INTERACCIONES",
+ "razon_social": "Banco Interacciones, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "042",
+ "descripcion": "MIFEL",
+ "razon_social": "Banca Mifel, S.A., Institución de Banca Múltiple, Grupo Financiero Mifel"
+ },
+ {
+ "c_banco": "044",
+ "descripcion": "SCOTIABANK",
+ "razon_social": "Scotiabank Inverlat, S.A."
+ },
+ {
+ "c_banco": "058",
+ "descripcion": "BANREGIO",
+ "razon_social": "Banco Regional de Monterrey, S.A., Institución de Banca Múltiple, Banregio Grupo Financiero"
+ },
+ {
+ "c_banco": "059",
+ "descripcion": "INVEX",
+ "razon_social": "Banco Invex, S.A., Institución de Banca Múltiple, Invex Grupo Financiero"
+ },
+ {
+ "c_banco": "060",
+ "descripcion": "BANSI",
+ "razon_social": "Bansi, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "062",
+ "descripcion": "AFIRME",
+ "razon_social": "Banca Afirme, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "072",
+ "descripcion": "BANORTE",
+ "razon_social": "Banco Mercantil del Norte, S.A., Institución de Banca Múltiple, Grupo Financiero Banorte"
+ },
+ {
+ "c_banco": "102",
+ "descripcion": "THE ROYAL BANK",
+ "razon_social": "The Royal Bank of Scotland México, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "103",
+ "descripcion": "AMERICAN EXPRESS",
+ "razon_social": "American Express Bank (México), S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "106",
+ "descripcion": "BAMSA",
+ "razon_social": "Bank of America México, S.A., Institución de Banca Múltiple, Grupo Financiero Bank of America"
+ },
+ {
+ "c_banco": "108",
+ "descripcion": "TOKYO",
+ "razon_social": "Bank of Tokyo-Mitsubishi UFJ (México), S.A."
+ },
+ {
+ "c_banco": "110",
+ "descripcion": "JP MORGAN",
+ "razon_social": "Banco J.P. Morgan, S.A., Institución de Banca Múltiple, J.P. Morgan Grupo Financiero"
+ },
+ {
+ "c_banco": "112",
+ "descripcion": "BMONEX",
+ "razon_social": "Banco Monex, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "113",
+ "descripcion": "VE POR MAS",
+ "razon_social": "Banco Ve Por Mas, S.A. Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "116",
+ "descripcion": "ING",
+ "razon_social": "ING Bank (México), S.A., Institución de Banca Múltiple, ING Grupo Financiero"
+ },
+ {
+ "c_banco": "124",
+ "descripcion": "DEUTSCHE",
+ "razon_social": "Deutsche Bank México, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "126",
+ "descripcion": "CREDIT SUISSE",
+ "razon_social": "Banco Credit Suisse (México), S.A. Institución de Banca Múltiple, Grupo Financiero Credit Suisse (México)"
+ },
+ {
+ "c_banco": "127",
+ "descripcion": "AZTECA",
+ "razon_social": "Banco Azteca, S.A. Institución de Banca Múltiple."
+ },
+ {
+ "c_banco": "128",
+ "descripcion": "AUTOFIN",
+ "razon_social": "Banco Autofin México, S.A. Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "129",
+ "descripcion": "BARCLAYS",
+ "razon_social": "Barclays Bank México, S.A., Institución de Banca Múltiple, Grupo Financiero Barclays México"
+ },
+ {
+ "c_banco": "130",
+ "descripcion": "COMPARTAMOS",
+ "razon_social": "Banco Compartamos, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "131",
+ "descripcion": "BANCO FAMSA",
+ "razon_social": "Banco Ahorro Famsa, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "132",
+ "descripcion": "BMULTIVA",
+ "razon_social": "Banco Multiva, S.A., Institución de Banca Múltiple, Multivalores Grupo Financiero"
+ },
+ {
+ "c_banco": "133",
+ "descripcion": "ACTINVER",
+ "razon_social": "Banco Actinver, S.A. Institución de Banca Múltiple, Grupo Financiero Actinver"
+ },
+ {
+ "c_banco": "134",
+ "descripcion": "WAL-MART",
+ "razon_social": "Banco Wal-Mart de México Adelante, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "135",
+ "descripcion": "NAFIN",
+ "razon_social": "Nacional Financiera, Sociedad Nacional de Crédito, Institución de Banca de Desarrollo"
+ },
+ {
+ "c_banco": "136",
+ "descripcion": "INTERBANCO",
+ "razon_social": "Inter Banco, S.A. Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "137",
+ "descripcion": "BANCOPPEL",
+ "razon_social": "BanCoppel, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "138",
+ "descripcion": "ABC CAPITAL",
+ "razon_social": "ABC Capital, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "139",
+ "descripcion": "UBS BANK",
+ "razon_social": "UBS Bank México, S.A., Institución de Banca Múltiple, UBS Grupo Financiero"
+ },
+ {
+ "c_banco": "140",
+ "descripcion": "CONSUBANCO",
+ "razon_social": "Consubanco, S.A. Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "141",
+ "descripcion": "VOLKSWAGEN",
+ "razon_social": "Volkswagen Bank, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "143",
+ "descripcion": "CIBANCO",
+ "razon_social": "CIBanco, S.A."
+ },
+ {
+ "c_banco": "145",
+ "descripcion": "BBASE",
+ "razon_social": "Banco Base, S.A., Institución de Banca Múltiple"
+ },
+ {
+ "c_banco": "166",
+ "descripcion": "BANSEFI",
+ "razon_social": "Banco del Ahorro Nacional y Servicios Financieros, Sociedad Nacional de Crédito, Institución de Banca de Desarrollo"
+ },
+ {
+ "c_banco": "168",
+ "descripcion": "HIPOTECARIA FEDERAL",
+ "razon_social": "Sociedad Hipotecaria Federal, Sociedad Nacional de Crédito, Institución de Banca de Desarrollo"
+ },
+ {
+ "c_banco": "600",
+ "descripcion": "MONEXCB",
+ "razon_social": "Monex Casa de Bolsa, S.A. de C.V. Monex Grupo Financiero"
+ },
+ {
+ "c_banco": "601",
+ "descripcion": "GBM",
+ "razon_social": "GBM Grupo Bursátil Mexicano, S.A. de C.V. Casa de Bolsa"
+ },
+ {
+ "c_banco": "602",
+ "descripcion": "MASARI",
+ "razon_social": "Masari Casa de Bolsa, S.A."
+ },
+ {
+ "c_banco": "605",
+ "descripcion": "VALUE",
+ "razon_social": "Value, S.A. de C.V. Casa de Bolsa"
+ },
+ {
+ "c_banco": "606",
+ "descripcion": "ESTRUCTURADORES",
+ "razon_social": "Estructuradores del Mercado de Valores Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "607",
+ "descripcion": "TIBER",
+ "razon_social": "Casa de Cambio Tiber, S.A. de C.V."
+ },
+ {
+ "c_banco": "608",
+ "descripcion": "VECTOR",
+ "razon_social": "Vector Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "610",
+ "descripcion": "B&B",
+ "razon_social": "B y B, Casa de Cambio, S.A. de C.V."
+ },
+ {
+ "c_banco": "614",
+ "descripcion": "ACCIVAL",
+ "razon_social": "Acciones y Valores Banamex, S.A. de C.V., Casa de Bolsa"
+ },
+ {
+ "c_banco": "615",
+ "descripcion": "MERRILL LYNCH",
+ "razon_social": "Merrill Lynch México, S.A. de C.V. Casa de Bolsa"
+ },
+ {
+ "c_banco": "616",
+ "descripcion": "FINAMEX",
+ "razon_social": "Casa de Bolsa Finamex, S.A. de C.V."
+ },
+ {
+ "c_banco": "617",
+ "descripcion": "VALMEX",
+ "razon_social": "Valores Mexicanos Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "618",
+ "descripcion": "UNICA",
+ "razon_social": "Unica Casa de Cambio, S.A. de C.V."
+ },
+ {
+ "c_banco": "619",
+ "descripcion": "MAPFRE",
+ "razon_social": "MAPFRE Tepeyac, S.A."
+ },
+ {
+ "c_banco": "620",
+ "descripcion": "PROFUTURO",
+ "razon_social": "Profuturo G.N.P., S.A. de C.V., Afore"
+ },
+ {
+ "c_banco": "621",
+ "descripcion": "CB ACTINVER",
+ "razon_social": "Actinver Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "622",
+ "descripcion": "OACTIN",
+ "razon_social": "OPERADORA ACTINVER, S.A. DE C.V."
+ },
+ {
+ "c_banco": "623",
+ "descripcion": "SKANDIA",
+ "razon_social": "Skandia Vida, S.A. de C.V."
+ },
+ {
+ "c_banco": "626",
+ "descripcion": "CBDEUTSCHE",
+ "razon_social": "Deutsche Securities, S.A. de C.V. CASA DE BOLSA"
+ },
+ {
+ "c_banco": "627",
+ "descripcion": "ZURICH",
+ "razon_social": "Zurich Compañía de Seguros, S.A."
+ },
+ {
+ "c_banco": "628",
+ "descripcion": "ZURICHVI",
+ "razon_social": "Zurich Vida, Compañía de Seguros, S.A."
+ },
+ {
+ "c_banco": "629",
+ "descripcion": "SU CASITA",
+ "razon_social": "Hipotecaria Su Casita, S.A. de C.V. SOFOM ENR"
+ },
+ {
+ "c_banco": "630",
+ "descripcion": "CB INTERCAM",
+ "razon_social": "Intercam Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "631",
+ "descripcion": "CI BOLSA",
+ "razon_social": "CI Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "632",
+ "descripcion": "BULLTICK CB",
+ "razon_social": "Bulltick Casa de Bolsa, S.A., de C.V."
+ },
+ {
+ "c_banco": "633",
+ "descripcion": "STERLING",
+ "razon_social": "Sterling Casa de Cambio, S.A. de C.V."
+ },
+ {
+ "c_banco": "634",
+ "descripcion": "FINCOMUN",
+ "razon_social": "Fincomún, Servicios Financieros Comunitarios, S.A. de C.V."
+ },
+ {
+ "c_banco": "636",
+ "descripcion": "HDI SEGUROS",
+ "razon_social": "HDI Seguros, S.A. de C.V."
+ },
+ {
+ "c_banco": "637",
+ "descripcion": "ORDER",
+ "razon_social": "Order Express Casa de Cambio, S.A. de C.V"
+ },
+ {
+ "c_banco": "638",
+ "descripcion": "AKALA",
+ "razon_social": "Akala, S.A. de C.V., Sociedad Financiera Popular"
+ },
+ {
+ "c_banco": "640",
+ "descripcion": "CB JPMORGAN",
+ "razon_social": "J.P. Morgan Casa de Bolsa, S.A. de C.V. J.P. Morgan Grupo Financiero"
+ },
+ {
+ "c_banco": "642",
+ "descripcion": "REFORMA",
+ "razon_social": "Operadora de Recursos Reforma, S.A. de C.V., S.F.P."
+ },
+ {
+ "c_banco": "646",
+ "descripcion": "STP",
+ "razon_social": "Sistema de Transferencias y Pagos STP, S.A. de C.V.SOFOM ENR"
+ },
+ {
+ "c_banco": "647",
+ "descripcion": "TELECOMM",
+ "razon_social": "Telecomunicaciones de México"
+ },
+ {
+ "c_banco": "648",
+ "descripcion": "EVERCORE",
+ "razon_social": "Evercore Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "649",
+ "descripcion": "SKANDIA",
+ "razon_social": "Skandia Operadora de Fondos, S.A. de C.V."
+ },
+ {
+ "c_banco": "651",
+ "descripcion": "SEGMTY",
+ "razon_social": "Seguros Monterrey New York Life, S.A de C.V"
+ },
+ {
+ "c_banco": "652",
+ "descripcion": "ASEA",
+ "razon_social": "Solución Asea, S.A. de C.V., Sociedad Financiera Popular"
+ },
+ {
+ "c_banco": "653",
+ "descripcion": "KUSPIT",
+ "razon_social": "Kuspit Casa de Bolsa, S.A. de C.V."
+ },
+ {
+ "c_banco": "655",
+ "descripcion": "SOFIEXPRESS",
+ "razon_social": "J.P. SOFIEXPRESS, S.A. de C.V., S.F.P."
+ },
+ {
+ "c_banco": "656",
+ "descripcion": "UNAGRA",
+ "razon_social": "UNAGRA, S.A. de C.V., S.F.P."
+ },
+ {
+ "c_banco": "659",
+ "descripcion": "OPCIONES EMPRESARIALES DEL NOROESTE",
+ "razon_social": "OPCIONES EMPRESARIALES DEL NORESTE, S.A. DE C.V., S.F.P."
+ },
+ {
+ "c_banco": "901",
+ "descripcion": "CLS",
+ "razon_social": "Cls Bank International"
+ },
+ {
+ "c_banco": "902",
+ "descripcion": "INDEVAL",
+ "razon_social": "SD. Indeval, S.A. de C.V."
+ },
+ {
+ "c_banco": "670",
+ "descripcion": "LIBERTAD",
+ "razon_social": "Libertad Servicios Financieros, S.A. De C.V."
+ },
+ {
+ "c_banco": "999",
+ "descripcion": "N/A",
+ "razon_social": null
+ }
+]
diff --git a/modules/Admin/Database/data/users.csv b/modules/Admin/Database/data/users.csv
new file mode 100644
index 0000000..8042ee6
--- /dev/null
+++ b/modules/Admin/Database/data/users.csv
@@ -0,0 +1,14 @@
+name,email,role
+Administrador Web,webadmin@concierge.test,Administrador Web
+Productos y servicios,productos@concierge.test,Productos y servicios
+Recursos humanos,rrhh@concierge.test,Recursos humanos
+Nómina,nomina@concierge.test,Nómina
+Activos fijos,activos@concierge.test,Activos fijos
+Compras y gastos,compras@concierge.test,Compras y gastos
+CRM,crm@concierge.test,CRM
+Vendedor,vendedor@concierge.test,Vendedor
+Gerente,gerente@concierge.test,Gerente
+Facturación,facturacion@concierge.test,Facturación
+Facturación avanzado,facturacion_avanzado@concierge.test,Facturación avanzado
+Finanzas,finanzas@concierge.test,Finanzas
+Auditor,auditor@concierge.test,Auditor
diff --git a/modules/Admin/Database/factories/UserFactory.php b/modules/Admin/Database/factories/UserFactory.php
new file mode 100644
index 0000000..d24c05c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Database/migrations/0001_01_01_000000_create_users_table.php b/modules/Admin/Database/migrations/0001_01_01_000000_create_users_table.php
new file mode 100644
index 0000000..8fcad6e
--- /dev/null
+++ b/modules/Admin/Database/migrations/0001_01_01_000000_create_users_table.php
@@ -0,0 +1,96 @@
+mediumIncrements('id');
+
+ $table->string('contact_code', 50)->unique()->nullable()->comment('Código único del contacto');
+
+ $table->string('name', 100)->comment('Nombre')->index();
+ $table->string('last_name', 100)->comment('Apellidos')->nullable()->index();
+
+ $table->string('email')->unique()->index();
+ $table->timestamp('email_verified_at')->nullable();
+ $table->string('password')->nullable();
+ $table->rememberToken();
+ $table->string('profile_photo_path', 2048)->nullable();
+
+ $table->string('company', 100)->nullable()->comment('Nombre de la empresa')->index();
+
+ $table->date('birth_date')->nullable()->comment('Fecha de nacimiento');
+ $table->date('hire_date')->nullable()->comment('Fecha de contratación');
+
+ $table->string('curp', 50)->nullable()->comment('Clave Única de Registro de Población (CURP)')->index();
+ $table->string('nss', 11)->nullable()->comment('Número de seguridad social')->index();
+
+ $table->string('job_title', 100)->nullable()->comment('Cargo del contacto en la empresa');
+
+ $table->json('face_vector')->nullable()->comment('Vector de características faciales');
+
+ $table->string('rfc', 13)->unique()->nullable()->index();
+ $table->string('nombre_fiscal')->nullable()->index();
+
+ $table->unsignedTinyInteger('tipo_persona')->nullable()->index();
+
+ $table->unsignedSmallInteger('c_regimen_fiscal')->nullable()->index(); // sat_regimen_fiscal.c_regimen_fiscal
+
+ $table->unsignedMediumInteger('domicilio_fiscal')->nullable()->index(); // sat_codigo_postal.c_codigo_postal
+
+ $table->char('c_uso_cfdi', 4)->charset('ascii')->collation('ascii_general_ci')->nullable()->index(); // sat_uso_cfdi.c_uso_cfdi
+
+ $table->unsignedTinyInteger('is_partner')->nullable()->index();
+ $table->unsignedTinyInteger('is_employee')->nullable()->index();
+ $table->unsignedTinyInteger('is_prospect')->nullable()->index();
+ $table->unsignedTinyInteger('is_customer')->nullable()->index();
+ $table->unsignedTinyInteger('is_provider')->nullable()->index();
+ $table->unsignedTinyInteger('is_user')->nullable()->index();
+
+ $table->unsignedTinyInteger('status')->nullable()->index();
+
+ // Auditoría
+ $table->dateTime('last_login_at')->nullable();
+ $table->ipAddress('last_login_ip')->nullable();
+
+ $table->unsignedMediumInteger('created_by')->nullable()->index(); // users.id
+ $table->timestamps();
+
+ // Relaciones
+ $table->foreign('created_by')->references('id')->on('users')->onUpdate('restrict')->onDelete('restrict');
+ });
+
+ Schema::create('password_reset_tokens', function (Blueprint $table) {
+ $table->string('email')->primary();
+ $table->string('token');
+ $table->timestamp('created_at')->nullable();
+ });
+
+ Schema::create('sessions', function (Blueprint $table) {
+ $table->string('id')->primary();
+ $table->foreignId('user_id')->nullable()->index();
+ $table->string('ip_address', 45)->nullable();
+ $table->text('user_agent')->nullable();
+ $table->longText('payload');
+ $table->integer('last_activity')->index();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('users');
+ Schema::dropIfExists('password_reset_tokens');
+ Schema::dropIfExists('sessions');
+ }
+};
diff --git a/modules/Admin/Database/migrations/0001_01_01_000001_create_cache_table.php b/modules/Admin/Database/migrations/0001_01_01_000001_create_cache_table.php
new file mode 100644
index 0000000..b9c106b
--- /dev/null
+++ b/modules/Admin/Database/migrations/0001_01_01_000001_create_cache_table.php
@@ -0,0 +1,35 @@
+string('key')->primary();
+ $table->mediumText('value');
+ $table->integer('expiration');
+ });
+
+ Schema::create('cache_locks', function (Blueprint $table) {
+ $table->string('key')->primary();
+ $table->string('owner');
+ $table->integer('expiration');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('cache');
+ Schema::dropIfExists('cache_locks');
+ }
+};
diff --git a/modules/Admin/Database/migrations/0001_01_01_000002_create_jobs_table.php b/modules/Admin/Database/migrations/0001_01_01_000002_create_jobs_table.php
new file mode 100644
index 0000000..425e705
--- /dev/null
+++ b/modules/Admin/Database/migrations/0001_01_01_000002_create_jobs_table.php
@@ -0,0 +1,57 @@
+id();
+ $table->string('queue')->index();
+ $table->longText('payload');
+ $table->unsignedTinyInteger('attempts');
+ $table->unsignedInteger('reserved_at')->nullable();
+ $table->unsignedInteger('available_at');
+ $table->unsignedInteger('created_at');
+ });
+
+ Schema::create('job_batches', function (Blueprint $table) {
+ $table->string('id')->primary();
+ $table->string('name');
+ $table->integer('total_jobs');
+ $table->integer('pending_jobs');
+ $table->integer('failed_jobs');
+ $table->longText('failed_job_ids');
+ $table->mediumText('options')->nullable();
+ $table->integer('cancelled_at')->nullable();
+ $table->integer('created_at');
+ $table->integer('finished_at')->nullable();
+ });
+
+ Schema::create('failed_jobs', function (Blueprint $table) {
+ $table->id();
+ $table->string('uuid')->unique();
+ $table->text('connection');
+ $table->text('queue');
+ $table->longText('payload');
+ $table->longText('exception');
+ $table->timestamp('failed_at')->useCurrent();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('jobs');
+ Schema::dropIfExists('job_batches');
+ Schema::dropIfExists('failed_jobs');
+ }
+};
diff --git a/modules/Admin/Database/migrations/2024_12_14_040004_create_user_logins_table.php b/modules/Admin/Database/migrations/2024_12_14_040004_create_user_logins_table.php
new file mode 100644
index 0000000..f1b064b
--- /dev/null
+++ b/modules/Admin/Database/migrations/2024_12_14_040004_create_user_logins_table.php
@@ -0,0 +1,35 @@
+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
+ {
+ Schema::dropIfExists('user_logins');
+ }
+};
diff --git a/modules/Admin/Database/migrations/2024_12_14_073441_create_personal_access_tokens_table.php b/modules/Admin/Database/migrations/2024_12_14_073441_create_personal_access_tokens_table.php
new file mode 100644
index 0000000..e828ad8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Database/migrations/2024_12_14_074756_create_permission_tables.php b/modules/Admin/Database/migrations/2024_12_14_074756_create_permission_tables.php
new file mode 100644
index 0000000..347947f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Database/migrations/2024_12_14_081739_add_two_factor_columns_to_users_table.php b/modules/Admin/Database/migrations/2024_12_14_081739_add_two_factor_columns_to_users_table.php
new file mode 100644
index 0000000..b490e24
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Database/migrations/2024_12_14_102026_create_audits_table.php b/modules/Admin/Database/migrations/2024_12_14_102026_create_audits_table.php
new file mode 100644
index 0000000..709069d
--- /dev/null
+++ b/modules/Admin/Database/migrations/2024_12_14_102026_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/modules/Admin/Database/migrations/2024_12_14_104331_create_cfdi_sat_catalog_tables.php b/modules/Admin/Database/migrations/2024_12_14_104331_create_cfdi_sat_catalog_tables.php
new file mode 100644
index 0000000..82cdf38
--- /dev/null
+++ b/modules/Admin/Database/migrations/2024_12_14_104331_create_cfdi_sat_catalog_tables.php
@@ -0,0 +1,305 @@
+smallIncrements('id');
+
+ $table->unsignedSmallInteger('c_banco')->index();
+ $table->string('descripcion');
+ $table->string('razon_social')->nullable();
+ $table->string('rfc', 13)->nullable();
+
+ $table->unsignedTinyInteger('status');
+
+ $table->timestamps();
+ });
+
+ Schema::create('sat_clave_prod_serv', function (Blueprint $table) {
+ $table->mediumIncrements('id');
+
+ $table->unsignedInteger('c_clave_prod_serv');
+ $table->string('descripcion')->nullable()->fulltext();
+ $table->string('incluir_iva_trasladado')->nullable();
+ $table->string('incluir_ieps_trasladado')->nullable();
+ $table->string('complemento_que_debe_incluir')->nullable();
+ $table->date('fecha_inicio_vigencia')->nullable();
+ $table->date('fecha_fin_vigencia')->nullable();
+ $table->unsignedTinyInteger('estimulo_franja_fronteriza')->nullable();
+ $table->string('palabras_similares', 1024)->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->unique('c_clave_prod_serv');
+ });
+
+ Schema::create('sat_clave_unidad', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->string('c_clave_unidad', 3)->unique();
+ $table->string('nombre')->fulltext();
+ $table->string('descripcion', 1024)->nullable();
+ $table->string('categoria', 1024)->nullable();
+ $table->string('nota', 1024)->nullable();
+ $table->date('fecha_de_inicio_de_vigencia')->nullable();
+ $table->date('fecha_de_fin_de_vigencia')->nullable();
+ $table->string('simbolo')->nullable();
+ $table->boolean('is_base')->nullable();
+
+ $table->timestamps();
+ });
+
+ Schema::create('sat_forma_pago', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->unsignedTinyInteger('c_forma_pago');
+ $table->string('descripcion');
+ $table->string('bancarizado')->nullable();
+ $table->string('numero_de_operacion')->nullable();
+ $table->string('rfc_del_emisor_de_la_cuenta_ordenante')->nullable();
+ $table->string('cuenta_ordenante')->nullable();
+ $table->string('patron_para_cuenta_ordenante')->nullable();
+ $table->string('rfc_del_emisor_cuenta_de_beneficiario')->nullable();
+ $table->string('cuenta_de_benenficiario')->nullable();
+ $table->string('patron_para_cuenta_beneficiaria')->nullable();
+ $table->string('tipo_cadena_pago')->nullable();
+ $table->string('banco_emisor_de_la_cuenta_ordenante')->nullable();
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->unique('c_forma_pago');
+ });
+
+ Schema::create('sat_moneda', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->char('c_moneda', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->string('descripcion');
+ $table->string('decimales')->nullable();
+ $table->string('porcentaje_variacion')->nullable();
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->unique('c_moneda');
+ });
+
+ Schema::create('sat_codigo_postal', function (Blueprint $table) {
+ $table->mediumIncrements('id');
+
+ $table->unsignedMediumInteger('c_codigo_postal');
+ $table->string('c_estado', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->unsignedSmallInteger('c_municipio')->nullable();
+ $table->unsignedTinyInteger('c_localidad')->nullable();
+ $table->string('estimulo_franja_fronteriza')->nullable();
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->index('c_codigo_postal');
+ $table->index('c_estado');
+ $table->index('c_municipio');
+ $table->index('c_localidad');
+
+ $table->unique('c_codigo_postal');
+ });
+
+ Schema::create('sat_regimen_fiscal', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->unsignedSmallInteger('c_regimen_fiscal');
+ $table->string('descripcion');
+ $table->char('fisica', 2)->nullable();
+ $table->char('moral', 2)->nullable();
+ $table->date('fecha_de_inicio_de_vigencia')->nullable();
+ $table->date('fecha_de_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->unique('c_regimen_fiscal');
+ });
+
+ Schema::create('sat_pais', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->char('c_pais', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->string('descripcion');
+ $table->string('formato_de_codigo_postal')->nullable();
+ $table->string('formato_de_registro_de_identidad_tributaria')->nullable();
+ $table->string('validacion_del_registro_de_identidad_tributaria')->nullable();
+ $table->string('agrupaciones')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->unique('c_pais');
+ });
+
+ Schema::create('sat_uso_cfdi', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->char('c_uso_cfdi', 4)->charset('ascii')->collation('ascii_general_ci');
+ $table->string('descripcion');
+ $table->char('aplica_para_tipo_persona_fisica', 2)->nullable();
+ $table->char('aplica_para_tipo_persona_moral', 2)->nullable();
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+ $table->string('regimen_fiscal_receptor')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->unique('c_uso_cfdi');
+ });
+
+ Schema::create('sat_colonia', function (Blueprint $table) {
+ $table->mediumIncrements('id');
+
+ $table->unsignedMediumInteger('c_colonia');
+ $table->unsignedMediumInteger('c_codigo_postal');
+ $table->string('nombre_del_asentamiento')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->index('c_colonia');
+ $table->index('c_codigo_postal');
+
+ $table->unique(['c_colonia', 'c_codigo_postal']);
+ });
+
+ Schema::create('sat_estado', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->string('c_estado', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->char('c_pais', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->string('nombre_del_estado');
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->index('c_estado');
+ $table->index('c_pais');
+
+ $table->unique(['c_estado', 'c_pais']);
+ });
+
+ Schema::create('sat_localidad', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->unsignedTinyInteger('c_localidad');
+ $table->string('c_estado', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->string('descripcion');
+ $table->date('fecha_de_inicio_de_vigencia')->nullable();
+ $table->date('fecha_de_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->index('c_localidad');
+ $table->index('c_estado');
+
+ $table->unique(['c_localidad', 'c_estado']);
+ });
+
+ Schema::create('sat_municipio', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->unsignedSmallInteger('c_municipio');
+ $table->string('c_estado', 3)->charset('ascii')->collation('ascii_general_ci');
+ $table->string('descripcion');
+ $table->date('fecha_de_inicio_de_vigencia')->nullable();
+ $table->date('fecha_de_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+
+ // Indices
+ $table->index('c_municipio');
+ $table->index('c_estado');
+
+ $table->unique(['c_municipio', 'c_estado']);
+ });
+
+ Schema::create('sat_deduccion', function (Blueprint $table) {
+ $table->tinyIncrements('id');
+
+ $table->unsignedTinyInteger('c_deduccion')->index();
+ $table->string('descripcion');
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+ });
+
+ Schema::create('sat_percepcion', function (Blueprint $table) {
+ $table->smallIncrements('id');
+
+ $table->unsignedTinyInteger('c_percepcion')->index();
+ $table->string('descripcion');
+ $table->date('fecha_inicio_de_vigencia')->nullable();
+ $table->date('fecha_fin_de_vigencia')->nullable();
+
+ $table->timestamps();
+ });
+
+
+ Schema::table('users', function (Blueprint $table) {
+ // Indices
+ $table->foreign('c_regimen_fiscal')
+ ->references('c_regimen_fiscal')
+ ->on('sat_regimen_fiscal')
+ ->onUpdate('restrict')
+ ->onDelete('restrict');
+
+ $table->foreign('domicilio_fiscal')
+ ->references('c_codigo_postal')
+ ->on('sat_codigo_postal')
+ ->onUpdate('restrict')
+ ->onDelete('restrict');
+
+ $table->foreign('c_uso_cfdi')
+ ->references('c_uso_cfdi')
+ ->on('sat_uso_cfdi')
+ ->onUpdate('restrict')
+ ->onDelete('restrict');
+ });
+
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('sat_forma_pago');
+ Schema::dropIfExists('sat_moneda');
+ Schema::dropIfExists('sat_codigo_postal');
+ Schema::dropIfExists('sat_regimen_fiscal');
+ Schema::dropIfExists('sat_pais');
+ Schema::dropIfExists('sat_uso_cfdi');
+ Schema::dropIfExists('sat_colonia');
+ Schema::dropIfExists('sat_estado');
+ Schema::dropIfExists('sat_localidad');
+ Schema::dropIfExists('sat_municipio');
+ }
+};
diff --git a/modules/Admin/Database/migrations/2024_12_14_108234_create_settings_table.php b/modules/Admin/Database/migrations/2024_12_14_108234_create_settings_table.php
new file mode 100644
index 0000000..db08618
--- /dev/null
+++ b/modules/Admin/Database/migrations/2024_12_14_108234_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/modules/Admin/Database/migrations/2024_12_14_113409_create_media_items_table.php b/modules/Admin/Database/migrations/2024_12_14_113409_create_media_items_table.php
new file mode 100644
index 0000000..aa1a5cb
--- /dev/null
+++ b/modules/Admin/Database/migrations/2024_12_14_113409_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/modules/Admin/Database/seeders/AdminDatabaseSeeder.php b/modules/Admin/Database/seeders/AdminDatabaseSeeder.php
new file mode 100644
index 0000000..f5ccd45
--- /dev/null
+++ b/modules/Admin/Database/seeders/AdminDatabaseSeeder.php
@@ -0,0 +1,16 @@
+call(RoleSeeder::class);
+ $this->call(UserSeeder::class);
+ $this->call(SettingSeeder::class);
+ $this->call(SATCatalogsSeeder::class);
+ }
+}
diff --git a/modules/Admin/Database/seeders/RoleSeeder.php b/modules/Admin/Database/seeders/RoleSeeder.php
new file mode 100644
index 0000000..efbdfda
--- /dev/null
+++ b/modules/Admin/Database/seeders/RoleSeeder.php
@@ -0,0 +1,1272 @@
+ 'SuperAdmin',
+ 'style' => 'dark'
+ ],
+ [
+ 'name' => 'Admin',
+ 'style' => 'primary'
+ ],
+ [
+ 'name' => 'Administrador Web',
+ 'style' => 'primary'
+ ],
+ [
+ 'name' => 'Editor',
+ 'style' => 'primary'
+ ],
+ [
+ 'name' => 'Productos y servicios',
+ 'style' => 'info'
+ ],
+ [
+ 'name' => 'Recursos humanos',
+ 'style' => 'success'
+ ],
+ [
+ 'name' => 'Nómina',
+ 'style' => 'success'
+ ],
+ [
+ 'name' => 'Activos fijos',
+ 'style' => 'secondary'
+ ],
+ [
+ 'name' => 'Compras y gastos',
+ 'style' => 'info'
+ ],
+ [
+ 'name' => 'CRM',
+ 'style' => 'warning'
+ ],
+ [
+ 'name' => 'Vendedor',
+ 'style' => 'info'
+ ],
+ [
+ 'name' => 'Gerente',
+ 'style' => 'danger'
+ ],
+ [
+ 'name' => 'Facturación',
+ 'style' => 'info'
+ ],
+ [
+ 'name' => 'Facturación avanzado',
+ 'style' => 'danger'
+ ],
+ [
+ 'name' => 'Finanzas',
+ 'style' => 'info'
+ ],
+ [
+ 'name' => 'Auditor',
+ 'style' => 'dark'
+ ],
+ ];
+
+ private $permissions = [
+ // Aplicación
+ 'webapp' => [
+ 'name' => 'Aplicación',
+ 'sub_groups' => [
+ 'general-settings' => [
+ 'name' => 'Ajustes generales',
+ 'actions' => [
+ 'allow' => [],
+ ]
+ ],
+ 'cache-manager' => [
+ 'name' => 'Ajuests de caché',
+ 'actions' => [
+ 'view' => [],
+ 'edit' => [],
+ ]
+ ],
+ 'session-settings' => [
+ 'name' => 'Ajustes de sesión',
+ 'actions' => [
+ 'view' => [],
+ 'edit' => [],
+ ]
+ ],
+ 'catalogs' => [
+ 'name' => 'Catálogos',
+ 'actions' => [
+ 'view' => [
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'api-banxico' => [
+ 'name' => 'API BANXICO (Tipos de cambio)',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'smtp-settings' => [
+ 'name' => 'Servidor de correo SMTP',
+ 'actions' => [
+ 'allow' => [],
+ ]
+ ],
+ ]
+ ],
+
+ // Sitio Web
+ 'website' => [
+ 'name' => 'Sitio Web',
+ 'sub_groups' => [
+ 'general-settings' => [
+ 'name' => 'Ajustes generales',
+ 'actions' => [
+ 'allow' => [
+ 'Administrador Web',
+ ],
+ ]
+ ],
+ 'slider' => [
+ 'name' => 'Slider',
+ 'actions' => [
+ 'view' => [
+ 'Administrador Web',
+ ],
+ 'create' => [
+ 'Administrador Web',
+ ],
+ 'edit' => [
+ 'Administrador Web',
+ ],
+ 'delete' => [
+ 'Administrador Web',
+ ]
+ ]
+ ],
+ 'cmagazine' => [
+ 'name' => 'Concierge Magazine',
+ 'actions' => [
+ 'view' => [
+ 'Administrador Web',
+ ],
+ 'create' => [
+ 'Administrador Web',
+ ],
+ 'edit' => [
+ 'Administrador Web',
+ ],
+ 'delete' => [
+ 'Administrador Web',
+ ]
+ ]
+ ],
+ 'faq' => [
+ 'name' => 'Preguntas frecuentes',
+ 'actions' => [
+ 'view' => [
+ 'Administrador Web',
+ ],
+ 'create' => [
+ 'Administrador Web',
+ ],
+ 'edit' => [
+ 'Administrador Web',
+ ],
+ 'delete' => [
+ 'Administrador Web',
+ ]
+ ]
+ ],
+ 'legal' => [
+ 'name' => 'Avisos legales',
+ 'actions' => [
+ 'view' => [
+ 'Administrador Web',
+ ],
+ 'edit' => [
+ 'Administrador Web',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Empresa
+ 'company' => [
+ 'name' => 'Empresa',
+ 'sub_groups' => [
+ 'general-settings' => [
+ 'name' => 'Ajustes generales',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'stores' => [
+ 'name' => 'Sucursales',
+ 'actions' => [
+ 'view' => [],
+ 'create' => [],
+ 'edit' => [],
+ 'delete' => [],
+ ]
+ ],
+ 'catalogs' => [
+ 'name' => 'Catálogos',
+ 'actions' => [
+ 'view' => [
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Recursos humanos
+ 'human-resources' => [
+ 'name' => 'Recursos Humanos',
+ 'sub_groups' => [
+ 'dashboard' => [
+ 'name' => 'Tablero',
+ 'actions' => [
+ 'allow' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'employees' => [
+ 'name' => 'Empleados',
+ 'actions' => [
+ 'view' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'jobs' => [
+ 'name' => 'Puestos de trabajo',
+ 'actions' => [
+ 'view' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Recursos humanos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Nómina
+ 'payrolls' => [
+ 'name' => 'Nómina',
+ 'sub_groups' => [
+ 'dashboard' => [
+ 'name' => 'Tablero',
+ 'actions' => [
+ 'allow' => [
+ 'Nómina',
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'contracts' => [
+ 'name' => 'Contratos',
+ 'actions' => [
+ 'view' => [
+ 'Nómina',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Nómina',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Nómina',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'assistance' => [
+ 'name' => 'Asistencias',
+ 'actions' => [
+ 'view' => [
+ 'Nómina',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Nómina',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Nómina',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Activos fijos
+ 'assets' => [
+ 'name' => 'Activos fijos',
+ 'sub_groups' => [
+ 'assets' => [
+ 'name' => 'Catálogo de activos',
+ 'actions' => [
+ 'view' => [
+ 'Activos fijos',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Activos fijos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Activos fijos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'events' => [
+ 'name' => 'Eventos relacionados',
+ 'actions' => [
+ 'view' => [
+ 'Activos fijos',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Activos fijos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Activos fijos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Gestión de Relación con los Clientes
+ 'crm' => [
+ 'name' => 'Gestión de Relación con los Clientes',
+ 'sub_groups' => [
+ 'contacts' => [
+ 'name' => 'Contactos',
+ 'actions' => [
+ 'view' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'marketing-campaigns' => [
+ 'name' => 'Campañas de marketing',
+ 'actions' => [
+ 'view' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'leads' => [
+ 'name' => 'Oportunidades',
+ 'actions' => [
+ 'view' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'CRM',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'newsletter' => [
+ 'name' => 'Newsletter',
+ 'actions' => [
+ 'view' => [
+ 'Administrador Web',
+ 'CRM',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Administrador Web',
+ 'CRM',
+ 'Gerente',
+ ],
+ 'delete' => []
+ ]
+ ],
+ ]
+ ],
+
+ // Gastos y compras
+ 'purchases' => [
+ 'name' => 'Gastos y compras',
+ 'sub_groups' => [
+ 'dashboard' => [
+ 'name' => 'Tablero',
+ 'actions' => [
+ 'allow' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'supplier' => [
+ 'name' => 'Proveedores',
+ 'actions' => [
+ 'view' => [
+ 'Compras y gastos',
+ 'Gerente',
+ 'Finanzas',
+ ],
+ 'create' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'orders' => [
+ 'name' => 'Órdenes de compras',
+ 'actions' => [
+ 'view' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'purchases' => [
+ 'name' => 'Compras y gastos',
+ 'actions' => [
+ 'view' => [
+ 'Compras y gastos',
+ 'Gerente',
+ 'Finanzas',
+ ],
+ 'create' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ]
+ ]
+ ],
+ ]
+ ],
+
+ // Productos y servicios
+ 'products' => [
+ 'name' => 'Productos y servicios',
+ 'sub_groups' => [
+ 'categories' => [
+ 'name' => 'Categorías de productos',
+ 'actions' => [
+ 'view' => [
+ 'Productos y servicios',
+ 'Activos fijos',
+ 'Compras y gastos',
+ 'Vendedor',
+ 'Gerente',
+ 'Facturación',
+ 'Facturación avanzado',
+ ],
+ 'create' => [
+ 'Productos y servicios',
+ 'Activos fijos',
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Productos y servicios',
+ 'Activos fijos',
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'catalogs' => [
+ 'name' => 'Catalogos de productos',
+ 'actions' => [
+ 'view' => [
+ 'Productos y servicios',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Productos y servicios',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Productos y servicios',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'products' => [
+ 'name' => 'Productos',
+ 'actions' => [
+ 'view' => [
+ 'Productos y servicios',
+ 'Activos fijos',
+ 'Compras y gastos',
+ 'Vendedor',
+ 'Gerente',
+ 'Facturación',
+ 'Facturación avanzado',
+ ],
+ 'create' => [
+ 'Productos y servicios',
+ 'Activos fijos',
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Productos y servicios',
+ 'Activos fijos',
+ 'Compras y gastos',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ],
+ ],
+
+ // Punto de venta
+ 'pos' => [
+ 'name' => 'Punto de venta',
+ 'sub_groups' => [
+ 'dashboard' => [
+ 'name' => 'Tablero',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'pricelists-config' => [
+ 'name' => 'listas de precios',
+ 'actions' => [
+ 'view' => [
+ 'Productos y servicios',
+ 'Compras y gastos',
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Gerente',
+ ],
+ 'delete' => [],
+ ]
+ ],
+ 'ticket-config' => [
+ 'name' => 'Ticket de punto de venta',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'catalogs' => [
+ 'name' => 'Catalogos de punto de venta',
+ 'actions' => [
+ 'view' => [
+ 'Productos y servicios',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Productos y servicios',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Productos y servicios',
+ 'Gerente',
+ ],
+ 'delete' => [],
+ ]
+ ],
+ 'customers' => [
+ 'name' => 'Clientes',
+ 'actions' => [
+ 'view' => [
+ 'Vendedor',
+ 'Gerente',
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Finanzas',
+ ],
+ 'create' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Vendedor',
+ 'Gerente',
+ 'Facturación',
+ 'Facturación avanzado',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'quotes' => [
+ 'name' => 'Cotizaciones',
+ 'actions' => [
+ 'view' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'sales' => [
+ 'name' => 'Ventas',
+ 'actions' => [
+ 'view' => [
+ 'Vendedor',
+ 'Gerente',
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Finanzas',
+ ],
+ 'create' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'modify-sale-price' => [
+ 'name' => 'Modificar precio de venta',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'apply-discounts' => [
+ 'name' => 'Aplicar descuentos',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'allow-negative-iventory' => [
+ 'name' => 'Permitir venta con inventario negativo',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'remissions' => [
+ 'name' => 'Remisiones',
+ 'actions' => [
+ 'view' => [
+ 'Vendedor',
+ 'Gerente',
+ 'Finanzas',
+ ],
+ 'create' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'credit-notes' => [
+ 'name' => 'Notas de crédito',
+ 'actions' => [
+ 'view' => [
+ 'Vendedor',
+ 'Gerente',
+ 'Finanzas',
+ ],
+ 'create' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Vendedor',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Facturación
+ 'billing' => [
+ 'name' => 'Facturación',
+ 'sub_groups' => [
+ 'dashboard' => [
+ 'name' => 'Tablero',
+ 'actions' => [
+ 'allow' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'general-settings' => [
+ 'name' => 'Configuraciones de facturación',
+ 'actions' => [
+ 'allow' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'csds-settings' => [
+ 'name' => 'Certificados de Sello Digital',
+ 'actions' => [
+ 'allow' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'smtp-settings' => [
+ 'name' => 'Correo SMTP de facturación',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'stamping-package' => [
+ 'name' => 'Paquete de timbrado',
+ 'actions' => [
+ 'allow' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'ingresos' => [
+ 'name' => 'Facturación CFDI Ingresos',
+ 'actions' => [
+ 'view' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'egresos' => [
+ 'name' => 'Facturación CFDI Egresos',
+ 'actions' => [
+ 'view' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'pagos' => [
+ 'name' => 'Facturación CFDI Pagos',
+ 'actions' => [
+ 'view' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'nomina' => [
+ 'name' => 'Facturación CFDI Nómina',
+ 'actions' => [
+ 'view' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Facturación avanzado',
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'verify-cfdi' => [
+ 'name' => 'Verificador de CFDI 4.0',
+ 'actions' => [
+ 'allow' => [
+ 'Facturación',
+ 'Facturación avanzado',
+ 'Gerente',
+ ]
+ ]
+ ],
+ ],
+ ],
+
+ // Finanzas
+ 'finance' => [
+ 'name' => 'Finanzas',
+ 'sub_groups' => [
+ 'dashboard' => [
+ 'name' => 'Tablero',
+ 'actions' => [
+ 'allow' => [
+ 'Finanzas',
+ 'Gerente',
+ ]
+ ]
+ ],
+ 'accounting-charts' => [
+ 'name' => 'Catálogos de cuentas contables',
+ 'actions' => [
+ 'view' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'accounts-payable' => [
+ 'name' => 'Cuentas por pagar',
+ 'actions' => [
+ 'view' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ 'accounts-receivable' => [
+ 'name' => 'Cuentas por cobrar',
+ 'actions' => [
+ 'view' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'create' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'edit' => [
+ 'Finanzas',
+ 'Gerente',
+ ],
+ 'cancel' => [
+ 'Gerente',
+ ],
+ 'delete' => [
+ 'Gerente',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Blog
+ 'blog' => [
+ 'name' => 'Blog',
+ 'sub_groups' => [
+ 'categories' => [
+ 'name' => 'Categorias',
+ 'actions' => [
+ 'view' => [
+ 'Editor',
+ ],
+ 'create' => [
+ 'Editor',
+ ],
+ 'edit' => [
+ 'Editor',
+ ],
+ 'delete' => [
+ 'Editor',
+ ],
+ ]
+ ],
+ 'tags' => [
+ 'name' => 'Etiquetas',
+ 'actions' => [
+ 'view' => [
+ 'Editor',
+ ],
+ 'create' => [
+ 'Editor',
+ ],
+ 'edit' => [
+ 'Editor',
+ ],
+ 'delete' => [
+ 'Editor',
+ ],
+ ]
+ ],
+ 'articles' => [
+ 'name' => 'Articulos',
+ 'actions' => [
+ 'view' => [
+ 'Editor',
+ ],
+ 'create' => [
+ 'Editor',
+ ],
+ 'edit' => [
+ 'Editor',
+ ],
+ 'delete' => [
+ 'Editor',
+ ],
+ ]
+ ],
+ 'comments' => [
+ 'name' => 'Comentarios',
+ 'actions' => [
+ 'view' => [
+ 'Editor',
+ ],
+ 'create' => [
+ 'Editor',
+ ],
+ 'edit' => [
+ 'Editor',
+ ],
+ 'delete' => [
+ 'Editor',
+ ],
+ ]
+ ],
+ ]
+ ],
+
+ // Sistema
+ 'system' => [
+ 'name' => 'Sistema',
+ 'sub_groups' => [
+ 'users' => [
+ 'name' => 'Usuarios de sistema',
+ 'actions' => [
+ 'view' => [
+ 'Gerente',
+ ],
+ 'create' => [],
+ 'edit' => [],
+ 'delete' => []
+ ]
+ ],
+ 'roles' => [
+ 'name' => 'Roles de usuario',
+ 'actions' => [
+ 'view' => [
+ 'Gerente',
+ ],
+ 'create' => [],
+ 'edit' => [],
+ 'delete' => []
+ ]
+ ],
+ 'permissions' => [
+ 'name' => 'Permisos de usuarios',
+ 'actions' => [
+ 'view' => []
+ ]
+ ]
+ ]
+ ],
+
+ // Importación
+ 'import' => [
+ 'name' => 'Importar',
+ 'sub_groups' => [
+ 'catalogs-sat' => [
+ 'name' => 'Importar Catálogos CFDI 4.0',
+ 'actions' => [
+ 'allow' => []
+ ]
+ ]
+ ]
+ ],
+
+ // Exportación
+ 'export' => [
+ 'name' => 'Exportar',
+ 'sub_groups' => [
+ 'customers' => [
+ 'name' => 'Exportar clientes',
+ 'actions' => [
+ 'allow' => [
+ 'Gerente',
+ ]
+ ]
+ ]
+ ]
+ ],
+
+ ];
+
+ /**
+ * Run the database seeds.
+ *
+ * @return void
+ */
+ public function run()
+ {
+ foreach ($this->roles as $role) {
+ Role::create($role);
+ }
+
+ $group_blockId = 0;
+
+ foreach ($this->permissions as $group_idx => $group) {
+ $sub_group_blockId = 0;
+
+ foreach ($group['sub_groups'] as $sub_group_idx => $sub_group) {
+ $action_id = 0;
+
+ foreach ($sub_group['actions'] as $action => $roleNames) {
+ $roles_default = ['SuperAdmin'];
+
+ // Default Admin role
+ if ("{$group_idx}.{$sub_group_idx}" != 'system.permissions')
+ $roles_default[] = 'Admin';
+
+ // Default Auditor role
+ if ($sub_group_idx == 'dashboard' || $action == 'view')
+ $roles_default[] = 'Auditor';
+
+ Permission::create([
+ 'id' => ($group_blockId * 1000) + ($sub_group_blockId * 10) + $action_id++,
+ 'name' => "{$group_idx}.{$sub_group_idx}.{$action}",
+ 'group_name' => $group['name'],
+ 'sub_group_name' => $sub_group['name'],
+ 'action' => $action,
+ ])->syncRoles(array_merge($roles_default, $roleNames));
+ }
+
+ $sub_group_blockId++;
+ }
+
+ $group_blockId++;
+ }
+
+ app()->make(\Spatie\Permission\PermissionRegistrar::class)->forgetCachedPermissions();
+ }
+}
diff --git a/modules/Admin/Database/seeders/SATCatalogsSeeder.php b/modules/Admin/Database/seeders/SATCatalogsSeeder.php
new file mode 100644
index 0000000..68ed0dd
--- /dev/null
+++ b/modules/Admin/Database/seeders/SATCatalogsSeeder.php
@@ -0,0 +1,83 @@
+console = $console;
+ }
+
+ /**
+ * Run the database seeds.
+ *
+ * @return void
+ */
+ public function run()
+ {
+ $this->importCatCFDIV4(base_path("modules/Admin/Database/data/catCFDI_V_4_20241121.xls"));
+ $this->importCatBancos(base_path('modules/Admin/Database/data/catalog-sat_bancos.json'));
+ }
+
+ private function importCatCFDIV4($file_path)
+ {
+ $import = new SatCatalogsImport($this->console);
+
+ $sheets = [
+ 'c_FormaPago',
+ 'c_Moneda',
+ 'c_CodigoPostal_Parte_1',
+ 'c_CodigoPostal_Parte_2',
+ 'c_RegimenFiscal',
+ 'c_Pais',
+ 'c_UsoCFDI',
+ 'C_Colonia_1',
+ 'C_Colonia_2',
+ 'C_Colonia_3',
+ 'c_Estado',
+ 'C_Localidad',
+ 'C_Municipio',
+ ];
+
+ $this->command->getOutput()->progressStart(count($sheets));
+
+ foreach ($sheets as $sheet) {
+ $import = new SatCatalogsImport();
+ $import->onlySheets($sheet);
+
+ Excel::import($import, $file_path);
+
+ $this->command->getOutput()->progressAdvance();
+ }
+
+ $this->command->getOutput()->progressFinish();
+ }
+
+ private function importCatBancos($file_path)
+ {
+ $json = File::get($file_path);
+
+ // Convierte el contenido JSON a un array asociativo
+ $bancos = json_decode($json, true);
+
+ // Inserta cada banco en la base de datos
+ foreach ($bancos as $banco) {
+ Banco::create([
+ 'c_banco' => $banco['c_banco'],
+ 'descripcion' => $banco['descripcion'],
+ 'razon_social' => $banco['razon_social'],
+ 'rfc' => null,
+ 'status' => Banco::STATUS_ENABLED,
+ ]);
+ }
+ }
+}
diff --git a/modules/Admin/Database/seeders/SettingSeeder.php b/modules/Admin/Database/seeders/SettingSeeder.php
new file mode 100644
index 0000000..4ec2a15
--- /dev/null
+++ b/modules/Admin/Database/seeders/SettingSeeder.php
@@ -0,0 +1,108 @@
+ '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/modules/Admin/ModuleServiceProvider.php b/modules/Admin/ModuleServiceProvider.php
new file mode 100644
index 0000000..a934b80
--- /dev/null
+++ b/modules/Admin/ModuleServiceProvider.php
@@ -0,0 +1,112 @@
+app->register(FortifyServiceProvider::class);
+ $this->app->register(PermissionServiceProvider::class);
+ $this->app->register(GlobalSettingsProvider::class);
+ $this->app->register(VuexyAdminProvider::class);
+ }
+
+
+ public function boot()
+ {
+ // Registrar alias del middleware
+ $this->app['router']->aliasMiddleware('admin.settings', AdminTemplateMiddleware::class);
+
+ // Register the module's routes
+ Route::middleware(['web'])->group(__DIR__ . '/routes.php');
+
+ // Register the module's views and resources
+ $this->loadViewsFrom(__DIR__ . '/Resources/views', 'admin');
+
+ // Register the migrations
+ $this->loadMigrationsFrom(__DIR__ . '/Database/migrations');
+
+ // Registrar manualmente listeners
+ Event::listen(Login::class, HandleUserLogin::class);
+ Event::listen(Logout::class, ClearUserCache::class);
+
+ // Register the module's Livewire components
+ Livewire::component('user-count', UserCount::class);
+ Livewire::component('user-table', UserTable::class);
+ Livewire::component('role-card', RoleCards::class);
+ Livewire::component('permissions-index', PermissionsIndex::class);
+
+ Livewire::component('general-settings', GeneralSettings::class);
+ Livewire::component('application-settings', ApplicationSettings::class);
+ Livewire::component('interface-settings', InterfaceSettings::class);
+
+ Livewire::component('cache-stats', CacheStats::class);
+ Livewire::component('session-stats', SessionStats::class);
+ Livewire::component('redis-stats', RedisStats::class);
+ Livewire::component('memcached-stats', MemcachedStats::class);
+ Livewire::component('cache-functions', CacheFunctions::class);
+
+ Livewire::component('mail-smtp-settings', MailSmtpSettings::class);
+ Livewire::component('mail-sender-response-settings', MailSenderResponseSettings::class);
+
+ Livewire::component('website-settings', WebsiteSettings::class);
+ Livewire::component('website-favicon-settings', FaviconSettings::class);
+ Livewire::component('website-image-logo-settings', ImageLogoSettings::class);
+ Livewire::component('website-social-settings', SocialSettings::class);
+ Livewire::component('website-contact-form-settings', ContactFormSettings::class);
+ Livewire::component('website-contact-info-settings', ContactInfoSettings::class);
+ Livewire::component('website-location-settings', LocationSettings::class);
+ Livewire::component('website-chat-settings', ChatSettings::class);
+ Livewire::component('website-analytics-settings', AnalyticsSettings::class);
+ Livewire::component('website-template-settings', TemplateSettings::class);
+ Livewire::component('website-legal-settings', LegalSettings::class);
+
+ // Enable auditing
+ User::observe(AuditableObserver::class);
+ }
+}
diff --git a/modules/Admin/Resources/assets/css/demo.css b/modules/Admin/Resources/assets/css/demo.css
new file mode 100644
index 0000000..ec996c1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/js/config.js b/modules/Admin/Resources/assets/js/config.js
new file mode 100644
index 0000000..cdc42a0
--- /dev/null
+++ b/modules/Admin/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 = true; // set true for rtl support (rtl + ltr), false for ltr only.
diff --git a/modules/Admin/Resources/assets/js/main.js b/modules/Admin/Resources/assets/js/main.js
new file mode 100644
index 0000000..9482e69
--- /dev/null
+++ b/modules/Admin/Resources/assets/js/main.js
@@ -0,0 +1,375 @@
+import './quicklinks-navbar.js';
+import './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 = assetsPath + '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
+ // -------------------------
+ window.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/modules/Admin/Resources/assets/js/quicklinks-navbar.js b/modules/Admin/Resources/assets/js/quicklinks-navbar.js
new file mode 100644
index 0000000..1fd95cb
--- /dev/null
+++ b/modules/Admin/Resources/assets/js/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/modules/Admin/Resources/assets/js/search-navbar.js b/modules/Admin/Resources/assets/js/search-navbar.js
new file mode 100644
index 0000000..7eb2085
--- /dev/null
+++ b/modules/Admin/Resources/assets/js/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/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OFL.txt b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OFL.txt
new file mode 100644
index 0000000..cb7002a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2020 The Open Sans Project Authors (https://github.com/googlefonts/opensans)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OpenSans-Italic-VariableFont_wdth,wght.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OpenSans-Italic-VariableFont_wdth,wght.ttf
new file mode 100644
index 0000000..8312b2c
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OpenSans-Italic-VariableFont_wdth,wght.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OpenSans-VariableFont_wdth,wght.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OpenSans-VariableFont_wdth,wght.ttf
new file mode 100644
index 0000000..ac587b4
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/OpenSans-VariableFont_wdth,wght.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/README.txt b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/README.txt
new file mode 100644
index 0000000..2548322
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/README.txt
@@ -0,0 +1,100 @@
+Open Sans Variable Font
+=======================
+
+This download contains Open Sans as both variable fonts and static fonts.
+
+Open Sans is a variable font with these axes:
+ wdth
+ wght
+
+This means all the styles are contained in these files:
+ OpenSans-VariableFont_wdth,wght.ttf
+ OpenSans-Italic-VariableFont_wdth,wght.ttf
+
+If your app fully supports variable fonts, you can now pick intermediate styles
+that aren’t available as static fonts. Not all apps support variable fonts, and
+in those cases you can use the static font files for Open Sans:
+ static/OpenSans_Condensed-Light.ttf
+ static/OpenSans_Condensed-Regular.ttf
+ static/OpenSans_Condensed-Medium.ttf
+ static/OpenSans_Condensed-SemiBold.ttf
+ static/OpenSans_Condensed-Bold.ttf
+ static/OpenSans_Condensed-ExtraBold.ttf
+ static/OpenSans_SemiCondensed-Light.ttf
+ static/OpenSans_SemiCondensed-Regular.ttf
+ static/OpenSans_SemiCondensed-Medium.ttf
+ static/OpenSans_SemiCondensed-SemiBold.ttf
+ static/OpenSans_SemiCondensed-Bold.ttf
+ static/OpenSans_SemiCondensed-ExtraBold.ttf
+ static/OpenSans-Light.ttf
+ static/OpenSans-Regular.ttf
+ static/OpenSans-Medium.ttf
+ static/OpenSans-SemiBold.ttf
+ static/OpenSans-Bold.ttf
+ static/OpenSans-ExtraBold.ttf
+ static/OpenSans_Condensed-LightItalic.ttf
+ static/OpenSans_Condensed-Italic.ttf
+ static/OpenSans_Condensed-MediumItalic.ttf
+ static/OpenSans_Condensed-SemiBoldItalic.ttf
+ static/OpenSans_Condensed-BoldItalic.ttf
+ static/OpenSans_Condensed-ExtraBoldItalic.ttf
+ static/OpenSans_SemiCondensed-LightItalic.ttf
+ static/OpenSans_SemiCondensed-Italic.ttf
+ static/OpenSans_SemiCondensed-MediumItalic.ttf
+ static/OpenSans_SemiCondensed-SemiBoldItalic.ttf
+ static/OpenSans_SemiCondensed-BoldItalic.ttf
+ static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf
+ static/OpenSans-LightItalic.ttf
+ static/OpenSans-Italic.ttf
+ static/OpenSans-MediumItalic.ttf
+ static/OpenSans-SemiBoldItalic.ttf
+ static/OpenSans-BoldItalic.ttf
+ static/OpenSans-ExtraBoldItalic.ttf
+
+Get started
+-----------
+
+1. Install the font files you want to use
+
+2. Use your app's font picker to view the font family and all the
+available styles
+
+Learn more about variable fonts
+-------------------------------
+
+ https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
+ https://variablefonts.typenetwork.com
+ https://medium.com/variable-fonts
+
+In desktop apps
+
+ https://theblog.adobe.com/can-variable-fonts-illustrator-cc
+ https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
+
+Online
+
+ https://developers.google.com/fonts/docs/getting_started
+ https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
+ https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
+
+Installing fonts
+
+ MacOS: https://support.apple.com/en-us/HT201749
+ Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
+ Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
+
+Android Apps
+
+ https://developers.google.com/fonts/docs/android
+ https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
+
+License
+-------
+Please read the full license text (OFL.txt) to understand the permissions,
+restrictions and requirements for usage, redistribution, and modification.
+
+You can use them in your products & projects – print or digital,
+commercial or otherwise.
+
+This isn't legal advice, please consider consulting a lawyer and see the full
+license for all details.
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Bold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Bold.ttf
new file mode 100644
index 0000000..98c74e0
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Bold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-BoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-BoldItalic.ttf
new file mode 100644
index 0000000..8558928
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-BoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-ExtraBold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-ExtraBold.ttf
new file mode 100644
index 0000000..4eb3393
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-ExtraBold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-ExtraBoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..75789b4
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-ExtraBoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Italic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Italic.ttf
new file mode 100644
index 0000000..29ff693
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Italic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Light.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Light.ttf
new file mode 100644
index 0000000..ea175cc
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Light.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-LightItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-LightItalic.ttf
new file mode 100644
index 0000000..edbfe0b
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-LightItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Medium.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Medium.ttf
new file mode 100644
index 0000000..ae71693
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Medium.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-MediumItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-MediumItalic.ttf
new file mode 100644
index 0000000..6d1e09b
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-MediumItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Regular.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Regular.ttf
new file mode 100644
index 0000000..67803bb
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-Regular.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-SemiBold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-SemiBold.ttf
new file mode 100644
index 0000000..e5ab464
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-SemiBold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-SemiBoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-SemiBoldItalic.ttf
new file mode 100644
index 0000000..cd23e15
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans-SemiBoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Bold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Bold.ttf
new file mode 100644
index 0000000..525397d
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Bold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-BoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-BoldItalic.ttf
new file mode 100644
index 0000000..d6c9bc0
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-BoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-ExtraBold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-ExtraBold.ttf
new file mode 100644
index 0000000..3e600b9
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-ExtraBold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-ExtraBoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..0393650
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-ExtraBoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Italic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Italic.ttf
new file mode 100644
index 0000000..fdf0a52
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Italic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Light.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Light.ttf
new file mode 100644
index 0000000..459be7b
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Light.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-LightItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-LightItalic.ttf
new file mode 100644
index 0000000..5f05d08
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-LightItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Medium.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Medium.ttf
new file mode 100644
index 0000000..802200d
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Medium.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-MediumItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-MediumItalic.ttf
new file mode 100644
index 0000000..b43786b
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-MediumItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Regular.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Regular.ttf
new file mode 100644
index 0000000..a2a83ac
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-Regular.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-SemiBold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-SemiBold.ttf
new file mode 100644
index 0000000..75bcd43
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-SemiBold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-SemiBoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-SemiBoldItalic.ttf
new file mode 100644
index 0000000..9fcaa52
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_Condensed-SemiBoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Bold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Bold.ttf
new file mode 100644
index 0000000..dc927fc
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Bold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-BoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-BoldItalic.ttf
new file mode 100644
index 0000000..7601048
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-BoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-ExtraBold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-ExtraBold.ttf
new file mode 100644
index 0000000..d6864b1
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-ExtraBold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..ec7ade5
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Italic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Italic.ttf
new file mode 100644
index 0000000..7fc00c8
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Italic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Light.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Light.ttf
new file mode 100644
index 0000000..5936496
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Light.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-LightItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-LightItalic.ttf
new file mode 100644
index 0000000..7ced21a
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-LightItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Medium.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Medium.ttf
new file mode 100644
index 0000000..25b1aad
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Medium.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-MediumItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-MediumItalic.ttf
new file mode 100644
index 0000000..fd87f78
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-MediumItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Regular.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Regular.ttf
new file mode 100644
index 0000000..5b09b35
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-Regular.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-SemiBold.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-SemiBold.ttf
new file mode 100644
index 0000000..fff3a37
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-SemiBold.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf
new file mode 100644
index 0000000..3874205
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/OpenSans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flag-icons.scss b/modules/Admin/Resources/assets/vendor/fonts/flag-icons.scss
new file mode 100644
index 0000000..800264c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flag-icons.scss
@@ -0,0 +1,7 @@
+$flag-icons-path: '../fonts/flags';
+
+@import 'flag-icons/sass/flag-icons';
+
+.fi {
+ vertical-align: middle;
+}
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ad.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ad.svg
new file mode 100644
index 0000000..4bd91b7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ad.svg
@@ -0,0 +1,148 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ae.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ae.svg
new file mode 100644
index 0000000..b59e113
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ae.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/af.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/af.svg
new file mode 100644
index 0000000..0b7939c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/af.svg
@@ -0,0 +1,81 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ag.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ag.svg
new file mode 100644
index 0000000..9b951b6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ag.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ai.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ai.svg
new file mode 100644
index 0000000..eeaebcf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ai.svg
@@ -0,0 +1,29 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/al.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/al.svg
new file mode 100644
index 0000000..15ee8bb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/al.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/am.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/am.svg
new file mode 100644
index 0000000..a188adf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/am.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ao.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ao.svg
new file mode 100644
index 0000000..46d6600
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ao.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/aq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/aq.svg
new file mode 100644
index 0000000..a4d9a20
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/aq.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ar.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ar.svg
new file mode 100644
index 0000000..984d6ea
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ar.svg
@@ -0,0 +1,32 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/arab.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/arab.svg
new file mode 100644
index 0000000..841f11a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/arab.svg
@@ -0,0 +1,109 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/as.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/as.svg
new file mode 100644
index 0000000..b0789e9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/as.svg
@@ -0,0 +1,73 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/at.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/at.svg
new file mode 100644
index 0000000..758ced6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/at.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/au.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/au.svg
new file mode 100644
index 0000000..38bb245
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/au.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/aw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/aw.svg
new file mode 100644
index 0000000..1f03d61
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/aw.svg
@@ -0,0 +1,186 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ax.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ax.svg
new file mode 100644
index 0000000..481d2a3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ax.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/az.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/az.svg
new file mode 100644
index 0000000..d692e22
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/az.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ba.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ba.svg
new file mode 100644
index 0000000..456ca12
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ba.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bb.svg
new file mode 100644
index 0000000..5af2bd0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bb.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bd.svg
new file mode 100644
index 0000000..86fcfba
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bd.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/be.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/be.svg
new file mode 100644
index 0000000..31d6210
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/be.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bf.svg
new file mode 100644
index 0000000..a5078df
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bf.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bg.svg
new file mode 100644
index 0000000..78412c5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bg.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bh.svg
new file mode 100644
index 0000000..2d131aa
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bh.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bi.svg
new file mode 100644
index 0000000..36a0d3a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bi.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bj.svg
new file mode 100644
index 0000000..bb27414
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bj.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bl.svg
new file mode 100644
index 0000000..65550d9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bl.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bm.svg
new file mode 100644
index 0000000..b4df192
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bm.svg
@@ -0,0 +1,97 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bn.svg
new file mode 100644
index 0000000..b536651
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bn.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bo.svg
new file mode 100644
index 0000000..b69b230
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bo.svg
@@ -0,0 +1,674 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bq.svg
new file mode 100644
index 0000000..4b9168e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bq.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/br.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/br.svg
new file mode 100644
index 0000000..be62f6f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/br.svg
@@ -0,0 +1,45 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bs.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bs.svg
new file mode 100644
index 0000000..0faa4bb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bs.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bt.svg
new file mode 100644
index 0000000..81f6788
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bt.svg
@@ -0,0 +1,89 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bv.svg
new file mode 100644
index 0000000..dcc6ad1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bv.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bw.svg
new file mode 100644
index 0000000..328e13c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bw.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/by.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/by.svg
new file mode 100644
index 0000000..ab7984d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/by.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bz.svg
new file mode 100644
index 0000000..e99106a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/bz.svg
@@ -0,0 +1,145 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ca.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ca.svg
new file mode 100644
index 0000000..84cde34
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ca.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cc.svg
new file mode 100644
index 0000000..f6c1755
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cc.svg
@@ -0,0 +1,19 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cd.svg
new file mode 100644
index 0000000..ea17728
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cd.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cefta.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cefta.svg
new file mode 100644
index 0000000..ff1a19b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cefta.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cf.svg
new file mode 100644
index 0000000..b0625db
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cf.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cg.svg
new file mode 100644
index 0000000..f786884
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cg.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ch.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ch.svg
new file mode 100644
index 0000000..52578bf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ch.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ci.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ci.svg
new file mode 100644
index 0000000..2abf641
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ci.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ck.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ck.svg
new file mode 100644
index 0000000..43a1057
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ck.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cl.svg
new file mode 100644
index 0000000..5fb6096
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cl.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cm.svg
new file mode 100644
index 0000000..ed4952b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cm.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cn.svg
new file mode 100644
index 0000000..e152f01
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cn.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/co.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/co.svg
new file mode 100644
index 0000000..5804bfe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/co.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cp.svg
new file mode 100644
index 0000000..ea3bfdc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cp.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cr.svg
new file mode 100644
index 0000000..4e7889e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cr.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cu.svg
new file mode 100644
index 0000000..a284902
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cu.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cv.svg
new file mode 100644
index 0000000..1170cd7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cv.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cw.svg
new file mode 100644
index 0000000..57062ab
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cw.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cx.svg
new file mode 100644
index 0000000..f14536f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cx.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cy.svg
new file mode 100644
index 0000000..39a87c8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cy.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cz.svg
new file mode 100644
index 0000000..dcd0a6b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/cz.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/de.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/de.svg
new file mode 100644
index 0000000..05a0a69
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/de.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dg.svg
new file mode 100644
index 0000000..0b8baf1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dg.svg
@@ -0,0 +1,130 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dj.svg
new file mode 100644
index 0000000..f5534d2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dj.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dk.svg
new file mode 100644
index 0000000..5aaaa19
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dm.svg
new file mode 100644
index 0000000..6f8f366
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dm.svg
@@ -0,0 +1,152 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/do.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/do.svg
new file mode 100644
index 0000000..867e12d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/do.svg
@@ -0,0 +1,123 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dz.svg
new file mode 100644
index 0000000..8abcd25
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/dz.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eac.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eac.svg
new file mode 100644
index 0000000..385fe9d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eac.svg
@@ -0,0 +1,48 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ec.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ec.svg
new file mode 100644
index 0000000..9545c5d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ec.svg
@@ -0,0 +1,138 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ee.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ee.svg
new file mode 100644
index 0000000..5a6a7e3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ee.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eg.svg
new file mode 100644
index 0000000..3ef7711
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eg.svg
@@ -0,0 +1,38 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eh.svg
new file mode 100644
index 0000000..ae509fa
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eh.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/er.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/er.svg
new file mode 100644
index 0000000..0f140e0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/er.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-ct.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-ct.svg
new file mode 100644
index 0000000..a06a2e3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-ct.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-ga.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-ga.svg
new file mode 100644
index 0000000..2fecfa0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-ga.svg
@@ -0,0 +1,187 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-pv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-pv.svg
new file mode 100644
index 0000000..7d383ed
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es-pv.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es.svg
new file mode 100644
index 0000000..0e6338f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/es.svg
@@ -0,0 +1,547 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/et.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/et.svg
new file mode 100644
index 0000000..eb7f3c4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/et.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eu.svg
new file mode 100644
index 0000000..4a07fbe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/eu.svg
@@ -0,0 +1,28 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fi.svg
new file mode 100644
index 0000000..aba2ef3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fi.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fj.svg
new file mode 100644
index 0000000..7a1cade
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fj.svg
@@ -0,0 +1,123 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fk.svg
new file mode 100644
index 0000000..21e654f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fk.svg
@@ -0,0 +1,89 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fm.svg
new file mode 100644
index 0000000..4f7d313
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fm.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fo.svg
new file mode 100644
index 0000000..eec9945
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fo.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fr.svg
new file mode 100644
index 0000000..0f60170
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/fr.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ga.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ga.svg
new file mode 100644
index 0000000..113a5b5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ga.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-eng.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-eng.svg
new file mode 100644
index 0000000..ee48fed
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-eng.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-nir.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-nir.svg
new file mode 100644
index 0000000..77a91f0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-nir.svg
@@ -0,0 +1,131 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-sct.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-sct.svg
new file mode 100644
index 0000000..44d38cc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-sct.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-wls.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-wls.svg
new file mode 100644
index 0000000..3126882
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb-wls.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb.svg
new file mode 100644
index 0000000..ce4d1e0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gb.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gd.svg
new file mode 100644
index 0000000..c3b2cef
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gd.svg
@@ -0,0 +1,27 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ge.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ge.svg
new file mode 100644
index 0000000..53b709f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ge.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gf.svg
new file mode 100644
index 0000000..9cf5aa2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gf.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gg.svg
new file mode 100644
index 0000000..480f550
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gg.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gh.svg
new file mode 100644
index 0000000..a64271b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gh.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gi.svg
new file mode 100644
index 0000000..7b26bb2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gi.svg
@@ -0,0 +1,32 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gl.svg
new file mode 100644
index 0000000..eaa817b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gl.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gm.svg
new file mode 100644
index 0000000..2a8f724
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gm.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gn.svg
new file mode 100644
index 0000000..ae81f9d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gn.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gp.svg
new file mode 100644
index 0000000..9dd8e3b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gp.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gq.svg
new file mode 100644
index 0000000..5fd7b6a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gq.svg
@@ -0,0 +1,23 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gr.svg
new file mode 100644
index 0000000..a268830
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gr.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gs.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gs.svg
new file mode 100644
index 0000000..1db72cf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gs.svg
@@ -0,0 +1,132 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gt.svg
new file mode 100644
index 0000000..97ea6aa
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gt.svg
@@ -0,0 +1,204 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gu.svg
new file mode 100644
index 0000000..5702487
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gu.svg
@@ -0,0 +1,23 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gw.svg
new file mode 100644
index 0000000..61a0548
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gw.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gy.svg
new file mode 100644
index 0000000..35e2f08
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/gy.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hk.svg
new file mode 100644
index 0000000..eef02a1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hk.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hm.svg
new file mode 100644
index 0000000..1f4d007
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hm.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hn.svg
new file mode 100644
index 0000000..847df20
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hn.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hr.svg
new file mode 100644
index 0000000..91009eb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hr.svg
@@ -0,0 +1,56 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ht.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ht.svg
new file mode 100644
index 0000000..a61736c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ht.svg
@@ -0,0 +1,116 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hu.svg
new file mode 100644
index 0000000..088242d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/hu.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ic.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ic.svg
new file mode 100644
index 0000000..096603d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ic.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/id.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/id.svg
new file mode 100644
index 0000000..df08018
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/id.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ie.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ie.svg
new file mode 100644
index 0000000..e13de22
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ie.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/il.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/il.svg
new file mode 100644
index 0000000..0a2a6d9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/il.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/im.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/im.svg
new file mode 100644
index 0000000..cff1c4b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/im.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/in.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/in.svg
new file mode 100644
index 0000000..26a02cf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/in.svg
@@ -0,0 +1,25 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/io.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/io.svg
new file mode 100644
index 0000000..6f1a8ca
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/io.svg
@@ -0,0 +1,130 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/iq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/iq.svg
new file mode 100644
index 0000000..a64456d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/iq.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ir.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ir.svg
new file mode 100644
index 0000000..095d971
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ir.svg
@@ -0,0 +1,219 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/is.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/is.svg
new file mode 100644
index 0000000..26510b9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/is.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/it.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/it.svg
new file mode 100644
index 0000000..b9596d0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/it.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/je.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/je.svg
new file mode 100644
index 0000000..8a9fdd5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/je.svg
@@ -0,0 +1,62 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jm.svg
new file mode 100644
index 0000000..07f023c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jm.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jo.svg
new file mode 100644
index 0000000..fbbd681
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jo.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jp.svg
new file mode 100644
index 0000000..118686a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/jp.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ke.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ke.svg
new file mode 100644
index 0000000..110600e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ke.svg
@@ -0,0 +1,23 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kg.svg
new file mode 100644
index 0000000..2ab176a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kg.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kh.svg
new file mode 100644
index 0000000..4b63b32
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kh.svg
@@ -0,0 +1,61 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ki.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ki.svg
new file mode 100644
index 0000000..14dab15
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ki.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/km.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/km.svg
new file mode 100644
index 0000000..d9b7751
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/km.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kn.svg
new file mode 100644
index 0000000..42d5adf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kn.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kp.svg
new file mode 100644
index 0000000..2539304
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kp.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kr.svg
new file mode 100644
index 0000000..af3d35e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kr.svg
@@ -0,0 +1,17 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kw.svg
new file mode 100644
index 0000000..b2fe54f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kw.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ky.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ky.svg
new file mode 100644
index 0000000..e55d520
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ky.svg
@@ -0,0 +1,103 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kz.svg
new file mode 100644
index 0000000..f9f9b98
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/kz.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/la.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/la.svg
new file mode 100644
index 0000000..af70d0d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/la.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lb.svg
new file mode 100644
index 0000000..6520109
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lb.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lc.svg
new file mode 100644
index 0000000..aa18fac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lc.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/li.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/li.svg
new file mode 100644
index 0000000..bf81810
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/li.svg
@@ -0,0 +1,43 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lk.svg
new file mode 100644
index 0000000..08212a5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lk.svg
@@ -0,0 +1,22 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lr.svg
new file mode 100644
index 0000000..74382ab
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lr.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ls.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ls.svg
new file mode 100644
index 0000000..605c087
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ls.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lt.svg
new file mode 100644
index 0000000..52ada94
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lt.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lu.svg
new file mode 100644
index 0000000..037c315
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lu.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lv.svg
new file mode 100644
index 0000000..5af883c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/lv.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ly.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ly.svg
new file mode 100644
index 0000000..4375a9e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ly.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ma.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ma.svg
new file mode 100644
index 0000000..8041667
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ma.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mc.svg
new file mode 100644
index 0000000..04173a4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mc.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/md.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/md.svg
new file mode 100644
index 0000000..18a77ea
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/md.svg
@@ -0,0 +1,71 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/me.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/me.svg
new file mode 100644
index 0000000..37e96b0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/me.svg
@@ -0,0 +1,118 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mf.svg
new file mode 100644
index 0000000..8d3285b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mf.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mg.svg
new file mode 100644
index 0000000..4f901ca
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mg.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mh.svg
new file mode 100644
index 0000000..1db268d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mh.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mk.svg
new file mode 100644
index 0000000..0ee923a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ml.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ml.svg
new file mode 100644
index 0000000..665d6b2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ml.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mm.svg
new file mode 100644
index 0000000..391f0c7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mm.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mn.svg
new file mode 100644
index 0000000..998fe5c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mn.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mo.svg
new file mode 100644
index 0000000..bd5cbcd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mo.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mp.svg
new file mode 100644
index 0000000..6179fb7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mp.svg
@@ -0,0 +1,86 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mq.svg
new file mode 100644
index 0000000..dcf0054
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mq.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mr.svg
new file mode 100644
index 0000000..ffe8c11
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mr.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ms.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ms.svg
new file mode 100644
index 0000000..c06dfcc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ms.svg
@@ -0,0 +1,25 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mt.svg
new file mode 100644
index 0000000..f534315
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mt.svg
@@ -0,0 +1,56 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mu.svg
new file mode 100644
index 0000000..2afe1d3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mu.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mv.svg
new file mode 100644
index 0000000..c9a6c5b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mv.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mw.svg
new file mode 100644
index 0000000..25bbf2e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mw.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mx.svg
new file mode 100644
index 0000000..bb991c1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mx.svg
@@ -0,0 +1,377 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/my.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/my.svg
new file mode 100644
index 0000000..b10f76e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/my.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mz.svg
new file mode 100644
index 0000000..bb75148
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/mz.svg
@@ -0,0 +1,21 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/na.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/na.svg
new file mode 100644
index 0000000..36ac8d7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/na.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nc.svg
new file mode 100644
index 0000000..1cc81eb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nc.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ne.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ne.svg
new file mode 100644
index 0000000..a96b027
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ne.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nf.svg
new file mode 100644
index 0000000..d9be156
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nf.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ng.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ng.svg
new file mode 100644
index 0000000..62813e8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ng.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ni.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ni.svg
new file mode 100644
index 0000000..847f331
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ni.svg
@@ -0,0 +1,129 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nl.svg
new file mode 100644
index 0000000..49ca5bc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nl.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/no.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/no.svg
new file mode 100644
index 0000000..939920d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/no.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/np.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/np.svg
new file mode 100644
index 0000000..498a100
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/np.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nr.svg
new file mode 100644
index 0000000..c8c827e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nr.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nu.svg
new file mode 100644
index 0000000..ce31672
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nu.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nz.svg
new file mode 100644
index 0000000..ee617d6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/nz.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/om.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/om.svg
new file mode 100644
index 0000000..2021f93
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/om.svg
@@ -0,0 +1,115 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pa.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pa.svg
new file mode 100644
index 0000000..108c40b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pa.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pc.svg
new file mode 100644
index 0000000..a38dd21
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pc.svg
@@ -0,0 +1,33 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pe.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pe.svg
new file mode 100644
index 0000000..9ba4c61
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pe.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pf.svg
new file mode 100644
index 0000000..92b2803
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pf.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pg.svg
new file mode 100644
index 0000000..8c8a2b8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pg.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ph.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ph.svg
new file mode 100644
index 0000000..7ae39fe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ph.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pk.svg
new file mode 100644
index 0000000..e71cd92
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pk.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pl.svg
new file mode 100644
index 0000000..8c43577
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pl.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pm.svg
new file mode 100644
index 0000000..950c6e8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pm.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pn.svg
new file mode 100644
index 0000000..0bae95e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pn.svg
@@ -0,0 +1,53 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pr.svg
new file mode 100644
index 0000000..eb302ad
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pr.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ps.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ps.svg
new file mode 100644
index 0000000..2c10079
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ps.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pt.svg
new file mode 100644
index 0000000..95ad6d7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pt.svg
@@ -0,0 +1,57 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pw.svg
new file mode 100644
index 0000000..ef6be79
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/pw.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/py.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/py.svg
new file mode 100644
index 0000000..e7e1bce
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/py.svg
@@ -0,0 +1,156 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/qa.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/qa.svg
new file mode 100644
index 0000000..897a21b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/qa.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/re.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/re.svg
new file mode 100644
index 0000000..41d87d9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/re.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ro.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ro.svg
new file mode 100644
index 0000000..e6cf0f6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ro.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/rs.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/rs.svg
new file mode 100644
index 0000000..d10ebb3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/rs.svg
@@ -0,0 +1,296 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ru.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ru.svg
new file mode 100644
index 0000000..f428b0c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ru.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/rw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/rw.svg
new file mode 100644
index 0000000..3d484fd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/rw.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sa.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sa.svg
new file mode 100644
index 0000000..fd6418e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sa.svg
@@ -0,0 +1,25 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sb.svg
new file mode 100644
index 0000000..398c708
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sb.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sc.svg
new file mode 100644
index 0000000..2996bac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sc.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sd.svg
new file mode 100644
index 0000000..0b9abdc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sd.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/se.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/se.svg
new file mode 100644
index 0000000..8f3f134
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/se.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sg.svg
new file mode 100644
index 0000000..60625e9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sg.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-ac.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-ac.svg
new file mode 100644
index 0000000..85cd9d1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-ac.svg
@@ -0,0 +1,690 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-hl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-hl.svg
new file mode 100644
index 0000000..4cb1990
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-hl.svg
@@ -0,0 +1,164 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-ta.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-ta.svg
new file mode 100644
index 0000000..7933fc2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh-ta.svg
@@ -0,0 +1,76 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh.svg
new file mode 100644
index 0000000..2fd3727
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sh.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/si.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/si.svg
new file mode 100644
index 0000000..33a03c6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/si.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sj.svg
new file mode 100644
index 0000000..ecb9c79
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sj.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sk.svg
new file mode 100644
index 0000000..d186822
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sk.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sl.svg
new file mode 100644
index 0000000..b649f1b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sl.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sm.svg
new file mode 100644
index 0000000..30c2490
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sm.svg
@@ -0,0 +1,73 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sn.svg
new file mode 100644
index 0000000..ff9cf2e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sn.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/so.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/so.svg
new file mode 100644
index 0000000..4848dbe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/so.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sr.svg
new file mode 100644
index 0000000..0ca3596
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sr.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ss.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ss.svg
new file mode 100644
index 0000000..bb50fac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ss.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/st.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/st.svg
new file mode 100644
index 0000000..c5e7c5c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/st.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sv.svg
new file mode 100644
index 0000000..14e98b0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sv.svg
@@ -0,0 +1,594 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sx.svg
new file mode 100644
index 0000000..758f483
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sx.svg
@@ -0,0 +1,56 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sy.svg
new file mode 100644
index 0000000..39e63f7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sy.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sz.svg
new file mode 100644
index 0000000..12ae0cd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/sz.svg
@@ -0,0 +1,34 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tc.svg
new file mode 100644
index 0000000..0b5af98
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tc.svg
@@ -0,0 +1,50 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/td.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/td.svg
new file mode 100644
index 0000000..8201312
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/td.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tf.svg
new file mode 100644
index 0000000..1ab7f6a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tf.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tg.svg
new file mode 100644
index 0000000..32c28af
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tg.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/th.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/th.svg
new file mode 100644
index 0000000..35141d3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/th.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tj.svg
new file mode 100644
index 0000000..9232ec1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tj.svg
@@ -0,0 +1,26 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tk.svg
new file mode 100644
index 0000000..9ff92e5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tl.svg
new file mode 100644
index 0000000..4fbb245
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tl.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tm.svg
new file mode 100644
index 0000000..ac39386
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tm.svg
@@ -0,0 +1,205 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tn.svg
new file mode 100644
index 0000000..ab3e36e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tn.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/to.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/to.svg
new file mode 100644
index 0000000..3f1b600
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/to.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tr.svg
new file mode 100644
index 0000000..0fe9017
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tr.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tt.svg
new file mode 100644
index 0000000..0f7f26e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tt.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tv.svg
new file mode 100644
index 0000000..098b916
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tv.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tw.svg
new file mode 100644
index 0000000..83f4e44
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tw.svg
@@ -0,0 +1,32 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tz.svg
new file mode 100644
index 0000000..846cbb5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/tz.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ua.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ua.svg
new file mode 100644
index 0000000..7ceb894
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ua.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ug.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ug.svg
new file mode 100644
index 0000000..a82a8fc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ug.svg
@@ -0,0 +1,30 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/um.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/um.svg
new file mode 100644
index 0000000..b8d4502
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/um.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/un.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/un.svg
new file mode 100644
index 0000000..322569d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/un.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/us.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/us.svg
new file mode 100644
index 0000000..a722047
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/us.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/uy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/uy.svg
new file mode 100644
index 0000000..f6b08b2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/uy.svg
@@ -0,0 +1,28 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/uz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/uz.svg
new file mode 100644
index 0000000..3385bc5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/uz.svg
@@ -0,0 +1,30 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/va.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/va.svg
new file mode 100644
index 0000000..9348ad2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/va.svg
@@ -0,0 +1,190 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vc.svg
new file mode 100644
index 0000000..21d41a8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vc.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ve.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ve.svg
new file mode 100644
index 0000000..665135b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ve.svg
@@ -0,0 +1,26 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vg.svg
new file mode 100644
index 0000000..cfcbbba
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vg.svg
@@ -0,0 +1,59 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vi.svg
new file mode 100644
index 0000000..081f8c6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vi.svg
@@ -0,0 +1,28 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vn.svg
new file mode 100644
index 0000000..49a68f0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vn.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vu.svg
new file mode 100644
index 0000000..0e695b9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/vu.svg
@@ -0,0 +1,21 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/wf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/wf.svg
new file mode 100644
index 0000000..5ba64e4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/wf.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ws.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ws.svg
new file mode 100644
index 0000000..ab08fdb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ws.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/xk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/xk.svg
new file mode 100644
index 0000000..28bdead
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/xk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/xx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/xx.svg
new file mode 100644
index 0000000..5a44cb7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/xx.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ye.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ye.svg
new file mode 100644
index 0000000..2ccb23b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/ye.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/yt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/yt.svg
new file mode 100644
index 0000000..41a4408
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/yt.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/za.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/za.svg
new file mode 100644
index 0000000..397696e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/za.svg
@@ -0,0 +1,17 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/zm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/zm.svg
new file mode 100644
index 0000000..a2084fb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/zm.svg
@@ -0,0 +1,27 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/zw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/zw.svg
new file mode 100644
index 0000000..98e1a42
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/1x1/zw.svg
@@ -0,0 +1,21 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ad.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ad.svg
new file mode 100644
index 0000000..067ab77
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ad.svg
@@ -0,0 +1,150 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ae.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ae.svg
new file mode 100644
index 0000000..651ac85
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ae.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/af.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/af.svg
new file mode 100644
index 0000000..521ac4c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/af.svg
@@ -0,0 +1,81 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ag.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ag.svg
new file mode 100644
index 0000000..243c3d8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ag.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ai.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ai.svg
new file mode 100644
index 0000000..628ad9b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ai.svg
@@ -0,0 +1,29 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/al.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/al.svg
new file mode 100644
index 0000000..1135b4b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/al.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/am.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/am.svg
new file mode 100644
index 0000000..99fa4dc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/am.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ao.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ao.svg
new file mode 100644
index 0000000..b1863bd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ao.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/aq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/aq.svg
new file mode 100644
index 0000000..53840cc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/aq.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ar.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ar.svg
new file mode 100644
index 0000000..d20cbbd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ar.svg
@@ -0,0 +1,32 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/arab.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/arab.svg
new file mode 100644
index 0000000..96d2715
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/arab.svg
@@ -0,0 +1,109 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/as.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/as.svg
new file mode 100644
index 0000000..3543556
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/as.svg
@@ -0,0 +1,72 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/at.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/at.svg
new file mode 100644
index 0000000..9d2775c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/at.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/au.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/au.svg
new file mode 100644
index 0000000..96e8076
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/au.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/aw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/aw.svg
new file mode 100644
index 0000000..413b7c4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/aw.svg
@@ -0,0 +1,186 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ax.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ax.svg
new file mode 100644
index 0000000..0584d71
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ax.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/az.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/az.svg
new file mode 100644
index 0000000..3557522
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/az.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ba.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ba.svg
new file mode 100644
index 0000000..93bd9cf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ba.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bb.svg
new file mode 100644
index 0000000..cecd5cc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bb.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bd.svg
new file mode 100644
index 0000000..16b794d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bd.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/be.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/be.svg
new file mode 100644
index 0000000..ac706a0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/be.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bf.svg
new file mode 100644
index 0000000..4713822
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bf.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bg.svg
new file mode 100644
index 0000000..af2d0d0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bg.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bh.svg
new file mode 100644
index 0000000..7a2ea54
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bh.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bi.svg
new file mode 100644
index 0000000..a4434a9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bi.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bj.svg
new file mode 100644
index 0000000..0846724
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bj.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bl.svg
new file mode 100644
index 0000000..f84cbba
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bl.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bm.svg
new file mode 100644
index 0000000..bab3e0a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bm.svg
@@ -0,0 +1,97 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bn.svg
new file mode 100644
index 0000000..4b416eb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bn.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bo.svg
new file mode 100644
index 0000000..46dc767
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bo.svg
@@ -0,0 +1,674 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bq.svg
new file mode 100644
index 0000000..0e6bc76
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bq.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/br.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/br.svg
new file mode 100644
index 0000000..22c908e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/br.svg
@@ -0,0 +1,45 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bs.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bs.svg
new file mode 100644
index 0000000..5cc918e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bs.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bt.svg
new file mode 100644
index 0000000..798c79b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bt.svg
@@ -0,0 +1,89 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bv.svg
new file mode 100644
index 0000000..40e16d9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bv.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bw.svg
new file mode 100644
index 0000000..3435608
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bw.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/by.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/by.svg
new file mode 100644
index 0000000..7e90ff2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/by.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bz.svg
new file mode 100644
index 0000000..25386a5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/bz.svg
@@ -0,0 +1,145 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ca.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ca.svg
new file mode 100644
index 0000000..89da5b7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ca.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cc.svg
new file mode 100644
index 0000000..ddfd180
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cc.svg
@@ -0,0 +1,19 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cd.svg
new file mode 100644
index 0000000..b9cf528
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cd.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cefta.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cefta.svg
new file mode 100644
index 0000000..f748d08
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cefta.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cf.svg
new file mode 100644
index 0000000..a6cd367
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cf.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cg.svg
new file mode 100644
index 0000000..f5a0e42
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cg.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ch.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ch.svg
new file mode 100644
index 0000000..b42d670
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ch.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ci.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ci.svg
new file mode 100644
index 0000000..e400f0c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ci.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ck.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ck.svg
new file mode 100644
index 0000000..18e547b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ck.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cl.svg
new file mode 100644
index 0000000..5b3c72f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cl.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cm.svg
new file mode 100644
index 0000000..70adc8b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cm.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cn.svg
new file mode 100644
index 0000000..10d3489
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cn.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/co.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/co.svg
new file mode 100644
index 0000000..ebd0a0f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/co.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cp.svg
new file mode 100644
index 0000000..b8aa9cf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cp.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cr.svg
new file mode 100644
index 0000000..5a409ee
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cr.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cu.svg
new file mode 100644
index 0000000..053c9ee
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cu.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cv.svg
new file mode 100644
index 0000000..aec8994
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cv.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cw.svg
new file mode 100644
index 0000000..bb0ece2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cw.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cx.svg
new file mode 100644
index 0000000..374ff2d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cx.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cy.svg
new file mode 100644
index 0000000..7e3d883
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cy.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cz.svg
new file mode 100644
index 0000000..7913de3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/cz.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/de.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/de.svg
new file mode 100644
index 0000000..71aa2d2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/de.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dg.svg
new file mode 100644
index 0000000..f163caf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dg.svg
@@ -0,0 +1,130 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dj.svg
new file mode 100644
index 0000000..9b00a82
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dj.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dk.svg
new file mode 100644
index 0000000..563277f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dm.svg
new file mode 100644
index 0000000..f692094
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dm.svg
@@ -0,0 +1,152 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/do.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/do.svg
new file mode 100644
index 0000000..b1be393
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/do.svg
@@ -0,0 +1,121 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dz.svg
new file mode 100644
index 0000000..5ff29a7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/dz.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eac.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eac.svg
new file mode 100644
index 0000000..aaf8133
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eac.svg
@@ -0,0 +1,48 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ec.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ec.svg
new file mode 100644
index 0000000..397bfd9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ec.svg
@@ -0,0 +1,138 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ee.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ee.svg
new file mode 100644
index 0000000..8b98c2c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ee.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eg.svg
new file mode 100644
index 0000000..00d1fa5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eg.svg
@@ -0,0 +1,38 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eh.svg
new file mode 100644
index 0000000..6aec728
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eh.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/er.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/er.svg
new file mode 100644
index 0000000..3f4f3f2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/er.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-ct.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-ct.svg
new file mode 100644
index 0000000..4d85911
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-ct.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-ga.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-ga.svg
new file mode 100644
index 0000000..3165781
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-ga.svg
@@ -0,0 +1,187 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-pv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-pv.svg
new file mode 100644
index 0000000..21c8759
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es-pv.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es.svg
new file mode 100644
index 0000000..acdf927
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/es.svg
@@ -0,0 +1,544 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/et.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/et.svg
new file mode 100644
index 0000000..3f99be4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/et.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eu.svg
new file mode 100644
index 0000000..b0874c1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/eu.svg
@@ -0,0 +1,28 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fi.svg
new file mode 100644
index 0000000..470be2d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fi.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fj.svg
new file mode 100644
index 0000000..23fbe57
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fj.svg
@@ -0,0 +1,120 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fk.svg
new file mode 100644
index 0000000..c65bf96
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fk.svg
@@ -0,0 +1,90 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fm.svg
new file mode 100644
index 0000000..c1b7c97
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fm.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fo.svg
new file mode 100644
index 0000000..f802d28
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fo.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fr.svg
new file mode 100644
index 0000000..4110e59
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/fr.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ga.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ga.svg
new file mode 100644
index 0000000..76edab4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ga.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-eng.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-eng.svg
new file mode 100644
index 0000000..12e3b67
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-eng.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-nir.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-nir.svg
new file mode 100644
index 0000000..e6be8db
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-nir.svg
@@ -0,0 +1,132 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-sct.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-sct.svg
new file mode 100644
index 0000000..f50cd32
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-sct.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-wls.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-wls.svg
new file mode 100644
index 0000000..6e15fd0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb-wls.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb.svg
new file mode 100644
index 0000000..7991383
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gb.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gd.svg
new file mode 100644
index 0000000..cb51e96
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gd.svg
@@ -0,0 +1,27 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ge.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ge.svg
new file mode 100644
index 0000000..d8126ec
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ge.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gf.svg
new file mode 100644
index 0000000..f8fe94c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gf.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gg.svg
new file mode 100644
index 0000000..f8216c8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gg.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gh.svg
new file mode 100644
index 0000000..5c3e3e6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gh.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gi.svg
new file mode 100644
index 0000000..e2b590a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gi.svg
@@ -0,0 +1,32 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gl.svg
new file mode 100644
index 0000000..eb5a52e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gl.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gm.svg
new file mode 100644
index 0000000..8fe9d66
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gm.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gn.svg
new file mode 100644
index 0000000..40d6ad4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gn.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gp.svg
new file mode 100644
index 0000000..ee55c4b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gp.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gq.svg
new file mode 100644
index 0000000..134e442
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gq.svg
@@ -0,0 +1,23 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gr.svg
new file mode 100644
index 0000000..599741e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gr.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gs.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gs.svg
new file mode 100644
index 0000000..1536e07
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gs.svg
@@ -0,0 +1,133 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gt.svg
new file mode 100644
index 0000000..f7cffbd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gt.svg
@@ -0,0 +1,204 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gu.svg
new file mode 100644
index 0000000..0d66e1b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gu.svg
@@ -0,0 +1,23 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gw.svg
new file mode 100644
index 0000000..d470bac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gw.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gy.svg
new file mode 100644
index 0000000..569fb56
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/gy.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hk.svg
new file mode 100644
index 0000000..4fd55bc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hk.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hm.svg
new file mode 100644
index 0000000..815c482
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hm.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hn.svg
new file mode 100644
index 0000000..11fde67
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hn.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hr.svg
new file mode 100644
index 0000000..44fed27
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hr.svg
@@ -0,0 +1,58 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ht.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ht.svg
new file mode 100644
index 0000000..5d48eb9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ht.svg
@@ -0,0 +1,116 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hu.svg
new file mode 100644
index 0000000..baddf7f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/hu.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ic.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ic.svg
new file mode 100644
index 0000000..81e6ee2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ic.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/id.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/id.svg
new file mode 100644
index 0000000..3b7c8fc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/id.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ie.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ie.svg
new file mode 100644
index 0000000..049be14
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ie.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/il.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/il.svg
new file mode 100644
index 0000000..f43be7e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/il.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/im.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/im.svg
new file mode 100644
index 0000000..f06f3d6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/im.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/in.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/in.svg
new file mode 100644
index 0000000..bc47d74
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/in.svg
@@ -0,0 +1,25 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/io.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/io.svg
new file mode 100644
index 0000000..7701667
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/io.svg
@@ -0,0 +1,130 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/iq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/iq.svg
new file mode 100644
index 0000000..259da9a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/iq.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ir.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ir.svg
new file mode 100644
index 0000000..8c6d516
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ir.svg
@@ -0,0 +1,219 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/is.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/is.svg
new file mode 100644
index 0000000..a6588af
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/is.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/it.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/it.svg
new file mode 100644
index 0000000..20a8bfd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/it.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/je.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/je.svg
new file mode 100644
index 0000000..611180d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/je.svg
@@ -0,0 +1,62 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jm.svg
new file mode 100644
index 0000000..269df03
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jm.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jo.svg
new file mode 100644
index 0000000..d6f927d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jo.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jp.svg
new file mode 100644
index 0000000..cc1c181
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/jp.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ke.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ke.svg
new file mode 100644
index 0000000..3a67ca3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ke.svg
@@ -0,0 +1,23 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kg.svg
new file mode 100644
index 0000000..68c210b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kg.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kh.svg
new file mode 100644
index 0000000..c658838
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kh.svg
@@ -0,0 +1,61 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ki.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ki.svg
new file mode 100644
index 0000000..0c80328
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ki.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/km.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/km.svg
new file mode 100644
index 0000000..414d65e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/km.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kn.svg
new file mode 100644
index 0000000..47fe64d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kn.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kp.svg
new file mode 100644
index 0000000..4d1dbab
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kp.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kr.svg
new file mode 100644
index 0000000..6947eab
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kr.svg
@@ -0,0 +1,24 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kw.svg
new file mode 100644
index 0000000..3dd89e9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kw.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ky.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ky.svg
new file mode 100644
index 0000000..74a2fea
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ky.svg
@@ -0,0 +1,103 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kz.svg
new file mode 100644
index 0000000..04a47f5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/kz.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/la.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/la.svg
new file mode 100644
index 0000000..6aea6b7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/la.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lb.svg
new file mode 100644
index 0000000..8619f24
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lb.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lc.svg
new file mode 100644
index 0000000..bb25654
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lc.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/li.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/li.svg
new file mode 100644
index 0000000..68ea26f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/li.svg
@@ -0,0 +1,43 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lk.svg
new file mode 100644
index 0000000..2c5cdbe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lk.svg
@@ -0,0 +1,22 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lr.svg
new file mode 100644
index 0000000..e482ab9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lr.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ls.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ls.svg
new file mode 100644
index 0000000..a7c01a9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ls.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lt.svg
new file mode 100644
index 0000000..90ec5d2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lt.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lu.svg
new file mode 100644
index 0000000..cc12206
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lu.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lv.svg
new file mode 100644
index 0000000..6a9e75e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/lv.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ly.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ly.svg
new file mode 100644
index 0000000..1eaa51e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ly.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ma.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ma.svg
new file mode 100644
index 0000000..7ce56ef
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ma.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mc.svg
new file mode 100644
index 0000000..9cb6c9e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mc.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/md.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/md.svg
new file mode 100644
index 0000000..6dc441e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/md.svg
@@ -0,0 +1,70 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/me.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/me.svg
new file mode 100644
index 0000000..d891890
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/me.svg
@@ -0,0 +1,116 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mf.svg
new file mode 100644
index 0000000..6305edc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mf.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mg.svg
new file mode 100644
index 0000000..5fa2d24
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mg.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mh.svg
new file mode 100644
index 0000000..7b9f490
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mh.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mk.svg
new file mode 100644
index 0000000..4f5cae7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ml.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ml.svg
new file mode 100644
index 0000000..6f6b716
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ml.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mm.svg
new file mode 100644
index 0000000..42b4dee
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mm.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mn.svg
new file mode 100644
index 0000000..152c2fc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mn.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mo.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mo.svg
new file mode 100644
index 0000000..d39985d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mo.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mp.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mp.svg
new file mode 100644
index 0000000..ff59ebf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mp.svg
@@ -0,0 +1,86 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mq.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mq.svg
new file mode 100644
index 0000000..b221951
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mq.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mr.svg
new file mode 100644
index 0000000..7558234
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mr.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ms.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ms.svg
new file mode 100644
index 0000000..faf07b0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ms.svg
@@ -0,0 +1,29 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mt.svg
new file mode 100644
index 0000000..c597266
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mt.svg
@@ -0,0 +1,58 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mu.svg
new file mode 100644
index 0000000..82d7a3b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mu.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mv.svg
new file mode 100644
index 0000000..10450f9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mv.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mw.svg
new file mode 100644
index 0000000..d83ddb2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mw.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mx.svg
new file mode 100644
index 0000000..f98a89e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mx.svg
@@ -0,0 +1,382 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/my.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/my.svg
new file mode 100644
index 0000000..89576f6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/my.svg
@@ -0,0 +1,26 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mz.svg
new file mode 100644
index 0000000..2ee6ec1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/mz.svg
@@ -0,0 +1,21 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/na.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/na.svg
new file mode 100644
index 0000000..35b9f78
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/na.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nc.svg
new file mode 100644
index 0000000..068f0c6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nc.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ne.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ne.svg
new file mode 100644
index 0000000..39a82b8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ne.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nf.svg
new file mode 100644
index 0000000..c8b3093
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nf.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ng.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ng.svg
new file mode 100644
index 0000000..81eb35f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ng.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ni.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ni.svg
new file mode 100644
index 0000000..6dcdc9a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ni.svg
@@ -0,0 +1,129 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nl.svg
new file mode 100644
index 0000000..e90f5b0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nl.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/no.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/no.svg
new file mode 100644
index 0000000..a5f2a15
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/no.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/np.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/np.svg
new file mode 100644
index 0000000..8d71d10
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/np.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nr.svg
new file mode 100644
index 0000000..ff394c4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nr.svg
@@ -0,0 +1,12 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nu.svg
new file mode 100644
index 0000000..4067baf
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nu.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nz.svg
new file mode 100644
index 0000000..935d8a7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/nz.svg
@@ -0,0 +1,36 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/om.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/om.svg
new file mode 100644
index 0000000..c003f86
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/om.svg
@@ -0,0 +1,115 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pa.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pa.svg
new file mode 100644
index 0000000..8dc03bc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pa.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pc.svg
new file mode 100644
index 0000000..882197d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pc.svg
@@ -0,0 +1,33 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pe.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pe.svg
new file mode 100644
index 0000000..33e6cfd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pe.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pf.svg
new file mode 100644
index 0000000..e06b236
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pf.svg
@@ -0,0 +1,19 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pg.svg
new file mode 100644
index 0000000..237cb6e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pg.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ph.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ph.svg
new file mode 100644
index 0000000..65489e1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ph.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pk.svg
new file mode 100644
index 0000000..491e58a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pk.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pl.svg
new file mode 100644
index 0000000..0fa5145
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pl.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pm.svg
new file mode 100644
index 0000000..19a9330
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pm.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pn.svg
new file mode 100644
index 0000000..07958ac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pn.svg
@@ -0,0 +1,53 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pr.svg
new file mode 100644
index 0000000..ec51831
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pr.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ps.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ps.svg
new file mode 100644
index 0000000..b33824a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ps.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pt.svg
new file mode 100644
index 0000000..445cf7f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pt.svg
@@ -0,0 +1,57 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pw.svg
new file mode 100644
index 0000000..9f89c5f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/pw.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/py.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/py.svg
new file mode 100644
index 0000000..38e2051
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/py.svg
@@ -0,0 +1,157 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/qa.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/qa.svg
new file mode 100644
index 0000000..901f3fa
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/qa.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/re.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/re.svg
new file mode 100644
index 0000000..64e788e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/re.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ro.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ro.svg
new file mode 100644
index 0000000..fda0f7b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ro.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/rs.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/rs.svg
new file mode 100644
index 0000000..2f97102
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/rs.svg
@@ -0,0 +1,292 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ru.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ru.svg
new file mode 100644
index 0000000..cf24301
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ru.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/rw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/rw.svg
new file mode 100644
index 0000000..06e26ae
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/rw.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sa.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sa.svg
new file mode 100644
index 0000000..c0a1486
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sa.svg
@@ -0,0 +1,25 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sb.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sb.svg
new file mode 100644
index 0000000..6066f94
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sb.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sc.svg
new file mode 100644
index 0000000..9a46b36
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sc.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sd.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sd.svg
new file mode 100644
index 0000000..12818b4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sd.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/se.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/se.svg
new file mode 100644
index 0000000..8ba745a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/se.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sg.svg
new file mode 100644
index 0000000..c4dd4ac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sg.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-ac.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-ac.svg
new file mode 100644
index 0000000..22b3658
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-ac.svg
@@ -0,0 +1,689 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-hl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-hl.svg
new file mode 100644
index 0000000..b92e703
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-hl.svg
@@ -0,0 +1,164 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-ta.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-ta.svg
new file mode 100644
index 0000000..a103aac
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh-ta.svg
@@ -0,0 +1,76 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh.svg
new file mode 100644
index 0000000..7aba0ae
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sh.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/si.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/si.svg
new file mode 100644
index 0000000..66a390d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/si.svg
@@ -0,0 +1,18 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sj.svg
new file mode 100644
index 0000000..bb2799c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sj.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sk.svg
new file mode 100644
index 0000000..8147694
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sk.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sl.svg
new file mode 100644
index 0000000..a07baf7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sl.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sm.svg
new file mode 100644
index 0000000..00e9286
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sm.svg
@@ -0,0 +1,75 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sn.svg
new file mode 100644
index 0000000..7c0673d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sn.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/so.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/so.svg
new file mode 100644
index 0000000..a581ac6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/so.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sr.svg
new file mode 100644
index 0000000..5e71c40
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sr.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ss.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ss.svg
new file mode 100644
index 0000000..b257aa0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ss.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/st.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/st.svg
new file mode 100644
index 0000000..1294bcb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/st.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sv.svg
new file mode 100644
index 0000000..c811e91
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sv.svg
@@ -0,0 +1,594 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sx.svg
new file mode 100644
index 0000000..18f7a13
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sx.svg
@@ -0,0 +1,56 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sy.svg
new file mode 100644
index 0000000..5225550
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sy.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sz.svg
new file mode 100644
index 0000000..294a2cc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/sz.svg
@@ -0,0 +1,34 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tc.svg
new file mode 100644
index 0000000..63f13c3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tc.svg
@@ -0,0 +1,50 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/td.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/td.svg
new file mode 100644
index 0000000..fa3bd92
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/td.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tf.svg
new file mode 100644
index 0000000..fba2335
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tf.svg
@@ -0,0 +1,15 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tg.svg
new file mode 100644
index 0000000..c63a6d1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tg.svg
@@ -0,0 +1,14 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/th.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/th.svg
new file mode 100644
index 0000000..1e93a61
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/th.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tj.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tj.svg
new file mode 100644
index 0000000..9fba246
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tj.svg
@@ -0,0 +1,22 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tk.svg
new file mode 100644
index 0000000..05d3e86
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tl.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tl.svg
new file mode 100644
index 0000000..3d0701a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tl.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tm.svg
new file mode 100644
index 0000000..8b656cc
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tm.svg
@@ -0,0 +1,204 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tn.svg
new file mode 100644
index 0000000..5735c19
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tn.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/to.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/to.svg
new file mode 100644
index 0000000..d072337
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/to.svg
@@ -0,0 +1,10 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tr.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tr.svg
new file mode 100644
index 0000000..b96da21
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tr.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tt.svg
new file mode 100644
index 0000000..bc24938
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tt.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tv.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tv.svg
new file mode 100644
index 0000000..675210e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tv.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tw.svg
new file mode 100644
index 0000000..57fd98b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tw.svg
@@ -0,0 +1,34 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tz.svg
new file mode 100644
index 0000000..a2cfbca
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/tz.svg
@@ -0,0 +1,13 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ua.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ua.svg
new file mode 100644
index 0000000..a339eb1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ua.svg
@@ -0,0 +1,6 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ug.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ug.svg
new file mode 100644
index 0000000..737eb2c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ug.svg
@@ -0,0 +1,30 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/um.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/um.svg
new file mode 100644
index 0000000..9e9edda
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/um.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/un.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/un.svg
new file mode 100644
index 0000000..e57793b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/un.svg
@@ -0,0 +1,16 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/us.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/us.svg
new file mode 100644
index 0000000..9cfd0c9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/us.svg
@@ -0,0 +1,9 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/uy.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/uy.svg
new file mode 100644
index 0000000..62c36f8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/uy.svg
@@ -0,0 +1,28 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/uz.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/uz.svg
new file mode 100644
index 0000000..0ccca1b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/uz.svg
@@ -0,0 +1,30 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/va.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/va.svg
new file mode 100644
index 0000000..87e0fbb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/va.svg
@@ -0,0 +1,190 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vc.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vc.svg
new file mode 100644
index 0000000..f26c2d8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vc.svg
@@ -0,0 +1,8 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ve.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ve.svg
new file mode 100644
index 0000000..314e7f5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ve.svg
@@ -0,0 +1,26 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vg.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vg.svg
new file mode 100644
index 0000000..0ee90fb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vg.svg
@@ -0,0 +1,59 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vi.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vi.svg
new file mode 100644
index 0000000..4270257
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vi.svg
@@ -0,0 +1,28 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vn.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vn.svg
new file mode 100644
index 0000000..7e4bac8
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vn.svg
@@ -0,0 +1,11 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vu.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vu.svg
new file mode 100644
index 0000000..91e1236
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/vu.svg
@@ -0,0 +1,21 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/wf.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/wf.svg
new file mode 100644
index 0000000..054c57d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/wf.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ws.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ws.svg
new file mode 100644
index 0000000..0e758a7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ws.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/xk.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/xk.svg
new file mode 100644
index 0000000..551e7a4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/xk.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/xx.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/xx.svg
new file mode 100644
index 0000000..9333be3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/xx.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ye.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ye.svg
new file mode 100644
index 0000000..1c9e6d6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/ye.svg
@@ -0,0 +1,7 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/yt.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/yt.svg
new file mode 100644
index 0000000..e7776b3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/yt.svg
@@ -0,0 +1,5 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/za.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/za.svg
new file mode 100644
index 0000000..d563adb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/za.svg
@@ -0,0 +1,17 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/zm.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/zm.svg
new file mode 100644
index 0000000..13239f5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/zm.svg
@@ -0,0 +1,27 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/zw.svg b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/zw.svg
new file mode 100644
index 0000000..6399ab4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/flags/4x3/zw.svg
@@ -0,0 +1,21 @@
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome.scss b/modules/Admin/Resources/assets/vendor/fonts/fontawesome.scss
new file mode 100644
index 0000000..323e2e2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf
new file mode 100644
index 0000000..5efb1d4
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-brands-400.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2 b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2
new file mode 100644
index 0000000..36fbda7
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-brands-400.woff2 differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf
new file mode 100644
index 0000000..838b4e2
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-regular-400.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2 b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2
new file mode 100644
index 0000000..b6cabba
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-regular-400.woff2 differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf
new file mode 100644
index 0000000..ec24749
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-solid-900.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2 b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2
new file mode 100644
index 0000000..824d518
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-solid-900.woff2 differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf
new file mode 100644
index 0000000..b175aa8
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2 b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2
new file mode 100644
index 0000000..e09b5a5
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/fontawesome/fa-v4compatibility.woff2 differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/tabler-icons.scss b/modules/Admin/Resources/assets/vendor/fonts/tabler-icons.scss
new file mode 100644
index 0000000..3c1f105
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.eot b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.eot
new file mode 100644
index 0000000..9eb3d27
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.eot differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.svg b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.svg
new file mode 100644
index 0000000..d641624
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.svg
@@ -0,0 +1,6384 @@
+
+
+
diff --git a/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.ttf b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.ttf
new file mode 100644
index 0000000..7e2d1ef
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.ttf differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.woff b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.woff
new file mode 100644
index 0000000..c4e7e10
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.woff differ
diff --git a/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.woff2 b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.woff2
new file mode 100644
index 0000000..6fdb616
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/fonts/tabler/tabler-icons.woff2 differ
diff --git a/modules/Admin/Resources/assets/vendor/js/_template-customizer/_template-customizer.html b/modules/Admin/Resources/assets/vendor/js/_template-customizer/_template-customizer.html
new file mode 100644
index 0000000..d3d0cf1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/js/_template-customizer/_template-customizer.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/Admin/Resources/assets/vendor/js/_template-customizer/_template-customizer.scss b/modules/Admin/Resources/assets/vendor/js/_template-customizer/_template-customizer.scss
new file mode 100644
index 0000000..facd41b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/js/bootstrap.js b/modules/Admin/Resources/assets/vendor/js/bootstrap.js
new file mode 100644
index 0000000..16cd75a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/js/dropdown-hover.js b/modules/Admin/Resources/assets/vendor/js/dropdown-hover.js
new file mode 100644
index 0000000..a986336
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/js/helpers.js b/modules/Admin/Resources/assets/vendor/js/helpers.js
new file mode 100644
index 0000000..9ca5341
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/js/mega-dropdown.js b/modules/Admin/Resources/assets/vendor/js/mega-dropdown.js
new file mode 100644
index 0000000..2525cd5
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/js/menu.js b/modules/Admin/Resources/assets/vendor/js/menu.js
new file mode 100644
index 0000000..6bdf909
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/js/template-customizer.js b/modules/Admin/Resources/assets/vendor/js/template-customizer.js
new file mode 100644
index 0000000..35d9cfe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/js/template-customizer.js
@@ -0,0 +1,1399 @@
+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/modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js b/modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js
new file mode 100644
index 0000000..c2b3bd8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js b/modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js
new file mode 100644
index 0000000..d7ad20a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss b/modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss
new file mode 100644
index 0000000..1ed7751
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js b/modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js
new file mode 100644
index 0000000..10c1736
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js
@@ -0,0 +1,7 @@
+import FormValidation from '@form-validation/bundle/popular';
+
+try {
+ window.FormValidation = FormValidation;
+} catch (e) {}
+
+export { FormValidation };
diff --git a/modules/Admin/Resources/assets/vendor/libs/@form-validation/validationMessages.es.js b/modules/Admin/Resources/assets/vendor/libs/@form-validation/validationMessages.es.js
new file mode 100644
index 0000000..51c83fe
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/@form-validation/validationMessages.es.js
@@ -0,0 +1,105 @@
+export const validationMessages = {
+ default: 'Por favor, introduce un valor válido.',
+
+ // Validación de campo obligatorio
+ notEmpty: 'Este campo no puede estar vacío.',
+
+ // Validación de direcciones de correo electrónico
+ emailAddress: 'Por favor, introduce una dirección de correo electrónico válida.',
+
+ // Validación de números
+ numeric: 'Por favor, introduce un número válido.',
+
+ // Validación de URL
+ uri: 'Por favor, introduce una URL válida.',
+
+ // Validación de rango de longitud de texto
+ stringLength: 'Por favor, introduce un valor entre %s y %s caracteres.',
+
+ // Validación de tamaño mínimo
+ greaterThan: 'Por favor, introduce un valor mayor o igual a %s.',
+
+ // Validación de tamaño máximo
+ lessThan: 'Por favor, introduce un valor menor o igual a %s.',
+
+ // Validación de rango entre dos valores
+ between: 'Por favor, introduce un valor entre %s y %s.',
+
+ // Validación de coincidencia de valores
+ identical: 'Los valores deben coincidir.',
+
+ // Validación de expresiones regulares
+ regexp: 'El formato del valor no es válido.',
+
+ // Validación de números de tarjeta de crédito
+ creditCard: 'Por favor, introduce un número de tarjeta de crédito válido.',
+
+ // Validación de direcciones IP
+ ip: 'Por favor, introduce una dirección IP válida.',
+
+ // Validación de direcciones MAC
+ mac: 'Por favor, introduce una dirección MAC válida.',
+
+ // Validación de números de teléfono
+ phone: 'Por favor, introduce un número de teléfono válido.',
+
+ // Validación de códigos postales
+ zipCode: 'Por favor, introduce un código postal válido.',
+
+ // Validación de datos remotos
+ remote: 'Por favor, corrige este campo.',
+
+ // Validación de archivo cargado (file upload)
+ file: {
+ size: 'Por favor, selecciona un archivo con un tamaño máximo de %s KB.',
+ type: 'Por favor, selecciona un archivo de tipo válido (%s).'
+ },
+
+ // Validación de fecha
+ date: 'Por favor, introduce una fecha válida en el formato %s.',
+
+ // Validación de valores únicos en una lista
+ unique: 'Por favor, asegúrate de que este valor sea único.',
+
+ // Validación de campos iguales
+ equalTo: 'Por favor, introduce el mismo valor que en el campo %s.',
+
+ // Validación de JSON
+ json: 'Por favor, introduce un JSON válido.',
+
+ // Validación de booleanos
+ boolean: 'Por favor, introduce un valor booleano válido (true o false).',
+
+ // Validación de IBAN
+ iban: 'Por favor, introduce un número IBAN válido.',
+
+ // Validación de ISBN
+ isbn: 'Por favor, introduce un número ISBN válido.',
+
+ // Validación de tarjeta de identidad
+ id: 'Por favor, introduce un número de identificación válido.',
+
+ // Validación de números enteros
+ integer: 'Por favor, introduce un número entero válido.',
+
+ // Validación de números decimales
+ decimal: 'Por favor, introduce un número decimal válido.',
+
+ // Validación de formato de hora
+ time: 'Por favor, introduce una hora válida en el formato %s.',
+
+ // Validación de rango de archivos cargados
+ fileCount: 'Por favor, selecciona entre %s y %s archivos.',
+
+ // Validación de valores en una lista
+ in: 'Por favor, selecciona un valor válido.',
+
+ // Validación de valores fuera de una lista
+ notIn: 'Por favor, selecciona un valor no restringido.',
+
+ // Validación de valores opcionales
+ optional: 'Este campo es opcional, pero debe ser válido si está presente.',
+
+ // Validación de UUID
+ uuid: 'Por favor, introduce un UUID válido.'
+};
diff --git a/modules/Admin/Resources/assets/vendor/libs/_tabler/_tabler.scss b/modules/Admin/Resources/assets/vendor/libs/_tabler/_tabler.scss
new file mode 100644
index 0000000..56eb8b4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/animate-css/animate.scss b/modules/Admin/Resources/assets/vendor/libs/animate-css/animate.scss
new file mode 100644
index 0000000..0c9e900
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/animate-css/animate.scss
@@ -0,0 +1 @@
+@import 'animate.css/animate';
diff --git a/modules/Admin/Resources/assets/vendor/libs/animate-on-scroll/animate-on-scroll.js b/modules/Admin/Resources/assets/vendor/libs/animate-on-scroll/animate-on-scroll.js
new file mode 100644
index 0000000..4e603b7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/animate-on-scroll/animate-on-scroll.js
@@ -0,0 +1,7 @@
+import AOS from 'aos/dist/aos';
+
+try {
+ window.AOS = AOS;
+} catch (e) {}
+
+export { AOS };
diff --git a/modules/Admin/Resources/assets/vendor/libs/animate-on-scroll/animate-on-scroll.scss b/modules/Admin/Resources/assets/vendor/libs/animate-on-scroll/animate-on-scroll.scss
new file mode 100644
index 0000000..70f7899
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/animate-on-scroll/animate-on-scroll.scss
@@ -0,0 +1 @@
+@import 'aos/dist/aos';
diff --git a/modules/Admin/Resources/assets/vendor/libs/apex-charts/apex-charts.scss b/modules/Admin/Resources/assets/vendor/libs/apex-charts/apex-charts.scss
new file mode 100644
index 0000000..61762ec
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/apex-charts/apex-charts.scss
@@ -0,0 +1,171 @@
+/**
+* Apex Charts
+*/
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'apexcharts-clevision/dist/apexcharts';
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ .apexcharts-canvas {
+ .apexcharts-tooltip {
+ background: light.$card-bg;
+ border-color: light.$border-color;
+ box-shadow: light.$box-shadow;
+ .apexcharts-tooltip-title {
+ background: light.$card-bg;
+ border-color: light.$border-color;
+ font-family: light.$font-family-base !important;
+ }
+ &.apexcharts-theme-light {
+ color: light.$headings-color;
+ }
+ &.apexcharts-theme-dark {
+ color: light.$white;
+ }
+ .apexcharts-tooltip-title {
+ font-weight: light.$headings-font-weight;
+ }
+ }
+ .apexcharts-xaxistooltip,
+ .apexcharts-yaxistooltip {
+ background: light.$body-bg;
+ border-color: light.$border-color;
+ color: light.$headings-color;
+ &.apexcharts-xaxistooltip-bottom,
+ &.apexcharts-yaxistooltip-bottom {
+ &:after {
+ border-bottom-color: light.$body-bg;
+ }
+ &:before {
+ border-bottom-color: light.$border-color;
+ }
+ }
+ &.apexcharts-xaxistooltip-left,
+ &.apexcharts-yaxistooltip-left {
+ &:after {
+ border-left-color: light.$body-bg;
+ }
+ &:before {
+ border-left-color: light.$border-color;
+ }
+ }
+ &.apexcharts-xaxistooltip-right,
+ &.apexcharts-yaxistooltip-right {
+ &:after {
+ border-right-color: light.$body-bg;
+ }
+ &:before {
+ border-right-color: light.$border-color;
+ }
+ }
+ &.apexcharts-xaxistooltip-top,
+ &.apexcharts-yaxistooltip-top {
+ &:after {
+ border-top-color: light.$body-bg;
+ }
+ &:before {
+ border-top-color: light.$border-color;
+ }
+ }
+ }
+ .apexcharts-tooltip-text {
+ font-family: light.$font-family-base !important;
+ filter: none;
+ }
+ }
+ }
+}
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ #radarChart {
+ .apexcharts-canvas {
+ .apexcharts-grid line {
+ opacity: 0;
+ }
+ }
+ }
+ .apexcharts-canvas {
+ .apexcharts-tooltip {
+ background: dark.$body-bg;
+ border-color: dark.$border-color;
+ box-shadow: dark.$box-shadow;
+ .apexcharts-tooltip-title {
+ background: dark.$body-bg;
+ border-color: dark.$border-color;
+ font-family: dark.$font-family-base !important;
+ }
+ &.apexcharts-theme-light {
+ color: dark.$headings-color;
+ }
+ &.apexcharts-theme-dark {
+ color: dark.$white;
+ }
+ .apexcharts-tooltip-title {
+ font-weight: dark.$headings-font-weight;
+ }
+ }
+ .apexcharts-xaxistooltip,
+ .apexcharts-yaxistooltip {
+ background: dark.$body-bg;
+ color: dark.$headings-color;
+ border-color: dark.$border-color;
+ &.apexcharts-xaxistooltip-bottom,
+ &.apexcharts-yaxistooltip-bottom {
+ &:after {
+ border-bottom-color: dark.$body-bg;
+ }
+ &:before {
+ border-bottom-color: dark.$border-color;
+ }
+ }
+ &.apexcharts-xaxistooltip-left,
+ &.apexcharts-yaxistooltip-left {
+ &:after {
+ border-left-color: dark.$body-bg;
+ }
+ &:before {
+ border-left-color: dark.$border-color;
+ }
+ }
+ &.apexcharts-xaxistooltip-right,
+ &.apexcharts-yaxistooltip-right {
+ &:after {
+ border-right-color: dark.$body-bg;
+ }
+ &:before {
+ border-right-color: dark.$border-color;
+ }
+ }
+ &.apexcharts-xaxistooltip-top,
+ &.apexcharts-yaxistooltip-top {
+ &:after {
+ border-top-color: dark.$body-bg;
+ }
+ &:before {
+ border-top-color: dark.$border-color;
+ }
+ }
+ }
+ }
+ }
+}
+
+// RTL
+@include app-rtl(false) {
+ .apexcharts-canvas {
+ .apexcharts-yaxis {
+ text {
+ text-anchor: start;
+ }
+ }
+ .apexcharts-legend-marker,
+ .apexcharts-tooltip-marker {
+ margin-right: 0;
+ margin-left: 0.5rem;
+ }
+ }
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/apex-charts/apexcharts.js b/modules/Admin/Resources/assets/vendor/libs/apex-charts/apexcharts.js
new file mode 100644
index 0000000..ac2500a
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/apex-charts/apexcharts.js
@@ -0,0 +1,7 @@
+import ApexCharts from 'apexcharts-clevision';
+
+try {
+ window.ApexCharts = ApexCharts;
+} catch (e) {}
+
+export { ApexCharts };
diff --git a/modules/Admin/Resources/assets/vendor/libs/autosize/autosize.js b/modules/Admin/Resources/assets/vendor/libs/autosize/autosize.js
new file mode 100644
index 0000000..7e739e4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/autosize/autosize.js
@@ -0,0 +1,7 @@
+import autosize from 'autosize';
+
+try {
+ window.autosize = autosize;
+} catch (e) {}
+
+export { autosize };
diff --git a/modules/Admin/Resources/assets/vendor/libs/block-ui/block-ui.js b/modules/Admin/Resources/assets/vendor/libs/block-ui/block-ui.js
new file mode 100644
index 0000000..61e0068
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/block-ui/block-ui.js
@@ -0,0 +1 @@
+import 'block-ui/jquery.blockUI';
diff --git a/modules/Admin/Resources/assets/vendor/libs/bloodhound/bloodhound.js b/modules/Admin/Resources/assets/vendor/libs/bloodhound/bloodhound.js
new file mode 100644
index 0000000..6909e20
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/bloodhound/bloodhound.js
@@ -0,0 +1,7 @@
+import Bloodhound from 'typeahead.js/dist/bloodhound';
+
+try {
+ window.Bloodhound = Bloodhound;
+} catch (e) {}
+
+export { Bloodhound };
diff --git a/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/_mixins.scss
new file mode 100644
index 0000000..ef93725
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js b/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js
new file mode 100644
index 0000000..bcb020b
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.js
@@ -0,0 +1 @@
+import 'bootstrap-datepicker/dist/js/bootstrap-datepicker';
diff --git a/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-datepicker/bootstrap-datepicker.scss
new file mode 100644
index 0000000..933dc74
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-daterangepicker/_mixins.scss
new file mode 100644
index 0000000..45f5302
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js b/modules/Admin/Resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.js
new file mode 100644
index 0000000..3950a71
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-daterangepicker/bootstrap-daterangepicker.scss
new file mode 100644
index 0000000..5eca304
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bootstrap-maxlength/bootstrap-maxlength.js b/modules/Admin/Resources/assets/vendor/libs/bootstrap-maxlength/bootstrap-maxlength.js
new file mode 100644
index 0000000..8f17377
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/bootstrap-maxlength/bootstrap-maxlength.js
@@ -0,0 +1 @@
+import 'bootstrap-maxlength/src/bootstrap-maxlength';
diff --git a/modules/Admin/Resources/assets/vendor/libs/bootstrap-maxlength/bootstrap-maxlength.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-maxlength/bootstrap-maxlength.scss
new file mode 100644
index 0000000..b71acb6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/bootstrap-maxlength/bootstrap-maxlength.scss
@@ -0,0 +1,46 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+.bootstrap-maxlength {
+ line-height: 1;
+ text-align: center;
+ vertical-align: baseline;
+}
+
+// light layout
+@if $enable-light-style {
+ .light-style {
+ .bootstrap-maxlength {
+ background: light.$gray-200;
+ font-size: light.$badge-font-size;
+ font-weight: light.$badge-font-weight;
+ padding: light.$badge-padding-y light.$badge-padding-x;
+
+ @include light.border-bottom-radius(light.$badge-border-radius);
+
+ &.label-danger {
+ color: light.color-contrast(map-get(light.$theme-colors, danger));
+ background: map-get(light.$theme-colors, danger);
+ }
+ }
+ }
+}
+
+// dark layout
+@if $enable-dark-style {
+ .dark-style {
+ .bootstrap-maxlength {
+ background: dark.$body-bg;
+ padding: dark.$badge-padding-y dark.$badge-padding-x;
+ font-size: dark.$badge-font-size;
+ font-weight: dark.$badge-font-weight;
+
+ @include light.border-bottom-radius(dark.$badge-border-radius);
+
+ &.label-danger {
+ color: dark.color-contrast(map-get(dark.$theme-colors, danger));
+ background: map-get(dark.$theme-colors, danger);
+ }
+ }
+ }
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/_mixins.scss
new file mode 100644
index 0000000..ef88b3f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js b/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js
new file mode 100644
index 0000000..a9eb0f5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/bootstrap-select.js
@@ -0,0 +1 @@
+import 'bootstrap-select/js/bootstrap-select';
diff --git a/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss b/modules/Admin/Resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss
new file mode 100644
index 0000000..6839d76
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bs-stepper/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/bs-stepper/_mixins.scss
new file mode 100644
index 0000000..8f643c1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bs-stepper/bs-stepper.js b/modules/Admin/Resources/assets/vendor/libs/bs-stepper/bs-stepper.js
new file mode 100644
index 0000000..dad4783
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/bs-stepper/bs-stepper.scss b/modules/Admin/Resources/assets/vendor/libs/bs-stepper/bs-stepper.scss
new file mode 100644
index 0000000..1c5dbeb
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/chartjs/chartjs.js b/modules/Admin/Resources/assets/vendor/libs/chartjs/chartjs.js
new file mode 100644
index 0000000..cba0edd
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/chartjs/chartjs.js
@@ -0,0 +1,7 @@
+import Chart from 'chart.js/auto';
+
+try {
+ window.Chart = Chart;
+} catch (e) {}
+
+export { Chart };
diff --git a/modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave-phone.js b/modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave-phone.js
new file mode 100644
index 0000000..9adf7c6
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave-phone.js
@@ -0,0 +1 @@
+import 'cleave.js/dist/addons/cleave-phone.us';
diff --git a/modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave.js b/modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave.js
new file mode 100644
index 0000000..64c1ded
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave.js
@@ -0,0 +1 @@
+import 'cleave.js/dist/cleave';
diff --git a/modules/Admin/Resources/assets/vendor/libs/clipboard/clipboard.js b/modules/Admin/Resources/assets/vendor/libs/clipboard/clipboard.js
new file mode 100644
index 0000000..7e4b990
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/clipboard/clipboard.js
@@ -0,0 +1,7 @@
+import ClipboardJS from 'clipboard';
+
+try {
+ window.ClipboardJS = ClipboardJS;
+} catch (e) {}
+
+export { ClipboardJS };
diff --git a/modules/Admin/Resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js b/modules/Admin/Resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js
new file mode 100644
index 0000000..12fd79d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/datatables-bs5/datatables-bootstrap5.js
@@ -0,0 +1,30 @@
+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';
+import { datatable_spanish_default } from '../datatables-lang/datatable-lang-es';
+
+// 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;
+$.fn.dataTable.ext.datatable_spanish_default = datatable_spanish_default;
+window.JSZip = JSZip;
diff --git a/modules/Admin/Resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-bs5/datatables.bootstrap5.scss
new file mode 100644
index 0000000..2e531d0
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-buttons-bs5/buttons.bootstrap5.scss
new file mode 100644
index 0000000..03b1c07
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-checkboxes-jquery/datatables.checkboxes.scss
new file mode 100644
index 0000000..2628c5e
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-fixedcolumns-bs5/fixedcolumns.bootstrap5.scss
new file mode 100644
index 0000000..3ef12dd
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-fixedheader-bs5/fixedheader.bootstrap5.scss
new file mode 100644
index 0000000..599b7e1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js b/modules/Admin/Resources/assets/vendor/libs/datatables-lang/datatable-lang-es.js
new file mode 100644
index 0000000..e37d675
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-responsive-bs5/_mixins.scss
new file mode 100644
index 0000000..4619524
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-responsive-bs5/responsive.bootstrap5.scss
new file mode 100644
index 0000000..7d97024
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-rowgroup-bs5/rowgroup.bootstrap5.scss
new file mode 100644
index 0000000..feea55b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss b/modules/Admin/Resources/assets/vendor/libs/datatables-select-bs5/select.bootstrap5.scss
new file mode 100644
index 0000000..99faa43
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/dropzone/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/dropzone/_mixins.scss
new file mode 100644
index 0000000..75e2c7f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/dropzone/dropzone.js b/modules/Admin/Resources/assets/vendor/libs/dropzone/dropzone.js
new file mode 100644
index 0000000..6122097
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/dropzone/dropzone.scss b/modules/Admin/Resources/assets/vendor/libs/dropzone/dropzone.scss
new file mode 100644
index 0000000..d342eef
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/flatpickr/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/flatpickr/_mixins.scss
new file mode 100644
index 0000000..8fdfa7c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/flatpickr/flatpickr.js b/modules/Admin/Resources/assets/vendor/libs/flatpickr/flatpickr.js
new file mode 100644
index 0000000..0c13982
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/flatpickr/flatpickr.scss b/modules/Admin/Resources/assets/vendor/libs/flatpickr/flatpickr.scss
new file mode 100644
index 0000000..43ef2fc
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/fullcalendar/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/fullcalendar/_mixins.scss
new file mode 100644
index 0000000..4c40892
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/fullcalendar/fullcalendar.js b/modules/Admin/Resources/assets/vendor/libs/fullcalendar/fullcalendar.js
new file mode 100644
index 0000000..64caa33
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/fullcalendar/fullcalendar.scss b/modules/Admin/Resources/assets/vendor/libs/fullcalendar/fullcalendar.scss
new file mode 100644
index 0000000..3224c44
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/hammer/hammer.js b/modules/Admin/Resources/assets/vendor/libs/hammer/hammer.js
new file mode 100644
index 0000000..b358dd4
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/hammer/hammer.js
@@ -0,0 +1 @@
+import 'hammerjs/hammer.js';
diff --git a/modules/Admin/Resources/assets/vendor/libs/highlight/highlight-github.scss b/modules/Admin/Resources/assets/vendor/libs/highlight/highlight-github.scss
new file mode 100644
index 0000000..44bedcb
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/highlight/highlight-github.scss
@@ -0,0 +1 @@
+@import 'highlight.js/styles/github.css';
diff --git a/modules/Admin/Resources/assets/vendor/libs/highlight/highlight.js b/modules/Admin/Resources/assets/vendor/libs/highlight/highlight.js
new file mode 100644
index 0000000..3086bda
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/highlight/highlight.js
@@ -0,0 +1,7 @@
+import hljs from 'highlight.js';
+
+try {
+ window.hljs = hljs;
+} catch (e) {}
+
+export { hljs };
diff --git a/modules/Admin/Resources/assets/vendor/libs/highlight/highlight.scss b/modules/Admin/Resources/assets/vendor/libs/highlight/highlight.scss
new file mode 100644
index 0000000..a3b542f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/highlight/highlight.scss
@@ -0,0 +1 @@
+@import 'highlight.js/styles/atom-one-light';
diff --git a/modules/Admin/Resources/assets/vendor/libs/idletimer/idletimer.js b/modules/Admin/Resources/assets/vendor/libs/idletimer/idletimer.js
new file mode 100644
index 0000000..89af693
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/idletimer/idletimer.js
@@ -0,0 +1,339 @@
+/*! Idle Timer - v1.1.1 - 2020-06-25
+ * https://github.com/thorst/jquery-idletimer
+ * Copyright (c) 2020 Paul Irish; Licensed MIT */
+/*
+ mousewheel (deprecated) -> IE6.0, Chrome, Opera, Safari
+ DOMMouseScroll (deprecated) -> Firefox 1.0
+ wheel (standard) -> Chrome 31, Firefox 17, IE9, Firefox Mobile 17.0
+
+ //No need to use, use DOMMouseScroll
+ MozMousePixelScroll -> Firefox 3.5, Firefox Mobile 1.0
+
+ //Events
+ WheelEvent -> see wheel
+ MouseWheelEvent -> see mousewheel
+ MouseScrollEvent -> Firefox 3.5, Firefox Mobile 1.0
+*/
+(function ($) {
+ $.idleTimer = function (firstParam, elem) {
+ var opts;
+ if (typeof firstParam === 'object') {
+ opts = firstParam;
+ firstParam = null;
+ } else if (typeof firstParam === 'number') {
+ opts = { timeout: firstParam };
+ firstParam = null;
+ }
+
+ // element to watch
+ elem = elem || document;
+
+ // defaults that are to be stored as instance props on the elem
+ opts = $.extend(
+ {
+ idle: false, // indicates if the user is idle
+ timeout: 30000, // the amount of time (ms) before the user is considered idle
+ events:
+ 'mousemove keydown wheel DOMMouseScroll mousewheel mousedown touchstart touchmove MSPointerDown MSPointerMove' // define active events
+ },
+ opts
+ );
+
+ var jqElem = $(elem),
+ obj = jqElem.data('idleTimerObj') || {},
+ /* (intentionally not documented)
+ * Toggles the idle state and fires an appropriate event.
+ * @return {void}
+ */
+ toggleIdleState = function (e) {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ // toggle the state
+ obj.idle = !obj.idle;
+
+ // store toggle state date time
+ obj.olddate = +new Date();
+
+ // create a custom event, with state and name space
+ var event = $.Event((obj.idle ? 'idle' : 'active') + '.idleTimer');
+
+ // trigger event on object with elem and copy of obj
+ $(elem).trigger(event, [elem, $.extend({}, obj), e]);
+ },
+ /**
+ * Handle event triggers
+ * @return {void}
+ * @method event
+ * @static
+ */
+ handleEvent = function (e) {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ // ignore writting to storage unless related to idleTimer
+ if (e.type === 'storage' && e.originalEvent.key !== obj.timerSyncId) {
+ return;
+ }
+
+ // this is already paused, ignore events for now
+ if (obj.remaining != null) {
+ return;
+ }
+
+ /*
+ mousemove is kinda buggy, it can be triggered when it should be idle.
+ Typically is happening between 115 - 150 milliseconds after idle triggered.
+ @psyafter & @kaellis report "always triggered if using modal (jQuery ui, with overlay)"
+ @thorst has similar issues on ios7 "after $.scrollTop() on text area"
+ */
+ if (e.type === 'mousemove') {
+ // if coord are same, it didn't move
+ if (e.pageX === obj.pageX && e.pageY === obj.pageY) {
+ return;
+ }
+ // if coord don't exist how could it move
+ if (typeof e.pageX === 'undefined' && typeof e.pageY === 'undefined') {
+ return;
+ }
+ // under 200 ms is hard to do, and you would have to stop, as continuous activity will bypass this
+ var elapsed = +new Date() - obj.olddate;
+ if (elapsed < 200) {
+ return;
+ }
+ }
+
+ // clear any existing timeout
+ clearTimeout(obj.tId);
+
+ // if the idle timer is enabled, flip
+ if (obj.idle) {
+ toggleIdleState(e);
+ }
+
+ // store when user was last active
+ obj.lastActive = +new Date();
+
+ // update mouse coord
+ obj.pageX = e.pageX;
+ obj.pageY = e.pageY;
+
+ // sync lastActive
+ if (e.type !== 'storage' && obj.timerSyncId) {
+ if (typeof localStorage !== 'undefined') {
+ localStorage.setItem(obj.timerSyncId, obj.lastActive);
+ }
+ }
+
+ // set a new timeout
+ obj.tId = setTimeout(toggleIdleState, obj.timeout);
+ },
+ /**
+ * Restore initial settings and restart timer
+ * @return {void}
+ * @method reset
+ * @static
+ */
+ reset = function () {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ // reset settings
+ obj.idle = obj.idleBackup;
+ obj.olddate = +new Date();
+ obj.lastActive = obj.olddate;
+ obj.remaining = null;
+
+ // reset Timers
+ clearTimeout(obj.tId);
+ if (!obj.idle) {
+ obj.tId = setTimeout(toggleIdleState, obj.timeout);
+ }
+ },
+ /**
+ * Store remaining time, stop timer
+ * You can pause from an idle OR active state
+ * @return {void}
+ * @method pause
+ * @static
+ */
+ pause = function () {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ // this is already paused
+ if (obj.remaining != null) {
+ return;
+ }
+
+ // define how much is left on the timer
+ obj.remaining = obj.timeout - (+new Date() - obj.olddate);
+
+ // clear any existing timeout
+ clearTimeout(obj.tId);
+ },
+ /**
+ * Start timer with remaining value
+ * @return {void}
+ * @method resume
+ * @static
+ */
+ resume = function () {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ // this isn't paused yet
+ if (obj.remaining == null) {
+ return;
+ }
+
+ // start timer
+ if (!obj.idle) {
+ obj.tId = setTimeout(toggleIdleState, obj.remaining);
+ }
+
+ // clear remaining
+ obj.remaining = null;
+ },
+ /**
+ * Stops the idle timer. This removes appropriate event handlers
+ * and cancels any pending timeouts.
+ * @return {void}
+ * @method destroy
+ * @static
+ */
+ destroy = function () {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ //clear any pending timeouts
+ clearTimeout(obj.tId);
+
+ //Remove data
+ jqElem.removeData('idleTimerObj');
+
+ //detach the event handlers
+ jqElem.off('._idleTimer');
+ },
+ /**
+ * Returns the time until becoming idle
+ * @return {number}
+ * @method remainingtime
+ * @static
+ */
+ remainingtime = function () {
+ var obj = $.data(elem, 'idleTimerObj') || {};
+
+ //If idle there is no time remaining
+ if (obj.idle) {
+ return 0;
+ }
+
+ //If its paused just return that
+ if (obj.remaining != null) {
+ return obj.remaining;
+ }
+
+ //Determine remaining, if negative idle didn't finish flipping, just return 0
+ var remaining = obj.timeout - (+new Date() - obj.lastActive);
+ if (remaining < 0) {
+ remaining = 0;
+ }
+
+ //If this is paused return that number, else return current remaining
+ return remaining;
+ };
+
+ // determine which function to call
+ if (firstParam === null && typeof obj.idle !== 'undefined') {
+ // they think they want to init, but it already is, just reset
+ reset();
+ return jqElem;
+ } else if (firstParam === null) {
+ // they want to init
+ } else if (firstParam !== null && typeof obj.idle === 'undefined') {
+ // they want to do something, but it isnt init
+ // not sure the best way to handle this
+ return false;
+ } else if (firstParam === 'destroy') {
+ destroy();
+ return jqElem;
+ } else if (firstParam === 'pause') {
+ pause();
+ return jqElem;
+ } else if (firstParam === 'resume') {
+ resume();
+ return jqElem;
+ } else if (firstParam === 'reset') {
+ reset();
+ return jqElem;
+ } else if (firstParam === 'getRemainingTime') {
+ return remainingtime();
+ } else if (firstParam === 'getElapsedTime') {
+ return +new Date() - obj.olddate;
+ } else if (firstParam === 'getLastActiveTime') {
+ return obj.lastActive;
+ } else if (firstParam === 'isIdle') {
+ return obj.idle;
+ }
+
+ // Test via a getter in the options object to see if the passive property is accessed
+ // This isnt working in jquery, though is planned for 4.0
+ // https://github.com/jquery/jquery/issues/2871
+ /*var supportsPassive = false;
+ try {
+ var Popts = Object.defineProperty({}, "passive", {
+ get: function() {
+ supportsPassive = true;
+ }
+ });
+ window.addEventListener("test", null, Popts);
+ } catch (e) {}
+*/
+
+ /* (intentionally not documented)
+ * Handles a user event indicating that the user isn't idle. namespaced with internal idleTimer
+ * @param {Event} event A DOM2-normalized event object.
+ * @return {void}
+ */
+ jqElem.on((opts.events + ' ').split(' ').join('._idleTimer ').trim(), function (e) {
+ handleEvent(e);
+ });
+ //}, supportsPassive ? { passive: true } : false);
+
+ if (opts.timerSyncId) {
+ $(window).on('storage', handleEvent);
+ }
+
+ // Internal Object Properties, This isn't all necessary, but we
+ // explicitly define all keys here so we know what we are working with
+ obj = $.extend(
+ {},
+ {
+ olddate: +new Date(), // the last time state changed
+ lastActive: +new Date(), // the last time timer was active
+ idle: opts.idle, // current state
+ idleBackup: opts.idle, // backup of idle parameter since it gets modified
+ timeout: opts.timeout, // the interval to change state
+ remaining: null, // how long until state changes
+ timerSyncId: opts.timerSyncId, // localStorage key to use for syncing this timer
+ tId: null, // the idle timer setTimeout
+ pageX: null, // used to store the mouse coord
+ pageY: null
+ }
+ );
+
+ // set a timeout to toggle state. May wish to omit this in some situations
+ if (!obj.idle) {
+ obj.tId = setTimeout(toggleIdleState, obj.timeout);
+ }
+
+ // store our instance on the object
+ $.data(elem, 'idleTimerObj', obj);
+
+ return jqElem;
+ };
+
+ // This allows binding to element
+ $.fn.idleTimer = function (firstParam) {
+ if (this[0]) {
+ return $.idleTimer(firstParam, this[0]);
+ }
+
+ return this;
+ };
+})(jQuery);
diff --git a/modules/Admin/Resources/assets/vendor/libs/jkanban/jkanban.js b/modules/Admin/Resources/assets/vendor/libs/jkanban/jkanban.js
new file mode 100644
index 0000000..06a987f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jkanban/jkanban.js
@@ -0,0 +1 @@
+import 'jkanban/dist/jkanban';
diff --git a/modules/Admin/Resources/assets/vendor/libs/jkanban/jkanban.scss b/modules/Admin/Resources/assets/vendor/libs/jkanban/jkanban.scss
new file mode 100644
index 0000000..543ad3f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jkanban/jkanban.scss
@@ -0,0 +1,28 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'jkanban/dist/jkanban';
+
+// Light layout
+@if $enable-light-style {
+ .light-style {
+ .kanban-board {
+ background: light.$border-color;
+ }
+ .kanban-item {
+ background: light.$card-bg;
+ }
+ }
+}
+
+// Dark layout
+@if $enable-dark-style {
+ .dark-style {
+ .kanban-board {
+ background: dark.$border-color;
+ }
+ .kanban-item {
+ background: dark.$card-bg;
+ }
+ }
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/jquery-repeater/jquery-repeater.js b/modules/Admin/Resources/assets/vendor/libs/jquery-repeater/jquery-repeater.js
new file mode 100644
index 0000000..ae51ee7
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jquery-repeater/jquery-repeater.js
@@ -0,0 +1 @@
+import 'jquery.repeater/jquery.repeater';
diff --git a/modules/Admin/Resources/assets/vendor/libs/jquery-sticky/jquery-sticky.js b/modules/Admin/Resources/assets/vendor/libs/jquery-sticky/jquery-sticky.js
new file mode 100644
index 0000000..206891e
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jquery-sticky/jquery-sticky.js
@@ -0,0 +1 @@
+import 'jquery-sticky/jquery.sticky';
diff --git a/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/_mixins.scss
new file mode 100644
index 0000000..19d71bb
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js b/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js
new file mode 100644
index 0000000..3b42569
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.js
@@ -0,0 +1 @@
+import 'timepicker/jquery.timepicker';
diff --git a/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss b/modules/Admin/Resources/assets/vendor/libs/jquery-timepicker/jquery-timepicker.scss
new file mode 100644
index 0000000..5b8e917
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/jquery/jquery.js b/modules/Admin/Resources/assets/vendor/libs/jquery/jquery.js
new file mode 100644
index 0000000..2df0597
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/jstree/jstree.js b/modules/Admin/Resources/assets/vendor/libs/jstree/jstree.js
new file mode 100644
index 0000000..9a3a55c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jstree/jstree.js
@@ -0,0 +1 @@
+import 'jstree/dist/jstree';
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/jstree.scss b/modules/Admin/Resources/assets/vendor/libs/jstree/jstree.scss
new file mode 100644
index 0000000..32023ff
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jstree/jstree.scss
@@ -0,0 +1,115 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'jstree/dist/themes/default/style';
+@import 'jstree/dist/themes/default-dark/style';
+@import './themes/theme';
+
+// Light Style
+@if $enable-light-style {
+ .light-style {
+ // Folder Icons and text colors
+ .jstree {
+ .jstree-container-ul {
+ .jstree-icon.ti-folder,
+ .ion-ios-folder {
+ color: light.$warning;
+ }
+ .jstree-icon.ti-file {
+ color: light.$primary;
+ }
+ }
+ }
+ // Context Menu Styling
+
+ .vakata-context.jstree-contextmenu {
+ background: light.$white;
+ border: 0;
+ box-shadow: 0px 0px 50px 0px rgba(light.$black, 0.1);
+ li {
+ a {
+ padding: 0 1.5rem;
+ text-shadow: none;
+ i {
+ display: none;
+ }
+ }
+ &.vakata-context-hover {
+ a {
+ box-shadow: none;
+ }
+ }
+ &.vakata-context-separator {
+ a {
+ margin: 0;
+ }
+ }
+ ul {
+ background: light.$white;
+ border: 0;
+ box-shadow: 0px 0px 50px 0px rgba(light.$black, 0.1);
+ }
+ }
+ .vakata-contextmenu-sep {
+ display: none;
+ }
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ // Folder Icons and text colors
+ .jstree {
+ .jstree-container-ul {
+ .jstree-icon.ti-folder,
+ .ion-ios-folder {
+ color: dark.$warning;
+ }
+ .jstree-icon.ti-file {
+ color: dark.$primary;
+ }
+ }
+ }
+
+ // Context Menu Styling
+
+ .vakata-context.jstree-contextmenu {
+ background: dark.$white;
+ border: 0;
+ box-shadow: 0px 0px 50px 0px rgba(dark.$black, 0.1);
+ li {
+ a {
+ padding: 0 1.5rem;
+ text-shadow: none;
+ i {
+ display: none;
+ }
+ }
+ &.vakata-context-hover {
+ a {
+ box-shadow: none;
+ }
+ }
+ &.vakata-context-separator {
+ a {
+ margin: 0;
+ }
+ }
+ ul {
+ background: dark.$white;
+ border: 0;
+ box-shadow: 0px 0px 50px 0px rgba(dark.$black, 0.1);
+ }
+ }
+ .vakata-contextmenu-sep {
+ display: none;
+ }
+ }
+ }
+}
+.jstree-default-dark .jstree-anchor {
+ text-shadow: none !important;
+ color: dark.$body-color;
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/_theme.scss b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/_theme.scss
new file mode 100644
index 0000000..12af432
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/_theme.scss
@@ -0,0 +1,123 @@
+@import '../../../scss/_bootstrap-extended/include'; // imported for media query mixin
+
+// Light Style
+@if $enable-light-style {
+ $theme-name: 'default';
+ $throbber-bg: "url('./themes/default/throbber.gif')";
+ $small-bg: "url('./themes/default/32px.png')";
+ $big-bg: "url('./themes/default/40px.png')";
+
+ .jstree-#{$theme-name} {
+ background: transparent;
+ }
+ .jstree-#{$theme-name} > .jstree-container-ul .jstree-loading > .jstree-ocl,
+ .jstree-#{$theme-name}-small > .jstree-container-ul .jstree-loading > .jstree-ocl,
+ .jstree-#{$theme-name}-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
+ background-image: #{$throbber-bg};
+ }
+
+ .jstree-#{$theme-name} .jstree-node,
+ .jstree-#{$theme-name} .jstree-icon,
+ .jstree-#{$theme-name} .jstree-file,
+ .jstree-#{$theme-name} .jstree-folder,
+ #jstree-dnd.jstree-#{$theme-name} .jstree-ok,
+ #jstree-dnd.jstree-#{$theme-name} .jstree-er,
+ .jstree-#{$theme-name}-small .jstree-node,
+ .jstree-#{$theme-name}-small .jstree-icon,
+ .jstree-#{$theme-name}-small .jstree-file,
+ .jstree-#{$theme-name}-small .jstree-folder,
+ #jstree-dnd.jstree-#{$theme-name}-small .jstree-ok,
+ #jstree-dnd.jstree-#{$theme-name}-small .jstree-er,
+ .jstree-#{$theme-name}-large .jstree-node,
+ .jstree-#{$theme-name}-large .jstree-icon,
+ .jstree-#{$theme-name}-large .jstree-file,
+ .jstree-#{$theme-name}-large .jstree-folder,
+ #jstree-dnd.jstree-#{$theme-name}-large .jstree-ok,
+ #jstree-dnd.jstree-#{$theme-name}-large .jstree-er {
+ background-image: #{$small-bg};
+ }
+
+ @include media-breakpoint-down(md) {
+ #jstree-dnd.jstree-dnd-responsive > .jstree-ok,
+ #jstree-dnd.jstree-dnd-responsive > .jstree-er,
+ .jstree-#{$theme-name}-responsive .jstree-icon,
+ .jstree-#{$theme-name}-responsive .jstree-node,
+ .jstree-#{$theme-name}-responsive .jstree-icon,
+ .jstree-#{$theme-name}-responsive .jstree-node > .jstree-ocl,
+ .jstree-#{$theme-name}-responsive .jstree-themeicon,
+ .jstree-#{$theme-name}-responsive .jstree-checkbox,
+ .jstree-#{$theme-name}-responsive .jstree-file,
+ .jstree-#{$theme-name}-responsive .jstree-folder {
+ background-image: #{$big-bg};
+ }
+ }
+
+ .jstree-#{$theme-name} .jstree-last,
+ .jstree-#{$theme-name} > .jstree-no-dots .jstree-node,
+ .jstree-#{$theme-name} > .jstree-no-dots .jstree-leaf > .jstree-ocl,
+ .jstree-#{$theme-name} .jstree-disabled,
+ .jstree-#{$theme-name} .jstree-themeicon-custom:not(.jstree-file):not(.jstree-folder) {
+ background: transparent !important;
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ $theme-name: 'default-dark';
+ $throbber-bg: "url('./themes/default-dark/throbber.gif')";
+ $small-bg: "url('./themes/default-dark/32px.png')";
+ $big-bg: "url('./themes/default-dark/40px.png')";
+
+ .jstree-#{$theme-name} {
+ background: transparent;
+ }
+ .jstree-#{$theme-name} > .jstree-container-ul .jstree-loading > .jstree-ocl,
+ .jstree-#{$theme-name}-small > .jstree-container-ul .jstree-loading > .jstree-ocl,
+ .jstree-#{$theme-name}-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
+ background-image: #{$throbber-bg};
+ }
+
+ .jstree-#{$theme-name} .jstree-node,
+ .jstree-#{$theme-name} .jstree-icon,
+ .jstree-#{$theme-name} .jstree-file,
+ .jstree-#{$theme-name} .jstree-folder,
+ #jstree-dnd.jstree-#{$theme-name} .jstree-ok,
+ #jstree-dnd.jstree-#{$theme-name} .jstree-er,
+ .jstree-#{$theme-name}-small .jstree-node,
+ .jstree-#{$theme-name}-small .jstree-icon,
+ .jstree-#{$theme-name}-small .jstree-file,
+ .jstree-#{$theme-name}-small .jstree-folder,
+ #jstree-dnd.jstree-#{$theme-name}-small .jstree-ok,
+ #jstree-dnd.jstree-#{$theme-name}-small .jstree-er,
+ .jstree-#{$theme-name}-large .jstree-node,
+ .jstree-#{$theme-name}-large .jstree-icon,
+ .jstree-#{$theme-name}-large .jstree-file,
+ .jstree-#{$theme-name}-large .jstree-folder,
+ #jstree-dnd.jstree-#{$theme-name}-large .jstree-ok,
+ #jstree-dnd.jstree-#{$theme-name}-large .jstree-er {
+ background-image: #{$small-bg};
+ }
+
+ @include media-breakpoint-down(md) {
+ #jstree-dnd.jstree-dnd-responsive > .jstree-ok,
+ #jstree-dnd.jstree-dnd-responsive > .jstree-er,
+ .jstree-#{$theme-name}-responsive .jstree-icon,
+ .jstree-#{$theme-name}-responsive .jstree-node,
+ .jstree-#{$theme-name}-responsive .jstree-icon,
+ .jstree-#{$theme-name}-responsive .jstree-node > .jstree-ocl,
+ .jstree-#{$theme-name}-responsive .jstree-themeicon,
+ .jstree-#{$theme-name}-responsive .jstree-checkbox,
+ .jstree-#{$theme-name}-responsive .jstree-file,
+ .jstree-#{$theme-name}-responsive .jstree-folder {
+ background-image: #{$big-bg};
+ }
+ }
+
+ .jstree-#{$theme-name} .jstree-last,
+ .jstree-#{$theme-name} > .jstree-no-dots .jstree-node,
+ .jstree-#{$theme-name} > .jstree-no-dots .jstree-leaf > .jstree-ocl,
+ .jstree-#{$theme-name} .jstree-disabled,
+ .jstree-#{$theme-name} .jstree-themeicon-custom:not(.jstree-file):not(.jstree-folder) {
+ background: transparent !important;
+ }
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/32px.png b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/32px.png
new file mode 100644
index 0000000..d6fd721
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/32px.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/40px.png b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/40px.png
new file mode 100644
index 0000000..4fc88e4
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/40px.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/throbber.gif b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/throbber.gif
new file mode 100644
index 0000000..cd75035
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default-dark/throbber.gif differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/32px.png b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/32px.png
new file mode 100644
index 0000000..8950a30
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/32px.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/40px.png b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/40px.png
new file mode 100644
index 0000000..1959347
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/40px.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/throbber.gif b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/throbber.gif
new file mode 100644
index 0000000..1b5b2fd
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/jstree/themes/default/throbber.gif differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/leaflet/images/layers-2x.png b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/layers-2x.png
new file mode 100644
index 0000000..200c333
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/layers-2x.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/leaflet/images/layers.png b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/layers.png
new file mode 100644
index 0000000..1a72e57
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/layers.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png
new file mode 100644
index 0000000..88f9e50
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-icon-2x.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-icon.png b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-icon.png
new file mode 100644
index 0000000..950edf2
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-icon.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-shadow.png b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-shadow.png
new file mode 100644
index 0000000..9fd2979
Binary files /dev/null and b/modules/Admin/Resources/assets/vendor/libs/leaflet/images/marker-shadow.png differ
diff --git a/modules/Admin/Resources/assets/vendor/libs/leaflet/leaflet.js b/modules/Admin/Resources/assets/vendor/libs/leaflet/leaflet.js
new file mode 100644
index 0000000..6d76387
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/leaflet/leaflet.scss b/modules/Admin/Resources/assets/vendor/libs/leaflet/leaflet.scss
new file mode 100644
index 0000000..a8ee3e3
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/mapbox-gl/mapbox-gl.js b/modules/Admin/Resources/assets/vendor/libs/mapbox-gl/mapbox-gl.js
new file mode 100644
index 0000000..cf7aab5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/mapbox-gl/mapbox-gl.js
@@ -0,0 +1,7 @@
+import mapboxgl from 'mapbox-gl';
+
+try {
+ window.mapboxgl = mapboxgl;
+} catch (e) {}
+
+export { mapboxgl };
diff --git a/modules/Admin/Resources/assets/vendor/libs/mapbox-gl/mapbox-gl.scss b/modules/Admin/Resources/assets/vendor/libs/mapbox-gl/mapbox-gl.scss
new file mode 100644
index 0000000..7435565
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/mapbox-gl/mapbox-gl.scss
@@ -0,0 +1,8 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'mapbox-gl/dist/mapbox-gl';
+
+.marker-focus {
+ filter: drop-shadow(0px 0px 7px light.$purple);
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/masonry/masonry.js b/modules/Admin/Resources/assets/vendor/libs/masonry/masonry.js
new file mode 100644
index 0000000..1b99631
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/masonry/masonry.js
@@ -0,0 +1,7 @@
+import Masonry from 'masonry-layout';
+
+try {
+ window.Masonry = Masonry;
+} catch (e) {}
+
+export { Masonry };
diff --git a/modules/Admin/Resources/assets/vendor/libs/moment/moment.js b/modules/Admin/Resources/assets/vendor/libs/moment/moment.js
new file mode 100644
index 0000000..7ab3937
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/node-waves/node-waves.js b/modules/Admin/Resources/assets/vendor/libs/node-waves/node-waves.js
new file mode 100644
index 0000000..4fcc263
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/node-waves/node-waves.scss b/modules/Admin/Resources/assets/vendor/libs/node-waves/node-waves.scss
new file mode 100644
index 0000000..ba09b71
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/node-waves/node-waves.scss
@@ -0,0 +1,4 @@
+// Waves
+// *******************************************************************************
+
+@import 'node-waves/src/scss/waves';
diff --git a/modules/Admin/Resources/assets/vendor/libs/nouislider/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/nouislider/_mixins.scss
new file mode 100644
index 0000000..db7d2cf
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/nouislider/nouislider.js b/modules/Admin/Resources/assets/vendor/libs/nouislider/nouislider.js
new file mode 100644
index 0000000..73b3a45
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/nouislider/nouislider.scss b/modules/Admin/Resources/assets/vendor/libs/nouislider/nouislider.scss
new file mode 100644
index 0000000..99588ce
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/numeral/numeral.js b/modules/Admin/Resources/assets/vendor/libs/numeral/numeral.js
new file mode 100644
index 0000000..d641a00
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/numeral/numeral.js
@@ -0,0 +1,8 @@
+import numeral from 'numeral';
+import 'numeral/locales';
+
+try {
+ window.numeral = numeral;
+} catch (e) {}
+
+export { numeral };
diff --git a/modules/Admin/Resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js b/modules/Admin/Resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js
new file mode 100644
index 0000000..80556c6
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.scss b/modules/Admin/Resources/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.scss
new file mode 100644
index 0000000..da4a4a8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/pickr/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/pickr/_mixins.scss
new file mode 100644
index 0000000..8da073b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/pickr/_pickr-classic.scss b/modules/Admin/Resources/assets/vendor/libs/pickr/_pickr-classic.scss
new file mode 100644
index 0000000..68d7429
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/pickr/_pickr-monolith.scss b/modules/Admin/Resources/assets/vendor/libs/pickr/_pickr-monolith.scss
new file mode 100644
index 0000000..63ecab7
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/pickr/_pickr-nano.scss b/modules/Admin/Resources/assets/vendor/libs/pickr/_pickr-nano.scss
new file mode 100644
index 0000000..c03bed5
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/pickr/pickr-themes.scss b/modules/Admin/Resources/assets/vendor/libs/pickr/pickr-themes.scss
new file mode 100644
index 0000000..aeb2034
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/pickr/pickr.js b/modules/Admin/Resources/assets/vendor/libs/pickr/pickr.js
new file mode 100644
index 0000000..fb3b52f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/plyr/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/plyr/_mixins.scss
new file mode 100644
index 0000000..c4aa97e
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/plyr/plyr.js b/modules/Admin/Resources/assets/vendor/libs/plyr/plyr.js
new file mode 100644
index 0000000..018283e
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/plyr/plyr.scss b/modules/Admin/Resources/assets/vendor/libs/plyr/plyr.scss
new file mode 100644
index 0000000..441d93a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/popper/popper.js b/modules/Admin/Resources/assets/vendor/libs/popper/popper.js
new file mode 100644
index 0000000..a7b487d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/quill/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/quill/_mixins.scss
new file mode 100644
index 0000000..df48b30
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/quill/editor.scss b/modules/Admin/Resources/assets/vendor/libs/quill/editor.scss
new file mode 100644
index 0000000..b75b2ef
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/quill/katex.js b/modules/Admin/Resources/assets/vendor/libs/quill/katex.js
new file mode 100644
index 0000000..ca9f0aa
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/quill/katex.scss b/modules/Admin/Resources/assets/vendor/libs/quill/katex.scss
new file mode 100644
index 0000000..c7a85d5
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/quill/katex.scss
@@ -0,0 +1 @@
+@import 'katex/dist/katex';
diff --git a/modules/Admin/Resources/assets/vendor/libs/quill/quill.js b/modules/Admin/Resources/assets/vendor/libs/quill/quill.js
new file mode 100644
index 0000000..e1d3937
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/quill/typography.scss b/modules/Admin/Resources/assets/vendor/libs/quill/typography.scss
new file mode 100644
index 0000000..5c882f8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/rateyo/rateyo.js b/modules/Admin/Resources/assets/vendor/libs/rateyo/rateyo.js
new file mode 100644
index 0000000..e67be48
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/rateyo/rateyo.js
@@ -0,0 +1 @@
+import 'rateyo/src/jquery.rateyo';
diff --git a/modules/Admin/Resources/assets/vendor/libs/rateyo/rateyo.scss b/modules/Admin/Resources/assets/vendor/libs/rateyo/rateyo.scss
new file mode 100644
index 0000000..d548dad
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/rateyo/rateyo.scss
@@ -0,0 +1,97 @@
+// Rateyo
+// *******************************************************************************
+
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import 'rateyo/src/jquery.rateyo';
+@import '../../scss/_custom-variables/libs';
+
+// For Horizontal menu-item, z-index overrides
+.jq-ry-container > .jq-ry-group-wrapper > .jq-ry-group,
+.jq-ry-container > .jq-ry-group-wrapper > .jq-ry-group.jq-ry-rated-group {
+ z-index: 8;
+}
+
+// Light Style
+@if $enable-light-style {
+ .light-style {
+ $unratedStarColor: light.rgba-to-hex(rgba(light.$black, 0.16), light.$rgba-to-hex-bg);
+ $ratedStarColor: light.$yellow;
+
+ .jq-ry-container {
+ padding: 0;
+ }
+ @include app-ltr-style {
+ .jq-ry-container {
+ .jq-ry-normal-group {
+ svg {
+ fill: $unratedStarColor;
+ }
+ }
+ }
+ .jq-ry-container:not(.multi-color-ratings) {
+ .jq-ry-rated-group {
+ svg {
+ fill: $ratedStarColor;
+ }
+ }
+ }
+ }
+ @include app-rtl-style {
+ .jq-ry-container:not(.multi-color-ratings) {
+ .jq-ry-normal-group {
+ svg {
+ fill: $ratedStarColor;
+ }
+ }
+ }
+ .jq-ry-container {
+ .jq-ry-rated-group {
+ svg {
+ fill: light.rgba-to-hex($unratedStarColor, light.$rgba-to-hex-bg);
+ }
+ }
+ }
+ }
+ }
+}
+
+// Dark Style
+@if $enable-dark-style {
+ .dark-style {
+ $unratedStarColor: dark.rgba-to-hex(rgba(dark.$base, 0.16), dark.$rgba-to-hex-bg);
+ $ratedStarColor: dark.$yellow;
+ @include app-ltr-style {
+ .jq-ry-container {
+ .jq-ry-normal-group {
+ svg {
+ fill: $unratedStarColor;
+ }
+ }
+ }
+ .jq-ry-container:not(.multi-color-ratings) {
+ .jq-ry-rated-group {
+ svg {
+ fill: $ratedStarColor;
+ }
+ }
+ }
+ }
+ @include app-rtl-style {
+ .jq-ry-container:not(.multi-color-ratings) {
+ .jq-ry-normal-group {
+ svg {
+ fill: $ratedStarColor;
+ }
+ }
+ }
+ .jq-ry-container {
+ .jq-ry-rated-group {
+ svg {
+ fill: dark.rgba-to-hex($unratedStarColor, dark.$rgba-to-hex-bg);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/select2/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/select2/_mixins.scss
new file mode 100644
index 0000000..d9796b1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/select2/select2.js b/modules/Admin/Resources/assets/vendor/libs/select2/select2.js
new file mode 100644
index 0000000..19e8c38
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/select2/select2.scss b/modules/Admin/Resources/assets/vendor/libs/select2/select2.scss
new file mode 100644
index 0000000..f4200e6
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/shepherd/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/shepherd/_mixins.scss
new file mode 100644
index 0000000..7b247b5
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/shepherd/shepherd.js b/modules/Admin/Resources/assets/vendor/libs/shepherd/shepherd.js
new file mode 100644
index 0000000..59b587d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/shepherd/shepherd.js
@@ -0,0 +1,7 @@
+import Shepherd from '/node_modules/shepherd.js/dist/esm/shepherd.mjs';
+
+try {
+ window.Shepherd = Shepherd;
+} catch (e) {}
+
+export { Shepherd };
diff --git a/modules/Admin/Resources/assets/vendor/libs/shepherd/shepherd.scss b/modules/Admin/Resources/assets/vendor/libs/shepherd/shepherd.scss
new file mode 100644
index 0000000..8ebd309
--- /dev/null
+++ b/modules/Admin/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 '/node_modules/shepherd.js/dist/css/shepherd.css';
+@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/modules/Admin/Resources/assets/vendor/libs/sortablejs/sortable.js b/modules/Admin/Resources/assets/vendor/libs/sortablejs/sortable.js
new file mode 100644
index 0000000..7886c88
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/sortablejs/sortable.js
@@ -0,0 +1,7 @@
+import Sortable from 'sortablejs/Sortable';
+
+try {
+ window.Sortable = Sortable;
+} catch (e) {}
+
+export { Sortable };
diff --git a/modules/Admin/Resources/assets/vendor/libs/spinkit/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/spinkit/_mixins.scss
new file mode 100644
index 0000000..612206b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/spinkit/spinkit.scss b/modules/Admin/Resources/assets/vendor/libs/spinkit/spinkit.scss
new file mode 100644
index 0000000..622912c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/sweetalert2/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/sweetalert2/_mixins.scss
new file mode 100644
index 0000000..25241f9
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/sweetalert2/sweetalert2.js b/modules/Admin/Resources/assets/vendor/libs/sweetalert2/sweetalert2.js
new file mode 100644
index 0000000..bb7762e
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/sweetalert2/sweetalert2.scss b/modules/Admin/Resources/assets/vendor/libs/sweetalert2/sweetalert2.scss
new file mode 100644
index 0000000..2fb202e
--- /dev/null
+++ b/modules/Admin/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: $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/modules/Admin/Resources/assets/vendor/libs/swiper/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/swiper/_mixins.scss
new file mode 100644
index 0000000..66c841f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/swiper/swiper.js b/modules/Admin/Resources/assets/vendor/libs/swiper/swiper.js
new file mode 100644
index 0000000..ff6e4b1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/swiper/swiper.scss b/modules/Admin/Resources/assets/vendor/libs/swiper/swiper.scss
new file mode 100644
index 0000000..8f92171
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/tagify/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/tagify/_mixins.scss
new file mode 100644
index 0000000..57a2912
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/tagify/_tagify-email-list.scss b/modules/Admin/Resources/assets/vendor/libs/tagify/_tagify-email-list.scss
new file mode 100644
index 0000000..5cf2047
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/tagify/_tagify-inline-suggestion.scss b/modules/Admin/Resources/assets/vendor/libs/tagify/_tagify-inline-suggestion.scss
new file mode 100644
index 0000000..75a2685
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/tagify/_tagify-users-list.scss b/modules/Admin/Resources/assets/vendor/libs/tagify/_tagify-users-list.scss
new file mode 100644
index 0000000..d8b01e3
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/tagify/tagify.js b/modules/Admin/Resources/assets/vendor/libs/tagify/tagify.js
new file mode 100644
index 0000000..ef2f8f2
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/tagify/tagify.js
@@ -0,0 +1,7 @@
+import Tagify from '/node_modules/@yaireo/tagify/dist/tagify.js';
+
+try {
+ window.Tagify = Tagify;
+} catch (e) {}
+
+export { Tagify };
diff --git a/modules/Admin/Resources/assets/vendor/libs/tagify/tagify.scss b/modules/Admin/Resources/assets/vendor/libs/tagify/tagify.scss
new file mode 100644
index 0000000..735bc38
--- /dev/null
+++ b/modules/Admin/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 '/node_modules/@yaireo/tagify/src/tagify.scss';
+
+@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/modules/Admin/Resources/assets/vendor/libs/toastr/toastr.js b/modules/Admin/Resources/assets/vendor/libs/toastr/toastr.js
new file mode 100644
index 0000000..1f9c229
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/toastr/toastr.js
@@ -0,0 +1,7 @@
+import toastr from 'toastr/toastr';
+
+try {
+ window.toastr = toastr;
+} catch (e) {}
+
+export { toastr };
diff --git a/modules/Admin/Resources/assets/vendor/libs/toastr/toastr.scss b/modules/Admin/Resources/assets/vendor/libs/toastr/toastr.scss
new file mode 100644
index 0000000..14331be
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/libs/toastr/toastr.scss
@@ -0,0 +1,199 @@
+@use '../../scss/_bootstrap-extended/include' as light;
+@use '../../scss/_bootstrap-extended/include-dark' as dark;
+@import '../../scss/_custom-variables/libs';
+@import 'toastr/toastr.scss';
+
+.toast-message {
+ margin-left: 0.75rem !important;
+ margin-right: 0.75rem !important;
+ a {
+ color: light.$primary;
+ &:hover {
+ color: rgba(light.$primary, 0.6);
+ }
+ }
+}
+// Toast title
+.toast-title {
+ margin-left: 0.75rem;
+ color: light.$headings-color;
+ margin-bottom: 0.25rem;
+ @include app-rtl {
+ margin-right: 0.75rem;
+ }
+}
+
+#toast-container {
+ > div {
+ padding: 20px 30px 20px 50px !important;
+ opacity: 1;
+
+ @include app-rtl {
+ direction: rtl;
+ background-position: top 0.9rem right 1.25rem;
+ padding: 20px 50px 20px 30px !important;
+ }
+ }
+ &.toast-top-left {
+ @include app-rtl {
+ right: 12px;
+ left: auto;
+ }
+ }
+ &.toast-top-right {
+ @include app-rtl {
+ left: 12px;
+ right: auto;
+ }
+ }
+ &.toast-bottom-left {
+ @include app-rtl {
+ right: 12px;
+ left: auto;
+ }
+ }
+ &.toast-bottom-right {
+ @include app-rtl {
+ left: 12px;
+ right: auto;
+ }
+ }
+ &.toast-top-full-width,
+ &.toast-bottom-full-width {
+ toast-container > div {
+ @include app-rtl {
+ left: 0;
+ right: 0;
+ }
+ }
+ }
+ > .toast {
+ max-width: 100%;
+ background-size: 28px;
+ background-repeat: no-repeat;
+ }
+ &.toast-bottom-full-width > div,
+ &.toast-top-full-width > div {
+ width: 100%;
+ margin-bottom: 0;
+ border-radius: 0 !important;
+ }
+
+ > .toast-info {
+ background-image: url("data:image/svg+xml,%3Csvg width='26' height='26' viewBox='0 0 26 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='26' height='26' rx='6' fill='%2300CFE8' fill-opacity='0.08'/%3E%3Ccircle cx='13' cy='13' r='6.75' stroke='%2300CFE8' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M13.0002 10H13.0077' stroke='%2300CFE8' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12.25 13H13V16H13.75' stroke='%2300CFE8' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A") !important;
+ background-position: 1.25rem 1.25rem;
+ }
+ > .toast-error {
+ background-image: url("data:image/svg+xml,%3Csvg width='26' height='26' viewBox='0 0 26 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='26' height='26' rx='6' fill='%23EA5455' fill-opacity='0.08'/%3E%3Cpath d='M17.5 8.5L8.5 17.5' stroke='%23EA5455' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M8.5 8.5L17.5 17.5' stroke='%23EA5455' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A") !important;
+
+ background-position: 1.25rem 1.25rem;
+ }
+ > .toast-success {
+ background-image: url("data:image/svg+xml,%3Csvg width='26' height='26' viewBox='0 0 26 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='26' height='26' rx='6' fill='%2328C76F' fill-opacity='0.08'/%3E%3Cpath d='M7.75 13L11.5 16.75L19 9.25' stroke='%2328C76F' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A") !important;
+ background-position: 1.25rem 1.25rem;
+ }
+ > .toast-warning {
+ background-image: url("data:image/svg+xml,%3Csvg width='26' height='26' viewBox='0 0 26 26' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='26' height='26' rx='6' fill='%23FF9F43' fill-opacity='0.08'/%3E%3Cpath d='M13 10V12.8362' stroke='%23FF9F43' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M13 15.6543L13 15.6899' stroke='%23FF9F43' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M7.74941 18.2504H18.2494C18.7463 18.2469 19.2092 17.9976 19.4856 17.5846C19.7619 17.1716 19.8158 16.6485 19.6294 16.1879L14.3044 7.00038C14.0402 6.5229 13.5376 6.22656 12.9919 6.22656C12.4462 6.22656 11.9436 6.5229 11.6794 7.00038L6.35441 16.1879C6.17171 16.6377 6.218 17.1481 6.47865 17.5577C6.7393 17.9673 7.18207 18.2254 7.66691 18.2504' stroke='%23FF9F43' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
+ background-position: 1.25rem 1.25rem;
+ }
+}
+// for full width toasts
+#toast-container:not(.toast-bottom-full-width, .toast-top-full-width) > div {
+ width: 22em !important;
+}
+
+.toast-progress {
+ position: absolute;
+ bottom: auto;
+ top: 0;
+ opacity: 0.15;
+ height: 0.1875rem;
+ -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=15);
+ filter: alpha(opacity=15);
+
+ @include app-rtl {
+ left: auto;
+ right: 0;
+ }
+}
+
+.toast-close-button {
+ position: absolute;
+ right: 1.25rem !important;
+ top: 0.5rem;
+ text-shadow: none;
+ color: light.$text-muted !important;
+ padding: auto;
+ font-size: 1.625rem;
+
+ @include app-rtl {
+ left: 1.25rem !important;
+ right: auto !important;
+ }
+}
+
+// Light style
+@if $enable-light-style {
+ .light-style {
+ #toast-container {
+ z-index: light.$zindex-notification;
+
+ .toast-close-button {
+ font-weight: light.$close-font-weight;
+ }
+
+ > div {
+ box-shadow: light.$box-shadow;
+ border-radius: light.$border-radius;
+ }
+
+ > .toast-success,
+ .toast-error,
+ .toast-info,
+ .toast-warning {
+ color: light.$headings-color;
+ background-color: light.$card-bg;
+ }
+ }
+ }
+}
+
+// Dark style
+@if $enable-dark-style {
+ .dark-style {
+ #toast-container {
+ z-index: dark.$zindex-notification;
+
+ .toast-close-button {
+ font-weight: dark.$close-font-weight;
+ color: dark.$text-muted !important;
+ }
+ .toast-title {
+ color: dark.$headings-color;
+ }
+
+ > div {
+ box-shadow: dark.$box-shadow;
+ border-radius: dark.$border-radius;
+ }
+ .toast-progress {
+ background-color: dark.$white;
+ }
+
+ > .toast-success,
+ .toast-error,
+ .toast-info,
+ .toast-warning {
+ color: dark.$headings-color;
+ background-color: dark.$card-bg;
+ }
+ }
+ }
+}
+
+// toast close button style
+@media (min-width: 241px) and (max-width: 480px) {
+ #toast-container .toast-close-button {
+ top: 0.3em;
+ }
+}
diff --git a/modules/Admin/Resources/assets/vendor/libs/typeahead-js/_mixins.scss b/modules/Admin/Resources/assets/vendor/libs/typeahead-js/_mixins.scss
new file mode 100644
index 0000000..7a0263a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/typeahead-js/typeahead.js b/modules/Admin/Resources/assets/vendor/libs/typeahead-js/typeahead.js
new file mode 100644
index 0000000..bd1e169
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/libs/typeahead-js/typeahead.scss b/modules/Admin/Resources/assets/vendor/libs/typeahead-js/typeahead.scss
new file mode 100644
index 0000000..4fa9556
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-dark.scss
new file mode 100644
index 0000000..2071652
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended-dark.scss
new file mode 100644
index 0000000..32a032d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended.scss
new file mode 100644
index 0000000..0d3ba7f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_accordion.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_accordion.scss
new file mode 100644
index 0000000..1bd238b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_alert.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_alert.scss
new file mode 100644
index 0000000..74f2fcf
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_badge.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_badge.scss
new file mode 100644
index 0000000..44cf65b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_breadcrumb.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_breadcrumb.scss
new file mode 100644
index 0000000..36fbffa
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_button-group.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_button-group.scss
new file mode 100644
index 0000000..614e828
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_buttons.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_buttons.scss
new file mode 100644
index 0000000..a01c72b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_card.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_card.scss
new file mode 100644
index 0000000..92c13e4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_carousel.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_carousel.scss
new file mode 100644
index 0000000..7732751
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_close.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_close.scss
new file mode 100644
index 0000000..ab45fe6
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_dropdown.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_dropdown.scss
new file mode 100644
index 0000000..e19d7fc
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_forms.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_forms.scss
new file mode 100644
index 0000000..15bcaa3
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_functions.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_functions.scss
new file mode 100644
index 0000000..a5ad1c7
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_include-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_include-dark.scss
new file mode 100644
index 0000000..1e086b3
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_include.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_include.scss
new file mode 100644
index 0000000..23b090d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_list-group.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_list-group.scss
new file mode 100644
index 0000000..2958b1a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_mixins.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_mixins.scss
new file mode 100644
index 0000000..7597d2c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_modal.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_modal.scss
new file mode 100644
index 0000000..3acb312
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_nav.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_nav.scss
new file mode 100644
index 0000000..c8b4af8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_navbar.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_navbar.scss
new file mode 100644
index 0000000..bd6db22
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_offcanvas.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_offcanvas.scss
new file mode 100644
index 0000000..d56fa0f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_pagination.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_pagination.scss
new file mode 100644
index 0000000..2e913e1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_popover.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_popover.scss
new file mode 100644
index 0000000..98294fe
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_progress.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_progress.scss
new file mode 100644
index 0000000..c41a774
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_reboot.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_reboot.scss
new file mode 100644
index 0000000..b05d833
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_root.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_root.scss
new file mode 100644
index 0000000..4bbd2bd
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_spinners.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_spinners.scss
new file mode 100644
index 0000000..72dc9c3
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_tables.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_tables.scss
new file mode 100644
index 0000000..e4eb283
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_toasts.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_toasts.scss
new file mode 100644
index 0000000..c033faf
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_tooltip.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_tooltip.scss
new file mode 100644
index 0000000..78c5e17
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_type.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_type.scss
new file mode 100644
index 0000000..2001fd4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_utilities-ltr.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_utilities-ltr.scss
new file mode 100644
index 0000000..a055e24
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_utilities-rtl.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_utilities-rtl.scss
new file mode 100644
index 0000000..0193ad7
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_utilities.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_utilities.scss
new file mode 100644
index 0000000..5f2cef1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_variables-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_variables-dark.scss
new file mode 100644
index 0000000..079a183
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_variables.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/_variables.scss
new file mode 100644
index 0000000..7dc629d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_floating-labels.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_floating-labels.scss
new file mode 100644
index 0000000..be2063a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-check.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-check.scss
new file mode 100644
index 0000000..120f50b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-control.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-control.scss
new file mode 100644
index 0000000..15ba127
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-range.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-range.scss
new file mode 100644
index 0000000..a1dcc9b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-select.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-select.scss
new file mode 100644
index 0000000..4ac4473
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-text.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-text.scss
new file mode 100644
index 0000000..d8a2ac3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_form-text.scss
@@ -0,0 +1,2 @@
+// Form Text
+// *******************************************************************************
diff --git a/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_input-group.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_input-group.scss
new file mode 100644
index 0000000..287e879
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_labels.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_labels.scss
new file mode 100644
index 0000000..3c284d2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_validation.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/forms/_validation.scss
new file mode 100644
index 0000000..40cfe68
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_alert.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_alert.scss
new file mode 100644
index 0000000..4428bf4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_badge.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_badge.scss
new file mode 100644
index 0000000..d8ec80a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_buttons.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_buttons.scss
new file mode 100644
index 0000000..13eede1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_card.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_card.scss
new file mode 100644
index 0000000..c766c67
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_caret.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_caret.scss
new file mode 100644
index 0000000..cd4b1df
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_dropdown.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_dropdown.scss
new file mode 100644
index 0000000..05f4c00
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_forms.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_forms.scss
new file mode 100644
index 0000000..d5270c0
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_list-group.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_list-group.scss
new file mode 100644
index 0000000..50acaf4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_misc.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_misc.scss
new file mode 100644
index 0000000..9c79146
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_modal.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_modal.scss
new file mode 100644
index 0000000..e838924
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_navs.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_navs.scss
new file mode 100644
index 0000000..85900ed
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_pagination.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_pagination.scss
new file mode 100644
index 0000000..f08551a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_popover.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_popover.scss
new file mode 100644
index 0000000..94b07fd
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_progress.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_progress.scss
new file mode 100644
index 0000000..02f92f2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_table-variants.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_table-variants.scss
new file mode 100644
index 0000000..8f94d41
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_tooltip.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap-extended/mixins/_tooltip.scss
new file mode 100644
index 0000000..93657ba
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_bootstrap.scss b/modules/Admin/Resources/assets/vendor/scss/_bootstrap.scss
new file mode 100644
index 0000000..cbf6f2a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_colors-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_colors-dark.scss
new file mode 100644
index 0000000..9af501a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_colors.scss b/modules/Admin/Resources/assets/vendor/scss/_colors.scss
new file mode 100644
index 0000000..384dc7a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_components-dark.scss
new file mode 100644
index 0000000..b4181f8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components.scss b/modules/Admin/Resources/assets/vendor/scss/_components.scss
new file mode 100644
index 0000000..e99d543
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_app-brand.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_app-brand.scss
new file mode 100644
index 0000000..0671c29
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_avatar.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_avatar.scss
new file mode 100644
index 0000000..1f054b1
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_base.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_base.scss
new file mode 100644
index 0000000..5e377d5
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_blockui.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_blockui.scss
new file mode 100644
index 0000000..3b6531d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_common.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_common.scss
new file mode 100644
index 0000000..ceef436
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_custom-options.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_custom-options.scss
new file mode 100644
index 0000000..fe28073
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_drag-drop.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_drag-drop.scss
new file mode 100644
index 0000000..82f0008
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_footer.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_footer.scss
new file mode 100644
index 0000000..f701708
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_include-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_include-dark.scss
new file mode 100644
index 0000000..b1b6718
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_include.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_include.scss
new file mode 100644
index 0000000..6ce1af0
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_layout.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_layout.scss
new file mode 100644
index 0000000..640db5a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_menu.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_menu.scss
new file mode 100644
index 0000000..bb17fa8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_mixins.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_mixins.scss
new file mode 100644
index 0000000..4c4241c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_switch.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_switch.scss
new file mode 100644
index 0000000..dbb4ed6
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_text-divider.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_text-divider.scss
new file mode 100644
index 0000000..95101d8
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_timeline.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_timeline.scss
new file mode 100644
index 0000000..96157d4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_variables-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_variables-dark.scss
new file mode 100644
index 0000000..745cb60
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/_variables.scss b/modules/Admin/Resources/assets/vendor/scss/_components/_variables.scss
new file mode 100644
index 0000000..a3a9479
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_app-brand.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_app-brand.scss
new file mode 100644
index 0000000..bc83dc5
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_avatar.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_avatar.scss
new file mode 100644
index 0000000..2941376
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_footer.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_footer.scss
new file mode 100644
index 0000000..c3e9959
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_menu.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_menu.scss
new file mode 100644
index 0000000..afe903f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_misc.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_misc.scss
new file mode 100644
index 0000000..f45340d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_navbar.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_navbar.scss
new file mode 100644
index 0000000..907493c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_switch.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_switch.scss
new file mode 100644
index 0000000..a5b5339
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_text-divider.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_text-divider.scss
new file mode 100644
index 0000000..cd67b7e
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_timeline.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_timeline.scss
new file mode 100644
index 0000000..5067c84
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_treeview.scss b/modules/Admin/Resources/assets/vendor/scss/_components/mixins/_treeview.scss
new file mode 100644
index 0000000..081a8c4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_bootstrap-extended-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_bootstrap-extended-dark.scss
new file mode 100644
index 0000000..29b6f8f
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_bootstrap-extended.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_bootstrap-extended.scss
new file mode 100644
index 0000000..e6dedd5
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_components-dark.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_components-dark.scss
new file mode 100644
index 0000000..706c14e
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_components.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_components.scss
new file mode 100644
index 0000000..e6230c4
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_libs.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_libs.scss
new file mode 100644
index 0000000..0235932
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_pages.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_pages.scss
new file mode 100644
index 0000000..f72a574
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_support.scss b/modules/Admin/Resources/assets/vendor/scss/_custom-variables/_support.scss
new file mode 100644
index 0000000..93cde5c
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_theme/_common.scss b/modules/Admin/Resources/assets/vendor/scss/_theme/_common.scss
new file mode 100644
index 0000000..09a66bf
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_theme/_libs.scss b/modules/Admin/Resources/assets/vendor/scss/_theme/_libs.scss
new file mode 100644
index 0000000..68d8c88
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_theme/_pages.scss b/modules/Admin/Resources/assets/vendor/scss/_theme/_pages.scss
new file mode 100644
index 0000000..b98f5e2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/_theme/_theme.scss b/modules/Admin/Resources/assets/vendor/scss/_theme/_theme.scss
new file mode 100644
index 0000000..3cf16bb
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/core-dark.scss b/modules/Admin/Resources/assets/vendor/scss/core-dark.scss
new file mode 100644
index 0000000..7233d20
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/core.scss b/modules/Admin/Resources/assets/vendor/scss/core.scss
new file mode 100644
index 0000000..dae0761
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/core.scss
@@ -0,0 +1,4 @@
+@import 'bootstrap';
+@import 'bootstrap-extended';
+@import 'components';
+@import 'colors';
diff --git a/modules/Admin/Resources/assets/vendor/scss/pages/_mixins.scss b/modules/Admin/Resources/assets/vendor/scss/pages/_mixins.scss
new file mode 100644
index 0000000..87ce6d2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-dark.scss
new file mode 100644
index 0000000..dfcafed
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../bootstrap-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-extended-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-extended-dark.scss
new file mode 100644
index 0000000..5c6845f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-extended-dark.scss
@@ -0,0 +1,9 @@
+$rtl-support: true;
+
+@import '../bootstrap-extended-dark';
+
+// RTL Utilities
+@include rtl-only {
+ @import '../_bootstrap-extended/utilities-rtl';
+ @import 'bootstrap/scss/utilities/api';
+}
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-extended.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-extended.scss
new file mode 100644
index 0000000..75241f0
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap-extended.scss
@@ -0,0 +1,9 @@
+$rtl-support: true;
+
+@import '../bootstrap-extended';
+
+// RTL Utilities
+@include rtl-only {
+ @import '../_bootstrap-extended/utilities-rtl';
+ @import 'bootstrap/scss/utilities/api';
+}
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap.scss
new file mode 100644
index 0000000..c75052d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_bootstrap.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../bootstrap';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_colors-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_colors-dark.scss
new file mode 100644
index 0000000..4b2b6c9
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_colors-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../colors-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_colors.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_colors.scss
new file mode 100644
index 0000000..af0e47c
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_colors.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../colors';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_components-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_components-dark.scss
new file mode 100644
index 0000000..127f242
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_components-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../components-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/_components.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/_components.scss
new file mode 100644
index 0000000..ca89bee
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/_components.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../components';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/core-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/core-dark.scss
new file mode 100644
index 0000000..7233d20
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/core-dark.scss
@@ -0,0 +1,4 @@
+@import 'bootstrap-dark';
+@import 'bootstrap-extended-dark';
+@import 'components-dark';
+@import 'colors-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/core.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/core.scss
new file mode 100644
index 0000000..dae0761
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/core.scss
@@ -0,0 +1,4 @@
+@import 'bootstrap';
+@import 'bootstrap-extended';
+@import 'components';
+@import 'colors';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-bordered-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-bordered-dark.scss
new file mode 100644
index 0000000..08cba94
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-bordered-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-bordered-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-bordered.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-bordered.scss
new file mode 100644
index 0000000..d25ce87
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-bordered.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-bordered';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-default-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-default-dark.scss
new file mode 100644
index 0000000..b8e63c3
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-default-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-default-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-default.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-default.scss
new file mode 100644
index 0000000..a4fe4c1
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-default.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-default';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-raspberry-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-raspberry-dark.scss
new file mode 100644
index 0000000..252b50f
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-raspberry-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-raspberry-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-raspberry.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-raspberry.scss
new file mode 100644
index 0000000..596f938
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-raspberry.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-raspberry';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-semi-dark-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-semi-dark-dark.scss
new file mode 100644
index 0000000..c7b6339
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-semi-dark-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-semi-dark-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/rtl/theme-semi-dark.scss b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-semi-dark.scss
new file mode 100644
index 0000000..d1fbb1d
--- /dev/null
+++ b/modules/Admin/Resources/assets/vendor/scss/rtl/theme-semi-dark.scss
@@ -0,0 +1,3 @@
+$rtl-support: true;
+
+@import '../theme-semi-dark';
diff --git a/modules/Admin/Resources/assets/vendor/scss/theme-bordered-dark.scss b/modules/Admin/Resources/assets/vendor/scss/theme-bordered-dark.scss
new file mode 100644
index 0000000..dcaa37a
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-bordered.scss b/modules/Admin/Resources/assets/vendor/scss/theme-bordered.scss
new file mode 100644
index 0000000..2676efc
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-default-dark.scss b/modules/Admin/Resources/assets/vendor/scss/theme-default-dark.scss
new file mode 100644
index 0000000..b2478e0
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-default.scss b/modules/Admin/Resources/assets/vendor/scss/theme-default.scss
new file mode 100644
index 0000000..27b48d3
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-raspberry-dark.scss b/modules/Admin/Resources/assets/vendor/scss/theme-raspberry-dark.scss
new file mode 100644
index 0000000..2f852d2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-raspberry.scss b/modules/Admin/Resources/assets/vendor/scss/theme-raspberry.scss
new file mode 100644
index 0000000..8b07048
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-semi-dark-dark.scss b/modules/Admin/Resources/assets/vendor/scss/theme-semi-dark-dark.scss
new file mode 100644
index 0000000..eb51502
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/assets/vendor/scss/theme-semi-dark.scss b/modules/Admin/Resources/assets/vendor/scss/theme-semi-dark.scss
new file mode 100644
index 0000000..e135b10
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/css/app.css b/modules/Admin/Resources/css/app.css
new file mode 100644
index 0000000..6cf2721
--- /dev/null
+++ b/modules/Admin/Resources/css/app.css
@@ -0,0 +1,353 @@
+@tailwind base;
+@tailwind components;
+@tailwind 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;
+}
+*/
diff --git a/modules/Admin/Resources/js/_class/FormCustomListener.js b/modules/Admin/Resources/js/_class/FormCustomListener.js
new file mode 100644
index 0000000..3fa0fda
--- /dev/null
+++ b/modules/Admin/Resources/js/_class/FormCustomListener.js
@@ -0,0 +1,247 @@
+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) {
+ console.log('Formulario válido');
+
+ // 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/modules/Admin/Resources/js/_class/LivewireNotification.js b/modules/Admin/Resources/js/_class/LivewireNotification.js
new file mode 100644
index 0000000..a0239b2
--- /dev/null
+++ b/modules/Admin/Resources/js/_class/LivewireNotification.js
@@ -0,0 +1,190 @@
+export default class LivewireNotification {
+ constructor(config = {}) {
+ const defaultConfig = {
+ notificationTimeout: 6000, // 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);
+ }
+ });
+ }
+
+ /**
+ * 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,
+ notificationTimeout: customTimeout || options.notificationTimeout || this.config.notificationTimeout // 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) {
+ 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.setNotificationTimeout(notificationElement, event);
+
+ // Configurar el evento para el botón de cierre
+ this.setupCloseButton(notificationElement, event);
+ }
+
+ /**
+ * 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.setNotificationTimeout(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.
+ */
+ setNotificationTimeout(notificationElement, event) {
+ const timeout = event.notificationTimeout || this.config.notificationTimeout;
+
+ 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);
+ }
+ });
+ }
+ }
+}
diff --git a/modules/Admin/Resources/js/_class/SenderResponseForm.js b/modules/Admin/Resources/js/_class/SenderResponseForm.js
new file mode 100644
index 0000000..7071604
--- /dev/null
+++ b/modules/Admin/Resources/js/_class/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/modules/Admin/Resources/js/_class/SmtpSettingsForm.js b/modules/Admin/Resources/js/_class/SmtpSettingsForm.js
new file mode 100644
index 0000000..8704bf1
--- /dev/null
+++ b/modules/Admin/Resources/js/_class/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/modules/Admin/Resources/js/_class/WebsiteLegalSettingsForm.js b/modules/Admin/Resources/js/_class/WebsiteLegalSettingsForm.js
new file mode 100644
index 0000000..3731643
--- /dev/null
+++ b/modules/Admin/Resources/js/_class/WebsiteLegalSettingsForm.js
@@ -0,0 +1,252 @@
+export default class WebsiteLegalSettingsForm {
+ constructor(config = {}) {
+ const defaultConfig = {
+ contentId: 'website-legal-settings-card',
+ forms: {
+ 'legal_terminos_y_condiciones-nav': {
+ enabledCheckboxId: 'legal_terminos_y_condiciones-enabled',
+ quillSelector: '#legal_terminos_y_condiciones-content',
+ quillPlaceholder: 'Ingrese los términos y condiciones'
+ },
+ 'legal_aviso_de_privacidad-nav': {
+ enabledCheckboxId: 'legal_aviso_de_privacidad-enabled',
+ quillSelector: '#legal_aviso_de_privacidad-content',
+ quillPlaceholder: 'Ingrese los aviso de privacidad'
+ },
+ 'legal_politica_de_devoluciones-nav': {
+ enabledCheckboxId: 'legal_politica_de_devoluciones-enabled',
+ quillSelector: '#legal_politica_de_devoluciones-content',
+ quillPlaceholder: 'Ingrese los política de devoluciones y reembolsos'
+ },
+ 'legal_politica_de_envios-nav': {
+ enabledCheckboxId: 'legal_politica_de_envios-enabled',
+ quillSelector: '#legal_politica_de_envios-content',
+ quillPlaceholder: 'Ingrese los política de envíos'
+ },
+ 'legal_politica_de_cookies-nav': {
+ enabledCheckboxId: 'legal_politica_de_cookies-enabled',
+ quillSelector: '#legal_politica_de_cookies-content',
+ quillPlaceholder: 'Ingrese los política de cookies'
+ },
+ 'legal_autorizaciones_y_licencias-nav': {
+ enabledCheckboxId: 'legal_autorizaciones_y_licencias-enabled',
+ quillSelector: '#legal_autorizaciones_y_licencias-content',
+ quillPlaceholder: 'Ingrese los autorizaciones y licencias'
+ },
+ 'legal_informacion_comercial-nav': {
+ enabledCheckboxId: 'legal_informacion_comercial-enabled',
+ quillSelector: '#legal_informacion_comercial-content',
+ quillPlaceholder: 'Ingrese los información comercial'
+ },
+ 'legal_consentimiento_para_el_login_de_terceros-nav': {
+ enabledCheckboxId: 'legal_consentimiento_para_el_login_de_terceros-enabled',
+ quillSelector: '#legal_consentimiento_para_el_login_de_terceros-content',
+ quillPlaceholder: 'Ingrese los consentimiento para el login de terceros'
+ },
+ 'legal_leyendas_de_responsabilidad-nav': {
+ enabledCheckboxId: 'legal_leyendas_de_responsabilidad-enabled',
+ quillSelector: '#legal_leyendas_de_responsabilidad-content',
+ quillPlaceholder: 'Ingrese los leyendas de responsabilidad'
+ }
+ },
+ saveButtonId: 'save-button',
+ cancelButtonId: 'cancel-button',
+ notificationAreaSelector: '.notification-container'
+ };
+
+ this.config = { ...defaultConfig, ...config };
+
+ this.content = null;
+ this.saveButton = null;
+ this.cancelButton = null;
+ this.notificationArea = null;
+ this.currentFormKey = null;
+ this.quillInstances = {}; // Almacenar instancias de Quill
+ this.editState = {};
+
+ this.init();
+ }
+
+ init() {
+ this.content = document.getElementById(this.config.contentId);
+ this.saveButton = document.getElementById(this.config.saveButtonId);
+ this.cancelButton = document.getElementById(this.config.cancelButtonId);
+ this.notificationArea = this.content.querySelector(this.config.notificationAreaSelector);
+
+ // Puntero para rastrear si un formulario ha sido editado
+ this.editState = Object.keys(this.config.forms).reduce((state, key) => {
+ state[key] = false; // Inicializar todos los formularios como no editados
+ return state;
+ }, {});
+
+ this.switchToForm(Object.keys(this.config.forms)[0]); // Cargar el primer formulario
+
+ this.saveButton.addEventListener('click', () => this.handleSave());
+ this.cancelButton.addEventListener('click', () => this.handleCancel());
+ }
+
+ reload() {
+ const currentFormKey = this.currentFormKey;
+
+ if (currentFormKey) {
+ const quillInstance = this.quillInstances[currentFormKey];
+ const { quillSelector, enabledCheckboxId } = this.config.forms[currentFormKey];
+ const quillContainer = document.querySelector(quillSelector);
+ const checkbox = document.getElementById(enabledCheckboxId);
+ const textarea = document.getElementById(`${currentFormKey.replace('-nav', '')}-textarea`);
+
+ quillInstance.root.innerHTML = textarea.value;
+
+ // Agregar eventos
+ checkbox.addEventListener('change', () =>
+ this.handleCheckboxChange(checkbox, quillContainer, currentFormKey)
+ );
+
+ const isEnabled = checkbox.checked;
+
+ quillInstance.enable(isEnabled); // Sincronizar habilitación con el checkbox
+ }
+ }
+
+ switchToForm(formKey) {
+ if (!this.config.forms[formKey]) return;
+
+ this.currentFormKey = formKey;
+ const { quillSelector, quillPlaceholder, enabledCheckboxId } = this.config.forms[formKey];
+ const quillContainer = document.querySelector(quillSelector);
+ const checkbox = document.getElementById(enabledCheckboxId);
+
+ // Si la instancia de Quill no existe, inicialízala
+ if (!this.quillInstances[formKey]) {
+ this.quillInstances[formKey] = new Quill(quillSelector, {
+ placeholder: quillPlaceholder,
+ modules: { toolbar: this.getToolbar() },
+ theme: 'snow'
+ });
+
+ // Escuchar cambios en el editor
+ quillContainer.__quill = this.quillInstances[formKey];
+
+ this.quillInstances[formKey].on(
+ 'text-change',
+ this.debounce(() => this.handleContentChange(formKey), 300)
+ );
+
+ setTimeout(() => {
+ const isEnabled = checkbox.checked;
+
+ quillContainer.__quill.enable(isEnabled); // Sincronizar habilitación con el checkbox
+ });
+ }
+
+ this.toggleButtonsState(this.editState[this.currentFormKey]);
+
+ // Asignar evento al checkbox (asegura no duplicar eventos)
+ if (!checkbox.dataset.bound) {
+ checkbox.addEventListener('change', () => this.handleCheckboxChange(checkbox, quillContainer, formKey));
+ checkbox.dataset.bound = true; // Marcar como manejado
+ }
+ }
+
+ handleContentChange(formKey) {
+ // Marcar el formulario como editado
+ this.editState[formKey] = true;
+
+ // Habilitar botones
+ this.toggleButtonsState(true);
+ }
+
+ handleCheckboxChange(checkbox, quillContainer, formKey) {
+ const isEnabled = checkbox.checked;
+
+ if (quillContainer.__quill) {
+ quillContainer.__quill.enable(isEnabled); // Habilitar o deshabilitar el editor
+
+ if (isEnabled) {
+ quillContainer.__quill.focus(); // Hacer focus si está habilitado
+ }
+ }
+
+ // Marcar el formulario como editado
+ this.editState[formKey] = true;
+ this.toggleButtonsState(true);
+ }
+
+ handleSave() {
+ const quillInstance = this.quillInstances[this.currentFormKey];
+ const textarea = document.getElementById(`${this.currentFormKey.replace('-nav', '-textarea')}`);
+
+ // Deshabilitar el estado de edición
+ this.editState[this.currentFormKey] = false;
+
+ //this.disableFormFields(this.content);
+ this.toggleButtonsState(false);
+ this.setButtonLoadingState(true);
+
+ // Actualizar el contenido del textarea para sincronizar con Livewire
+ textarea.value = quillInstance.root.innerHTML;
+
+ // Simular el evento 'input' para actualizar el contenido en el textarea
+ textarea.dispatchEvent(new Event('input', { bubbles: true }));
+
+ // Emitir el evento de guardar en Livewire
+ Livewire.dispatch('saveLegal');
+ }
+
+ handleCancel() {
+ // Restablecer el estado de edición del formulario actual
+ this.editState[this.currentFormKey] = false;
+
+ //this.disableFormFields();
+ this.toggleButtonsState(false);
+ }
+
+ disableFormFields(content) {
+ content.querySelectorAll('input, select, textarea').forEach(field => {
+ field.disabled = true;
+ });
+
+ if (this.fullEditor) {
+ this.fullEditor.enable(false); // Deshabilitar el editor
+ }
+ }
+
+ toggleButtonsState(state) {
+ this.saveButton.disabled = !state;
+ this.cancelButton.disabled = !state;
+ }
+
+ setButtonLoadingState(isLoading) {
+ const loadingText = this.saveButton.getAttribute('data-loading-text');
+
+ if (loadingText && isLoading) {
+ this.saveButton.innerHTML = loadingText;
+ } else {
+ this.saveButton.innerHTML = this.saveButton.getAttribute('data-original-text') || this.saveButton.innerHTML;
+ }
+ }
+
+ debounce(func, wait) {
+ let timeout;
+
+ return function (...args) {
+ const context = this;
+
+ clearTimeout(timeout);
+
+ timeout = setTimeout(() => func.apply(context, args), wait);
+ };
+ }
+
+ getToolbar() {
+ return [
+ [{ font: [] }, { size: [] }],
+ ['bold', 'italic', 'underline', 'strike'],
+ [{ color: [] }, { background: [] }],
+ [{ script: 'super' }, { script: 'sub' }],
+ [{ header: '1' }, { header: '2' }],
+ [{ list: 'ordered' }, { list: 'bullet' }, { indent: '-1' }, { indent: '+1' }],
+ ['link', 'clean']
+ ];
+ }
+}
diff --git a/modules/Admin/Resources/js/admin-settings/admin-settings-scripts.js b/modules/Admin/Resources/js/admin-settings/admin-settings-scripts.js
new file mode 100644
index 0000000..6067f87
--- /dev/null
+++ b/modules/Admin/Resources/js/admin-settings/admin-settings-scripts.js
@@ -0,0 +1,29 @@
+import LivewireNotification from '../_class/LivewireNotification';
+import FormCustomListener from '../_class/FormCustomListener';
+
+const notification = new LivewireNotification();
+
+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/modules/Admin/Resources/js/admin-settings/smtp-settings-scripts.js b/modules/Admin/Resources/js/admin-settings/smtp-settings-scripts.js
new file mode 100644
index 0000000..e822ce4
--- /dev/null
+++ b/modules/Admin/Resources/js/admin-settings/smtp-settings-scripts.js
@@ -0,0 +1,27 @@
+import LivewireNotification from '../_class/LivewireNotification';
+import SmtpSettingsForm from '../_class/SmtpSettingsForm';
+import SenderResponseForm from '../_class/SenderResponseForm';
+
+new LivewireNotification();
+
+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/modules/Admin/Resources/js/app.js b/modules/Admin/Resources/js/app.js
new file mode 100644
index 0000000..cda08dd
--- /dev/null
+++ b/modules/Admin/Resources/js/app.js
@@ -0,0 +1,9 @@
+import './bootstrap';
+/*
+ Add custom scripts here
+*/
+import.meta.glob([
+ '../assets/img/**',
+ // '../assets/json/**',
+ '../assets/vendor/fonts/**'
+]);
diff --git a/modules/Admin/Resources/js/auth/app-access-permission.js b/modules/Admin/Resources/js/auth/app-access-permission.js
new file mode 100644
index 0000000..e2ccac8
--- /dev/null
+++ b/modules/Admin/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 = $(
+ ''
+ )
+ .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('');
+ });
+ });
+ }
+ });
+ }
+
+ // 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/modules/Admin/Resources/js/auth/app-access-roles.js b/modules/Admin/Resources/js/auth/app-access-roles.js
new file mode 100644
index 0000000..0568330
--- /dev/null
+++ b/modules/Admin/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 = $(
+ ''
+ )
+ .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('');
+ });
+ });
+ }
+ });
+ }
+ // 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/modules/Admin/Resources/js/auth/app-user-list.js b/modules/Admin/Resources/js/auth/app-user-list.js
new file mode 100644
index 0000000..4d00b93
--- /dev/null
+++ b/modules/Admin/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 = $(
+ ''
+ )
+ .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('');
+ });
+ });
+ // Adding plan filter once table initialized
+ this.api()
+ .columns(4)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ''
+ )
+ .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('');
+ });
+ });
+ // Adding status filter once table initialized
+ this.api()
+ .columns(6)
+ .every(function () {
+ var column = this;
+ var select = $(
+ ''
+ )
+ .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(
+ ''
+ );
+ });
+ });
+ }
+ });
+ }
+
+ // 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/modules/Admin/Resources/js/auth/app-user-view-account.js b/modules/Admin/Resources/js/auth/app-user-view-account.js
new file mode 100644
index 0000000..82f49dd
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/app-user-view-billing.js b/modules/Admin/Resources/js/auth/app-user-view-billing.js
new file mode 100644
index 0000000..212b396
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/app-user-view-security.js b/modules/Admin/Resources/js/auth/app-user-view-security.js
new file mode 100644
index 0000000..fa0e1ed
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/app-user-view.js b/modules/Admin/Resources/js/auth/app-user-view.js
new file mode 100644
index 0000000..60b1d23
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-add-new-address.js b/modules/Admin/Resources/js/auth/modal-add-new-address.js
new file mode 100644
index 0000000..5ca25dd
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-add-new-cc.js b/modules/Admin/Resources/js/auth/modal-add-new-cc.js
new file mode 100644
index 0000000..41bfe4d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-add-permission.js b/modules/Admin/Resources/js/auth/modal-add-permission.js
new file mode 100644
index 0000000..b76feaa
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-add-role.js b/modules/Admin/Resources/js/auth/modal-add-role.js
new file mode 100644
index 0000000..af4c8fe
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-edit-cc.js b/modules/Admin/Resources/js/auth/modal-edit-cc.js
new file mode 100644
index 0000000..5b5c254
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-edit-permission.js b/modules/Admin/Resources/js/auth/modal-edit-permission.js
new file mode 100644
index 0000000..ee06c49
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-edit-user.js b/modules/Admin/Resources/js/auth/modal-edit-user.js
new file mode 100644
index 0000000..1edcb67
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/modal-enable-otp.js b/modules/Admin/Resources/js/auth/modal-enable-otp.js
new file mode 100644
index 0000000..767edf2
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/pages-account-settings-account.js b/modules/Admin/Resources/js/auth/pages-account-settings-account.js
new file mode 100644
index 0000000..1a2b0c7
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/pages-account-settings-billing.js b/modules/Admin/Resources/js/auth/pages-account-settings-billing.js
new file mode 100644
index 0000000..317f502
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/pages-account-settings-security.js b/modules/Admin/Resources/js/auth/pages-account-settings-security.js
new file mode 100644
index 0000000..f7f8a5d
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/pages-auth-multisteps.js b/modules/Admin/Resources/js/auth/pages-auth-multisteps.js
new file mode 100644
index 0000000..9934fcf
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/pages-auth-two-steps.js b/modules/Admin/Resources/js/auth/pages-auth-two-steps.js
new file mode 100644
index 0000000..0939acb
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/auth/pages-auth.js b/modules/Admin/Resources/js/auth/pages-auth.js
new file mode 100644
index 0000000..9627b75
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/bootstrap.js b/modules/Admin/Resources/js/bootstrap.js
new file mode 100644
index 0000000..5f1390b
--- /dev/null
+++ b/modules/Admin/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/modules/Admin/Resources/js/cache-manager/cache-scripts.js b/modules/Admin/Resources/js/cache-manager/cache-scripts.js
new file mode 100644
index 0000000..1521436
--- /dev/null
+++ b/modules/Admin/Resources/js/cache-manager/cache-scripts.js
@@ -0,0 +1,102 @@
+import LivewireNotification from '../_class/LivewireNotification';
+import FormCustomListener from '../_class/FormCustomListener';
+
+// Inicializar notificaciones globales
+const notification = new LivewireNotification();
+
+// 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/modules/Admin/Resources/js/rbac/permissions-scripts.js b/modules/Admin/Resources/js/rbac/permissions-scripts.js
new file mode 100644
index 0000000..cff3fe1
--- /dev/null
+++ b/modules/Admin/Resources/js/rbac/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 = $(
+ ''
+ )
+ .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('');
+ });
+ });
+ }
+ });
+ }
+
+ // 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/modules/Admin/Resources/js/rbac/roles-scripts.js b/modules/Admin/Resources/js/rbac/roles-scripts.js
new file mode 100644
index 0000000..e09f31e
--- /dev/null
+++ b/modules/Admin/Resources/js/rbac/roles-scripts.js
@@ -0,0 +1,10 @@
+import LivewireNotification from '../_class/LivewireNotification';
+import WebsiteLegalSettingsForm from '../_class/WebsiteLegalSettingsForm';
+
+new LivewireNotification();
+
+window.WebsiteLegalSettingsForm = new WebsiteLegalSettingsForm();
+
+Livewire.hook('morphed', () => {
+ window.WebsiteLegalSettingsForm.reload();
+});
diff --git a/modules/Admin/Resources/js/website-settings/legal-settings-scripts.js b/modules/Admin/Resources/js/website-settings/legal-settings-scripts.js
new file mode 100644
index 0000000..e09f31e
--- /dev/null
+++ b/modules/Admin/Resources/js/website-settings/legal-settings-scripts.js
@@ -0,0 +1,10 @@
+import LivewireNotification from '../_class/LivewireNotification';
+import WebsiteLegalSettingsForm from '../_class/WebsiteLegalSettingsForm';
+
+new LivewireNotification();
+
+window.WebsiteLegalSettingsForm = new WebsiteLegalSettingsForm();
+
+Livewire.hook('morphed', () => {
+ window.WebsiteLegalSettingsForm.reload();
+});
diff --git a/modules/Admin/Resources/js/website-settings/website-settings-scripts.js b/modules/Admin/Resources/js/website-settings/website-settings-scripts.js
new file mode 100644
index 0000000..fd34867
--- /dev/null
+++ b/modules/Admin/Resources/js/website-settings/website-settings-scripts.js
@@ -0,0 +1,590 @@
+import LivewireNotification from '../_class/LivewireNotification';
+import FormCustomListener from '../_class/FormCustomListener';
+
+new LivewireNotification();
+
+// Inicializar formularios de ajustes de sitio web
+window.WebsiteSettingsForm = new FormCustomListener({
+ formSelector: '#website-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [
+ () => {} // Deshabilitar callback para #save_website_button
+ ],
+ dispatchOnSubmit: 'saveWebsiteSettings',
+ validationConfig: {
+ fields: {
+ website_title: {
+ validators: {
+ stringLength: {
+ min: 2,
+ max: 50,
+ message: 'El título debe tener entre 2 y 50 caracteres.'
+ }
+ }
+ },
+ website_description: {
+ validators: {
+ stringLength: {
+ max: 160,
+ message: 'La descripción no puede exceder los 160 caracteres.'
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de favicon
+new FormCustomListener({
+ formSelector: '#website-favicon-settings-card',
+ buttonSelectors: ['.btn']
+});
+
+// Inicializar formularios de ajustes de logo de imagen
+new FormCustomListener({
+ formSelector: '#website-image-logo-settings-card',
+ buttonSelectors: ['.btn']
+});
+
+// Inicializar formularios de ajustes de social media
+window.SocialSettingsForm = new FormCustomListener({
+ formSelector: '#website-social-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveSocialSettings',
+ validationConfig: {
+ fields: {
+ social_whatsapp: {
+ validators: {
+ callback: {
+ message: 'Por favor, introduce un número de teléfono válido para México.',
+ callback: function (input) {
+ // Si el campo está vacío, no hacemos validación
+ if (input.value.trim() === '') {
+ return true; // Permitir vacío
+ }
+
+ // Si no está vacío, validamos el formato del número
+ const cleanValue = input.value.replace(/\D/g, '');
+ const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
+
+ return regex.test(cleanValue); // Valida solo si hay un número
+ }
+ }
+ }
+ },
+ social_whatsapp_message: {
+ validators: {
+ stringLength: {
+ max: 500,
+ message: 'El mensaje no puede exceder los 500 caracteres.'
+ },
+ callback: {
+ message: 'El mensaje es obligatorio.',
+ callback: function (input) {
+ // Obtener el valor de 'social_whatsapp'
+ const whatsappNumber = document.querySelector('#social_whatsapp').value.trim();
+
+ // Si 'social_whatsapp' tiene un valor, entonces el mensaje es obligatorio
+ if (whatsappNumber !== '') {
+ return input.value.trim() !== ''; // El mensaje no puede estar vacío
+ }
+
+ return true; // Si 'social_whatsapp' está vacío, no validamos 'social_whatsapp_message'
+ }
+ }
+ }
+ },
+ social_facebook: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_instagram: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_linkedin: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_tiktok: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_x_twitter: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_google: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_pinterest: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_youtube: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ },
+ social_vimeo: {
+ validators: {
+ uri: {
+ message: 'Por favor, introduce una URL válida.'
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de Formularios de contacto
+window.ContactFormSettingsForm = new FormCustomListener({
+ formSelector: '#website-contact-form-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveContactFormSettings',
+ validationConfig: {
+ fields: {
+ // Validación para correo electrónico de recepción
+ contact_form_email: {
+ validators: {
+ emailAddress: {
+ message: 'Por favor, introduce un correo electrónico válido.'
+ },
+ notEmpty: {
+ message: 'El correo electrónico es obligatorio.'
+ }
+ }
+ },
+ // Validación para correo electrónico con copia
+ contact_form_email_cc: {
+ validators: {
+ emailAddress: {
+ message: 'Por favor, introduce un correo electrónico válido.'
+ },
+ // Validación personalizada para comparar ambos correos electrónicos
+ callback: {
+ message: 'Los correos electrónicos deben ser diferentes.',
+ callback: function (input) {
+ const email = document.querySelector('#contact_form_email').value.trim();
+ const emailCC = input.value.trim();
+
+ // Si ambos correos son iguales, la validación falla
+ if (email === emailCC) {
+ return false; // Los correos son iguales, por lo que la validación falla
+ }
+
+ return true; // Si son diferentes, la validación pasa
+ }
+ }
+ }
+ },
+ // Validación para el asunto del formulario de contacto
+ contact_form_subject: {
+ validators: {
+ stringLength: {
+ max: 60,
+ message: 'El título del correo no puede exceder los 60 caracteres.'
+ },
+ notEmpty: {
+ message: 'El título del correo es obligatorio.'
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de información de contacto
+window.ContactInfoSettingsForm = new FormCustomListener({
+ formSelector: '#website-contact-info-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveContactInfoSettings',
+ validationConfig: {
+ fields: {
+ // Validación para número telefónico
+ contact_phone_number: {
+ validators: {
+ callback: {
+ message: 'Por favor, introduce un número de teléfono válido para México.',
+ callback: function (input) {
+ // Si el campo está vacío, no hacemos validación
+ if (input.value.trim() === '') {
+ return true; // Permitir vacío
+ }
+
+ // Si no está vacío, validamos el formato del número
+ const cleanValue = input.value.replace(/\D/g, '');
+ const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
+
+ return regex.test(cleanValue); // Valida solo si hay un número
+ }
+ }
+ }
+ },
+ // Validación para extensión telefónica (opcional, pero solo si contact_phone_number tiene valor)
+ contact_phone_number_ext: {
+ validators: {
+ stringLength: {
+ max: 10,
+ message: 'La extensión no debe exceder los 10 caracteres.'
+ },
+ callback: {
+ message: 'La extensión requiere de ingresar un número telefónico.',
+ callback: function (input) {
+ // Obtener el valor de 'contact_phone_number'
+ const phoneNumber = document.querySelector('#contact_phone_number')?.value.trim();
+
+ // Si el número telefónico tiene valor, entonces la extensión es obligatoria
+ if (phoneNumber !== '') {
+ // Si la extensión está vacía, la validación falla
+ return true; // Permitir vacío
+ }
+
+ // Si no se ha ingresado un número telefónico, la extensión no debe tener valor
+ return input.value.trim() === '';
+ }
+ }
+ }
+ },
+ // Validación para correo electrónico de contacto (opcional)
+ contact_email: {
+ validators: {
+ emailAddress: {
+ message: 'Por favor, introduce un correo electrónico válido.'
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de ubicación
+window.LocationSettingsForm = new FormCustomListener({
+ formSelector: '#website-location-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveLocationSettings',
+ validationConfig: {
+ fields: {
+ // Validación para dirección (No obligatorio, máximo 160 caracteres)
+ contact_direccion: {
+ validators: {
+ stringLength: {
+ max: 160,
+ message: 'La dirección no puede exceder los 160 caracteres.'
+ }
+ }
+ },
+ // Validación para horario (No obligatorio, máximo 160 caracteres)
+ contact_horario: {
+ validators: {
+ stringLength: {
+ max: 160,
+ message: 'El horario no puede exceder los 160 caracteres.'
+ }
+ }
+ },
+ // Validación para latitud (No obligatorio, pero debe ser un número si se ingresa)
+ contact_location_lat: {
+ validators: {
+ numeric: {
+ message: 'La latitud debe ser un número.'
+ },
+ callback: {
+ message: 'La latitud es obligatoria si se ingresa longitud.',
+ callback: function (input) {
+ // Obtener el valor de longitud
+ const longitude = document.querySelector('#contact_location_lng')?.value.trim();
+
+ // Si longitud tiene un valor, entonces latitud es obligatorio
+ if (longitude !== '') {
+ return input.value.trim() !== ''; // La latitud no puede estar vacía
+ }
+
+ return true; // Si longitud está vacío, no se valida latitud
+ }
+ }
+ }
+ },
+ // Validación para longitud (No obligatorio, pero debe ser un número si se ingresa)
+ contact_location_lng: {
+ validators: {
+ numeric: {
+ message: 'La longitud debe ser un número.'
+ },
+ callback: {
+ message: 'La longitud es obligatoria si se ingresa latitud.',
+ callback: function (input) {
+ // Obtener el valor de latitud
+ const latitude = document.querySelector('#contact_location_lat')?.value.trim();
+
+ // Si latitud tiene un valor, entonces longitud es obligatorio
+ if (latitude !== '') {
+ return input.value.trim() !== ''; // La longitud no puede estar vacía
+ }
+
+ return true; // Si latitud está vacío, no se valida longitud
+ }
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de chat
+window.ChatSettingsForm = new FormCustomListener({
+ formSelector: '#website-chat-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveChatSettings',
+ validationConfig: {
+ fields: {
+ chat_whatsapp_number: {
+ validators: {
+ callback: {
+ message: 'Por favor, introduce un número de teléfono válido para México.',
+ callback: function (input) {
+ // Obtener el proveedor directamente dentro de la validación
+ const provider = document.querySelector('#chat_provider')?.value;
+
+ // Validar solo si el proveedor es WhatsApp
+ if (provider !== 'whatsapp') return true;
+
+ const cleanValue = input.value.replace(/\D/g, '');
+ const regex = /^[1-9]\d{9}$/; // Exactamente 10 dígitos
+
+ return regex.test(cleanValue);
+ }
+ },
+ notEmpty: {
+ message: 'El número de teléfono es obligatorio.',
+ enabled: () => {
+ // Obtener el proveedor directamente dentro de la validación
+ const provider = document.querySelector('#chat_provider')?.value;
+
+ return provider === 'whatsapp'; // Habilita solo si es WhatsApp
+ }
+ }
+ }
+ },
+ chat_whatsapp_message: {
+ validators: {
+ stringLength: {
+ max: 500,
+ message: 'El mensaje no puede exceder los 500 caracteres.'
+ },
+ notEmpty: {
+ message: 'El mensaje es obligatorio.',
+ enabled: () => {
+ // Obtener el proveedor directamente dentro de la validación
+ const provider = document.querySelector('#chat_provider')?.value;
+
+ return provider === 'whatsapp'; // Habilita solo si es WhatsApp
+ }
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de análisis de datos
+window.AnalyticsSettingsForm = new FormCustomListener({
+ formSelector: '#website-analytics-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveAnalyticsSettings',
+ validationConfig: {
+ fields: {
+ google_analytics_id: {
+ validators: {
+ callback: {
+ message: 'ID de medición de Google Analytics no tienen un formato válido.',
+ callback: function (input) {
+ if (document.getElementById('google_analytics_enabled').checked) {
+ 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()
+ }
+ }
+});
+
+// Inicializar formularios de ajustes de plantilla de sitio web
+window.TemplateSettingsForm = new FormCustomListener({
+ formSelector: '#website-template-settings-card',
+ buttonSelectors: ['.btn-save', '.btn-cancel'],
+ callbacks: [() => {}],
+ dispatchOnSubmit: 'saveTemplateSettings',
+ validationConfig: {
+ fields: {
+ website_tpl_footer_text: {
+ validators: {
+ stringLength: {
+ max: 50,
+ message: 'El mensaje no puede exceder los 50 caracteres.'
+ }
+ }
+ }
+ },
+ 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()
+ }
+ }
+});
+
+// Recargar validación de formularios al morphear componentes
+Livewire.hook('morphed', ({ component }) => {
+ switch (component.name) {
+ case 'website-settings':
+ if (window.WebsiteSettingsForm) {
+ window.WebsiteSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-social-settings':
+ if (window.SocialSettingsForm) {
+ window.SocialSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-contact-info-settings':
+ if (window.ContactInfoSettingsForm) {
+ window.ContactInfoSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-contact-form-settings':
+ if (window.ContactFormSettingsForm) {
+ window.ContactFormSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-location-settings':
+ if (window.LocationSettingsForm) {
+ window.LocationSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-chat-settings':
+ if (window.ChatSettingsForm) {
+ window.ChatSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-analytics-settings':
+ if (window.AnalyticsSettingsForm) {
+ window.AnalyticsSettingsForm.reloadValidation();
+ }
+ break;
+
+ case 'website-template-settings':
+ if (window.TemplateSettingsForm) {
+ window.TemplateSettingsForm.reloadValidation();
+ }
+ break;
+
+ default:
+ break;
+ }
+});
diff --git a/modules/Admin/Resources/scss/auth/page-auth.scss b/modules/Admin/Resources/scss/auth/page-auth.scss
new file mode 100644
index 0000000..00dc08e
--- /dev/null
+++ b/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/scss/auth/page-misc.scss b/modules/Admin/Resources/scss/auth/page-misc.scss
new file mode 100644
index 0000000..e7c1693
--- /dev/null
+++ b/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/scss/auth/page-profile.scss b/modules/Admin/Resources/scss/auth/page-profile.scss
new file mode 100644
index 0000000..51087a3
--- /dev/null
+++ b/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/scss/auth/page-user-view.scss b/modules/Admin/Resources/scss/auth/page-user-view.scss
new file mode 100644
index 0000000..c4f73cf
--- /dev/null
+++ b/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/scss/user/page-account-settings.scss b/modules/Admin/Resources/scss/user/page-account-settings.scss
new file mode 100644
index 0000000..c6abbe1
--- /dev/null
+++ b/modules/Admin/Resources/scss/user/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/modules/Admin/Resources/views/admin-settings/smtp-settings.blade.php b/modules/Admin/Resources/views/admin-settings/smtp-settings.blade.php
new file mode 100644
index 0000000..d98b1de
--- /dev/null
+++ b/modules/Admin/Resources/views/admin-settings/smtp-settings.blade.php
@@ -0,0 +1,36 @@
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Servidor de correo SMTP')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite('modules/Admin/Resources/js/admin-settings/smtp-settings-scripts.js')
+@endsection
+
+@section('content')
+
+
+
+ @livewire('mail-smtp-settings')
+
+
+
+
+ @livewire('mail-sender-response-settings')
+
+
+
+@endsection
diff --git a/modules/Admin/Resources/views/admin-settings/webapp-general-settings.blade.php b/modules/Admin/Resources/views/admin-settings/webapp-general-settings.blade.php
new file mode 100644
index 0000000..de01ae4
--- /dev/null
+++ b/modules/Admin/Resources/views/admin-settings/webapp-general-settings.blade.php
@@ -0,0 +1,30 @@
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Ajustes generales')
+
+@section('page-script')
+ @vite('modules/Admin/Resources/js/admin-settings/admin-settings-scripts.js')
+@endsection
+
+@section('content')
+
+
+
+
+ @livewire('application-settings')
+
+
+
+
+
+ @livewire('general-settings')
+
+
+
+
+
+ @livewire('interface-settings')
+
+
+
+@endsection
diff --git a/modules/Admin/Resources/views/auth/auth-register-multisteps.blade.php b/modules/Admin/Resources/views/auth/auth-register-multisteps.blade.php
new file mode 100644
index 0000000..df03b9b
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/auth-register-multisteps.blade.php
@@ -0,0 +1,356 @@
+@php
+$customizerHidden = 'customizer-hide';
+$configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Multi Steps Sign-up - Pages')
+
+@section('vendor-style')
+@vite([
+ 'modules/Admin/Resources/assets/vendor/libs/bs-stepper/bs-stepper.scss',
+ 'modules/Admin/Resources/assets/vendor/libs/bootstrap-select/bootstrap-select.scss',
+ 'modules/Admin/Resources/assets/vendor/libs/select2/select2.scss',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+])
+@endsection
+
+@section('page-style')
+@vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+])
+@endsection
+
+@section('vendor-script')
+@vite([
+ 'modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave.js',
+ 'modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave-phone.js',
+ 'modules/Admin/Resources/assets/vendor/libs/bs-stepper/bs-stepper.js',
+ 'modules/Admin/Resources/assets/vendor/libs/select2/select2.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+])
+@endsection
+
+@section('page-script')
+@vite([
+ 'modules/Admin/Resources/js/auth/pages-auth-multisteps.js'
+])
+@endsection
+
+@section('content')
+
+
+
+@endsection
diff --git a/modules/Admin/Resources/views/auth/auth-two-steps-basic.blade.php b/modules/Admin/Resources/views/auth/auth-two-steps-basic.blade.php
new file mode 100644
index 0000000..9f91713
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/auth-two-steps-basic.blade.php
@@ -0,0 +1,86 @@
+@php
+$customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Two Steps Verifications Basic - Pages')
+
+@section('vendor-style')
+@vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+])
+@endsection
+
+@section('page-style')
+@vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+])
+@endsection
+
+@section('vendor-script')
+@vite([
+ 'modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+])
+@endsection
+
+@section('page-script')
+@vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js',
+ 'modules/Admin/Resources/js/auth/pages-auth-two-steps.js'
+])
+@endsection
+
+@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/modules/Admin/Resources/views/auth/auth-two-steps-cover.blade.php b/modules/Admin/Resources/views/auth/auth-two-steps-cover.blade.php
new file mode 100644
index 0000000..4a34836
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/auth-two-steps-cover.blade.php
@@ -0,0 +1,96 @@
+@php
+$customizerHidden = 'customizer-hide';
+$configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Two Steps Verifications Cover - Pages')
+
+@section('vendor-style')
+@vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+])
+@endsection
+
+@section('page-style')
+@vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+])
+@endsection
+
+@section('vendor-script')
+@vite([
+ 'modules/Admin/Resources/assets/vendor/libs/cleavejs/cleave.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+])
+@endsection
+
+@section('page-script')
+@vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js',
+ 'modules/Admin/Resources/js/auth/pages-auth-two-steps.js'
+])
+@endsection
+
+@section('content')
+
+
+
+
+
+
+ {{ config('_var.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/modules/Admin/Resources/views/auth/auth-verify-email-basic.blade.php b/modules/Admin/Resources/views/auth/auth-verify-email-basic.blade.php
new file mode 100644
index 0000000..52bf0fa
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/auth-verify-email-basic.blade.php
@@ -0,0 +1,47 @@
+@php
+$customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Verify Email Basic - Pages')
+
+@section('page-style')
+
+@vite('modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/views/auth/auth-verify-email-cover.blade.php b/modules/Admin/Resources/views/auth/auth-verify-email-cover.blade.php
new file mode 100644
index 0000000..6234c7f
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/auth-verify-email-cover.blade.php
@@ -0,0 +1,57 @@
+@php
+$customizerHidden = 'customizer-hide';
+$configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Verify Email Cover - Pages')
+
+@section('page-style')
+
+@vite('modules/Admin/Resources/scss/auth/page-auth.scss')
+@endsection
+
+@section('content')
+
+@endsection
diff --git a/modules/Admin/Resources/views/auth/forgot-password-basic.blade.php b/modules/Admin/Resources/views/auth/forgot-password-basic.blade.php
new file mode 100644
index 0000000..699fead
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/forgot-password-basic.blade.php
@@ -0,0 +1,97 @@
+@php
+ $customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Recuperar Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@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/modules/Admin/Resources/views/auth/forgot-password-cover.blade.php b/modules/Admin/Resources/views/auth/forgot-password-cover.blade.php
new file mode 100644
index 0000000..2819c7b
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/forgot-password-cover.blade.php
@@ -0,0 +1,104 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Recuperar Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@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/modules/Admin/Resources/views/auth/login-basic.blade.php b/modules/Admin/Resources/views/auth/login-basic.blade.php
new file mode 100644
index 0000000..e2dd081
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/login-basic.blade.php
@@ -0,0 +1,133 @@
+@php
+use Laravel\Fortify\Features;
+
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Iniciar sesión')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@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/modules/Admin/Resources/views/auth/login-cover.blade.php b/modules/Admin/Resources/views/auth/login-cover.blade.php
new file mode 100644
index 0000000..ce0b47a
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/login-cover.blade.php
@@ -0,0 +1,139 @@
+@php
+use Laravel\Fortify\Features;
+
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Iniciar sesión')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@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/modules/Admin/Resources/views/auth/register-basic.blade.php b/modules/Admin/Resources/views/auth/register-basic.blade.php
new file mode 100644
index 0000000..a05ea22
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/register-basic.blade.php
@@ -0,0 +1,151 @@
+@php
+ $customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Registro de usuarios')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
+
Empieza tu aventura 🚀
+
¡Gestiona tu aplicación de manera sencilla y divertida!
+
+
+
+
+
+
+@endsection
diff --git a/modules/Admin/Resources/views/auth/register-cover.blade.php b/modules/Admin/Resources/views/auth/register-cover.blade.php
new file mode 100644
index 0000000..38477f7
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/register-cover.blade.php
@@ -0,0 +1,132 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Registro de usuarios')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@section('content')
+
+@endsection
diff --git a/modules/Admin/Resources/views/auth/reset-password-basic.blade.php b/modules/Admin/Resources/views/auth/reset-password-basic.blade.php
new file mode 100644
index 0000000..62560d1
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/reset-password-basic.blade.php
@@ -0,0 +1,130 @@
+@php
+ $customizerHidden = 'customizer-hide';
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Restablecer Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@section('content')
+
+
+
+
+
+
+
+
+
+
Restablecer Contraseña 🔒
+
Tu nueva contraseña debe ser diferente de las contraseñas utilizadas anteriormente
+
+
+
+
+
+
+
+
+@endsection
diff --git a/modules/Admin/Resources/views/auth/reset-password-cover.blade.php b/modules/Admin/Resources/views/auth/reset-password-cover.blade.php
new file mode 100644
index 0000000..61ece9b
--- /dev/null
+++ b/modules/Admin/Resources/views/auth/reset-password-cover.blade.php
@@ -0,0 +1,137 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Restablecer Contraseña')
+
+@section('vendor-style')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/form-validation.scss'
+ ])
+@endsection
+
+@section('page-style')
+ @vite([
+ 'modules/Admin/Resources/scss/auth/page-auth.scss'
+ ])
+@endsection
+
+@section('vendor-script')
+ @vite([
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/popular.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/bootstrap5.js',
+ 'modules/Admin/Resources/assets/vendor/libs/@form-validation/auto-focus.js'
+ ])
+@endsection
+
+@section('page-script')
+ @vite([
+ 'modules/Admin/Resources/js/auth/pages-auth.js'
+ ])
+@endsection
+
+@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/modules/Admin/Resources/views/cache-manager/index.blade.php b/modules/Admin/Resources/views/cache-manager/index.blade.php
new file mode 100644
index 0000000..cf3a3ef
--- /dev/null
+++ b/modules/Admin/Resources/views/cache-manager/index.blade.php
@@ -0,0 +1,41 @@
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', 'Ajustes de caché')
+
+@section('page-script')
+ @vite('modules/Admin/Resources/js/cache-manager/cache-scripts.js')
+@endsection
+
+@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/modules/Admin/Resources/views/errors/400.blade.php b/modules/Admin/Resources/views/errors/400.blade.php
new file mode 100644
index 0000000..fee1a5d
--- /dev/null
+++ b/modules/Admin/Resources/views/errors/400.blade.php
@@ -0,0 +1,38 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', '400 Bad Request')
+
+@section('page-style')
+
+ @vite(['/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/views/errors/401.blade.php b/modules/Admin/Resources/views/errors/401.blade.php
new file mode 100644
index 0000000..80d8498
--- /dev/null
+++ b/modules/Admin/Resources/views/errors/401.blade.php
@@ -0,0 +1,38 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', '401 Unauthorized')
+
+@section('page-style')
+
+ @vite(['/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/views/errors/403.blade.php b/modules/Admin/Resources/views/errors/403.blade.php
new file mode 100644
index 0000000..91616c3
--- /dev/null
+++ b/modules/Admin/Resources/views/errors/403.blade.php
@@ -0,0 +1,38 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', '403 Forbidden')
+
+@section('page-style')
+
+ @vite(['/modules/Admin/Resources/scss/auth/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/modules/Admin/Resources/views/errors/404.blade.php b/modules/Admin/Resources/views/errors/404.blade.php
new file mode 100644
index 0000000..b85fe42
--- /dev/null
+++ b/modules/Admin/Resources/views/errors/404.blade.php
@@ -0,0 +1,34 @@
+@php
+ $customizerHidden = 'customizer-hide';
+ $configData = Helper::appClasses();
+@endphp
+
+@extends('admin::layouts.vuexy.layoutMaster')
+
+@section('title', '404 Not Found')
+
+@section('page-style')
+
+ @vite(['/modules/Admin/Resources/scss/auth/page-misc.scss'])
+@endsection
+
+@section('content')
+
+
+
+
404
+
Página no encontrada ⚠️
+
+ {{ __('errors.page_not_found') }}
+
+
Regresar al inicio
+
+
 }})
+
+
+
+
+
 }})
+
+
+@endsection
diff --git a/modules/Admin/Resources/views/layouts/vuexy/blankLayout.blade.php b/modules/Admin/Resources/views/layouts/vuexy/blankLayout.blade.php
new file mode 100644
index 0000000..d055c58
--- /dev/null
+++ b/modules/Admin/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('admin::layouts.vuexy.commonMaster' )
+
+@section('layoutContent')
+
+ @yield('content')
+
+@endsection
diff --git a/modules/Admin/Resources/views/layouts/vuexy/commonMaster.blade.php b/modules/Admin/Resources/views/layouts/vuexy/commonMaster.blade.php
new file mode 100644
index 0000000..d7c4ab4
--- /dev/null
+++ b/modules/Admin/Resources/views/layouts/vuexy/commonMaster.blade.php
@@ -0,0 +1,56 @@
+
+@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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @include('admin::layouts.vuexy.sections.styles' . $isFront)
+
+
+
+ @include('admin::layouts.vuexy.sections.scriptsIncludes' . $isFront)
+
+
+
+ @yield('layoutContent')
+
+
+
+
+ @include('admin::layouts.vuexy.sections.scripts' . $isFront)
+
+
diff --git a/modules/Admin/Resources/views/layouts/vuexy/contentNavbarLayout.blade.php b/modules/Admin/Resources/views/layouts/vuexy/contentNavbarLayout.blade.php
new file mode 100644
index 0000000..f3d30f8
--- /dev/null
+++ b/modules/Admin/Resources/views/layouts/vuexy/contentNavbarLayout.blade.php
@@ -0,0 +1,91 @@
+@isset($pageConfigs)
+{!! Helper::updatePageConfig($pageConfigs) !!}
+@endisset
+@php
+$configData = Helper::appClasses();
+@endphp
+@extends('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')
+
diff --git a/routes/console.php b/routes/console.php
new file mode 100644
index 0000000..eff2ed2
--- /dev/null
+++ b/routes/console.php
@@ -0,0 +1,8 @@
+comment(Inspiring::quote());
+})->purpose('Display an inspiring quote')->hourly();
diff --git a/routes/web.php b/routes/web.php
new file mode 100644
index 0000000..2b1341b
--- /dev/null
+++ b/routes/web.php
@@ -0,0 +1,12 @@
+group(function () {
+ Route::get('/', 'index')->name('web.home');
+});
+
+// locale
+Route::get('/lang/{locale}', [LanguageController::class, 'swap']);
diff --git a/storage/app/.gitignore b/storage/app/.gitignore
new file mode 100644
index 0000000..8f4803c
--- /dev/null
+++ b/storage/app/.gitignore
@@ -0,0 +1,3 @@
+*
+!public/
+!.gitignore
diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/app/public/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/debugbar/.gitignore b/storage/debugbar/.gitignore
new file mode 100755
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/debugbar/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore
new file mode 100644
index 0000000..05c4471
--- /dev/null
+++ b/storage/framework/.gitignore
@@ -0,0 +1,9 @@
+compiled.php
+config.php
+down
+events.scanned.php
+maintenance.php
+routes.php
+routes.scanned.php
+schedule-*
+services.json
diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore
new file mode 100644
index 0000000..01e4a6c
--- /dev/null
+++ b/storage/framework/cache/.gitignore
@@ -0,0 +1,3 @@
+*
+!data/
+!.gitignore
diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/cache/data/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/sessions/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/testing/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/framework/views/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/storage/logs/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..2524b08
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,22 @@
+import defaultTheme from 'tailwindcss/defaultTheme';
+
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
+ './storage/framework/views/*.php',
+ './resources/**/*.blade.php',
+ './resources/**/*.js',
+ './resources/**/*.vue',
+ './modules/**/*.blade.php', // Plantillas Blade en módulos
+ './modules/**/*.js' // Archivos JS en módulos
+ ],
+ theme: {
+ extend: {
+ fontFamily: {
+ sans: ['Figtree', ...defaultTheme.fontFamily.sans],
+ },
+ },
+ },
+ plugins: [],
+};
diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php
new file mode 100644
index 0000000..8364a84
--- /dev/null
+++ b/tests/Feature/ExampleTest.php
@@ -0,0 +1,19 @@
+get('/');
+
+ $response->assertStatus(200);
+ }
+}
diff --git a/tests/TestCase.php b/tests/TestCase.php
new file mode 100644
index 0000000..fe1ffc2
--- /dev/null
+++ b/tests/TestCase.php
@@ -0,0 +1,10 @@
+assertTrue(true);
+ }
+}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..c89b331
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,84 @@
+import { defineConfig } from 'vite';
+import laravel from 'laravel-vite-plugin';
+import html from '@rollup/plugin-html';
+import { glob } from 'glob';
+
+/**
+ * Get Files from a directory
+ * @param {string} query
+ * @returns array
+ */
+function GetFilesArray(query) {
+ return glob.sync(query);
+}
+/**
+ * Js Files
+ */
+// Processing Modules JS Files
+const ModulesJsFiles = GetFilesArray('modules/Admin/Resources/**/*.js');
+
+
+/**
+ * Scss Files
+ */
+// Processing Libs Scss & Css Files
+const ModulesScssFiles = GetFilesArray('modules/Admin/Resources/**/!(_)*.scss');
+const ModulesScsFiles = GetFilesArray('modules/Admin/Resources/**/*.css');
+
+
+
+// Processing Website Vendor JS Files
+const WebVendorJsFiles = GetFilesArray('resources/assets/vendor/**/*.js');
+
+// Processing Website Libs JS Files
+const WebJsFiles = GetFilesArray('resources/js/**/*.js');
+
+// Processing Website Core, Themes, Libs Scss & Css Files
+const WebVendorScsFiles = GetFilesArray('resources/assets/vendor/**/*.css');
+const WebScsFiles = GetFilesArray('resources/css/**/*.css');
+
+// Processing Window Assignment for Libs like jKanban, pdfMake
+function libsWindowAssignment() {
+ return {
+ name: 'libsWindowAssignment',
+
+ transform(src, id) {
+ if (id.includes('jkanban.js')) {
+ return src.replace('this.jKanban', 'window.jKanban');
+ } else if (id.includes('vfs_fonts')) {
+ return src.replaceAll('this.pdfMake', 'window.pdfMake');
+ }
+ }
+ };
+}
+
+export default defineConfig({
+ plugins: [
+ laravel({
+ input: [
+ ...ModulesJsFiles,
+ ...ModulesScssFiles,
+ ...ModulesScsFiles,
+ ...WebVendorJsFiles,
+ ...WebJsFiles,
+ ...WebVendorScsFiles,
+ ...WebScsFiles
+ ],
+ refresh: ['resources/**', 'routes/**', 'app/**', 'modules/**']
+ }),
+ html(),
+ libsWindowAssignment()
+ ],
+ resolve: {
+ alias: {
+ '@admin': '/Modules/Admin/Resources'
+ }
+ },
+ server: {
+ watch: {
+ //ignored: ['!**/modules/**'],
+ usePolling: true,
+ interval: 300
+ }
+ }
+});