diff --git a/odex30_base/expert_theme/__manifest__.py b/odex30_base/expert_theme/__manifest__.py index 0a5f8d3..0f4b5e9 100644 --- a/odex30_base/expert_theme/__manifest__.py +++ b/odex30_base/expert_theme/__manifest__.py @@ -24,6 +24,8 @@ 'views/expert_theme_config_views.xml', 'views/expert_home_views.xml', 'views/expert_menu_views.xml', + 'views/web_layout.xml', + 'views/res_config_settings_views.xml', ], 'assets': { 'web.assets_frontend': [ @@ -33,6 +35,8 @@ 'expert_theme/static/src/js/expert_login_template.js', ], 'web.assets_backend': [ + 'expert_theme/static/src/fonts/en_fonts.scss', + 'expert_theme/static/src/fonts/ar_fonts.scss', 'expert_theme/static/src/scss/expert_theme_config.scss', 'expert_theme/static/src/scss/expert_theme.scss', 'expert_theme/static/src/js/expert_theme_dynamic.js', @@ -40,6 +44,11 @@ 'expert_theme/static/src/js/expert_home.js', 'expert_theme/static/src/js/expert_login_template_list.js', 'expert_theme/static/src/xml/expert_home.xml', + 'expert_theme/static/src/language_menu/language_menu.js', + 'expert_theme/static/src/language_menu/language_menu.xml', + 'expert_theme/static/src/language_menu/language_menu.scss', + 'expert_theme/static/src/scss/intro_loader.scss', + 'expert_theme/static/src/js/intro_loader.js', ] }, 'installable': True, diff --git a/odex30_base/expert_theme/controllers/__init__.py b/odex30_base/expert_theme/controllers/__init__.py index 2b4d723..6b5f334 100644 --- a/odex30_base/expert_theme/controllers/__init__.py +++ b/odex30_base/expert_theme/controllers/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- from . import expert_controller +from . import main \ No newline at end of file diff --git a/odex30_base/expert_theme/controllers/main.py b/odex30_base/expert_theme/controllers/main.py new file mode 100644 index 0000000..fc6cbac --- /dev/null +++ b/odex30_base/expert_theme/controllers/main.py @@ -0,0 +1,18 @@ +import base64 +from odoo import http +from odoo.http import request + +class IntroLoaderController(http.Controller): + + @http.route('/intro_loader/image', type='http', auth="none") + def intro_loader_image(self, **kwargs): + # Fetch image from config + img_b64 = request.env['ir.config_parameter'].sudo().get_param('intro_loader.image_data') + + if not img_b64: + # Return a 1x1 transparent pixel or default Odoo logo if none set + return request.redirect('/web/static/img/logo2.png') + + image_data = base64.b64decode(img_b64) + headers = [('Content-Type', 'image/png')] + return request.make_response(image_data, headers) \ No newline at end of file diff --git a/odex30_base/expert_theme/i18n/ar_001.po b/odex30_base/expert_theme/i18n/ar_001.po new file mode 100644 index 0000000..7231d7f --- /dev/null +++ b/odex30_base/expert_theme/i18n/ar_001.po @@ -0,0 +1,1528 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * expert_theme +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.2a1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-06 05:42+0000\n" +"PO-Revision-Date: 2026-01-06 05:42+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_minimal_page +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_modern_page +msgid "Expert" +msgstr "خبير" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_minimal_page +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_modern_page +msgid "E" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Editing Existing Template: You are editing an existing template. \n" +" To create a NEW template, go back to the list and click \"New\" button." +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Note: Logo and image will be used across all three pages " +"(Login, Signup, Reset Password) when Corporate template is active." +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Note: Logo and image will be used across all three pages " +"(Login, Signup, Reset Password) when Minimal template is active." +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Note: Logo and image will be used across all three pages " +"(Login, Signup, Reset Password) when Modern template is active." +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Note: Only one template can be active at a time. \n" +" Activating this template will deactivate all others. \n" +" Each template has a completely different HTML structure and design." +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Template Types:
\n" +" • Default: Standard Odoo login page
\n" +" • Modern: Card design with gradient background
\n" +" • Minimal: Clean minimal design
\n" +" • Corporate: Professional dark theme" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "Access Portal" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_tree +msgid "Activate" +msgstr "تفعيل" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__active +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__active +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_search +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_search +msgid "Active" +msgstr "نشط" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__almarai +msgid "Almarai" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Apply Theme" +msgstr "تطبيق المظهر" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__arabic_fonts_style +msgid "Arabic Fonts Style" +msgstr "نمط الخطوط العربية" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_tree +msgid "" +"Are you sure you want to activate this template? It will deactivate all " +"other templates." +msgstr "" + +#. module: expert_theme +#: model:ir.ui.menu,name:expert_theme.menu_expert_login_templates +msgid "Auth Pages Templates" +msgstr "" + +#. module: expert_theme +#: model:ir.ui.menu,name:expert_theme.menu_expert_theme_colors +msgid "Backend Themes" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__background_color +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Background Color" +msgstr "لون الخلفية" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Background Colors" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_button_bg_color +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_button_bg_color +msgid "Background color for login button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_button_bg_hover +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_button_bg_hover +msgid "Background color for login button on hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_button_bg_color +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_button_bg_color +msgid "Background color for signup button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_button_bg_hover +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_button_bg_hover +msgid "Background color for signup button on hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__background_color +msgid "Background color for the login page" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Background color for the login page (used for CSS customization)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__beiruti +msgid "Beiruti" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__border_color +msgid "Border Color" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Border Colors" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Button Colors" +msgstr "ألوان الأزرار" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_button_text +msgid "Button text for Minimal template login page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_button_text +msgid "Button text for Minimal template signup page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_button_text +msgid "Button text for Modern template login page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_button_text +msgid "Button text for Modern template signup page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__cairo +msgid "Cairo" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "Check the browser console for debugging information" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,description:expert_theme.expert_login_template_minimal +msgid "Clean minimal design template" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "Click to open" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__home_banner_bg_type__color +msgid "Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__navbar_brand_color +msgid "Color of the brand/logo text in the navbar" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__navbar_link_color +msgid "Color of the links in the navbar" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "" +"Company\n" +" Portal" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_minimal_page +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_modern_page +msgid "Company Logo" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__corporate_template_logo +msgid "" +"Company logo to display on Corporate login, signup, and reset password pages" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_template_logo +msgid "" +"Company logo to display on Minimal login, signup, and reset password pages" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_template_logo +msgid "" +"Company logo to display on Modern login, signup, and reset password pages" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__name +msgid "Configuration Name" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.actions.act_window,help:expert_theme.action_expert_login_template +msgid "" +"Configure different login page templates and switch between them.\n" +" Each template can have different colors, backgrounds, and styles." +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__bg_content +msgid "Content Background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_login_template__template_type__corporate +msgid "Corporate Design" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,name:expert_theme.expert_login_template_corporate +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Corporate Template" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__corporate_template_image +msgid "Corporate Template Image" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__corporate_template_logo +msgid "Corporate Template Logo" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,minimal_signup_button_text:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_signup_button_text:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_signup_button_text:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_signup_button_text:expert_theme.expert_login_template_modern +#: model:expert.login.template,minimal_signup_title:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_signup_title:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_signup_title:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_signup_title:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_signup_button_text:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_signup_button_text:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_signup_button_text:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_signup_button_text:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_signup_title:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_signup_title:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_signup_title:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_signup_title:expert_theme.expert_login_template_modern +msgid "Create an account" +msgstr "إنشاء حساب" + +#. module: expert_theme +#: model_terms:ir.actions.act_window,help:expert_theme.action_expert_login_template +msgid "Create your first login page template!" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.actions.act_window,help:expert_theme.action_expert_theme_config +msgid "Create your first theme configuration!" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__create_uid +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__create_uid +msgid "Created by" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__create_date +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__create_date +msgid "Created on" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.actions.act_window,help:expert_theme.action_expert_theme_config +msgid "" +"Customize the colors of your Expert Theme by creating a new configuration.\n" +" You can set primary colors, button colors, backgrounds, and more." +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__danger_color +msgid "Danger Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__danger_color +msgid "Danger/Error state (red)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__default +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__default +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_search +msgid "Default" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_login_template__template_type__default +msgid "Default Odoo Login" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,name:expert_theme.expert_login_template_default +msgid "Default Template" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__border_color +msgid "Default border color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__is_default +msgid "Default template to use" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Describe this template..." +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__description +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Description" +msgstr "الوصف" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__description +msgid "Description of this template" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__display_name +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__display_name +#: model:ir.model.fields,field_description:expert_theme.field_ir_http__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_tree +msgid "Duplicate" +msgstr "تكرار" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__english_fonts_style +msgid "English Fonts Style" +msgstr "نمط الخطوط الإنجليزية" + +#. module: expert_theme +#: model:expert.login.template,minimal_reset_subtitle:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_reset_subtitle:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_reset_subtitle:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_reset_subtitle:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_reset_subtitle:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_reset_subtitle:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_reset_subtitle:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_reset_subtitle:expert_theme.expert_login_template_modern +msgid "Enter your email to receive reset instructions" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "Enter your password" +msgstr "أدخل كلمة المرور" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "Enter your username" +msgstr "أدخل اسم المستخدم" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "Error:" +msgstr "خطأ:" + +#. module: expert_theme +#: model:ir.actions.client,name:expert_theme.action_expert_home +msgid "Expert Home" +msgstr "" + +#. module: expert_theme +#: model:ir.model,name:expert_theme.model_expert_login_template +msgid "Expert Login Page Template" +msgstr "" + +#. module: expert_theme +#: model:ir.model,name:expert_theme.model_expert_theme_config +msgid "Expert Theme Color Configuration" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Expert Theme Configuration" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_tree +msgid "Expert Theme Configurations" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Fonts Settings" +msgstr "إعدادات الخطوط" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__bg_gradient_end +msgid "Gradient End" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__bg_gradient_start +msgid "Gradient Start" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_search +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_search +msgid "Group By" +msgstr "تجميع حسب" + +#. module: expert_theme +#: model:ir.model,name:expert_theme.model_ir_http +msgid "HTTP Routing" +msgstr "مسار HTTP" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__home_banner_bg_image +msgid "Home Banner Background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__home_banner_bg_type +msgid "Home Banner Background Type" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Home Banner Settings" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__home_banner_text +msgid "Home Banner Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__navbar_link_hover +msgid "Hover color for navbar links" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__primary_hover +msgid "Hover state for primary elements" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__secondary_hover +msgid "Hover state for secondary elements" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__ibm_plex_sans_arabic +msgid "IBM Plex Sans Arabic" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__id +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__id +#: model:ir.model.fields,field_description:expert_theme.field_ir_http__id +msgid "ID" +msgstr "المُعرف" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__home_banner_bg_type__image +msgid "Image" +msgstr "صورة" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__home_banner_bg_image_filename +msgid "Image Filename" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__corporate_template_image +msgid "" +"Image to display on the right side of Corporate login, signup, and reset " +"password pages" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_template_image +msgid "" +"Image to display on the right side of Minimal login, signup, and reset " +"password pages" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_template_image +msgid "" +"Image to display on the right side of Modern login, signup, and reset " +"password pages" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_search +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_search +msgid "Inactive" +msgstr "غير نشط" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__info_color +msgid "Info Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__info_color +msgid "Info state (blue)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__inter +msgid "Inter" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__is_default +msgid "Is Default Template" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,minimal_signup_subtitle:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_signup_subtitle:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_signup_subtitle:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_signup_subtitle:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_signup_subtitle:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_signup_subtitle:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_signup_subtitle:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_signup_subtitle:expert_theme.expert_login_template_modern +msgid "Join us today and get started" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_modern_page +msgid "" +"Kindly fill in your details below to sign in to your\n" +" account" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,minimal_login_subtitle:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_login_subtitle:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_login_subtitle:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_login_subtitle:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_login_subtitle:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_login_subtitle:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_login_subtitle:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_login_subtitle:expert_theme.expert_login_template_modern +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_minimal_page +msgid "Kindly fill in your details below to sign in to your account" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__write_uid +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__write_date +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__write_date +msgid "Last Updated on" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__libertinus_serif_display +msgid "Libertinus Serif Display" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__libre_baskerville +msgid "Libre Baskerville" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__border_light +msgid "Light Border" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_light +msgid "Light Button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_light_hover +msgid "Light Button Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_light_text +msgid "Light Button Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__text_light +msgid "Light Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__border_light +msgid "Light border color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_light_hover +msgid "Light button hover state" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_light_text +msgid "Light button text color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_light +msgid "Light buttons (like \"Learn More\" buttons)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__text_light +msgid "Light text (for dark backgrounds)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__primary_light +msgid "Light version of primary color" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "Loading your modules..." +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "Loading..." +msgstr "جارٍ التحميل..." + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_button_bg_hover +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_button_bg_hover +msgid "Login Button BG Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_button_bg_color +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_button_bg_color +msgid "Login Button Background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_button_text +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_button_text +msgid "Login Button Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_button_text_color +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_button_text_color +msgid "Login Button Text Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_button_text_hover +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_button_text_hover +msgid "Login Button Text Hover" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Login Page" +msgstr "صفحة تسجيل الدخول" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Login Page Template" +msgstr "" + +#. module: expert_theme +#: model:ir.actions.act_window,name:expert_theme.action_expert_login_template +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_tree +msgid "Login Page Templates" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_subtitle +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_subtitle +msgid "Login Subtitle" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_login_title +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_login_title +msgid "Login Title" +msgstr "عنوان تسجيل الدخول" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__primary_color +msgid "Main brand color - affects navbar, primary buttons, and accents" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__bg_content +msgid "Main content background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__text_primary +msgid "Main text color (dark)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_login_template__template_type__minimal +msgid "Minimal Design" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,name:expert_theme.expert_login_template_minimal +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Minimal Template" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_template_image +msgid "Minimal Template Image" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_template_logo +msgid "Minimal Template Logo" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Minimal Template Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_login_template__template_type__modern +msgid "Modern Card Design" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,name:expert_theme.expert_login_template_modern +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Modern Template" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_template_image +msgid "Modern Template Image" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_template_logo +msgid "Modern Template Logo" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Modern Template Text" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,description:expert_theme.expert_login_template_modern +msgid "Modern card design with gradient background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__name +msgid "Name of the login page template" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__navbar_brand_color +msgid "Navbar Brand Color" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Navbar Colors" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__navbar_link_color +msgid "Navbar Link Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__navbar_link_hover +msgid "Navbar Link Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__bg_primary +msgid "Navbar background" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "No installed modules found." +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "No modules are currently installed" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__noto_kufi_arabic +msgid "Noto Kufi Arabic" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__noto_sans_arabic +msgid "Noto Sans Arabic" +msgstr "" + +#. module: expert_theme +#: model:ir.ui.menu,name:expert_theme.menu_expert_root +msgid "Odex Theme" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__active +msgid "" +"Only one template can be active at a time. Activate this template to use it " +"on the login page." +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__sequence +msgid "Order of display" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__oswald +msgid "Oswald" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__bg_gradient_end +msgid "Page gradient end color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__bg_gradient_start +msgid "Page gradient start color" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "Password" +msgstr "كلمة المرور" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__bg_primary +msgid "Primary Background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_primary +msgid "Primary Button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_primary_hover +msgid "Primary Button Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__primary_color +msgid "Primary Color" +msgstr "اللون الأساسي" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Primary Colors" +msgstr "الألوان الأساسية" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__primary_hover +msgid "Primary Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__primary_light +msgid "Primary Light" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__text_primary +msgid "Primary Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_primary_hover +msgid "Primary button hover state" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_primary +msgid "Primary buttons (like \"Activate\" buttons)" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,description:expert_theme.expert_login_template_corporate +msgid "Professional corporate dark theme" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__quicksand +msgid "Quicksand" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__raleway +msgid "Raleway" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Reset Password Page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_reset_subtitle +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_reset_subtitle +msgid "Reset Password Subtitle" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_reset_title +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_reset_title +msgid "Reset Password Title" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,minimal_reset_title:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_reset_title:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_reset_title:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_reset_title:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_reset_title:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_reset_title:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_reset_title:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_reset_title:expert_theme.expert_login_template_modern +msgid "Reset your password" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__roboto +msgid "Roboto" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__rubik +msgid "Rubik" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Save" +msgstr "حفظ" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_search +msgid "Search Login Templates" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_search +msgid "Search Theme Configurations" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__bg_secondary +msgid "Secondary Background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_secondary +msgid "Secondary Button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__btn_secondary_hover +msgid "Secondary Button Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__secondary_color +msgid "Secondary Color" +msgstr "اللون الثانوي" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Secondary Colors" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__secondary_hover +msgid "Secondary Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__text_secondary +msgid "Secondary Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__secondary_color +msgid "Secondary brand color - affects upgrade buttons and secondary elements" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_secondary_hover +msgid "Secondary button hover state" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__btn_secondary +msgid "Secondary buttons (like \"Upgrade\" buttons)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__text_secondary +msgid "Secondary text color (gray)" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "Secure Login Access" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__template_type +msgid "" +"Select the login page template design. Each design has a completely " +"different HTML structure and layout." +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__sequence +msgid "Sequence" +msgstr "التسلسل" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__bg_secondary +msgid "Sidebar background" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,minimal_login_button_text:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_login_button_text:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_login_button_text:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_login_button_text:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_login_button_text:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_login_button_text:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_login_button_text:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_login_button_text:expert_theme.expert_login_template_modern +msgid "Sign In" +msgstr "تسجيل الدخول" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_button_bg_hover +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_button_bg_hover +msgid "Signup Button BG Hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_button_bg_color +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_button_bg_color +msgid "Signup Button Background" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_button_text +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_button_text +msgid "Signup Button Text" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_button_text_color +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_button_text_color +msgid "Signup Button Text Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_button_text_hover +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_button_text_hover +msgid "Signup Button Text Hover" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_minimal_page +msgid "Signup Illustration" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Signup Page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_subtitle +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_subtitle +msgid "Signup Subtitle" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__minimal_signup_title +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__modern_signup_title +msgid "Signup Title" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__space_grotesk +msgid "Space Grotesk" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,description:expert_theme.expert_login_template_default +msgid "Standard Odoo login page template" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_search +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_search +msgid "Status" +msgstr "الحالة" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Status Colors" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__story_script +msgid "Story Script" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_subtitle +msgid "Subtitle text for Minimal template login page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_reset_subtitle +msgid "Subtitle text for Minimal template reset password page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_subtitle +msgid "Subtitle text for Minimal template signup page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_subtitle +msgid "Subtitle text for Modern template login page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_reset_subtitle +msgid "Subtitle text for Modern template reset password page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_subtitle +msgid "Subtitle text for Modern template signup page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__success_color +msgid "Success Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__success_color +msgid "Success/Active state (green)" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__arabic_fonts_style__tajawal +msgid "Tajawal" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__template_type +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Template Design" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Template Images & Logo" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_login_template__name +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Template Name" +msgstr "اسم القالب" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "Template Settings" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Text Colors" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_button_text_color +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_button_text_color +msgid "Text color for login button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_button_text_hover +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_button_text_hover +msgid "Text color for login button on hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_button_text_color +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_button_text_color +msgid "Text color for signup button" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_button_text_hover +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_button_text_hover +msgid "Text color for signup button on hover" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__home_banner_text +msgid "Text color for the home screen banner" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "The module detection is not working properly" +msgstr "" + +#. module: expert_theme +#: model:ir.actions.act_window,name:expert_theme.action_expert_theme_config +msgid "Theme Colors" +msgstr "ألوان المظهر" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_theme_config_form +msgid "Theme Name" +msgstr "اسم المظهر" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "This could mean:" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_login_title +msgid "Title text for Minimal template login page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_reset_title +msgid "Title text for Minimal template reset password page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__minimal_signup_title +msgid "Title text for Minimal template signup page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_login_title +msgid "Title text for Modern template login page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_reset_title +msgid "Title text for Modern template reset password page" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_login_template__modern_signup_title +msgid "Title text for Modern template signup page" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "" +"Try refreshing the page or check if modules are properly installed in Odoo." +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields.selection,name:expert_theme.selection__expert_theme_config__english_fonts_style__ubuntu +msgid "Ubuntu" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Upload an image to display on the right side of Corporate login, signup, and" +" reset password pages" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Upload an image to display on the right side of Minimal login, signup, and " +"reset password pages" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Upload an image to display on the right side of Modern login, signup, and " +"reset password pages" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "" +"Upload your company logo (recommended size: 40x40px). This will replace the " +"default 'E' icon." +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_corporate_page +msgid "Username" +msgstr "اسم المستخدم" + +#. module: expert_theme +#: model:ir.model.fields,field_description:expert_theme.field_expert_theme_config__warning_color +msgid "Warning Color" +msgstr "" + +#. module: expert_theme +#: model:ir.model.fields,help:expert_theme.field_expert_theme_config__warning_color +msgid "Warning state (yellow)" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_modern_page +msgid "" +"Welcome to Expert \n" +" 👋" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.login_template_minimal_page +msgid "Welcome to Expert 👋" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_home +msgid "Welcome to Expert Theme" +msgstr "" + +#. module: expert_theme +#: model:expert.login.template,minimal_login_title:expert_theme.expert_login_template_corporate +#: model:expert.login.template,minimal_login_title:expert_theme.expert_login_template_default +#: model:expert.login.template,minimal_login_title:expert_theme.expert_login_template_minimal +#: model:expert.login.template,minimal_login_title:expert_theme.expert_login_template_modern +#: model:expert.login.template,modern_login_title:expert_theme.expert_login_template_corporate +#: model:expert.login.template,modern_login_title:expert_theme.expert_login_template_default +#: model:expert.login.template,modern_login_title:expert_theme.expert_login_template_minimal +#: model:expert.login.template,modern_login_title:expert_theme.expert_login_template_modern +msgid "Welcome to Expert 👋" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_home +msgid "Your installed modules are listed below" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Create an account" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Enter your email to receive reset instructions" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Join us today and get started" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Kindly fill in your details below to sign in to your account" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Reset your password" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Sign In" +msgstr "" + +#. module: expert_theme +#: model_terms:ir.ui.view,arch_db:expert_theme.view_expert_login_template_form +msgid "e.g., Welcome to Expert 👋" +msgstr "" + +#. module: expert_theme +#. odoo-javascript +#: code:addons/expert_theme/static/src/xml/expert_home.xml:0 +msgid "🎨 Customize Theme Colors" +msgstr "" diff --git a/odex30_base/expert_theme/models/__init__.py b/odex30_base/expert_theme/models/__init__.py index 6878437..51fd383 100644 --- a/odex30_base/expert_theme/models/__init__.py +++ b/odex30_base/expert_theme/models/__init__.py @@ -2,3 +2,5 @@ from . import expert_theme_config from . import expert_login_template +from . import ir_http +from . import res_config_settings \ No newline at end of file diff --git a/odex30_base/expert_theme/models/expert_theme_config.py b/odex30_base/expert_theme/models/expert_theme_config.py index 6d0060d..faa6960 100644 --- a/odex30_base/expert_theme/models/expert_theme_config.py +++ b/odex30_base/expert_theme/models/expert_theme_config.py @@ -12,8 +12,8 @@ class ExpertThemeConfig(models.Model): active = fields.Boolean(string='Active', default=True) # Primary Colors - primary_color = fields.Char(string='Primary Color', default='#875A7B', help='Main brand color - affects navbar, primary buttons, and accents') - primary_hover = fields.Char(string='Primary Hover', default='#6B4C6B', help='Hover state for primary elements') + primary_color = fields.Char(string='Primary Color', default='#194571', help='Main brand color - affects navbar, primary buttons, and accents') + primary_hover = fields.Char(string='Primary Hover', default="#1A3958", help='Hover state for primary elements') primary_light = fields.Char(string='Primary Light', default='#A67B9B', help='Light version of primary color') # Secondary Colors @@ -21,8 +21,8 @@ class ExpertThemeConfig(models.Model): secondary_hover = fields.Char(string='Secondary Hover', default='#008B8A', help='Hover state for secondary elements') # Button Colors - btn_primary = fields.Char(string='Primary Button', default='#875A7B', help='Primary buttons (like "Activate" buttons)') - btn_primary_hover = fields.Char(string='Primary Button Hover', default='#6B4C6B', help='Primary button hover state') + btn_primary = fields.Char(string='Primary Button', default='#194571', help='Primary buttons (like "Activate" buttons)') + btn_primary_hover = fields.Char(string='Primary Button Hover', default='#1A3958', help='Primary button hover state') btn_secondary = fields.Char(string='Secondary Button', default='#00A09D', help='Secondary buttons (like "Upgrade" buttons)') btn_secondary_hover = fields.Char(string='Secondary Button Hover', default='#008B8A', help='Secondary button hover state') btn_light = fields.Char(string='Light Button', default='#F8F9FA', help='Light buttons (like "Learn More" buttons)') @@ -30,8 +30,8 @@ class ExpertThemeConfig(models.Model): btn_light_text = fields.Char(string='Light Button Text', default='#6C757D', help='Light button text color') # Background Colors - bg_primary = fields.Char(string='Primary Background', default='#875A7B', help='Navbar background') - bg_secondary = fields.Char(string='Secondary Background', default='#F8F9FA', help='Sidebar background') + bg_primary = fields.Char(string='Primary Background', default='#194571', help='Navbar background') + bg_secondary = fields.Char(string='Secondary Background', default='#194571', help='Sidebar background') bg_content = fields.Char(string='Content Background', default='#FFFFFF', help='Main content background') bg_gradient_start = fields.Char(string='Gradient Start', default='#f5f7fa', help='Page gradient start color') bg_gradient_end = fields.Char(string='Gradient End', default='#c3cfe2', help='Page gradient end color') @@ -50,7 +50,49 @@ class ExpertThemeConfig(models.Model): warning_color = fields.Char(string='Warning Color', default='#FFC107', help='Warning state (yellow)') danger_color = fields.Char(string='Danger Color', default='#DC3545', help='Danger/Error state (red)') info_color = fields.Char(string='Info Color', default='#17A2B8', help='Info state (blue)') + + # Navbar Colors + navbar_brand_color = fields.Char(string='Navbar Brand Color', default='#FFFFFF', help='Color of the brand/logo text in the navbar') + navbar_link_color = fields.Char(string='Navbar Link Color', default='#FFFFFF', help='Color of the links in the navbar') + navbar_link_hover = fields.Char(string='Navbar Link Hover', default='#194571', help='Hover color for navbar links') + + # home screen banner + home_banner_bg_type = fields.Selection([ + ('color', 'Color'), + ('image', 'Image') + ], string='Home Banner Background Type', default='color', required=True) + home_banner_bg_image = fields.Binary(string='Home Banner Background', attachment=True) + home_banner_bg_image_filename = fields.Char(string='Image Filename') + home_banner_text = fields.Char(string='Home Banner Text', default='#212529', help='Text color for the home screen banner') + + # Font Styles + arabic_fonts_style = fields.Selection([ + ('default', 'Default'), + ('rubik', 'Rubik'), + ('cairo', 'Cairo'), + ('tajawal', 'Tajawal'), + ('noto_sans_arabic', 'Noto Sans Arabic'), + ('almarai', 'Almarai'), + ('ibm_plex_sans_arabic', 'IBM Plex Sans Arabic'), + ('noto_kufi_arabic', 'Noto Kufi Arabic'), + ('beiruti', 'Beiruti'), + ], string='Arabic Fonts Style', default='default') + english_fonts_style = fields.Selection([ + ('default', 'Default'), + ('roboto', 'Roboto'), + ('roboto', 'Roboto'), + ('inter', 'Inter'), + ('story_script', 'Story Script'), + ('oswald', 'Oswald'), + ('raleway','Raleway'), + ('libertinus_serif_display', 'Libertinus Serif Display'), + ('ubuntu','Ubuntu'), + ('quicksand', 'Quicksand'), + ('libre_baskerville', 'Libre Baskerville'), + ('space_grotesk', 'Space Grotesk'), + ], string='English Fonts Style', default='default') + @api.model def get_active_config(self): """Get the active configuration or create a default one""" @@ -66,6 +108,23 @@ class ExpertThemeConfig(models.Model): def get_css_variables(self): """Get CSS variables for the active configuration""" config = self.get_active_config() + + banner_bg = "url('/expert_theme/static/src/img/home/background-light.png') no-repeat center / cover" + # check home banner bg type + if config.home_banner_bg_type == 'color': + banner_bg = config.primary_color + else: + if config.home_banner_bg_image: + banner_bg = f"url('/web/content/{config._name}/{config.id}/home_banner_bg_image') no-repeat center / cover" + + # get font styles + arabic_font_label = 'var(--font-sans-serif)' + english_font_label = 'var(--font-sans-serif)' + if self.arabic_fonts_style != 'default': + arabic_font_label = dict(self.fields_get(allfields=['arabic_fonts_style'])['arabic_fonts_style']['selection']).get(self.arabic_fonts_style, self.arabic_fonts_style) + if self.english_fonts_style != 'default': + english_font_label = dict(self.fields_get(allfields=['english_fonts_style'])['english_fonts_style']['selection']).get(self.english_fonts_style, self.english_fonts_style) + return { '--expert-primary-color': config.primary_color, '--expert-primary-hover': config.primary_hover, @@ -93,6 +152,13 @@ class ExpertThemeConfig(models.Model): '--expert-warning': config.warning_color, '--expert-danger': config.danger_color, '--expert-info': config.info_color, + '--expert-home-banner-bg': banner_bg, + '--homeMenuCaption-color': config.home_banner_text, + '--NavBar-brand-color': config.navbar_brand_color, + '--NavBar-entry-color': config.navbar_link_color, + '--NavBar-entry-color--hover': config.navbar_link_hover, + '--expert-ar-font-family': arabic_font_label, + '--expert-en-font-family': english_font_label } def apply_theme(self): diff --git a/odex30_base/expert_theme/models/ir_http.py b/odex30_base/expert_theme/models/ir_http.py new file mode 100644 index 0000000..44cb022 --- /dev/null +++ b/odex30_base/expert_theme/models/ir_http.py @@ -0,0 +1,19 @@ +# models/ir_http.py +from odoo import models + +class IrHttp(models.AbstractModel): + _inherit = 'ir.http' + + def session_info(self): + result = super().session_info() + # Fetch all active languages + languages = self.env['res.lang'].search_read( + [('active', '=', True)], + ['code', 'name', 'flag_image_url'] + ) + # Sort them: Current user's lang first, then by name + current_lang = self.env.user.lang + languages.sort(key=lambda x: (x['code'] != current_lang, x['name'])) + + result['available_languages'] = languages + return result \ No newline at end of file diff --git a/odex30_base/expert_theme/models/res_config_settings.py b/odex30_base/expert_theme/models/res_config_settings.py new file mode 100644 index 0000000..d6023cc --- /dev/null +++ b/odex30_base/expert_theme/models/res_config_settings.py @@ -0,0 +1,37 @@ +from odoo import models, fields, api + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + intro_loader_active = fields.Boolean(string="Enable Intro Loader", config_parameter='intro_loader.active') + + # Text Configuration + intro_loader_text = fields.Char(string="Loader Text", config_parameter='intro_loader.text', default="Loading...") + intro_loader_show_text = fields.Boolean(string="Show Text", config_parameter='intro_loader.show_text') + + # Spinner Configuration + intro_loader_show_spinner = fields.Boolean(string="Show Spinner", config_parameter='intro_loader.show_spinner') + + # Image Configuration + intro_loader_image = fields.Binary(string="Loader Image", attachment=True) + intro_loader_animation = fields.Selection([ + ('pulse', 'Pulse'), + ('spin', 'Spin'), + ('bounce', 'Bounce'), + ('none', 'Static') + ], string="Image Animation", config_parameter='intro_loader.animation', default='pulse') + + @api.model + def get_values(self): + res = super(ResConfigSettings, self).get_values() + # Retrieve the image manually since config_parameter doesn't store binaries well + params = self.env['ir.config_parameter'].sudo() + image = params.get_param('intro_loader.image_data') + res.update(intro_loader_image=image) + return res + + def set_values(self): + super(ResConfigSettings, self).set_values() + # Save the image as a string parameter (or handle via attachment for larger files) + params = self.env['ir.config_parameter'].sudo() + params.set_param('intro_loader.image_data', self.intro_loader_image or False) \ No newline at end of file diff --git a/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrI0FFlKp.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrI0FFlKp.woff2 new file mode 100644 index 0000000..d0edc13 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrI0FFlKp.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrJ8FFlKp.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrJ8FFlKp.woff2 new file mode 100644 index 0000000..a241ebb Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrJ8FFlKp.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrO0FFlKp.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrO0FFlKp.woff2 new file mode 100644 index 0000000..4b37cf3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrO0FFlKp.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOMFFg.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOMFFg.woff2 new file mode 100644 index 0000000..e6b33e2 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOMFFg.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOYFFlKp.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOYFFlKp.woff2 new file mode 100644 index 0000000..5755070 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOYFFlKp.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iura6YBj_oCad4k1nzGBCw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iura6YBj_oCad4k1nzGBCw.woff2 new file mode 100644 index 0000000..d62192f Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iura6YBj_oCad4k1nzGBCw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iura6YBj_oCad4k1nzSBC45I.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iura6YBj_oCad4k1nzSBC45I.woff2 new file mode 100644 index 0000000..bd8cd1f Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iura6YBj_oCad4k1nzSBC45I.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l4qkHrFpiQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l4qkHrFpiQ.woff2 new file mode 100644 index 0000000..05d3a6e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l4qkHrFpiQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l4qkHrRpiYlJ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l4qkHrRpiYlJ.woff2 new file mode 100644 index 0000000..da5472e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l4qkHrRpiYlJ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5anHrFpiQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5anHrFpiQ.woff2 new file mode 100644 index 0000000..0a11d0e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5anHrFpiQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5anHrRpiYlJ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5anHrRpiYlJ.woff2 new file mode 100644 index 0000000..af73b03 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5anHrRpiYlJ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5qjHrFpiQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5qjHrFpiQ.woff2 new file mode 100644 index 0000000..ddd5d6b Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5qjHrFpiQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5qjHrRpiYlJ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5qjHrRpiYlJ.woff2 new file mode 100644 index 0000000..677481a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l5qjHrRpiYlJ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l7KmHrFpiQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l7KmHrFpiQ.woff2 new file mode 100644 index 0000000..3825bb3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l7KmHrFpiQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l7KmHrRpiYlJ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l7KmHrRpiYlJ.woff2 new file mode 100644 index 0000000..f6d28c2 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l7KmHrRpiYlJ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l8KiHrFpiQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l8KiHrFpiQ.woff2 new file mode 100644 index 0000000..c7b63d3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l8KiHrFpiQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l8KiHrRpiYlJ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l8KiHrRpiYlJ.woff2 new file mode 100644 index 0000000..3e5c444 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l8KiHrRpiYlJ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l_6gHrFpiQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l_6gHrFpiQ.woff2 new file mode 100644 index 0000000..28249eb Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l_6gHrFpiQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l_6gHrRpiYlJ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l_6gHrRpiYlJ.woff2 new file mode 100644 index 0000000..e1970f0 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Iurf6YBj_oCad4k1l_6gHrRpiYlJ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSA1t4FZA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSA1t4FZA.woff2 new file mode 100644 index 0000000..32f64c2 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSA1t4FZA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAZt4FZA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAZt4FZA.woff2 new file mode 100644 index 0000000..75c0bba Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAZt4FZA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAdt4FZA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAdt4FZA.woff2 new file mode 100644 index 0000000..b854f33 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAdt4FZA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAht4A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAht4A.woff2 new file mode 100644 index 0000000..02d1a1c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/JTUXjIU69Cmr9FGcSAht4A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys43PWrfQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys43PWrfQ.woff2 new file mode 100644 index 0000000..fb4678c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys43PWrfQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys93PU.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys93PU.woff2 new file mode 100644 index 0000000..f929295 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys93PU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysw3PWrfQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysw3PWrfQ.woff2 new file mode 100644 index 0000000..92d42d5 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysw3PWrfQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysz3PWrfQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysz3PWrfQ.woff2 new file mode 100644 index 0000000..d5b551f Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysz3PWrfQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PKzeflA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PKzeflA.woff2 new file mode 100644 index 0000000..5421e8e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PKzeflA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PezeQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PezeQ.woff2 new file mode 100644 index 0000000..57d3778 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PezeQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PmzeflA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PmzeflA.woff2 new file mode 100644 index 0000000..c3fe27c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PmzeflA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PqzeflA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PqzeflA.woff2 new file mode 100644 index 0000000..5cfddef Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PqzeflA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCRXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCRXMR5Kw.woff2 new file mode 100644 index 0000000..f8bd4ea Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCRXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCUXMQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCUXMQ.woff2 new file mode 100644 index 0000000..0711030 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCUXMQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCZXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCZXMR5Kw.woff2 new file mode 100644 index 0000000..95295d8 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCZXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCaXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCaXMR5Kw.woff2 new file mode 100644 index 0000000..51035a3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCaXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCRXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCRXMR5Kw.woff2 new file mode 100644 index 0000000..97085a8 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCRXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCUXMQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCUXMQ.woff2 new file mode 100644 index 0000000..133e653 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCUXMQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCZXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCZXMR5Kw.woff2 new file mode 100644 index 0000000..ca0cb2e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCZXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCaXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCaXMR5Kw.woff2 new file mode 100644 index 0000000..225e993 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCaXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CRXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CRXMR5Kw.woff2 new file mode 100644 index 0000000..3d03f7b Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CRXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CUXMQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CUXMQ.woff2 new file mode 100644 index 0000000..5a2b601 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CUXMQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CZXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CZXMR5Kw.woff2 new file mode 100644 index 0000000..73d2838 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CZXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CaXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CaXMR5Kw.woff2 new file mode 100644 index 0000000..a986c7e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CaXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCRXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCRXMR5Kw.woff2 new file mode 100644 index 0000000..86fefef Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCRXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCUXMQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCUXMQ.woff2 new file mode 100644 index 0000000..fd0d7f3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCUXMQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCZXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCZXMR5Kw.woff2 new file mode 100644 index 0000000..9d22c2e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCZXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCaXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCaXMR5Kw.woff2 new file mode 100644 index 0000000..53a59fe Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCaXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCRXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCRXMR5Kw.woff2 new file mode 100644 index 0000000..112a24e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCRXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCUXMQ.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCUXMQ.woff2 new file mode 100644 index 0000000..8520239 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCUXMQ.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCZXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCZXMR5Kw.woff2 new file mode 100644 index 0000000..c588249 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCZXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCaXMR5Kw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCaXMR5Kw.woff2 new file mode 100644 index 0000000..668e8c4 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCaXMR5Kw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscQyyS4J0.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscQyyS4J0.woff2 new file mode 100644 index 0000000..98ece7b Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscQyyS4J0.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscRiyS.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscRiyS.woff2 new file mode 100644 index 0000000..bb04766 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscRiyS.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscSCyS4J0.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscSCyS4J0.woff2 new file mode 100644 index 0000000..5b6a642 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscSCyS4J0.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnX661A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnX661A.woff2 new file mode 100644 index 0000000..c39379c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnX661A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXC61F3f.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXC61F3f.woff2 new file mode 100644 index 0000000..2eb28bc Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXC61F3f.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXO61F3f.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXO61F3f.woff2 new file mode 100644 index 0000000..8228bc4 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXO61F3f.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXq61F3f.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXq61F3f.woff2 new file mode 100644 index 0000000..fc8a409 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXq61F3f.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXu61F3f.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXu61F3f.woff2 new file mode 100644 index 0000000..1a6b967 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXu61F3f.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXy61F3f.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXy61F3f.woff2 new file mode 100644 index 0000000..1f1306a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWEBXyIfDnIV7nEnXy61F3f.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nBrXw.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nBrXw.woff2 new file mode 100644 index 0000000..42fc52a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nBrXw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nDrXyi0A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nDrXyi0A.woff2 new file mode 100644 index 0000000..e445d06 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nDrXyi0A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nErXyi0A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nErXyi0A.woff2 new file mode 100644 index 0000000..557cbb7 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nErXyi0A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nFrXyi0A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nFrXyi0A.woff2 new file mode 100644 index 0000000..1becf8a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nFrXyi0A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nMrXyi0A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nMrXyi0A.woff2 new file mode 100644 index 0000000..16abe42 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nMrXyi0A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nPrXyi0A.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nPrXyi0A.woff2 new file mode 100644 index 0000000..55166f7 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/iJWKBXyIfDnIV7nPrXyi0A.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj41v4o.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj41v4o.woff2 new file mode 100644 index 0000000..83ea034 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj41v4o.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj47v4r4xA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj47v4r4xA.woff2 new file mode 100644 index 0000000..61d55c2 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj47v4r4xA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj4wv4r4xA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj4wv4r4xA.woff2 new file mode 100644 index 0000000..0563cb3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj4wv4r4xA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5Jv4r4xA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5Jv4r4xA.woff2 new file mode 100644 index 0000000..f965e8e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5Jv4r4xA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5bv4r4xA.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5bv4r4xA.woff2 new file mode 100644 index 0000000..840022e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5bv4r4xA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS-agtn-Wow.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS-agtn-Wow.woff2 new file mode 100644 index 0000000..449417c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS-agtn-Wow.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS-agtnqWo572.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS-agtnqWo572.woff2 new file mode 100644 index 0000000..6a6ebe1 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS-agtnqWo572.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_antn-Wow.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_antn-Wow.woff2 new file mode 100644 index 0000000..a88bb36 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_antn-Wow.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_antnqWo572.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_antnqWo572.woff2 new file mode 100644 index 0000000..c588799 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_antnqWo572.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_qjtn-Wow.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_qjtn-Wow.woff2 new file mode 100644 index 0000000..e6d1169 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_qjtn-Wow.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_qjtnqWo572.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_qjtnqWo572.woff2 new file mode 100644 index 0000000..f684f26 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tssoApxBaigK_hnnS_qjtnqWo572.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tsstApxBaigK_hnnQ12Fow.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tsstApxBaigK_hnnQ12Fow.woff2 new file mode 100644 index 0000000..053147a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tsstApxBaigK_hnnQ12Fow.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar/tsstApxBaigK_hnnQ1iFo0C3.woff2 b/odex30_base/expert_theme/static/src/fonts/ar/tsstApxBaigK_hnnQ1iFo0C3.woff2 new file mode 100644 index 0000000..1209342 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/ar/tsstApxBaigK_hnnQ1iFo0C3.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/ar_fonts.scss b/odex30_base/expert_theme/static/src/fonts/ar_fonts.scss new file mode 100644 index 0000000..3751f0f --- /dev/null +++ b/odex30_base/expert_theme/static/src/fonts/ar_fonts.scss @@ -0,0 +1,716 @@ +/* arabic */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/tssoApxBaigK_hnnS_antnqWo572.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/tssoApxBaigK_hnnS_antn-Wow.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/tsstApxBaigK_hnnQ1iFo0C3.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/tsstApxBaigK_hnnQ12Fow.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/tssoApxBaigK_hnnS-agtnqWo572.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/tssoApxBaigK_hnnS-agtn-Wow.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url(ar/tssoApxBaigK_hnnS_qjtnqWo572.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Almarai'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url(ar/tssoApxBaigK_hnnS_qjtn-Wow.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Beiruti'; + font-style: normal; + font-weight: 200 900; + font-display: swap; + src: url(ar/JTUXjIU69Cmr9FGcSA1t4FZA.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* vietnamese */ +@font-face { + font-family: 'Beiruti'; + font-style: normal; + font-weight: 200 900; + font-display: swap; + src: url(ar/JTUXjIU69Cmr9FGcSAdt4FZA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Beiruti'; + font-style: normal; + font-weight: 200 900; + font-display: swap; + src: url(ar/JTUXjIU69Cmr9FGcSAZt4FZA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Beiruti'; + font-style: normal; + font-weight: 200 900; + font-display: swap; + src: url(ar/JTUXjIU69Cmr9FGcSAht4A.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Cairo'; + font-style: normal; + font-weight: 200 1000; + font-display: swap; + src: url(ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscQyyS4J0.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin-ext */ +@font-face { + font-family: 'Cairo'; + font-style: normal; + font-weight: 200 1000; + font-display: swap; + src: url(ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscSCyS4J0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Cairo'; + font-style: normal; + font-weight: 200 1000; + font-display: swap; + src: url(ar/SLXVc1nY6HkvangtZmpQdkhzfH5lkSscRiyS.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url(ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PKzeflA.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url(ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PqzeflA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url(ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PmzeflA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url(ar/Qw3MZRtWPQCuHme67tEYUIx3Kh0PHR9N6YNe7PezeQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCRXMR5Kw.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCZXMR5Kw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCaXMR5Kw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPy_eCUXMQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCRXMR5Kw.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCZXMR5Kw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCaXMR5Kw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOW_uCUXMQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys43PWrfQ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysw3PWrfQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ysz3PWrfQ.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/Qw3CZRtWPQCuHme67tEYUIx3Kh0PHR9N6Ys93PU.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CRXMR5Kw.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CZXMR5Kw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CaXMR5Kw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPO_-CUXMQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCRXMR5Kw.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCZXMR5Kw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCaXMR5Kw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YPi-OCUXMQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCRXMR5Kw.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCZXMR5Kw.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* latin-ext */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCaXMR5Kw.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'IBM Plex Sans Arabic'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/Qw3NZRtWPQCuHme67tEYUIx3Kh0PHR9N6YOG-eCUXMQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Noto Kufi Arabic'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOYFFlKp.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* math */ +@font-face { + font-family: 'Noto Kufi Arabic'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrJ8FFlKp.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Noto Kufi Arabic'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrI0FFlKp.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* latin-ext */ +@font-face { + font-family: 'Noto Kufi Arabic'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrO0FFlKp.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Noto Kufi Arabic'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(ar/CSRk4ydQnPyaDxEXLFF6LZVLKrodrOMFFg.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Noto Sans Arabic'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj4wv4r4xA.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* math */ +@font-face { + font-family: 'Noto Sans Arabic'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5Jv4r4xA.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Noto Sans Arabic'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj5bv4r4xA.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* latin-ext */ +@font-face { + font-family: 'Noto Sans Arabic'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj47v4r4xA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Noto Sans Arabic'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(ar/nwpCtLGrOAZMl5nJ_wfgRg3DrWFZWsnVBJ_sS6tlqHHFlj41v4o.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Rubik'; + font-style: italic; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWEBXyIfDnIV7nEnXu61F3f.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Rubik'; + font-style: italic; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWEBXyIfDnIV7nEnXO61F3f.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Rubik'; + font-style: italic; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWEBXyIfDnIV7nEnXq61F3f.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* hebrew */ +@font-face { + font-family: 'Rubik'; + font-style: italic; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWEBXyIfDnIV7nEnXy61F3f.woff2) format('woff2'); + unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* latin-ext */ +@font-face { + font-family: 'Rubik'; + font-style: italic; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWEBXyIfDnIV7nEnXC61F3f.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Rubik'; + font-style: italic; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWEBXyIfDnIV7nEnX661A.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Rubik'; + font-style: normal; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWKBXyIfDnIV7nErXyi0A.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Rubik'; + font-style: normal; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWKBXyIfDnIV7nMrXyi0A.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Rubik'; + font-style: normal; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWKBXyIfDnIV7nFrXyi0A.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* hebrew */ +@font-face { + font-family: 'Rubik'; + font-style: normal; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWKBXyIfDnIV7nDrXyi0A.woff2) format('woff2'); + unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* latin-ext */ +@font-face { + font-family: 'Rubik'; + font-style: normal; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWKBXyIfDnIV7nPrXyi0A.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Rubik'; + font-style: normal; + font-weight: 300 900; + font-display: swap; + src: url(ar/iJWKBXyIfDnIV7nBrXw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l_6gHrRpiYlJ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l_6gHrFpiQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l5qjHrRpiYlJ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l5qjHrFpiQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/Iura6YBj_oCad4k1nzSBC45I.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(ar/Iura6YBj_oCad4k1nzGBCw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l8KiHrRpiYlJ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l8KiHrFpiQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l4qkHrRpiYlJ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l4qkHrFpiQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l5anHrRpiYlJ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l5anHrFpiQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* arabic */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l7KmHrRpiYlJ.woff2) format('woff2'); + unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1; +} +/* latin */ +@font-face { + font-family: 'Tajawal'; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url(ar/Iurf6YBj_oCad4k1l7KmHrFpiQ.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} \ No newline at end of file diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbgMdhLhU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbgMdhLhU.woff2 new file mode 100644 index 0000000..b6d60d7 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbgMdhLhU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbh8dhLhU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbh8dhLhU.woff2 new file mode 100644 index 0000000..48d17de Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbh8dhLhU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbhMdh.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbhMdh.woff2 new file mode 100644 index 0000000..98e8bec Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbhMdh.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbi8dhLhU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbi8dhLhU.woff2 new file mode 100644 index 0000000..76efc58 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbi8dhLhU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbiMdhLhU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbiMdhLhU.woff2 new file mode 100644 index 0000000..e11a48a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbiMdhLhU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbicdhLhU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbicdhLhU.woff2 new file mode 100644 index 0000000..5680d55 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbicdhLhU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbisdhLhU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbisdhLhU.woff2 new file mode 100644 index 0000000..6572594 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbisdhLhU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4Q4FqPfE.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4Q4FqPfE.woff2 new file mode 100644 index 0000000..be83fa7 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4Q4FqPfE.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4QIFqPfE.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4QIFqPfE.woff2 new file mode 100644 index 0000000..fa536ca Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4QIFqPfE.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4QoFqPfE.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4QoFqPfE.woff2 new file mode 100644 index 0000000..e01bb3a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4QoFqPfE.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4SYFqPfE.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4SYFqPfE.woff2 new file mode 100644 index 0000000..78b07f2 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4SYFqPfE.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4TYFq.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4TYFq.woff2 new file mode 100644 index 0000000..e42c392 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptsg8zYS_SKggPNyCg4TYFq.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyC0ITw.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyC0ITw.woff2 new file mode 100644 index 0000000..67a3b53 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyC0ITw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCAIT5lu.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCAIT5lu.woff2 new file mode 100644 index 0000000..dee82d4 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCAIT5lu.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCIIT5lu.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCIIT5lu.woff2 new file mode 100644 index 0000000..b566478 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCIIT5lu.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCMIT5lu.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCMIT5lu.woff2 new file mode 100644 index 0000000..24cc256 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCMIT5lu.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCkIT5lu.woff2 b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCkIT5lu.woff2 new file mode 100644 index 0000000..1005b7c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/1Ptug8zYS_SKggPNyCkIT5lu.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hJFQNcOM.woff2 b/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hJFQNcOM.woff2 new file mode 100644 index 0000000..4ac6270 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hJFQNcOM.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hJVQNcOM.woff2 b/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hJVQNcOM.woff2 new file mode 100644 index 0000000..47ab264 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hJVQNcOM.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hK1QN.woff2 b/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hK1QN.woff2 new file mode 100644 index 0000000..2240e40 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/6xKtdSZaM9iE8KbpRA_hK1QN.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2 new file mode 100644 index 0000000..ab38fd5 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2 new file mode 100644 index 0000000..db65849 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2 new file mode 100644 index 0000000..7c9cbed Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2 new file mode 100644 index 0000000..e0aa393 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2 new file mode 100644 index 0000000..b677130 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2 new file mode 100644 index 0000000..669ba79 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2 new file mode 100644 index 0000000..6cc1de8 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2 new file mode 100644 index 0000000..ded8a41 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2 new file mode 100644 index 0000000..dbac481 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 new file mode 100644 index 0000000..8e0eec6 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 new file mode 100644 index 0000000..0ddf16c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 new file mode 100644 index 0000000..7bd3c2e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 new file mode 100644 index 0000000..8e43aa4 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 new file mode 100644 index 0000000..2c6ba19 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 new file mode 100644 index 0000000..2f8b493 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 new file mode 100644 index 0000000..7c16c79 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 new file mode 100644 index 0000000..c2788c7 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 new file mode 100644 index 0000000..528b3bf Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752FD8Ghe4.woff2 b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752FD8Ghe4.woff2 new file mode 100644 index 0000000..22e18a3 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752FD8Ghe4.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752Fj8Ghe4.woff2 b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752Fj8Ghe4.woff2 new file mode 100644 index 0000000..d3738f6 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752Fj8Ghe4.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752Fz8Ghe4.woff2 b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752Fz8Ghe4.woff2 new file mode 100644 index 0000000..1ca5ca1 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752Fz8Ghe4.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752GT8G.woff2 b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752GT8G.woff2 new file mode 100644 index 0000000..a8e119e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752GT8G.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752HT8Ghe4.woff2 b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752HT8Ghe4.woff2 new file mode 100644 index 0000000..1244b7a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/TK3iWkUHHAIjg752HT8Ghe4.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwAT9nA2.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwAT9nA2.woff2 new file mode 100644 index 0000000..6c2ce2d Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwAT9nA2.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwQT9g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwQT9g.woff2 new file mode 100644 index 0000000..39eb636 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwQT9g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwcT9nA2.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwcT9nA2.woff2 new file mode 100644 index 0000000..e8b4994 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwcT9nA2.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwgT9nA2.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwgT9nA2.woff2 new file mode 100644 index 0000000..2be522a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwgT9nA2.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwkT9nA2.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwkT9nA2.woff2 new file mode 100644 index 0000000..57fdf36 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwkT9nA2.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwoT9nA2.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwoT9nA2.woff2 new file mode 100644 index 0000000..fb8e67e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwoT9nA2.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwsT9nA2.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwsT9nA2.woff2 new file mode 100644 index 0000000..db25457 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCm3FwrK3iLTcvnUwsT9nA2.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvhYwYL8g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvhYwYL8g.woff2 new file mode 100644 index 0000000..612258d Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvhYwYL8g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcviYwY.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcviYwY.woff2 new file mode 100644 index 0000000..b0d0e2e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcviYwY.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvmYwYL8g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvmYwYL8g.woff2 new file mode 100644 index 0000000..17ec069 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvmYwYL8g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvsYwYL8g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvsYwYL8g.woff2 new file mode 100644 index 0000000..a0125fa Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvsYwYL8g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvtYwYL8g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvtYwYL8g.woff2 new file mode 100644 index 0000000..79ac1ef Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvtYwYL8g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvuYwYL8g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvuYwYL8g.woff2 new file mode 100644 index 0000000..afb0394 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvuYwYL8g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvvYwYL8g.woff2 b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvvYwYL8g.woff2 new file mode 100644 index 0000000..2f90b7d Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/UcCo3FwrK3iLTcvvYwYL8g.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2 b/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2 new file mode 100644 index 0000000..ce97d0f Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2 b/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2 new file mode 100644 index 0000000..db732c2 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2 b/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2 new file mode 100644 index 0000000..ce2ec21 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWx8QDP2V.woff2 b/odex30_base/expert_theme/static/src/fonts/en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWx8QDP2V.woff2 new file mode 100644 index 0000000..365d344 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWx8QDP2V.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWxEQDA.woff2 b/odex30_base/expert_theme/static/src/fonts/en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWxEQDA.woff2 new file mode 100644 index 0000000..e74536b Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWxEQDA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY3KcA.woff2 b/odex30_base/expert_theme/static/src/fonts/en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY3KcA.woff2 new file mode 100644 index 0000000..443efad Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY3KcA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY5KcCsww.woff2 b/odex30_base/expert_theme/static/src/fonts/en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY5KcCsww.woff2 new file mode 100644 index 0000000..2334975 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY5KcCsww.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNXaxMICA.woff2 b/odex30_base/expert_theme/static/src/fonts/en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNXaxMICA.woff2 new file mode 100644 index 0000000..b15ae0d Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNXaxMICA.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNZaxM.woff2 b/odex30_base/expert_theme/static/src/fonts/en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNZaxM.woff2 new file mode 100644 index 0000000..350b569 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNZaxM.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOUuhp.woff2 b/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOUuhp.woff2 new file mode 100644 index 0000000..107ca6a Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOUuhp.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOXOhpOqc.woff2 b/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOXOhpOqc.woff2 new file mode 100644 index 0000000..add6659 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOXOhpOqc.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOXehpOqc.woff2 b/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOXehpOqc.woff2 new file mode 100644 index 0000000..0ce4e7e Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/mem5YaSw02SQ0OlzDuR8IskOXehpOqc.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 new file mode 100644 index 0000000..0fb066c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 new file mode 100644 index 0000000..bc2aea0 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 new file mode 100644 index 0000000..fcce594 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 new file mode 100644 index 0000000..ffc8e9c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 new file mode 100644 index 0000000..6375e9c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 new file mode 100644 index 0000000..2e849f6 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 new file mode 100644 index 0000000..5d9194c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 new file mode 100644 index 0000000..e5c936b Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 new file mode 100644 index 0000000..5cf8aff Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 new file mode 100644 index 0000000..f7e9995 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 new file mode 100644 index 0000000..4e8b905 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 new file mode 100644 index 0000000..bed5b67 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 new file mode 100644 index 0000000..9164ccb Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 new file mode 100644 index 0000000..08bed85 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 new file mode 100644 index 0000000..307b214 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 new file mode 100644 index 0000000..0b0b3a4 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 new file mode 100644 index 0000000..4bce1d0 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 new file mode 100644 index 0000000..5bd7b8f Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 new file mode 100644 index 0000000..b969602 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 new file mode 100644 index 0000000..1f7d08c Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v-6QU.woff2 b/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v-6QU.woff2 new file mode 100644 index 0000000..066c517 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v-6QU.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v9KQU4Wc.woff2 b/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v9KQU4Wc.woff2 new file mode 100644 index 0000000..8398212 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v9KQU4Wc.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v9aQU4Wc.woff2 b/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v9aQU4Wc.woff2 new file mode 100644 index 0000000..80eeee8 Binary files /dev/null and b/odex30_base/expert_theme/static/src/fonts/en/wlpwgwvFAVdoq2_v9aQU4Wc.woff2 differ diff --git a/odex30_base/expert_theme/static/src/fonts/en_fonts.scss b/odex30_base/expert_theme/static/src/fonts/en_fonts.scss new file mode 100644 index 0000000..2fb2e1c --- /dev/null +++ b/odex30_base/expert_theme/static/src/fonts/en_fonts.scss @@ -0,0 +1,866 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwkT9nA2.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwAT9nA2.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwgT9nA2.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwcT9nA2.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwsT9nA2.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwoT9nA2.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCm3FwrK3iLTcvnUwQT9g.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcvvYwYL8g.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcvmYwYL8g.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcvuYwYL8g.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcvhYwYL8g.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcvtYwYL8g.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcvsYwYL8g.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/UcCo3FwrK3iLTcviYwY.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Lexend'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/wlpwgwvFAVdoq2_v9KQU4Wc.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Lexend'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/wlpwgwvFAVdoq2_v9aQU4Wc.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Lexend'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/wlpwgwvFAVdoq2_v-6QU.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbicdhLhU.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbgMdhLhU.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbiMdhLhU.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbh8dhLhU.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_Gpgcbi8dhLhU.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbisdhLhU.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Libertinus Serif Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/0FlHVOmbklub_P32Hm53RVREi5BsXWudOF_GpgcbhMdh.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'Libre Baskerville'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWx8QDP2V.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Libre Baskerville'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url(en/kmKhZrc3Hgbbcjq75U4uslyuy4kn0qNcWxEQDA.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'Libre Baskerville'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNXaxMICA.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Libre Baskerville'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/kmKnZrc3Hgbbcjq75U4uslyuy4kn0qNZaxM.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'Libre Baskerville'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY5KcCsww.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Libre Baskerville'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(en/kmKiZrc3Hgbbcjq75U4uslyuy4kn0qviTgY3KcA.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); + unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* hebrew */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); + unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; +} +/* math */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300 800; + font-stretch: 100%; + font-display: swap; + src: url(en/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Oswald'; + font-style: normal; + font-weight: 200 700; + font-display: swap; + src: url(en/TK3iWkUHHAIjg752FD8Ghe4.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Oswald'; + font-style: normal; + font-weight: 200 700; + font-display: swap; + src: url(en/TK3iWkUHHAIjg752HT8Ghe4.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Oswald'; + font-style: normal; + font-weight: 200 700; + font-display: swap; + src: url(en/TK3iWkUHHAIjg752Fj8Ghe4.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Oswald'; + font-style: normal; + font-weight: 200 700; + font-display: swap; + src: url(en/TK3iWkUHHAIjg752Fz8Ghe4.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Oswald'; + font-style: normal; + font-weight: 200 700; + font-display: swap; + src: url(en/TK3iWkUHHAIjg752GT8G.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Quicksand'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url(en/6xKtdSZaM9iE8KbpRA_hJFQNcOM.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Quicksand'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url(en/6xKtdSZaM9iE8KbpRA_hJVQNcOM.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Quicksand'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url(en/6xKtdSZaM9iE8KbpRA_hK1QN.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Raleway'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptsg8zYS_SKggPNyCg4QIFqPfE.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Raleway'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptsg8zYS_SKggPNyCg4SYFqPfE.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Raleway'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptsg8zYS_SKggPNyCg4QoFqPfE.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Raleway'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptsg8zYS_SKggPNyCg4Q4FqPfE.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Raleway'; + font-style: italic; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptsg8zYS_SKggPNyCg4TYFq.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptug8zYS_SKggPNyCAIT5lu.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptug8zYS_SKggPNyCkIT5lu.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptug8zYS_SKggPNyCIIT5lu.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptug8zYS_SKggPNyCMIT5lu.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Raleway'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(en/1Ptug8zYS_SKggPNyC0ITw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* math */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2'); + unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; +} +/* math */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2'); + unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; +} +/* symbols */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2'); + unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 100 900; + font-stretch: 100%; + font-display: swap; + src: url(en/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url(en/V8mDoQDjQSkFtoMM3T6r8E7mPb54C-s0.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url(en/V8mDoQDjQSkFtoMM3T6r8E7mPb94C-s0.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Space Grotesk'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url(en/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* vietnamese */ +@font-face { + font-family: 'Story Script'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/mem5YaSw02SQ0OlzDuR8IskOXehpOqc.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Story Script'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/mem5YaSw02SQ0OlzDuR8IskOXOhpOqc.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Story Script'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(en/mem5YaSw02SQ0OlzDuR8IskOUuhp.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} \ No newline at end of file diff --git a/odex30_base/expert_theme/static/src/img/home/background-dark.png b/odex30_base/expert_theme/static/src/img/home/background-dark.png new file mode 100644 index 0000000..ac94fc4 Binary files /dev/null and b/odex30_base/expert_theme/static/src/img/home/background-dark.png differ diff --git a/odex30_base/expert_theme/static/src/img/home/background-light.png b/odex30_base/expert_theme/static/src/img/home/background-light.png new file mode 100644 index 0000000..63ffa6c Binary files /dev/null and b/odex30_base/expert_theme/static/src/img/home/background-light.png differ diff --git a/odex30_base/expert_theme/static/src/js/intro_loader.js b/odex30_base/expert_theme/static/src/js/intro_loader.js new file mode 100644 index 0000000..9996b41 --- /dev/null +++ b/odex30_base/expert_theme/static/src/js/intro_loader.js @@ -0,0 +1,35 @@ +/** @odoo-module **/ + +import { WebClient } from "@web/webclient/webclient"; +import { patch } from "@web/core/utils/patch"; +import { onMounted } from "@odoo/owl"; + +patch(WebClient.prototype, { + setup() { + super.setup(); + + onMounted(() => { + // Select the loader element + const loader = document.getElementById("o_intro_loader"); + + if (loader) { + // Optional: Check sessionStorage if you want it ONCE per browser session + // const hasLoaded = sessionStorage.getItem('odoo_intro_shown'); + + // Add the hidden class to trigger CSS transition + // We add a small delay (e.g., 500ms) to ensure the UI is visually stable behind it + setTimeout(() => { + loader.classList.add("o_hidden"); + + // Cleanup DOM after animation finishes (optional but cleaner) + setTimeout(() => { + loader.remove(); + }, 1000); + + }, 500); + + // sessionStorage.setItem('odoo_intro_shown', 'true'); + } + }); + } +}); \ No newline at end of file diff --git a/odex30_base/expert_theme/static/src/js/user_menu_language.js b/odex30_base/expert_theme/static/src/js/user_menu_language.js new file mode 100644 index 0000000..55dae3b --- /dev/null +++ b/odex30_base/expert_theme/static/src/js/user_menu_language.js @@ -0,0 +1,69 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { session } from "@web/session"; +import { browser } from "@web/core/browser/browser"; +import { _t } from "@web/core/l10n/translation"; + +const userMenuRegistry = registry.category("user_menuitems"); + +/** + * Service to handle the language switch logic + */ +async function switchLanguage(env, langCode) { + // 1. Write the new language to the user's preference + await env.services.orm.write("res.users", [session.uid], { + lang: langCode, + }); + + // 2. Reload the page to apply changes + browser.location.reload(); +} + +/** + * Function to generate language menu items + */ +function languageSwitchItems(env) { + console.log("Generating language switcher menu items"); + const activeLanguages = session.available_languages || []; + const currentLang = session.bundle_params.lang || 'en'; + console.log("Active languages:", activeLanguages); + console.log("Current language:", userMenuRegistry); + + // Use a separator to visually group languages if you have many items + // If you prefer a flat list, you can remove the separator logic. + const items = [ + { + type: "separator", + id: "language_separator", + }, + ]; + + console.log(items); + + activeLanguages.forEach((lang) => { + // Skip adding the currently active language to the list (optional UX choice) + // OR add it but mark it as checked. Here we just add all. + const isCurrent = lang.code === currentLang; + console.log("Adding language menu item for:", lang.code, "Current:", isCurrent); + items.push({ + type: "item", + id: `lang_switch_${lang.code}`, + description: `${lang.name} ${isCurrent ? "✓" : ""}`, + callback: async () => { + if (!isCurrent) { + await switchLanguage(env, lang.code); + } + }, + }); + }); + + return items; +} + +// Add the languages to the registry +// We wrap it in a function because the registry expects a function that returns the item(s) +// userMenuRegistry.add("language_switcher", languageSwitchItems, { sequence: 10,force: true }); +userMenuRegistry.remove("documentation"); +userMenuRegistry.remove("support"); +userMenuRegistry.remove("odoo_account"); diff --git a/odex30_base/expert_theme/static/src/language_menu/language_menu.js b/odex30_base/expert_theme/static/src/language_menu/language_menu.js new file mode 100755 index 0000000..17f7923 --- /dev/null +++ b/odex30_base/expert_theme/static/src/language_menu/language_menu.js @@ -0,0 +1,115 @@ +import { Dropdown } from "@web/core/dropdown/dropdown"; +import { DropdownGroup } from "@web/core/dropdown/dropdown_group"; +import { DropdownItem } from "@web/core/dropdown/dropdown_item"; +import { CheckBox } from "@web/core/checkbox/checkbox"; +import { registry } from "@web/core/registry"; +import { user } from "@web/core/user"; +import { session } from "@web/session"; +import { browser } from "@web/core/browser/browser"; +import { Component } from "@odoo/owl"; +import { imageUrl } from "@web/core/utils/urls"; + +const languageMenuRegistry = registry.category("language_menuitems"); + +export class LanguageMenu extends Component { + static template = "web.LanguageMenu"; + static components = { DropdownGroup, Dropdown, DropdownItem, CheckBox }; + static props = {}; + + setup() { + console.log("LanguageMenu setup called", session); + this.activeLanguage = session.bundle_params.lang_code || 'en_US'; + this.availableLanguages = session.available_languages || []; + const { partnerId, writeDate } = user; + console.log("User info:", user); + this.languageSwitchItems(); + } + + getElements() { + const sortedItems = languageMenuRegistry + .getAll() + .map((element) => element(this.env)) + .filter((element) => (element.show ? element.show() : true)) + .sort((x, y) => { + const xSeq = x.sequence ? x.sequence : 100; + const ySeq = y.sequence ? y.sequence : 100; + return xSeq - ySeq; + }); + return sortedItems; + } + + getCurrentLanguageFlag() { + const currentLang = this.availableLanguages.find( + (lang) => lang.code === this.activeLanguage + ); + if (currentLang && currentLang.flag_image_url) { + return currentLang.flag_image_url; + } + return null; + } + + /** + * Service to handle the language switch logic + */ + async switchLanguage(langCode) { + console.log("Switching language to:", user); + // 1. Write the new language to the user's preference + await this.env.services.orm.write("res.users", [user.userId], { + lang: langCode, + }); + + // 2. Reload the page to apply changes + browser.location.reload(); + } + + /** + * Function to generate language menu items + */ + languageSwitchItems() { + const activeLanguages = session.available_languages || []; + const currentLang = session.bundle_params.lang || 'en_US'; + // Use a separator to visually group languages if you have many items + // If you prefer a flat list, you can remove the separator logic. + const items = []; + let self = this; + + activeLanguages.forEach((lang) => { + // Skip adding the currently active language to the list (optional UX choice) + // OR add it but mark it as checked. Here we just add all. + const isCurrent = lang.code === currentLang; + console.log(isCurrent) + console.log("Adding language menu item for:", lang.code, "Current:", isCurrent); + languageMenuRegistry.add(`lang_switch_${lang.code}`, () => { + return { + type: "item", + id: `lang_switch_${lang.code}`, + icon: lang.flag_image_url, + description: `${lang.name}`, + currentLang: isCurrent, + callback: async () => { + if (!isCurrent) { + await self.switchLanguage(lang.code); + } + }, + }; + }); + // items.push({ + // type: "item", + // id: `lang_switch_${lang.code}`, + // description: `${lang.name} ${isCurrent ? "✓" : ""}`, + // callback: async () => { + // if (!isCurrent) { + // await this.switchLanguage(lang.code); + // } + // }, + // }); + }); + + return items; + } +} + +export const systrayItem = { + Component: LanguageMenu, +}; +registry.category("systray").add("web.language_menu", systrayItem, { sequence: 0 }); diff --git a/odex30_base/expert_theme/static/src/language_menu/language_menu.scss b/odex30_base/expert_theme/static/src/language_menu/language_menu.scss new file mode 100755 index 0000000..4bfa5df --- /dev/null +++ b/odex30_base/expert_theme/static/src/language_menu/language_menu.scss @@ -0,0 +1,19 @@ +.o_user_menu .dropdown-toggle { + --NavBar-entry-padding-right: #{$o-horizontal-padding}; + + .o_user_avatar { + height: calc(var(--o-navbar-height) - 20px); + } +} + +.o_menu_icon{ + height: 16px; + width: 20px; + object-fit: cover; +} +.o_menu_item_icon{ + height: 25px; + width: 25px; + object-fit: cover; + border-radius: 100%; +} \ No newline at end of file diff --git a/odex30_base/expert_theme/static/src/language_menu/language_menu.xml b/odex30_base/expert_theme/static/src/language_menu/language_menu.xml new file mode 100755 index 0000000..916ebab --- /dev/null +++ b/odex30_base/expert_theme/static/src/language_menu/language_menu.xml @@ -0,0 +1,42 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + diff --git a/odex30_base/expert_theme/static/src/scss/expert_theme.scss b/odex30_base/expert_theme/static/src/scss/expert_theme.scss index 13c2eb4..026ff27 100644 --- a/odex30_base/expert_theme/static/src/scss/expert_theme.scss +++ b/odex30_base/expert_theme/static/src/scss/expert_theme.scss @@ -3,44 +3,80 @@ /* CSS Variables for Customizable Colors */ :root { /* Primary Colors */ - --expert-primary-color: #875A7B; /* Main brand color (Odoo purple) */ - --expert-primary-hover: #6B4C6B; /* Primary hover state */ - --expert-primary-light: #A67B9B; /* Light primary */ - + --expert-primary-color: #875A7B; + /* Main brand color (Odoo purple) */ + --expert-primary-hover: #6B4C6B; + /* Primary hover state */ + --expert-primary-light: #A67B9B; + /* Light primary */ + /* Secondary Colors */ - --expert-secondary-color: #00A09D; /* Teal for upgrades */ - --expert-secondary-hover: #008B8A; /* Teal hover */ - + --expert-secondary-color: #00A09D; + /* Teal for upgrades */ + --expert-secondary-hover: #008B8A; + /* Teal hover */ + /* Button Colors */ - --expert-btn-primary: #875A7B; /* Primary button (Activate) */ - --expert-btn-primary-hover: #6B4C6B; /* Primary button hover */ - --expert-btn-secondary: #00A09D; /* Secondary button (Upgrade) */ - --expert-btn-secondary-hover: #008B8A; /* Secondary button hover */ - --expert-btn-light: #F8F9FA; /* Light button (Learn More) */ - --expert-btn-light-hover: #E9ECEF; /* Light button hover */ - --expert-btn-light-text: #6C757D; /* Light button text */ - + --expert-btn-primary: #875A7B; + /* Primary button (Activate) */ + --expert-btn-primary-hover: #6B4C6B; + /* Primary button hover */ + --expert-btn-secondary: #00A09D; + /* Secondary button (Upgrade) */ + --expert-btn-secondary-hover: #008B8A; + /* Secondary button hover */ + --expert-btn-light: #F8F9FA; + /* Light button (Learn More) */ + --expert-btn-light-hover: #E9ECEF; + /* Light button hover */ + --expert-btn-light-text: #6C757D; + /* Light button text */ + /* Background Colors */ - --expert-bg-primary: #875A7B; /* Navbar background */ - --expert-bg-secondary: #F8F9FA; /* Sidebar background */ - --expert-bg-content: #FFFFFF; /* Main content background */ - --expert-bg-gradient-start: #f5f7fa; /* Gradient start */ - --expert-bg-gradient-end: #c3cfe2; /* Gradient end */ - + --expert-bg-primary: #875A7B; + /* Navbar background */ + --expert-bg-secondary: #F8F9FA; + /* Sidebar background */ + --expert-bg-content: #FFFFFF; + /* Main content background */ + --expert-bg-gradient-start: #f5f7fa; + /* Gradient start */ + --expert-bg-gradient-end: #c3cfe2; + /* Gradient end */ + /* Text Colors */ - --expert-text-primary: #212529; /* Primary text */ - --expert-text-secondary: #6C757D; /* Secondary text */ - --expert-text-light: #FFFFFF; /* Light text (on dark backgrounds) */ - + --expert-text-primary: #212529; + /* Primary text */ + --expert-text-secondary: #6C757D; + /* Secondary text */ + --expert-text-light: #FFFFFF; + /* Light text (on dark backgrounds) */ + /* Border Colors */ - --expert-border-color: #DEE2E6; /* Default border */ - --expert-border-light: #E9ECEF; /* Light border */ - + --expert-border-color: #DEE2E6; + /* Default border */ + --expert-border-light: #E9ECEF; + /* Light border */ + /* Status Colors */ - --expert-success: #28A745; /* Success/Active state */ - --expert-warning: #FFC107; /* Warning state */ - --expert-danger: #DC3545; /* Danger/Error state */ - --expert-info: #17A2B8; /* Info state */ + --expert-success: #28A745; + /* Success/Active state */ + --expert-warning: #FFC107; + /* Warning state */ + --expert-danger: #DC3545; + /* Danger/Error state */ + --expert-info: #17A2B8; + /* Info state */ + + /* Home Banner Background */ + --expert-home-banner-bg: #875A7B; + /* Home banner background color */ + --expert-home-banner-text: #FFFFFF; + /* Home banner text color */ + + /* Font Families */ + --expert-en-font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + --expert-ar-font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } /* Apply gradient to the entire page background */ @@ -50,6 +86,11 @@ body { // min-height: 100vh !important; // margin: 0 !important; // padding: 0 !important; + font-family: var(--expert-en-font-family, 'Helvetica Neue', Helvetica, Arial, sans-serif) !important; + + &.o_rtl{ + font-family: var(--expert-ar-font-family, 'Helvetica Neue', Helvetica, Arial, sans-serif) !important; + } } /* Ensure the gradient shows on the main content area */ @@ -65,6 +106,20 @@ body { .o_web_client { background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%) !important; background: linear-gradient(135deg, var(--expert-bg-gradient-start, #f5f7fa) 0%, var(--expert-bg-gradient-end, #c3cfe2) 100%) !important; + + &.o_home_menu_background { + background: var(--expert-home-banner-bg) !important; + // color: var(--expert-home-banner-text) !important; + + .o_action_manager { + background: transparent !important; + } + + .o_main_navbar{ + background-color: transparent !important; + border-bottom: none !important; + } + } } .expert-home-container { @@ -89,12 +144,12 @@ body { font-weight: 500; cursor: pointer; transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(0,0,0,0.1); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .expert-theme-btn:hover { transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(0,0,0,0.15); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); background: linear-gradient(135deg, var(--expert-primary-hover) 0%, var(--expert-primary-color) 100%); } @@ -105,7 +160,7 @@ body { background: linear-gradient(135deg, var(--expert-primary-color) 0%, var(--expert-primary-hover) 100%); color: var(--expert-text-light); border-radius: 10px; - box-shadow: 0 4px 15px rgba(0,0,0,0.1); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .expert-home-header h1 { @@ -132,7 +187,7 @@ body { border-radius: 10px; padding: 20px; text-align: center; - box-shadow: 0 2px 10px rgba(0,0,0,0.1); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; cursor: pointer; border: 1px solid var(--expert-border-light); @@ -140,7 +195,7 @@ body { .expert-module-card:hover { transform: translateY(-5px); - box-shadow: 0 8px 25px rgba(0,0,0,0.15); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); border-color: var(--expert-primary-color); } @@ -185,7 +240,9 @@ body { } @keyframes spinner-border { - to { transform: rotate(360deg); } + to { + transform: rotate(360deg); + } } .expert-error, @@ -216,14 +273,14 @@ body { /* Override Odoo's default colors */ .o_main_navbar { background-color: var(--expert-bg-primary) !important; - border-bottom: 1px solid var(--expert-border-color) !important; + // border-bottom: 1px solid var(--expert-border-color) !important; } -.o_main_navbar .o_menu_item > a { +.o_main_navbar .o_menu_item>a { color: var(--expert-text-light) !important; } -.o_main_navbar .o_menu_item > a:hover { +.o_main_navbar .o_menu_item>a:hover { background-color: var(--expert-primary-hover) !important; color: var(--expert-text-light) !important; } @@ -266,11 +323,11 @@ body { background-color: var(--expert-bg-secondary) !important; } -.o_main_navbar .o_menu_sections .o_menu_item > a { +.o_main_navbar .o_menu_sections .o_menu_item>a { color: var(--expert-text-primary) !important; } -.o_main_navbar .o_menu_sections .o_menu_item > a:hover { +.o_main_navbar .o_menu_sections .o_menu_item>a:hover { background-color: var(--expert-primary-light) !important; color: var(--expert-text-light) !important; } @@ -297,18 +354,26 @@ body { color: var(--expert-info) !important; } +.o_main_navbar { + .o_menu_sections { + .dropdown-toggle ,.o_nav_entry{ + background: transparent; + } + } +} + /* Responsive design */ @media (max-width: 768px) { .expert-modules-grid { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 15px; } - + .expert-home-header h1 { font-size: 2rem; } - + .expert-home-container { padding: 15px; } -} +} \ No newline at end of file diff --git a/odex30_base/expert_theme/static/src/scss/intro_loader.scss b/odex30_base/expert_theme/static/src/scss/intro_loader.scss new file mode 100644 index 0000000..f416be7 --- /dev/null +++ b/odex30_base/expert_theme/static/src/scss/intro_loader.scss @@ -0,0 +1,56 @@ +.o_intro_loader { + position: fixed; + top: 0; left: 0; width: 100vw; height: 100vh; + background-color: #ffffff; + z-index: 99999; + display: flex; + align-items: center; + justify-content: center; + transition: opacity 0.8s ease-out, visibility 0.8s; + + .o_loader_content { + display: flex; + flex-direction: column; + align-items: center; + } + + .o_loader_logo { + max-width: 150px; + height: auto; + } + + /* --- Animations --- */ + .anim-pulse { animation: loader-pulse 2s infinite; } + .anim-spin { animation: loader-spin 2s linear infinite; } + .anim-bounce { animation: loader-bounce 2s infinite; } + .anim-none { /* No animation */ } + + .o_loader_spinner { + width: 50px; height: 50px; + border: 5px solid #f3f3f3; + border-top: 5px solid #714B67; + border-radius: 50%; + animation: loader-spin 1s linear infinite; + } + + &.o_hidden { + opacity: 0; + visibility: hidden; + pointer-events: none; + } +} + +@keyframes loader-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} +@keyframes loader-pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.05); } + 100% { transform: scale(1); } +} +@keyframes loader-bounce { + 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} + 40% {transform: translateY(-20px);} + 60% {transform: translateY(-10px);} +} \ No newline at end of file diff --git a/odex30_base/expert_theme/views/expert_menu_views.xml b/odex30_base/expert_theme/views/expert_menu_views.xml index c4158ff..8aef122 100644 --- a/odex30_base/expert_theme/views/expert_menu_views.xml +++ b/odex30_base/expert_theme/views/expert_menu_views.xml @@ -14,13 +14,13 @@ sequence="1" /> --> diff --git a/odex30_base/expert_theme/views/expert_theme_config_views.xml b/odex30_base/expert_theme/views/expert_theme_config_views.xml index b4719f3..e15033f 100644 --- a/odex30_base/expert_theme/views/expert_theme_config_views.xml +++ b/odex30_base/expert_theme/views/expert_theme_config_views.xml @@ -68,6 +68,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/odex30_base/expert_theme/views/res_config_settings_views.xml b/odex30_base/expert_theme/views/res_config_settings_views.xml new file mode 100644 index 0000000..b7c294d --- /dev/null +++ b/odex30_base/expert_theme/views/res_config_settings_views.xml @@ -0,0 +1,34 @@ + + + + res.config.settings.view.form.inherit.intro.loader + res.config.settings + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/odex30_base/expert_theme/views/web_layout.xml b/odex30_base/expert_theme/views/web_layout.xml new file mode 100644 index 0000000..3f26ec8 --- /dev/null +++ b/odex30_base/expert_theme/views/web_layout.xml @@ -0,0 +1,30 @@ + + + + \ No newline at end of file diff --git a/odex30_base/odex30_web/i18n/ar_001.po b/odex30_base/odex30_web/i18n/ar_001.po deleted file mode 100644 index 805626c..0000000 --- a/odex30_base/odex30_web/i18n/ar_001.po +++ /dev/null @@ -1,457 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * odex30_web -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 18.0+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-01-01 22:17+0000\n" -"PO-Revision-Date: 2026-01-01 22:17+0000\n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "%s days" -msgstr "%s أيام" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 -msgid "(Enterprise Edition)" -msgstr "(النسخة الشركاتية)" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "1 month" -msgstr "شهر واحد" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/views/list/list_renderer_desktop.xml:0 -msgid "Add Custom Field" -msgstr "إضافة حقل مخصص" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/views/kanban/kanban_header_patch.js:0 -msgid "Automations" -msgstr "الأتمتة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Build new apps from scratch" -msgstr "بناء تطبيقات جديدة من الصفر" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Build new reports" -msgstr "بناء تقارير جديدة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/share_url/burger_menu.xml:0 -msgid "Close menu" -msgstr "إغلاق القائمة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "" -"Contact your sales representative to help you to unlink your previous " -"database" -msgstr "" -"تواصل مع مندوب المبيعات لمساعدتك في فصل قاعدة البيانات السابقة" -"" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Create automation rules" -msgstr "إنشاء قواعد الأتمتة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Customize Reports" -msgstr "تخصيص التقارير" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Customize any screen" -msgstr "تخصيص أي شاشة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/color_scheme/color_scheme_menu_items.js:0 -msgid "Dark Mode" -msgstr "الوضع الداكن" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 -msgid "Database expiration:" -msgstr "انتهاء صلاحية قاعدة البيانات:" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Define webhooks" -msgstr "تعريف Webhooks" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Discard" -msgstr "إلغاء" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Dismiss" -msgstr "إغلاق" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Error reason:" -msgstr "سبب الخطأ:" - -#. module: odex30_web -#: model:ir.model,name:odex30_web.model_ir_http -msgid "HTTP Routing" -msgstr "مسار HTTP" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu_service.js:0 -msgid "Home" -msgstr "الرئيسية" - -#. module: odex30_web -#: model:ir.model.fields,field_description:odex30_web.field_res_users_settings__homemenu_config -msgid "Home Menu Configuration" -msgstr "إعدادات قائمة الرئيسية" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/navbar/navbar.js:0 -msgid "Home menu" -msgstr "قائمة الرئيسية" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "I paid, please recheck!" -msgstr "لقد دفعت، يرجى إعادة التحقق!" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Install Odoo Studio and its dependencies" -msgstr "تثبيت Odoo Studio وتبعياته" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Learn More" -msgstr "تعرف على المزيد" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Log in as an administrator to correct the issue." -msgstr "سجل الدخول كمدير لإصلاح المشكلة." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu.xml:0 -msgid "No result" -msgstr "لا توجد نتائج" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 -msgid "Odoo" -msgstr "أودو" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/settings_form_view/res_config_edition.xml:0 -msgid "Odoo Enterprise Edition License V1.0" -msgstr "رخصة Odoo Enterprise Edition V1.0" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/views/list/list_renderer_desktop.js:0 -msgid "Odoo Studio - Add new fields to any view" -msgstr "Odoo Studio - إضافة حقول جديدة إلى أي عرض" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/views/kanban/kanban_header_patch.js:0 -msgid "Odoo Studio - Customize workflows in minutes" -msgstr "Odoo Studio - تخصيص سير العمل في دقائق" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Odoo Support" -msgstr "دعم أودو" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Paste code here" -msgstr "الصق الكود هنا" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/navbar/navbar.js:0 -msgid "Previous view" -msgstr "العرض السابق" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "Register" -msgstr "تسجيل" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Register your subscription" -msgstr "تسجيل اشتراكك" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Renew now" -msgstr "تجديد الآن" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "Retry" -msgstr "إعادة المحاولة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Send an email" -msgstr "إرسال بريد إلكتروني" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Sending the instructions by email ..." -msgstr "إرسال التعليمات بالبريد الإلكتروني..." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/share_url/share_url.js:0 -msgid "Share" -msgstr "مشاركة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/share_url/burger_menu.xml:0 -msgid "Share URL" -msgstr "مشاركة الرابط" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "" -"Something went wrong while registering your database. You can try again or " -"contact" -msgstr "" -"حدث خطأ أثناء تسجيل قاعدة البيانات. يمكنك المحاولة مرة أخرى أو التواصل" -" مع" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Start using Odoo Studio" -msgstr "ابدأ استخدام Odoo Studio" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Subscription Code:" -msgstr "كود الاشتراك:" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu.xml:0 -msgid "TIP" -msgstr "نصيحة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "" -"Thank you, your registration was successful! Your database is valid until" -msgstr "" -"شكراً، تم تسجيلك بنجاح! قاعدة بياناتك صالحة حتى" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/enterprise_subscription_service.js:0 -msgid "" -"Thank you, your registration was successful! Your database is valid until " -"%s." -msgstr "" -"شكراً، تم تسجيلك بنجاح! قاعدة بياناتك صالحة حتى %s." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "" -"The instructions to unlink your subscription from the previous database(s) " -"have been sent" -msgstr "" -"تم إرسال التعليمات لفصل اشتراكك من قواعد البيانات السابقة" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "This database has expired. " -msgstr "انتهت صلاحية هذه قاعدة البيانات. " - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "This database will expire in %s. " -msgstr "ستنتهي صلاحية قاعدة البيانات هذه في %s. " - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "This demo database will expire in %s. " -msgstr "ستنتهي صلاحية قاعدة بيانات العرض التجريبي في %s. " - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Unable to send the instructions by email, please contact the" -msgstr "تعذر إرسال التعليمات بالبريد الإلكتروني، يرجى التواصل مع" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Unleash the power of Odoo Studio:" -msgstr "استخدم قوة Odoo Studio:" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Upgrade your subscription" -msgstr "ترقية اشتراكك" - -#. module: odex30_web -#: model:ir.model,name:odex30_web.model_res_users_settings -msgid "User Settings" -msgstr "إعدادات المستخدم" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "Want to tailor-make your Odoo?" -msgstr "هل تريد تخصيص أودو حسب احتياجاتك؟" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "" -"You have more users or more apps installed than your subscription allows." -msgstr "" -"لديك مستخدمون أو تطبيقات مثبتة أكثر مما يسمح به اشتراكك." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "" -"You will be able to register your database once you have installed your " -"first app." -msgstr "" -"يمكنك تسجيل قاعدة البيانات بعد تثبيت أول تطبيق." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Your subscription code" -msgstr "كود اشتراكك" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "" -"Your subscription expired %s days ago. This database will be blocked soon. " -msgstr "" -"انتهى اشتراكك منذ %s أيام. سيتم حظر قاعدة البيانات قريباً. " - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.js:0 -msgid "Your subscription expires in %s days. " -msgstr "ينتهي اشتراكك بعد %s أيام. " - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Your subscription is already linked to a database." -msgstr "اشتراكك مرتبط بقاعدة بيانات بالفعل." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "Your subscription was updated and is valid until" -msgstr "تم تحديث اشتراكك وهو صالح حتى" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/promote_studio_dialog/promote_studio_dialog.xml:0 -msgid "and more!" -msgstr "وأكثر!" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "buy a subscription" -msgstr "شراء اشتراك" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "buy a subscription." -msgstr "شراء اشتراك." - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "or" -msgstr "أو" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/expiration_panel.xml:0 -msgid "to the subscription owner to confirm the change, enter a new code or" -msgstr "" -"لصاحب الاشتراك لتأكيد التغيير، أدخل كود جديد أو" - -#. module: odex30_web -#. odoo-javascript -#: code:addons/odex30_web/static/src/webclient/home_menu/home_menu.xml:0 -msgid "— open me anywhere with" -msgstr "" diff --git a/odex30_base/odex30_web/static/description/icon.png b/odex30_base/odex30_web/static/description/icon.png new file mode 100644 index 0000000..d3b8d45 Binary files /dev/null and b/odex30_base/odex30_web/static/description/icon.png differ diff --git a/odex30_base/odex30_web/static/img/background-dark.jpg b/odex30_base/odex30_web/static/img/background-dark.jpg deleted file mode 100644 index ce69f95..0000000 Binary files a/odex30_base/odex30_web/static/img/background-dark.jpg and /dev/null differ diff --git a/odex30_base/odex30_web/static/img/background-dark.png b/odex30_base/odex30_web/static/img/background-dark.png new file mode 100644 index 0000000..ac94fc4 Binary files /dev/null and b/odex30_base/odex30_web/static/img/background-dark.png differ diff --git a/odex30_base/odex30_web/static/img/background-light.png b/odex30_base/odex30_web/static/img/background-light.png new file mode 100644 index 0000000..63ffa6c Binary files /dev/null and b/odex30_base/odex30_web/static/img/background-light.png differ diff --git a/odex30_base/odex30_web/static/img/background-light.svg b/odex30_base/odex30_web/static/img/background-light.svg deleted file mode 100644 index aa437a1..0000000 --- a/odex30_base/odex30_web/static/img/background-light.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss b/odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss deleted file mode 100644 index 5bf10d1..0000000 --- a/odex30_base/odex30_web/static/src/core/search/search_panel/search_panel.dark.scss +++ /dev/null @@ -1,9 +0,0 @@ -// = Search Panel -// ============================================================================ -// No CSS hacks, variables overrides only - -.o_search_panel_section { - .o_popover > & .list-group { - --#{$prefix}list-group-active-bg: #{$o-gray-400}; - } -} diff --git a/odex30_base/odex30_web/static/src/webclient/home_menu/enterprise_subscription_service.js b/odex30_base/odex30_web/static/src/webclient/home_menu/enterprise_subscription_service.js deleted file mode 100644 index e3c65c1..0000000 --- a/odex30_base/odex30_web/static/src/webclient/home_menu/enterprise_subscription_service.js +++ /dev/null @@ -1,195 +0,0 @@ -/** @odoo-module **/ - -import { registry } from "@web/core/registry"; -import { session } from "@web/session"; -import { browser } from "@web/core/browser/browser"; -import { deserializeDateTime, serializeDate, formatDate } from "@web/core/l10n/dates"; -import { useService } from "@web/core/utils/hooks"; -import { _t } from "@web/core/l10n/translation"; -import { ExpirationPanel } from "./expiration_panel"; -import { cookie } from "@web/core/browser/cookie"; -import { rpc } from "@web/core/network/rpc"; - -const { DateTime } = luxon; -import { Component, xml, useState } from "@odoo/owl"; - -function daysUntil(datetime) { - const duration = datetime.diff(DateTime.utc(), "days"); - return Math.round(duration.values.days); -} - -export class SubscriptionManager { - constructor(env, { orm, notification }) { - this.env = env; - this.orm = orm; - this.notification = notification; - if (session.expiration_date) { - this.expirationDate = deserializeDateTime(session.expiration_date); - } else { - // If no date found, assume 1 month and hope for the best - this.expirationDate = DateTime.utc().plus({ days: 30 }); - } - this.expirationReason = session.expiration_reason; - // Hack: we need to know if there is at least one app installed (except from App and - // Settings). We use mail to do that, as it is a dependency of almost every addon. To - // determine whether mail is installed or not, we check for the presence of the key - // "storeData" in session_info, as it is added in mail. - this.hasInstalledApps = "storeData" in session; - // "user" or "admin" - this.warningType = session.warning; - this.lastRequestStatus = null; - this.isWarningHidden = cookie.get("oe_instance_hide_panel"); - } - - get formattedExpirationDate() { - return formatDate(this.expirationDate, { format: "DDD" }); - } - - get daysLeft() { - return daysUntil(this.expirationDate); - } - - get unregistered() { - return ["trial", "demo", false].includes(this.expirationReason); - } - - hideWarning() { - // Hide warning for 24 hours. - cookie.set("oe_instance_hide_panel", true, 24 * 60 * 60); - this.isWarningHidden = true; - } - - async buy() { - const limitDate = serializeDate(DateTime.utc().minus({ days: 15 })); - const args = [ - [ - ["share", "=", false], - ["login_date", ">=", limitDate], - ], - ]; - const nbUsers = await this.orm.call("res.users", "search_count", args); - browser.location = `https://www.odoo.com/odoo-enterprise/upgrade?num_users=${nbUsers}`; - } - - async submitCode(OdexCode) { - const [oldDate, ] = await Promise.all([ - this.orm.call("ir.config_parameter", "get_param", ["database.expiration_date"]), - this.orm.call("ir.config_parameter", "set_param", [ - "database.enterprise_code", - OdexCode, - ]) - ]); - - await this.orm.call("publisher_warranty.contract", "update_notification", [[]]); - - const [linkedSubscriptionUrl, linkedEmail, expirationDate] = await Promise.all([ - this.orm.call("ir.config_parameter", "get_param", [ - "database.already_linked_subscription_url", - ]), - this.orm.call("ir.config_parameter", "get_param", ["database.already_linked_email"]), - this.orm.call("ir.config_parameter", "get_param", [ - "database.expiration_date", - ]) - ]); - - if (linkedSubscriptionUrl) { - this.lastRequestStatus = "link"; - this.linkedSubscriptionUrl = linkedSubscriptionUrl; - this.mailDeliveryStatus = null; - this.linkedEmail = linkedEmail; - } else if (expirationDate !== oldDate) { - this.lastRequestStatus = "success"; - this.expirationDate = deserializeDateTime(expirationDate); - if (this.daysLeft > 30) { - this.notification.add( - _t( - "Thank you, your registration was successful! Your database is valid until %s.", - this.formattedExpirationDate - ), - { type: "success" } - ); - } - } else { - this.lastRequestStatus = "error"; - } - } - - async checkStatus() { - await this.orm.call("publisher_warranty.contract", "update_notification", [[]]); - - const expirationDateStr = await this.orm.call("ir.config_parameter", "get_param", [ - "database.expiration_date", - ]); - this.lastRequestStatus = "update"; - this.expirationDate = deserializeDateTime(expirationDateStr); - } - - async sendUnlinkEmail() { - const sendUnlinkInstructionsUrl = await this.orm.call("ir.config_parameter", "get_param", [ - "database.already_linked_send_mail_url", - ]); - this.mailDeliveryStatus = "ongoing"; - const { result, reason } = await rpc(sendUnlinkInstructionsUrl); - if (result) { - this.mailDeliveryStatus = "success"; - } else { - this.mailDeliveryStatus = "fail"; - this.mailDeliveryStatusError = reason; - } - } - - async renew() { - const OdexCode = await this.orm.call("ir.config_parameter", "get_param", [ - "database.enterprise_code", - ]); - - const url = "https://www.odoo.com/odoo-enterprise/renew"; - const contractQueryString = OdexCode ? `?contract=${OdexCode}` : ""; - browser.location = `${url}${contractQueryString}`; - } - - async upsell() { - const limitDate = serializeDate(DateTime.utc().minus({ days: 15 })); - const [OdexCode, nbUsers] = await Promise.all([ - this.orm.call("ir.config_parameter", "get_param", ["database.enterprise_code"]), - this.orm.call("res.users", "search_count", [ - [ - ["share", "=", false], - ["login_date", ">=", limitDate], - ], - ]), - ]); - const url = "https://www.odoo.com/odoo-enterprise/upsell"; - const contractQueryString = OdexCode ? `&contract=${OdexCode}` : ""; - browser.location = `${url}?num_users=${nbUsers}${contractQueryString}`; - } -} - -class ExpiredSubscriptionBlockUI extends Component { - static props = {}; - // TODO the "o_blockUI" div in there seems useless (it has 0 height and thus displays and does nothing) - static template = xml` - -
-
- -
- `; - static components = { ExpirationPanel }; - setup() { - this.subscription = useState(useService("enterprise_subscription")); - } -} - -export const enterpriseSubscriptionService = { - name: "enterprise_subscription", - dependencies: ["orm", "notification"], - start(env, { orm, notification }) { - registry - .category("main_components") - .add("expired_subscription_block_ui", { Component: ExpiredSubscriptionBlockUI }); - return new SubscriptionManager(env, { orm, notification }); - }, -}; - -registry.category("services").add("enterprise_subscription", enterpriseSubscriptionService); diff --git a/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.js b/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.js deleted file mode 100644 index 57d48a2..0000000 --- a/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.js +++ /dev/null @@ -1,97 +0,0 @@ -/** @odoo-module **/ - -import { useService } from "@web/core/utils/hooks"; -import { Transition } from "@web/core/transition"; -import { _t } from "@web/core/l10n/translation"; -import { Component, useState, useRef } from "@odoo/owl"; - -const { DateTime } = luxon; - -/** - * Expiration panel - * - * Component representing the banner located on top of the home menu. Its purpose - * is to display the expiration state of the current database and to help the - * user to buy/renew its subscription. - * @extends Component - */ -export class ExpirationPanel extends Component { - static template = "DatabaseExpirationPanel"; - static props = {}; - static components = { Transition }; - - setup() { - this.subscription = useState(useService("enterprise_subscription")); - - this.state = useState({ - displayRegisterForm: false, - }); - - this.inputRef = useRef("input"); - } - - get buttonText() { - return this.subscription.lastRequestStatus === "error" ? _t("Retry") : _t("Register"); - } - - get alertType() { - if (this.subscription.lastRequestStatus === "success") { - return "success"; - } - const { daysLeft } = this.subscription; - if (daysLeft <= 6) { - return "danger"; - } else if (daysLeft <= 16) { - return "warning"; - } - return "info"; - } - - get expirationMessage() { - const { daysLeft } = this.subscription; - if (daysLeft <= 0) { - return _t("This database has expired. "); - } - const delay = daysLeft === 30 ? _t("1 month") : _t("%s days", daysLeft); - if (this.subscription.expirationReason === "demo") { - return _t("This demo database will expire in %s. ", delay); - } - - const expirationDate = this.subscription.expirationDate; - const today = DateTime.now(); - const diff = expirationDate.diff(today); - - if (this.subscription.expirationReason !== 'renewal') { - return _t("This database will expire in %s. ", delay); - } else { - if (daysLeft > 15) { - return _t( - "Your subscription expires in %s days. ", - daysLeft - 15 - ); - } else { - return _t( - "Your subscription expired %s days ago. This database will be blocked soon. ", - (diff.as("days") | 0) - ); - } - } - } - - showRegistrationForm() { - this.state.displayRegisterForm = !this.state.displayRegisterForm; - } - - async onCodeSubmit() { - const OdexCode = this.inputRef.el.value; - if (!OdexCode) { - return; - } - await this.subscription.submitCode(OdexCode); - if (this.subscription.lastRequestStatus === "success") { - this.state.displayRegisterForm = false; - } else { - this.state.buttonText = _t("Retry"); - } - } -} diff --git a/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.scss b/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.scss deleted file mode 100644 index 5d7511f..0000000 --- a/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.scss +++ /dev/null @@ -1,8 +0,0 @@ -.database_expiration_panel .oe_instance_register_form { - max-height: 0; - transition: max-height 0.4s; - - &.o-vertical-slide-enter-active { - max-height: 10rem; // fixed value is required to properly trigger transition - } -} diff --git a/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.xml b/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.xml deleted file mode 100644 index be99fd1..0000000 --- a/odex30_base/odex30_web/static/src/webclient/home_menu/expiration_panel.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - diff --git a/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.dark.scss b/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.dark.scss index 8c59efa..358d38b 100644 --- a/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.dark.scss +++ b/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.dark.scss @@ -4,5 +4,5 @@ .o_home_menu_background { --homeMenu-bg-color: #000511; - --homeMenu-bg-image: url("/odex30_web/static/img/background-dark.jpg"); + --homeMenu-bg-image: url("/odex30_web/static/img/background-dark.png"); } diff --git a/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.scss b/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.scss index e00bcb9..65a3cdd 100644 --- a/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.scss +++ b/odex30_base/odex30_web/static/src/webclient/home_menu/home_menu_background.scss @@ -4,6 +4,6 @@ size: cover; attachment: fixed; color: var(--homeMenu-bg-color, #{$o-gray-200}); - image: var(--homeMenu-bg-image, url("/odex30_web/static/img/background-light.svg")); + image: var(--homeMenu-bg-image, url("/odex30_web/static/img/background-light.png")); } } diff --git a/odex30_base/odex30_web/static/tests/helpers.js b/odex30_base/odex30_web/static/tests/helpers.js deleted file mode 100644 index c743b5e..0000000 --- a/odex30_base/odex30_web/static/tests/helpers.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @odoo-module */ - -import { createWebClient } from "@web/../tests/webclient/helpers"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -export function createOdexWebClient(params) { - params.WebClientClass = WebClientOdex; - return createWebClient(params); -} diff --git a/odex30_base/odex30_web/static/tests/mobile/burger_menu.test.js b/odex30_base/odex30_web/static/tests/mobile/burger_menu.test.js deleted file mode 100644 index e6afdb2..0000000 --- a/odex30_base/odex30_web/static/tests/mobile/burger_menu.test.js +++ /dev/null @@ -1,107 +0,0 @@ -import { beforeEach, describe, expect, test } from "@odoo/hoot"; -import { click, queryAll } from "@odoo/hoot-dom"; -import { animationFrame, runAllTimers } from "@odoo/hoot-mock"; -import { defineActions, defineMenus, mountWithCleanup } from "@web/../tests/web_test_helpers"; - -import { Component, onMounted, xml } from "@odoo/owl"; - -import { registry } from "@web/core/registry"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -const actionRegistry = registry.category("actions"); - -const queryAllRoot = (selector) => queryAll(selector, { root: document.body }); - -class TestClientAction extends Component { - static template = xml` -
- ClientAction_ -
`; - static props = ["*"]; - setup() { - onMounted(() => this.env.config.setDisplayName(`Client action ${this.props.action.id}`)); - } -} - -describe.current.tags("mobile"); - -beforeEach(() => { - defineMenus([ - { - id: 1, - name: "App1", - appID: 1, - actionID: 1001, - xmlid: "menu_1", - }, - ]); -}); - -test("Burger Menu on home menu", async () => { - expect.assertions(5); - - await mountWithCleanup(WebClientOdex); - await animationFrame(); - expect(queryAllRoot(".o_burger_menu")).toHaveCount(0); - expect(queryAllRoot(".o_home_menu")).toBeVisible(); - - await click(queryAllRoot(".o_mobile_menu_toggle")); - await runAllTimers(); - await animationFrame(); - expect(queryAllRoot(".o_burger_menu")).toHaveCount(1); - expect(queryAllRoot(".o_user_menu_mobile")).toHaveCount(1); - await click(queryAllRoot(".o_sidebar_close")); - await animationFrame(); - expect(".o_burger_menu").toHaveCount(0); -}); - -test("Burger Menu on home menu over an App", async () => { - expect.assertions(5); - - actionRegistry.add("__test__client__action__", TestClientAction); - - defineMenus([ - { - id: 1, - children: [ - { - id: 99, - name: "SubMenu", - appID: 1, - actionID: 1002, - webIconData: undefined, - webIcon: false, - }, - ], - }, - ]); - - defineActions([ - { - id: 1001, - tag: "__test__client__action__", - target: "main", - type: "ir.actions.client", - params: { description: "Id 1" }, - }, - ]); - - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - await click(queryAllRoot(".o_draggable:first-of-type .o_app")); - await animationFrame(); - await click(queryAllRoot(".o_menu_toggle")); - await animationFrame(); - await click(queryAllRoot(".o_sidebar_topbar a.btn-primary")); - await animationFrame(); - - expect(queryAllRoot(".o_burger_menu")).toHaveCount(0); - expect(queryAllRoot(".o_home_menu")).toBeVisible(); - - await click(queryAllRoot(".o_mobile_menu_toggle")); - await animationFrame(); - expect(queryAllRoot(".o_burger_menu")).toHaveCount(1); - expect(queryAllRoot(".o_burger_menu nav.o_burger_menu_content li")).toHaveCount(0); - expect(queryAllRoot(".o_burger_menu_content")).not.toHaveClass("o_burger_menu_dark"); -}); diff --git a/odex30_base/odex30_web/static/tests/mobile/pivot_view.test.js b/odex30_base/odex30_web/static/tests/mobile/pivot_view.test.js deleted file mode 100644 index 67b23d9..0000000 --- a/odex30_base/odex30_web/static/tests/mobile/pivot_view.test.js +++ /dev/null @@ -1,72 +0,0 @@ -import { describe, expect, test } from "@odoo/hoot"; -import { click } from "@odoo/hoot-dom"; -import { animationFrame } from "@odoo/hoot-mock"; -import { defineModels, fields, models, mountView } from "@web/../tests/web_test_helpers"; - -class Partner extends models.Model { - foo = fields.Integer({ aggregator: "sum" }); - - _records = [ - { - id: 1, - foo: 12, - }, - { - id: 2, - foo: 1, - }, - { - id: 3, - foo: 17, - }, - { - id: 4, - foo: 2, - }, - ]; -} - -defineModels([Partner]); - -describe.current.tags("mobile"); - -test("simple pivot rendering", async () => { - expect.assertions(2); - - await mountView({ - type: "pivot", - resModel: "partner", - arch: /* xml */ ` - - - - `, - }); - - expect(".o_pivot_view").toHaveClass("o_view_controller"); - expect("td.o_pivot_cell_value:contains(32)").toHaveCount(1, { - message: "should contain a pivot cell with the sum of all records", - }); -}); - -test("unselecting all measures should not crash pivot rendering", async () => { - expect.assertions(1); - - await mountView({ - type: "pivot", - resModel: "partner", - arch: /* xml */ ` - - - - `, - }); - - await click(".dropdown-toggle.btn.btn-primary:eq(1)"); - await animationFrame(); - await click(".dropdown-item.o_menu_item.selected:eq(0)"); - await animationFrame(); - expect("div.o_nocontent_help").toHaveCount(1, { - message: "Instead of error action helper will appear", - }); -}); diff --git a/odex30_base/odex30_web/static/tests/mobile/webclient_mobile.test.js b/odex30_base/odex30_web/static/tests/mobile/webclient_mobile.test.js deleted file mode 100644 index 952d9c0..0000000 --- a/odex30_base/odex30_web/static/tests/mobile/webclient_mobile.test.js +++ /dev/null @@ -1,112 +0,0 @@ -import { describe, expect, test } from "@odoo/hoot"; -import { click, queryFirst } from "@odoo/hoot-dom"; -import { animationFrame, mockMatchMedia } from "@odoo/hoot-mock"; -import { - defineActions, - defineModels, - fields, - getService, - models, - mountWithCleanup, -} from "@web/../tests/web_test_helpers"; - -import { UserMenu } from "@web/webclient/user_menu/user_menu"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -class Partner extends models.Model { - name = fields.Char(); - - _records = [ - { id: 1, name: "First record" }, - { id: 2, name: "Second record" }, - ]; - _views = { - form: ` -
- - - -
- `, - kanban: ` - - - - - - - - `, - list: ``, - }; -} - -defineModels([Partner]); - -defineActions([ - { - id: 1, - xml_id: "action_1", - name: "Partners Action 1", - res_model: "partner", - views: [[false, "kanban"]], - }, - { - id: 3, - xml_id: "action_3", - name: "Partners", - res_model: "partner", - views: [ - [false, "list"], - [false, "kanban"], - [false, "form"], - ], - }, -]); - -describe.current.tags("mobile"); - -test("scroll position is kept", async () => { - // This test relies on the fact that the scrollable element in mobile - // is view's root node. - const firstRecord = Partner._records[0]; - delete firstRecord.id; - Partner._records = [...Array(80)].map((_, i) => ({ - ...firstRecord, - name: `Record ${i + 1}`, - })); - - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - // partners in list/kanban - await getService("action").doAction(3); - expect(".o_kanban_view").toHaveCount(1); - - queryFirst(".o_kanban_view").scrollTo(0, 123); - await click(".o_kanban_record:eq(20)"); - await animationFrame(); - expect(".o_form_view").toHaveCount(1); - expect(".o_kanban_view").toHaveCount(0); - - await click(".o_breadcrumb .o_back_button"); - await animationFrame(); - expect(".o_form_view").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(1); -}); - -test("Share URL item is not present in the user menu when screen is small", async () => { - mockMatchMedia({ ["display-mode"]: "standalone" }); - - await mountWithCleanup(UserMenu); - - expect(".o_user_menu").toHaveCount(1); - queryFirst(".o_user_menu").classList.remove("d-none"); - - await click(".o_user_menu button"); - await animationFrame(); - - expect(".o_user_menu .dropdown-item").toHaveCount(0, { - message: "share button is not visible", - }); -}); diff --git a/odex30_base/odex30_web/static/tests/tours/web_enterprise_tours.js b/odex30_base/odex30_web/static/tests/tours/web_enterprise_tours.js deleted file mode 100644 index 35f1bc8..0000000 --- a/odex30_base/odex30_web/static/tests/tours/web_enterprise_tours.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @odoo-module */ -import { registry } from "@web/core/registry"; - -registry.category("web_tour.tours").add("odex30_web.test_studio_list_upsell", { - steps: () => [ - { - trigger: ".o_list_view", - }, - { - trigger: ".o_optional_columns_dropdown > button", - run: "click", - }, - { - trigger: " .o-dropdown--menu .dropdown-item-studio", - }, - ], -}); diff --git a/odex30_base/odex30_web/static/tests/views/list.test.js b/odex30_base/odex30_web/static/tests/views/list.test.js deleted file mode 100644 index e282075..0000000 --- a/odex30_base/odex30_web/static/tests/views/list.test.js +++ /dev/null @@ -1,348 +0,0 @@ -import { beforeEach, describe, expect, test } from "@odoo/hoot"; -import { click, queryAll } from "@odoo/hoot-dom"; -import { animationFrame } from "@odoo/hoot-mock"; -import { - contains, - defineModels, - fields, - getDropdownMenu, - getService, - models, - mountView, - mountWithCleanup, - onRpc, - patchWithCleanup, -} from "@web/../tests/web_test_helpers"; - -import { browser } from "@web/core/browser/browser"; -import { user } from "@web/core/user"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -class Foo extends models.Model { - foo = fields.Char(); - bar = fields.Boolean(); - - _records = [ - { id: 1, bar: true, foo: "yop" }, - { id: 2, bar: true, foo: "blip" }, - { id: 3, bar: true, foo: "gnap" }, - { id: 4, bar: false, foo: "blip" }, - ]; -} - -defineModels([Foo]); - -const getDefaultConfig = () => ({ - actionId: 1, - actionType: "ir.actions.act_window", -}); - -describe.current.tags("desktop"); - -beforeEach(() => { - onRpc("has_group", () => true); -}); - -test("add custom field button with other optional columns - studio not installed", async () => { - expect.assertions(8); - - onRpc("search_read", ({ model }) => { - if (model === "ir.module.module") { - expect.step("studio_module_id"); - return [{ id: 42 }]; - } - }); - onRpc("button_immediate_install", ({ model, args }) => { - if (model === "ir.module.module") { - expect(args[0]).toEqual([42], { - message: "Should be the id of studio module returned by the search read", - }); - expect.step("studio_module_install"); - return true; - } - }); - await mountView({ - type: "list", - resModel: "foo", - arch: /* xml */ ` - - - - - `, - config: getDefaultConfig(), - }); - - patchWithCleanup(browser.location, { - reload: function () { - expect.step("window_reload"); - }, - }); - - expect(".o_data_row").toHaveCount(4); - expect(".o_optional_columns_dropdown_toggle").toHaveCount(1); - - await click(".o_optional_columns_dropdown_toggle"); - await animationFrame(); - const dropdown = getDropdownMenu(".o_optional_columns_dropdown"); - - expect(queryAll(".dropdown-item", { root: dropdown })).toHaveCount(2); - expect(queryAll(".dropdown-item-studio", { root: dropdown })).toHaveCount(1); - - await click(".dropdown-item-studio"); - await animationFrame(); - expect(".modal-studio").toHaveCount(1); - - await click(".modal .o_install_studio"); - await animationFrame(); - expect(browser.localStorage.getItem("openStudioOnReload")).toBe("main"); - expect.verifySteps(["studio_module_id", "studio_module_install", "window_reload"]); -}); - -test("add custom field button without other optional columns - studio not installed", async () => { - expect.assertions(8); - - onRpc("search_read", ({ model }) => { - if (model === "ir.module.module") { - expect.step("studio_module_id"); - return [{ id: 42 }]; - } - }); - onRpc("button_immediate_install", ({ model, args }) => { - if (model === "ir.module.module") { - expect(args[0]).toEqual([42], { - message: "Should be the id of studio module returned by the search read", - }); - expect.step("studio_module_install"); - return true; - } - }); - await mountView({ - type: "list", - resModel: "foo", - config: getDefaultConfig(), - arch: /* xml */ ` - - - - - `, - }); - - patchWithCleanup(browser.location, { - reload: function () { - expect.step("window_reload"); - }, - }); - - expect(".o_data_row").toHaveCount(4); - expect(".o_optional_columns_dropdown_toggle").toHaveCount(1); - - await click(".o_optional_columns_dropdown_toggle"); - await animationFrame(); - const dropdown = getDropdownMenu(".o_optional_columns_dropdown"); - - expect(queryAll(".dropdown-item", { root: dropdown })).toHaveCount(1); - expect(queryAll(".dropdown-item-studio", { root: dropdown })).toHaveCount(1); - - await click(".dropdown-item-studio"); - await animationFrame(); - expect(".modal-studio").toHaveCount(1); - - await click(".modal .o_install_studio"); - await animationFrame(); - expect(browser.localStorage.getItem("openStudioOnReload")).toBe("main"); - expect.verifySteps(["studio_module_id", "studio_module_install", "window_reload"]); -}); - -test("add custom field button not shown to non-system users (with opt. col.)", async () => { - expect.assertions(3); - - patchWithCleanup(user, { isSystem: false }); - - await mountView({ - type: "list", - resModel: "foo", - config: getDefaultConfig(), - arch: /* xml */ ` - - - - - `, - }); - - expect(".o_optional_columns_dropdown_toggle").toHaveCount(1); - - await click(".o_optional_columns_dropdown_toggle"); - await animationFrame(); - const dropdown = getDropdownMenu(".o_optional_columns_dropdown"); - expect(queryAll(".dropdown-item", { root: dropdown })).toHaveCount(1); - expect(queryAll(".dropdown-item-studio", { root: dropdown })).toHaveCount(0); -}); - -test("add custom field button not shown to non-system users (wo opt. col.)", async () => { - patchWithCleanup(user, { isSystem: false }); - - await mountView({ - type: "list", - resModel: "foo", - config: getDefaultConfig(), - arch: /* xml */ ` - - - - - `, - }); - - expect(".o_optional_columns_dropdown_toggle").toHaveCount(0); -}); - -test("add custom field button not shown with invalid action", async () => { - expect.assertions(1); - - patchWithCleanup(user, { isSystem: false }); - - await mountView({ - type: "list", - resModel: "foo", - config: { ...getDefaultConfig(), actionId: null }, - arch: /* xml */ ` - - - - - `, - }); - - expect(".o_optional_columns_dropdown_toggle").toHaveCount(0); -}); - -test("add custom field button not shown with bank statement line model", async () => { - class AccountBankStatementLine extends models.Model { - name = fields.Char(); - _views = { - kanban: ` - - - - `, - list: ` `, - }; - } - defineModels([AccountBankStatementLine]); - - expect.assertions(3); - - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - await getService("action").doAction({ - xml_id: "test", - id: 1312, - name: "test", - res_id: 1, - res_model: "account.bank.statement.line", - type: "ir.actions.act_window", - views: [[false, "kanban"], [false, "list"]], - }); - - expect("button.o_switch_view.o_list[data-tooltip='List']").toHaveCount(1); - await contains("button.o_switch_view.o_list[data-tooltip='List']").click(); - expect(".o_list_renderer .o_list_controller button.dropdown-toggle").toHaveCount(1); - await contains(".o_list_renderer .o_list_controller button.dropdown-toggle").click(); - expect(".dropdown-item-studio").toHaveCount(0); -}); - -test("x2many should not be editable", async () => { - class Bar extends models.Model {} - defineModels([Bar]); - Foo._fields.o2m = fields.One2many({ relation: "bar" }); - - await mountView({ - type: "form", - resModel: "foo", - arch: /* xml */ ` -
- - - - - - - - -
- - - `, - }); - expect(".o_optional_columns_dropdown_toggle").toHaveCount(0); - await click(".nav-link:eq(1)"); - await animationFrame(); - await click(".nav-link:eq(0)"); - await animationFrame(); - expect(".o_field_widget").toHaveCount(1); - expect(".o_optional_columns_dropdown_toggle").toHaveCount(0); -}); - -test("upsell studio feature is not polluted by another view", async () => { - class Partner extends models.Model { - name = fields.Char(); - - _views = { - list: ` `, - }; - } - - defineModels([Partner]); - - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - await getService("action").doAction({ - xml_id: "editable", - id: 999, - type: "ir.actions.act_window", - views: [[false, "list"]], - res_model: "partner", - }); - - await click(".o_optional_columns_dropdown_toggle"); - await animationFrame(); - expect(".dropdown-item").toHaveCount(2); - expect(".dropdown-item-studio").toHaveCount(1); - - await getService("action").doAction({ - id: 99, - xml_id: "in_dialog", - type: "ir.actions.act_window", - views: [[false, "list"]], - res_model: "partner", - target: "new", - }); - - await click(".modal .o_optional_columns_dropdown_toggle"); - await animationFrame(); - let dropdown = getDropdownMenu(".modal .o_optional_columns_dropdown"); - expect(queryAll(".dropdown-item", { root: dropdown })).toHaveCount(1); - expect(queryAll(".dropdown-item-studio", { root: dropdown })).toHaveCount(0); - await click(".modal-header .btn-close"); - await animationFrame(); - expect(".modal").toHaveCount(0); - - await click(".o_optional_columns_dropdown_toggle"); - await animationFrame(); - expect(".o-dropdown--menu").toHaveCount(0); - await click(".o_optional_columns_dropdown_toggle"); - await animationFrame(); - - dropdown = getDropdownMenu(".o_optional_columns_dropdown"); - expect(queryAll(".dropdown-item", { root: dropdown })).toHaveCount(2); - expect(queryAll(".dropdown-item-studio", { root: dropdown })).toHaveCount(1); -}); diff --git a/odex30_base/odex30_web/static/tests/webclient/action_manager_mobile.test.js b/odex30_base/odex30_web/static/tests/webclient/action_manager_mobile.test.js deleted file mode 100644 index 16f7303..0000000 --- a/odex30_base/odex30_web/static/tests/webclient/action_manager_mobile.test.js +++ /dev/null @@ -1,164 +0,0 @@ -import { describe, expect, test } from "@odoo/hoot"; -import { click } from "@odoo/hoot-dom"; -import { animationFrame } from "@odoo/hoot-mock"; -import { - defineActions, - defineModels, - getService, - fields, - models, - mountWithCleanup, - onRpc, - stepAllNetworkCalls, -} from "@web/../tests/web_test_helpers"; - -import { redirect } from "@web/core/utils/urls"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -class Partner extends models.Model { - name = fields.Char(); - - _records = [ - { id: 1, name: "First record" }, - { id: 2, name: "Second record" }, - ]; - _views = { - form: ` -
- - - -
- `, - kanban: ` - - - - - - - - `, - list: ``, - }; -} - -defineModels([Partner]); - -defineActions([ - { - id: 1, - name: "Partners Action 1", - res_model: "partner", - views: [ - [false, "list"], - [false, "kanban"], - [false, "form"], - ], - }, - { - id: 2, - name: "Partners Action 2", - res_model: "partner", - views: [ - [false, "list"], - [false, "form"], - ], - }, -]); - -describe.current.tags("mobile"); - -test("uses a mobile-friendly view by default (if possible)", async () => { - onRpc("has_group", () => true); - - await mountWithCleanup(WebClientOdex); - await animationFrame(); - // should default on a mobile-friendly view (kanban) for action 1 - await getService("action").doAction(1); - - expect(".o_list_view").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(1); - - // there is no mobile-friendly view for action 2, should use the first one (list) - await getService("action").doAction(2); - - expect(".o_list_view").toHaveCount(1); - expect(".o_kanban_view").toHaveCount(0); -}); - -test("lazy load mobile-friendly view", async () => { - stepAllNetworkCalls(); - - redirect("/odoo/action-1/new"); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".o_list_view").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(0); - expect(".o_form_view").toHaveCount(1); - - // go back to lazy loaded view - await click(".o_breadcrumb .o_back_button"); - await animationFrame(); - expect(".o_list_view").toHaveCount(0); - expect(".o_form_view").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(1); - - expect.verifySteps([ - "/web/webclient/translations", - "/web/webclient/load_menus", - "/web/action/load", - "get_views", - "onchange", // default_get/onchange to open form view - "web_search_read", // web search read when coming back to Kanban - ]); -}); - -test("lazy load mobile-friendly view; legacy url", async () => { - stepAllNetworkCalls(); - - redirect("/web#action=1&view_type=form"); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".o_list_view").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(0); - expect(".o_form_view").toHaveCount(1); - - // go back to lazy loaded view - await click(".o_breadcrumb .o_back_button"); - await animationFrame(); - expect(".o_list_view").toHaveCount(0); - expect(".o_form_view").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(1); - - expect.verifySteps([ - "/web/webclient/translations", - "/web/webclient/load_menus", - "/web/action/load", - "get_views", - "onchange", // default_get/onchange to open form view - "web_search_read", // web search read when coming back to Kanban - ]); -}); - -test("view switcher button should be displayed in dropdown on mobile screens", async () => { - // This test will spawn a kanban view (mobile friendly). - // so, the "legacy" code won't be tested here. - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - await getService("action").doAction(1); - - expect(".o_control_panel .o_cp_switch_buttons > button").toHaveCount(1); - expect(".o_control_panel .o_cp_switch_buttons .o_switch_view.o_kanban").toHaveCount(0); - expect(".o_control_panel .o_cp_switch_buttons button.o_switch_view").toHaveCount(0); - - expect(".o_control_panel .o_cp_switch_buttons > button > i").toHaveClass("oi-view-kanban"); - await click(".o_control_panel .o_cp_switch_buttons > button"); - await animationFrame(); - - expect(".dropdown-item:has(.oi-view-kanban)").toHaveClass("selected"); - expect(".dropdown-item:has(.oi-view-list)").not.toHaveClass("selected"); -}); diff --git a/odex30_base/odex30_web/static/tests/webclient/clickbot.test.js b/odex30_base/odex30_web/static/tests/webclient/clickbot.test.js deleted file mode 100644 index c95039e..0000000 --- a/odex30_base/odex30_web/static/tests/webclient/clickbot.test.js +++ /dev/null @@ -1,176 +0,0 @@ -import { beforeEach, describe, expect, test } from "@odoo/hoot"; -import { Deferred, mockDate } from "@odoo/hoot-mock"; -import { - defineActions, - defineMenus, - defineModels, - fields, - models, - mountWithCleanup, - onRpc, - patchWithCleanup, -} from "@web/../tests/web_test_helpers"; - -import { browser } from "@web/core/browser/browser"; -import { WebClient } from "@web/webclient/webclient"; -import { SUCCESS_SIGNAL } from "@web/webclient/clickbot/clickbot"; - -class Foo extends models.Model { - foo = fields.Char(); - bar = fields.Boolean(); - date = fields.Date(); - - _records = [ - { id: 1, bar: true, foo: "yop", date: "2017-01-25" }, - { id: 2, bar: true, foo: "blip" }, - { id: 3, bar: true, foo: "gnap" }, - { id: 4, bar: false, foo: "blip" }, - ]; - - _views = { - search: /* xml */ ` - - - - - `, - list: /* xml */ ` - - - - `, - kanban: /* xml */ ` - - - - - - `, - }; -} - -describe.current.tags("desktop"); - -defineModels([Foo]); - -beforeEach(() => { - defineActions([ - { - id: 1001, - name: "App1", - res_model: "foo", - views: [ - [false, "list"], - [false, "kanban"], - ], - xml_id: "app1", - }, - { - id: 1002, - name: "App2 Menu 1", - res_model: "foo", - views: [[false, "kanban"]], - xml_id: "app2_menu1", - }, - { - id: 1022, - name: "App2 Menu 2", - res_model: "foo", - views: [[false, "list"]], - xml_id: "app2_menu2", - }, - ]); - defineMenus([ - { id: 1, name: "App1", appID: 1, actionID: 1001, xmlid: "app1" }, - { - id: 2, - children: [ - { - id: 3, - name: "menu 1", - appID: 2, - actionID: 1002, - xmlid: "app2_menu1", - }, - { - id: 4, - name: "menu 2", - appID: 2, - actionID: 1022, - xmlid: "app2_menu2", - }, - ], - name: "App2", - appID: 2, - actionID: 1002, - xmlid: "app2", - }, - ]); -}); - -test("clickbot clickeverywhere test", async () => { - onRpc("has_group", () => true); - mockDate("2017-10-08T15:35:11.000"); - const clickEverywhereDef = new Deferred(); - patchWithCleanup(browser, { - console: { - log: (msg) => { - expect.step(msg); - if (msg === SUCCESS_SIGNAL) { - clickEverywhereDef.resolve(); - } - }, - error: (msg) => { - expect.step(msg); - clickEverywhereDef.resolve(); - }, - }, - }); - const webClient = await mountWithCleanup(WebClient); - patchWithCleanup(odoo, { - __WOWL_DEBUG__: { root: webClient }, - }); - window.clickEverywhere(); - await clickEverywhereDef; - expect.verifySteps([ - "Clicking on: apps menu toggle button", - "Testing app menu: app1", - "Testing menu App1 app1", - 'Clicking on: menu item "App1"', - "Testing 2 filters", - 'Clicking on: filter "Not Bar"', - 'Clicking on: filter "Date"', - 'Clicking on: filter option "October"', - "Testing view switch: kanban", - "Clicking on: kanban view switcher", - "Testing 2 filters", - 'Clicking on: filter "Not Bar"', - 'Clicking on: filter "Date"', - 'Clicking on: filter option "October"', - "Clicking on: apps menu toggle button", - "Testing app menu: app2", - "Testing menu App2 app2", - 'Clicking on: menu item "App2"', - "Testing 2 filters", - 'Clicking on: filter "Not Bar"', - 'Clicking on: filter "Date"', - 'Clicking on: filter option "October"', - "Testing menu menu 1 app2_menu1", - 'Clicking on: menu item "menu 1"', - "Testing 2 filters", - 'Clicking on: filter "Not Bar"', - 'Clicking on: filter "Date"', - 'Clicking on: filter option "October"', - "Testing menu menu 2 app2_menu2", - 'Clicking on: menu item "menu 2"', - "Testing 2 filters", - 'Clicking on: filter "Not Bar"', - 'Clicking on: filter "Date"', - 'Clicking on: filter option "October"', - "Successfully tested 2 apps", - "Successfully tested 2 menus", - "Successfully tested 0 modals", - "Successfully tested 10 filters", - SUCCESS_SIGNAL, - ]); -}); diff --git a/odex30_base/odex30_web/static/tests/webclient/expiration_panel.test.js b/odex30_base/odex30_web/static/tests/webclient/expiration_panel.test.js deleted file mode 100644 index 2a9bf4c..0000000 --- a/odex30_base/odex30_web/static/tests/webclient/expiration_panel.test.js +++ /dev/null @@ -1,615 +0,0 @@ -import { expect, test } from "@odoo/hoot"; -import { click, queryFirst, edit } from "@odoo/hoot-dom"; -import { animationFrame, mockDate, runAllTimers } from "@odoo/hoot-mock"; -import { - getService, - mockService, - mountWithCleanup, - onRpc, - patchWithCleanup, - serverState, -} from "@web/../tests/web_test_helpers"; - -import { session } from "@web/session"; -import { browser } from "@web/core/browser/browser"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -test("Expiration Panel one app installed", async () => { - mockDate("2019-10-10T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-11-09 12:00:00", - expiration_reason: "", - storeData: true, - warning: "admin", - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - await getService("action").doAction("menu"); - - expect(".oe_instance_register").toHaveText("This database will expire in 1 month."); - - expect(".database_expiration_panel").toHaveClass("alert-info"); - - // Close the expiration panel - await click(".oe_instance_hide_panel"); - await animationFrame(); - - expect(".database_expiration_panel").toHaveCount(0); -}); - -test("Expiration Panel one app installed, buy subscription", async () => { - expect.assertions(6); - - mockDate("2019-10-10T12:00:00"); - patchWithCleanup(session, { - expiration_date: "2019-10-24 12:00:00", - expiration_reason: "demo", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("res.users", "search_count", () => 7); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - await runAllTimers(); - - expect(".oe_instance_register").toHaveText( - "This demo database will expire in 14 days. Register your subscription or buy a subscription." - ); - - expect(".database_expiration_panel").toHaveClass("alert-warning", { - message: "Color should be orange", - }); - - expect(".oe_instance_register_show").toHaveCount(1, { - message: "Part 'Register your subscription'", - }); - expect(".oe_instance_buy").toHaveCount(1, { message: "Part 'buy a subscription'" }); - expect(".oe_instance_register_form").toHaveCount(0, { - message: "There should be no registration form", - }); - - // Click on 'buy subscription' - await click(".oe_instance_buy"); - await animationFrame(); - - expect(browser.location.href).toBe("https://www.odoo.com/odoo-enterprise/upgrade?num_users=7"); -}); - -test("Expiration Panel one app installed, try several times to register subscription", async () => { - expect.assertions(33); - - mockDate("2019-10-10T12:00:00"); - - let callToGetParamCount = 0; - - patchWithCleanup(session, { - expiration_date: "2019-10-15 12:00:00", - expiration_reason: "trial", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - - mockService("notification", { - add: (message, options) => { - expect.step(JSON.stringify({ message, options })); - }, - }); - onRpc("get_param", ({ args }) => { - expect.step("get_param"); - if (args[0] === "database.already_linked_subscription_url") { - return false; - } - if (args[0] === "database.already_linked_email") { - return "super_company_admin@gmail.com"; - } - expect(args[0]).toBe("database.expiration_date"); - callToGetParamCount++; - if (callToGetParamCount <= 3) { - return "2019-10-15 12:00:00"; - } else { - return "2019-11-15 12:00:00"; - } - }); - onRpc("set_param", ({ args }) => { - expect.step("set_param"); - expect(args[0]).toBe("database.enterprise_code"); - if (callToGetParamCount === 1) { - expect(args[1]).toBe("ABCDEF"); - } else { - expect(args[1]).toBe("ABC"); - } - return true; - }); - onRpc("update_notification", ({ args }) => { - expect.step("update_notification"); - expect(args[0]).toBeInstanceOf(Array); - expect(args[0]).toHaveLength(0); - return true; - }); - onRpc("res.users", "search_count", () => 7); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "This database will expire in 5 days. Register your subscription or buy a subscription." - ); - - expect(".database_expiration_panel").toHaveClass("alert-danger", { - message: "Color should be red", - }); - - expect(".oe_instance_register_show").toHaveCount(1, { - message: "Part 'Register your subscription'", - }); - expect(".oe_instance_buy").toHaveCount(1, { message: "Part 'buy a subscription'" }); - expect(".oe_instance_register_form").toHaveCount(0, { - message: "There should be no registration form", - }); - - // Click on 'buy subscription' - await click(".oe_instance_register_show"); - await animationFrame(); - - expect(".oe_instance_register_form").toHaveCount(1, { - message: "there should be a registration form", - }); - expect('.oe_instance_register_form input[placeholder="Paste code here"]').toHaveCount(1, { - message: "with an input with place holder 'Paste code here'", - }); - expect(".oe_instance_register_form button").toHaveCount(1, { - message: "and a button 'Register'", - }); - expect(".oe_instance_register_form button").toHaveText("Register"); - - await click(".oe_instance_register_form button"); - await animationFrame(); - - expect(".oe_instance_register_form").toHaveCount(1, { - message: "there should be a registration form", - }); - expect('.oe_instance_register_form input[placeholder="Paste code here"]').toHaveCount(1, { - message: "with an input with place holder 'Paste code here'", - }); - expect(".oe_instance_register_form button").toHaveCount(1, { - message: "and a button 'Register'", - }); - - await click(".oe_instance_register_form input"); - await edit("ABCDEF"); - await animationFrame(); - await click(".oe_instance_register_form button"); - await animationFrame(); - - expect(queryFirst(".oe_instance_register")).toHaveText( - "Something went wrong while registering your database. You can try again or contact Odoo Support." - ); - expect(".database_expiration_panel").toHaveClass("alert-danger", { - message: "Color should be red", - }); - expect("span.oe_instance_error").toHaveCount(1); - expect(".oe_instance_register_form").toHaveCount(1, { - message: "there should be a registration form", - }); - expect('.oe_instance_register_form input[placeholder="Paste code here"]').toHaveCount(1, { - message: "with an input with place holder 'Paste code here'", - }); - expect(".oe_instance_register_form button").toHaveCount(1, { - message: "and a button 'Register'", - }); - expect(".oe_instance_register_form button").toHaveText("Retry"); - - await click(".oe_instance_register_form input"); - await edit("ABC"); - await animationFrame(); - await click(".oe_instance_register_form button"); - await animationFrame(); - - expect(".database_expiration_panel").toHaveCount(0, { - message: "expiration panel should be gone", - }); - - expect.verifySteps([ - // second try to submit - "get_param", - "set_param", - "update_notification", - "get_param", - "get_param", - "get_param", - // third try - "get_param", - "set_param", - "update_notification", - "get_param", - "get_param", - "get_param", - `{"message":"Thank you, your registration was successful! Your database is valid until November 15, 2019.","options":{"type":"success"}}`, - ]); -}); - -test("Expiration Panel one app installed, subscription already linked", async () => { - expect.assertions(5); - - mockDate("2019-10-10T12:00:00"); - - let getExpirationDateCount = 0; - - patchWithCleanup(session, { - expiration_date: "2019-10-15 12:00:00", - expiration_reason: "trial", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("/already/linked/send/mail/url", () => ({ - result: false, - reason: "By design", - })); - onRpc("get_param", ({ args }) => { - expect.step("get_param"); - if (args[0] === "database.expiration_date") { - getExpirationDateCount++; - if (getExpirationDateCount === 1) { - return "2019-10-15 12:00:00"; - } else { - return "2019-11-17 12:00:00"; - } - } - if (args[0] === "database.already_linked_subscription_url") { - return "www.super_company.com"; - } - if (args[0] === "database.already_linked_send_mail_url") { - return "/already/linked/send/mail/url"; - } - if (args[0] === "database.already_linked_email") { - return "super_company_admin@gmail.com"; - } - }); - onRpc("set_param", () => { - expect.step("set_param"); - return true; - }); - onRpc("update_notification", () => { - expect.step("update_notification"); - return true; - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "This database will expire in 5 days. Register your subscription or buy a subscription." - ); - // Click on 'register your subscription' - await click(".oe_instance_register_show"); - await animationFrame(); - await click(".oe_instance_register_form input"); - await edit("ABC"); - await click(".oe_instance_register_form button"); - await animationFrame(); - - expect(".oe_instance_register.oe_database_already_linked").toHaveText( - `Your subscription is already linked to a database.\nSend an email to the subscription owner to confirm the change, enter a new code or buy a subscription.` - ); - - await click("a.oe_contract_send_mail"); - await animationFrame(); - expect(".database_expiration_panel").toHaveClass("alert-danger", { - message: "Color should be red", - }); - - expect(".oe_instance_register.oe_database_already_linked").toHaveText( - `Your subscription is already linked to a database.\nSend an email to the subscription owner to confirm the change, enter a new code or buy a subscription.\n\nUnable to send the instructions by email, please contact the Odoo Support\nError reason: By design` - ); - - expect.verifySteps([ - "get_param", - "set_param", - "update_notification", - "get_param", - "get_param", - "get_param", - "get_param", - ]); -}); - -test("One app installed, database expired", async () => { - expect.assertions(8); - - mockDate("2019-10-10T12:00:00"); - - let callToGetParamCount = 0; - - patchWithCleanup(session, { - expiration_date: "2019-10-08 12:00:00", - expiration_reason: "trial", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("/already/linked/send/mail/url", () => ({ - result: false, - reason: "By design", - })); - onRpc("get_param", ({ args }) => { - if (args[0] === "database.already_linked_subscription_url") { - return false; - } - callToGetParamCount++; - if (callToGetParamCount === 1) { - return "2019-10-09 12:00:00"; - } else { - return "2019-11-09 12:00:00"; - } - }); - onRpc("set_param", () => true); - onRpc("update_notification", () => true); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "This database has expired. Register your subscription or buy a subscription." - ); - expect(".o_blockUI").toHaveCount(1, { message: "UI should be blocked" }); - - expect(".database_expiration_panel").toHaveClass("alert-danger", { - message: "Color should be red", - }); - expect(".oe_instance_register_show").toHaveCount(1, { - message: "Part 'Register your subscription'", - }); - expect(".oe_instance_buy").toHaveCount(1, { message: "Part 'buy a subscription'" }); - - expect(".oe_instance_register_form").toHaveCount(0); - - // Click on 'Register your subscription' - await click(".oe_instance_register_show"); - await animationFrame(); - await click(".oe_instance_register_form input"); - await edit("ABC"); - await click(".oe_instance_register_form button"); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "Thank you, your registration was successful! Your database is valid until November 9, 2019." - ); - expect(".o_blockUI").toHaveCount(0, { message: "UI should no longer be blocked" }); -}); - -test("One app installed, renew", async () => { - expect.assertions(7); - - mockDate("2019-10-10T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-10-20 12:00:00", - expiration_reason: "renewal", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("get_param", ({ args }) => { - expect.step("get_param"); - expect(args[0]).toBe("database.enterprise_code"); - return "ABC"; - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "Your subscription expired 9 days ago. This database will be blocked soon.\n" + - "Renew now\n" + - "I paid, please recheck!" - ); - - expect(".database_expiration_panel").toHaveClass("alert-warning", { - message: "Color should be orange", - }); - expect(".oe_instance_renew").toHaveCount(1, { message: "Part 'Register your subscription'" }); - expect("a.check_enterprise_status").toHaveCount(1, { - message: "there should be a button for status checking", - }); - - expect(".oe_instance_register_form").toHaveCount(0); - - // Click on 'Renew your subscription' - await click(".oe_instance_renew"); - await animationFrame(); - - expect.verifySteps(["get_param"]); -}); - -test("One app installed, check status and get success", async () => { - expect.assertions(4); - - mockDate("2019-10-10T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-10-20 12:00:00", - expiration_reason: "renewal", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("get_param", ({ args }) => { - expect.step("get_param"); - expect(args[0]).toBe("database.expiration_date"); - return "2019-10-24 12:00:00"; - }); - onRpc("update_notification", () => { - expect.step("update_notification"); - return true; - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - // click on "I paid, please recheck!" - expect("a.check_enterprise_status").toHaveText("I paid, please recheck!"); - await click("a.check_enterprise_status"); - await animationFrame(); - - expect(".oe_instance_register.oe_subscription_updated").toHaveText( - "Your subscription was updated and is valid until October 24, 2019." - ); - - expect.verifySteps(["update_notification", "get_param"]); -}); - -// Why would we want to reload the page when we check the status and it hasn't changed? -test.skip("One app installed, check status and get page reload", async () => { - expect.assertions(4); - - mockDate("2019-10-10T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-10-20 12:00:00", - expiration_reason: "renewal", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("get_param", () => { - expect.step("get_param"); - return "2019-10-20 12:00:00"; - }); - onRpc("update_notification", () => { - expect.step("update_notification"); - return true; - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - // click on "I paid, please recheck!" - await click("a.check_enterprise_status"); - await animationFrame(); - - expect.verifySteps(["update_notification", "get_param", "reloadPage"]); -}); - -test("One app installed, upgrade database", async () => { - expect.assertions(4); - - mockDate("2019-10-10T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-10-20 12:00:00", - expiration_reason: "upsell", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("get_param", ({ args }) => { - expect.step("get_param"); - expect(args[0]).toBe("database.enterprise_code"); - return "ABC"; - }); - onRpc("search_count", () => { - expect.step("search_count"); - return 13; - }); - onRpc("update_notification", () => true); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - await runAllTimers(); - - expect(".oe_instance_register").toHaveText( - "This database will expire in 10 days. You have more users or more apps installed than your subscription allows.\n\n" + - "Upgrade your subscription\n" + - "I paid, please recheck!" - ); - - await click("a.oe_instance_upsell"); - await animationFrame(); - - expect.verifySteps(["get_param", "search_count"]); - expect(browser.location.href).toBe( - "https://www.odoo.com/odoo-enterprise/upsell?num_users=13&contract=ABC" - ); -}); - -test("One app installed, message for non admin user", async () => { - expect.assertions(2); - - mockDate("2019-10-10T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-11-08 12:00:00", - expiration_reason: "", - storeData: true, // used by subscription service to know whether mail is installed - warning: "user", - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "This database will expire in 29 days. Log in as an administrator to correct the issue." - ); - - expect(".database_expiration_panel").toHaveClass("alert-info", { - message: "Color should be grey", - }); -}); - -test("One app installed, navigation to renewal page", async () => { - expect.assertions(8); - - mockDate("2019-11-10T00:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-10-20 12:00:00", - expiration_reason: "renewal", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - onRpc("get_param", ({ args }) => { - expect.step("get_param"); - expect(args[0]).toBe("database.enterprise_code"); - return "ABC"; - }); - onRpc("update_notification", () => { - expect.step("update_notification"); - return true; - }); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - await runAllTimers(); - - expect(".oe_instance_register").toHaveText( - "This database has expired.\nRenew now\nI paid, please recheck!" - ); - - expect(".database_expiration_panel").toHaveClass("alert-danger"); - expect(".oe_instance_renew").toHaveCount(1, { message: "Part 'Register your subscription'" }); - expect("a.check_enterprise_status").toHaveCount(1, { - message: "there should be a button for status checking", - }); - - expect(".oe_instance_register_form").toHaveCount(0); - - // Click on 'Renew your subscription' - await click(".oe_instance_renew"); - await animationFrame(); - - expect(browser.location.href).toBe("https://www.odoo.com/odoo-enterprise/renew?contract=ABC"); - - expect.verifySteps(["get_param"]); -}); - -test("One app installed, different locale (arabic)", async () => { - expect.assertions(1); - - mockDate("2019-25-09T12:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-10-20 12:00:00", - expiration_reason: "renewal", - storeData: true, // used by subscription service to know whether mail is installed - warning: "admin", - }); - serverState.lang = "ar-001"; - onRpc("get_param", () => "2019-11-09 12:00:00"); - onRpc("update_notification", () => true); - await mountWithCleanup(WebClientOdex); - await animationFrame(); - - await click("a.check_enterprise_status"); - await animationFrame(); - - expect(".oe_instance_register").toHaveText( - "Your subscription was updated and is valid until ٩ نوفمبر ٢٠١٩." - ); -}); diff --git a/odex30_base/odex30_web/static/tests/webclient/home_menu.test.js b/odex30_base/odex30_web/static/tests/webclient/home_menu.test.js deleted file mode 100644 index 13020ed..0000000 --- a/odex30_base/odex30_web/static/tests/webclient/home_menu.test.js +++ /dev/null @@ -1,353 +0,0 @@ -import { describe, expect, test } from "@odoo/hoot"; -import { click, drag, keyDown, pointerDown, queryFirst } from "@odoo/hoot-dom"; -import { advanceTime, animationFrame, mockDate, mockTouch } from "@odoo/hoot-mock"; -import { - getService, - mountWithCleanup, - onRpc, - patchWithCleanup, -} from "@web/../tests/web_test_helpers"; - -import { reactive } from "@odoo/owl"; -import { session } from "@web/session"; -import { HomeMenu } from "@odex30_web/webclient/home_menu/home_menu"; -import { reorderApps } from "@web/webclient/menus/menu_helpers"; - -async function walkOn(path) { - for (const step of path) { - await keyDown(`${step.shiftKey ? "shift+" : ""}${step.key}`); - await animationFrame(); - expect(`.o_menuitem:eq(${step.index})`).toHaveClass("o_focused", { - message: `step ${step.number}`, - }); - } -} - -const getDefaultHomeMenuProps = () => { - const apps = [ - { - actionID: 121, - href: "/odoo/action-121", - appID: 1, - id: 1, - label: "Discuss", - parents: "", - webIcon: false, - xmlid: "app.1", - }, - { - actionID: 122, - href: "/odoo/action-122", - appID: 2, - id: 2, - label: "Calendar", - parents: "", - webIcon: false, - xmlid: "app.2", - }, - { - actionID: 123, - href: "/odoo/contacts", - appID: 3, - id: 3, - label: "Contacts", - parents: "", - webIcon: false, - xmlid: "app.3", - }, - ]; - return { apps, reorderApps: (order) => reorderApps(apps, order) }; -}; - -describe.current.tags("desktop"); - -test("ESC Support", async () => { - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - patchWithCleanup(getService("home_menu"), { - async toggle(show) { - expect.step(`toggle ${show}`); - }, - }); - await keyDown("escape"); - expect.verifySteps(["toggle false"]); -}); - -test("Click on an app", async () => { - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - patchWithCleanup(getService("menu"), { - async selectMenu(menu) { - expect.step(`selectMenu ${menu.id}`); - }, - }); - await click(".o_menuitem:eq(0)"); - await animationFrame(); - expect.verifySteps(["selectMenu 1"]); -}); - -test("Display Expiration Panel (no module installed)", async () => { - mockDate("2019-10-09T00:00:00"); - - patchWithCleanup(session, { - expiration_date: "2019-11-01 12:00:00", - expiration_reason: "", - isMailInstalled: false, - warning: "admin", - }); - - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - - expect(".database_expiration_panel").toHaveCount(1); - expect(".database_expiration_panel .oe_instance_register").toHaveText( - "You will be able to register your database once you have installed your first app.", - { message: "There should be an expiration panel displayed" } - ); - - // Close the expiration panel - await click(".database_expiration_panel .oe_instance_hide_panel"); - await animationFrame(); - expect(".database_expiration_panel").toHaveCount(0); -}); - -test("Navigation (only apps, only one line)", async () => { - expect.assertions(8); - - const homeMenuProps = { - apps: new Array(3).fill().map((x, i) => { - return { - actionID: 120 + i, - href: "/odoo/act" + (120 + i), - appID: i + 1, - id: i + 1, - label: `0${i}`, - parents: "", - webIcon: false, - xmlid: `app.${i}`, - }; - }), - reorderApps: (order) => reorderApps(homeMenuProps.apps, order), - }; - await mountWithCleanup(HomeMenu, { - props: homeMenuProps, - }); - - const path = [ - { number: 0, key: "ArrowDown", index: 0 }, - { number: 1, key: "ArrowRight", index: 1 }, - { number: 2, key: "Tab", index: 2 }, - { number: 3, key: "ArrowRight", index: 0 }, - { number: 4, key: "Tab", shiftKey: true, index: 2 }, - { number: 5, key: "ArrowLeft", index: 1 }, - { number: 6, key: "ArrowDown", index: 1 }, - { number: 7, key: "ArrowUp", index: 1 }, - ]; - - await walkOn(path); -}); - -test("Navigation (only apps, two lines, one incomplete)", async () => { - expect.assertions(19); - - const homeMenuProps = { - apps: new Array(8).fill().map((x, i) => { - return { - actionID: 121, - href: "/odoo/action-121", - appID: i + 1, - id: i + 1, - label: `0${i}`, - parents: "", - webIcon: false, - xmlid: `app.${i}`, - }; - }), - reorderApps: (order) => reorderApps(homeMenuProps.apps, order), - }; - await mountWithCleanup(HomeMenu, { - props: homeMenuProps, - }); - - const path = [ - { number: 1, key: "ArrowRight", index: 0 }, - { number: 2, key: "ArrowUp", index: 6 }, - { number: 3, key: "ArrowUp", index: 0 }, - { number: 4, key: "ArrowDown", index: 6 }, - { number: 5, key: "ArrowDown", index: 0 }, - { number: 6, key: "ArrowRight", index: 1 }, - { number: 7, key: "ArrowRight", index: 2 }, - { number: 8, key: "ArrowUp", index: 7 }, - { number: 9, key: "ArrowUp", index: 1 }, - { number: 10, key: "ArrowRight", index: 2 }, - { number: 11, key: "ArrowDown", index: 7 }, - { number: 12, key: "ArrowDown", index: 1 }, - { number: 13, key: "ArrowUp", index: 7 }, - { number: 14, key: "ArrowRight", index: 6 }, - { number: 15, key: "ArrowLeft", index: 7 }, - { number: 16, key: "ArrowUp", index: 1 }, - { number: 17, key: "ArrowLeft", index: 0 }, - { number: 18, key: "ArrowLeft", index: 5 }, - { number: 19, key: "ArrowRight", index: 0 }, - ]; - - await walkOn(path); -}); - -test("Navigation and open an app in the home menu", async () => { - expect.assertions(6); - - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - patchWithCleanup(getService("menu"), { - async selectMenu(menu) { - expect.step(`selectMenu ${menu.id}`); - }, - }); - // No app selected so nothing to open - await keyDown("enter"); - expect.verifySteps([]); - - const path = [ - { number: 0, key: "ArrowDown", index: 0 }, - { number: 1, key: "ArrowRight", index: 1 }, - { number: 2, key: "Tab", index: 2 }, - { number: 3, key: "shift+Tab", index: 1 }, - ]; - - await walkOn(path); - - // open first app (Calendar) - await keyDown("enter"); - - expect.verifySteps(["selectMenu 2"]); -}); - -test("Reorder apps in home menu using drag and drop", async () => { - const homeMenuProps = { - apps: reactive( - new Array(8).fill().map((x, i) => { - return { - actionID: 121, - href: "/odoo/action-121", - appID: i + 1, - id: i + 1, - label: `0${i}`, - parents: "", - webIcon: false, - xmlid: `app.${i}`, - }; - }) - ), - reorderApps: (order) => reorderApps(homeMenuProps.apps, order), - }; - onRpc("set_res_users_settings", () => { - expect.step(`set_res_users_settings`); - return { - id: 1, - homemenu_config: '["app.1","app.2","app.3","app.0","app.4","app.5","app.6","app.7"]', - }; - }); - await mountWithCleanup(HomeMenu, { - props: homeMenuProps, - }); - - const { moveTo, drop } = await drag(".o_draggable:first-child"); - await advanceTime(250); - expect(".o_draggable:first-child a").not.toHaveClass("o_dragged_app"); - await advanceTime(250); - expect(".o_draggable:first-child a").toHaveClass("o_dragged_app"); - await moveTo(".o_draggable:first-child", { - position: { - x: 70, - y: 35, - }, - relative: true, - }); - await drop(".o_draggable:not(.o_dragged):eq(3)"); - await animationFrame(); - expect.verifySteps(["set_res_users_settings"]); - expect(".o_app:eq(0)").toHaveAttribute("data-menu-xmlid", "app.1", { - message: "first displayed app has app.1 xmlid", - }); - expect(".o_app:eq(3)").toHaveAttribute("data-menu-xmlid", "app.0", { - message: "app 0 is now at 4th position", - }); -}); - -test("The HomeMenu input takes the focus when you press a key only if no other element is the activeElement", async () => { - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - expect(".o_search_hidden").toBeFocused(); - - const activeElement = document.createElement("div"); - getService("ui").activateElement(activeElement); - // remove the focus from the input - const otherInput = document.createElement("input"); - queryFirst(".o_home_menu").appendChild(otherInput); - await pointerDown(otherInput); - await pointerDown(document.body); - expect(".o_search_hidden").not.toBeFocused(); - - await keyDown("a"); - await animationFrame(); - expect(".o_search_hidden").not.toBeFocused(); - - getService("ui").deactivateElement(activeElement); - await keyDown("a"); - await animationFrame(); - expect(".o_search_hidden").toBeFocused(); -}); - -test("The HomeMenu input does not take the focus if it is already on another input", async () => { - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - expect(".o_search_hidden").toBeFocused(); - - const otherInput = document.createElement("input"); - queryFirst(".o_home_menu").appendChild(otherInput); - await pointerDown(otherInput); - await keyDown("a"); - await animationFrame(); - expect(".o_search_hidden").not.toBeFocused(); - - otherInput.remove(); - await keyDown("a"); - await animationFrame(); - expect(".o_search_hidden").toBeFocused(); -}); - -test("The HomeMenu input does not take the focus if it is already on a textarea", async () => { - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - expect(".o_search_hidden").toBeFocused(); - - const textarea = document.createElement("textarea"); - queryFirst(".o_home_menu").appendChild(textarea); - await pointerDown(textarea); - await keyDown("a"); - await animationFrame(); - expect(".o_search_hidden").not.toBeFocused(); - - textarea.remove(); - await keyDown("a"); - await animationFrame(); - expect(".o_search_hidden").toBeFocused(); -}); - -test("home search input shouldn't be focused on touch devices", async () => { - mockTouch(true); - await mountWithCleanup(HomeMenu, { - props: getDefaultHomeMenuProps(), - }); - expect(".o_search_hidden").not.toBeFocused({ - message: "home menu search input shouldn't have the focus", - }); -}); diff --git a/odex30_base/odex30_web/static/tests/webclient/webclient_enterprise.test.js b/odex30_base/odex30_web/static/tests/webclient/webclient_enterprise.test.js deleted file mode 100644 index ef36fdf..0000000 --- a/odex30_base/odex30_web/static/tests/webclient/webclient_enterprise.test.js +++ /dev/null @@ -1,798 +0,0 @@ -import { beforeEach, describe, expect, test } from "@odoo/hoot"; -import { click, keyDown, queryAll, queryFirst } from "@odoo/hoot-dom"; -import { animationFrame, Deferred, mockMatchMedia } from "@odoo/hoot-mock"; -import { Component, onMounted, xml } from "@odoo/owl"; -import { - clearRegistry, - contains, - defineActions, - defineMenus, - defineModels, - fields, - getMockEnv, - getService, - models, - mountWithCleanup, - onRpc, - patchWithCleanup, - serverState, - stepAllNetworkCalls, -} from "@web/../tests/web_test_helpers"; -import { browser } from "@web/core/browser/browser"; -import { router } from "@web/core/browser/router"; -import { registry } from "@web/core/registry"; -import { config as transitionConfig } from "@web/core/transition"; -import { user } from "@web/core/user"; -import { redirect } from "@web/core/utils/urls"; -import { UserMenu } from "@web/webclient/user_menu/user_menu"; -import { shareUrlMenuItem } from "@odex30_web/webclient/share_url/share_url"; -import { WebClientOdex } from "@odex30_web/webclient/webclient"; - -const actionRegistry = registry.category("actions"); - -/** - * @param {{ env: import("@web/env").OdooEnv }} [options] - */ -async function mountWebClientOdex(options) { - await mountWithCleanup(WebClientOdex, options); - // Wait for visual changes caused by a potential loadState - await animationFrame(); - // wait for BlankComponent - await animationFrame(); - // wait for the regular rendering - await animationFrame(); -} - -async function goToHomeMenu() { - await click(".o_menu_toggle"); - await animationFrame(); - - if (getMockEnv().isSmall) { - await click(queryFirst(".o_sidebar_topbar a.btn-primary", { root: document.body })); - await animationFrame(); - } -} - -defineActions([ - { - id: 1, - xml_id: "action_1", - name: "Partners Action 1", - res_model: "partner", - views: [[false, "kanban"]], - }, - { - id: 2, - xml_id: "action_2", - type: "ir.actions.server", - }, - { - id: 3, - xml_id: "action_3", - name: "Partners", - res_model: "partner", - views: [ - [false, "list"], - [false, "kanban"], - [false, "form"], - ], - }, - { - id: 4, - xml_id: "action_4", - name: "Partners Action 4", - res_model: "partner", - views: [ - [false, "kanban"], - [false, "list"], - [false, "form"], - ], - }, - { - id: 5, - xml_id: "action_5", - name: "Create a Partner", - res_model: "partner", - target: "new", - views: [[false, "form"]], - }, - { - id: 6, - xml_id: "action_6", - name: "Partner", - res_id: 2, - res_model: "partner", - target: "inline", - views: [[false, "form"]], - }, - { - id: 1001, - tag: "__test__client__action__", - target: "main", - type: "ir.actions.client", - params: { description: "Id 1" }, - }, - { - id: 1002, - tag: "__test__client__action__", - target: "main", - type: "ir.actions.client", - params: { description: "Id 2" }, - }, -]); - -defineMenus([ - { id: 0 }, // prevents auto-loading the first action - { id: 1, name: "App1", appID: 1, actionID: 1001, xmlid: "menu_1" }, - { id: 2, name: "App2", appID: 2, actionID: 1002, xmlid: "menu_2" }, -]); -class Partner extends models.Model { - name = fields.Char(); - foo = fields.Char(); - parent_id = fields.Many2one({ relation: "partner" }); - child_ids = fields.One2many({ relation: "partner", relation_field: "parent_id" }); - - _records = [ - { id: 1, name: "First record", foo: "yop", parent_id: 3 }, - { id: 2, name: "Second record", foo: "blip", parent_id: 3 }, - { id: 3, name: "Third record", foo: "gnap", parent_id: 1 }, - { id: 4, name: "Fourth record", foo: "plop", parent_id: 1 }, - { id: 5, name: "Fifth record", foo: "zoup", parent_id: 1 }, - ]; - _views = { - kanban: ` - - - - - - - - `, - list: ``, - form: ` -
-
-
- - - - -
- `, - search: ``, - }; -} -defineModels([Partner]); -class TestClientAction extends Component { - static template = xml` -
- ClientAction_ -
- `; - static props = ["*"]; - - setup() { - onMounted(() => { - this.env.config.setDisplayName(`Client action ${this.props.action.id}`); - }); - } -} - -onRpc("has_group", () => true); - -beforeEach(() => { - actionRegistry.add("__test__client__action__", TestClientAction); - patchWithCleanup(transitionConfig, { disabled: true }); -}); - -describe("basic flow with home menu", () => { - stepAllNetworkCalls(); - onRpc("partner", "get_formview_action", () => ({ - type: "ir.actions.act_window", - res_model: "partner", - view_type: "form", - view_mode: "form", - views: [[false, "form"]], - target: "current", - res_id: 2, - })); - defineMenus( - [ - { - id: 1, - name: "App1", - appID: 1, - actionID: 4, - xmlid: "menu_1", - }, - ], - { mode: "replace" } - ); - test("1 -- start up", async () => { - await mountWebClientOdex(); - expect.verifySteps(["/web/webclient/translations", "/web/webclient/load_menus"]); - expect(document.body).toHaveClass("o_home_menu_background"); - expect(".o_home_menu").toHaveCount(1); - expect(".o_menu_toggle").not.toBeVisible(); - expect(".o_app.o_menuitem").toHaveCount(1); - }); - - test("2 -- navbar updates on displaying an action", async () => { - await mountWebClientOdex(); - expect.verifySteps(["/web/webclient/translations", "/web/webclient/load_menus"]); - await contains(".o_app.o_menuitem").click(); - await animationFrame(); - expect.verifySteps(["/web/action/load", "get_views", "web_search_read"]); - expect(document.body).not.toHaveClass("o_home_menu_background"); - expect(".o_home_menu").toHaveCount(0); - expect(".o_kanban_view").toHaveCount(1); - expect(".o_menu_toggle").toBeVisible(); - expect(".o_menu_toggle").not.toHaveClass("o_menu_toggle_back"); - }); - - test("3 -- push another action in the breadcrumb", async () => { - await mountWebClientOdex(); - expect.verifySteps(["/web/webclient/translations", "/web/webclient/load_menus"]); - await contains(".o_app.o_menuitem").click(); - await animationFrame(); - expect.verifySteps(["/web/action/load", "get_views", "web_search_read"]); - expect(".o_kanban_view").toHaveCount(1); - await contains(".o_kanban_record").click(); - await animationFrame(); // there is another tick to update navbar and destroy HomeMenu - expect.verifySteps(["web_read"]); - expect(".o_menu_toggle").toBeVisible(); - expect(".o_form_view").toHaveCount(1); - expect(".o_breadcrumb .active").toHaveText("First record"); - }); - - test.tags("desktop"); - test("4 -- push a third action in the breadcrumb", async () => { - Partner._views["form"] = ` -
- - - - `; - await mountWebClientOdex(); - expect.verifySteps(["/web/webclient/translations", "/web/webclient/load_menus"]); - await contains(".o_app.o_menuitem").click(); - await animationFrame(); - expect.verifySteps(["/web/action/load", "get_views", "web_search_read"]); - expect(".o_kanban_view").toHaveCount(1); - await contains(".o_kanban_record").click(); - expect.verifySteps(["web_read"]); - await contains('.o_field_widget[name="parent_id"] .o_external_button', { - visible: false, - }).click(); - expect.verifySteps(["get_formview_action", "get_views", "web_read"]); - expect(".o_form_view").toHaveCount(1); - expect(".o_breadcrumb .active").toHaveText("Second record"); - // The third one is the active one - expect(".breadcrumb-item").toHaveCount(2); - }); - - test("5 -- switch to HomeMenu from an action with 2 breadcrumbs", async () => { - Partner._views["form"] = ` -
- - - - `; - await mountWebClientOdex(); - expect.verifySteps(["/web/webclient/translations", "/web/webclient/load_menus"]); - await contains(".o_app.o_menuitem").click(); - await animationFrame(); - expect.verifySteps(["/web/action/load", "get_views", "web_search_read"]); - expect(".o_kanban_view").toHaveCount(1); - await contains(".o_kanban_record").click(); - expect.verifySteps(["web_read"]); - await contains('.o_field_widget[name="parent_id"] .o_external_button', { - visible: false, - }).click(); - expect.verifySteps(["get_formview_action", "get_views", "web_read"]); - await goToHomeMenu(); - expect.verifySteps([]); - expect(".o_menu_toggle").toHaveClass("o_menu_toggle_back"); - expect(".o_home_menu").toHaveCount(1); - expect(".o_form_view").not.toHaveCount(); - }); - - test.tags("desktop"); - test("6 -- back to underlying action with many breadcrumbs", async () => { - Partner._views["form"] = ` -
- - - - `; - await mountWebClientOdex(); - expect.verifySteps(["/web/webclient/translations", "/web/webclient/load_menus"]); - await contains(".o_app.o_menuitem").click(); - await animationFrame(); - expect.verifySteps(["/web/action/load", "get_views", "web_search_read"]); - expect(".o_kanban_view").toHaveCount(1); - await contains(".o_kanban_record").click(); - expect.verifySteps(["web_read"]); - await contains('.o_field_widget[name="parent_id"] .o_external_button', { - visible: false, - }).click(); - expect.verifySteps(["get_formview_action", "get_views", "web_read"]); - await contains(".o_menu_toggle").click(); - - // can't click again too soon because of the mutex in home_menu - // service (waiting for the url to be updated) - await animationFrame(); - - await contains(".o_menu_toggle").click(); - - expect.verifySteps(["web_read"]); - expect(".o_home_menu").toHaveCount(0); - expect(".o_form_view").toHaveCount(1); - expect(".o_menu_toggle").not.toHaveClass("o_menu_toggle_back"); - expect(".o_breadcrumb .active").toHaveText("Second record"); - // Third breadcrumb is the active one - expect(".breadcrumb-item").toHaveCount(2); - }); -}); - -test("restore the newly created record in form view", async () => { - defineActions( - [ - { - id: 6, - xml_id: "action_6", - name: "Partner", - res_model: "partner", - views: [[false, "form"]], - }, - ], - { mode: "replace" } - ); - await mountWebClientOdex(); - - await getService("action").doAction(6); - expect(".o_form_view").toHaveCount(1); - expect(".o_form_view .o_form_editable").toHaveCount(1); - await contains(".o_field_widget[name=name] input").edit("red right hand"); - await contains(".o_form_button_save").click(); - expect(".o_breadcrumb .active").toHaveText("red right hand"); - await goToHomeMenu(); - expect(".o_form_view").not.toHaveCount(); - - // can't click again too soon because of the mutex in home_menu - // service (waiting for the url to be updated) - await animationFrame(); - - await contains(".o_menu_toggle").click(); - expect(".o_form_view").toHaveCount(1); - expect(".o_form_view .o_form_saved").toHaveCount(1); - expect(".o_breadcrumb .active").toHaveText("red right hand"); -}); - -test.tags("desktop"); -test("fast clicking on restore (implementation detail)", async () => { - expect.assertions(8); - - let doVeryFastClick = false; - - class DelayedClientAction extends Component { - static template = xml`
- -
`; - static props = ["*"]; - setup() { - onMounted(() => { - if (doVeryFastClick) { - doVeryFastClick = false; - click(".o_menu_toggle"); // go to home menu - } - }); - } - } - - registry.category("actions").add("DelayedClientAction", DelayedClientAction); - await mountWebClientOdex(); - await getService("action").doAction("DelayedClientAction"); - await animationFrame(); - await contains(".o_menu_toggle").click(); // go to home menu - expect(".o_home_menu").toBeVisible(); - expect(".delayed_client_action").not.toHaveCount(); - - doVeryFastClick = true; - await contains(".o_menu_toggle").click(); // back - expect(".o_home_menu").toHaveCount(0); - expect(".delayed_client_action").toHaveCount(1); - await animationFrame(); // waiting for DelayedClientAction - expect(".o_home_menu").toBeVisible(); - expect(".delayed_client_action").not.toHaveCount(); - - await contains(".o_menu_toggle").click(); // back - await animationFrame(); - expect(".o_home_menu").toHaveCount(0); - expect(".delayed_client_action").toHaveCount(1); -}); - -test("clear unCommittedChanges when toggling home menu", async () => { - expect.assertions(6); - // Edit a form view, don't save, toggle home menu - // the autosave feature of the Form view is activated - // and relied upon by this test - - onRpc("web_save", ({ args, model }) => { - expect(model).toBe("partner"); - expect(args[1]).toEqual({ - name: "red right hand", - foo: false, - }); - }); - - await mountWebClientOdex(); - await getService("action").doAction(3, { viewType: "form" }); - expect(".o_form_view .o_form_editable").toHaveCount(1); - await contains(".o_field_widget[name=name] input").edit("red right hand"); - - await goToHomeMenu(); - expect(".o_form_view").toHaveCount(0); - expect(".modal").toHaveCount(0); - expect(".o_home_menu").toHaveCount(1); -}); - -test("can have HomeMenu and dialog action", async () => { - await mountWebClientOdex(); - expect(".o_home_menu").toHaveCount(1); - expect(".modal .o_form_view").toHaveCount(0); - await getService("action").doAction(5); - expect(".modal .o_form_view").toHaveCount(1); - expect(".modal .o_form_view").toBeVisible(); - expect(".o_home_menu").toHaveCount(1); -}); - -test("supports attachments of apps deleted", async () => { - // When doing a pg_restore without the filestore - // LPE fixme: may not be necessary anymore since menus are not HomeMenu props anymore - defineMenus([ - { - id: 1, - appID: 1, - actionID: 1, - xmlid: "", - name: "Partners", - webIconData: "", - webIcon: "bloop,bloop", - }, - ]); - serverState.debug = "1"; - await mountWebClientOdex(); - expect(".o_home_menu").toHaveCount(1); -}); - -test.tags("desktop"); -test("debug manager resets to global items when home menu is displayed", async () => { - const debugRegistry = registry.category("debug"); - debugRegistry.category("default").add("item_1", () => ({ - type: "item", - description: "globalItem", - callback: () => {}, - sequence: 10, - })); - onRpc("has_access", () => true); - serverState.debug = "1"; - await mountWebClientOdex(); - await contains(".o_debug_manager .dropdown-toggle").click(); - expect(".dropdown-item:contains('globalItem')").toHaveCount(1); - expect(".dropdown-item:contains('View: Kanban')").toHaveCount(0); - - await contains(".o_debug_manager .dropdown-toggle").click(); - await getService("action").doAction(1); - await contains(".o_debug_manager .dropdown-toggle").click(); - expect(".dropdown-item:contains('globalItem')").toHaveCount(1); - expect(".dropdown-item:contains('View: Kanban')").toHaveCount(1); - - await contains(".o_menu_toggle").click(); - await contains(".o_debug_manager .dropdown-toggle").click(); - expect(".dropdown-item:contains('globalItem')").toHaveCount(1); - expect(".dropdown-item:contains('View: Kanban')").toHaveCount(0); - - await contains(".o_debug_manager .dropdown-toggle").click(); - await getService("action").doAction(3); - await contains(".o_debug_manager .dropdown-toggle").click(); - expect(".dropdown-item:contains('globalItem')").toHaveCount(1); - expect(".dropdown-item:contains('View: List')").toHaveCount(1); - expect(".dropdown-item:contains('View: Kanban')").toHaveCount(0); -}); - -test("url state is well handled when going in and out of the HomeMenu", async () => { - patchWithCleanup(browser.location, { - origin: "http://example.com", - }); - redirect("/odoo"); - await mountWebClientOdex(); - expect(router.current).toEqual({ - action: "menu", - actionStack: [ - { - action: "menu", - displayName: "Home", - }, - ], - }); - expect(browser.history.length).toBe(1); - - await contains(".o_apps > .o_draggable:eq(1) > .o_app").click(); - await animationFrame(); - expect(router.current).toEqual({ - action: 1002, - actionStack: [ - { - action: 1002, - displayName: "Client action 1002", - }, - ], - }); - expect(browser.history.length).toBe(2); - expect(browser.location.href).toBe("http://example.com/odoo/action-1002"); - - await goToHomeMenu(); - await animationFrame(); - expect(router.current).toEqual( - { - action: "menu", - actionStack: [ - { - action: 1002, - displayName: "Client action 1002", - }, - { - action: "menu", - displayName: "Home", - }, - ], - }, - { - message: - "the actionStack is required to be able to restore the menu toggle back button and the underlying breadcrumbs", - } - ); - expect(browser.history.length).toBe(3); - expect(browser.location.href).toBe("http://example.com/odoo", { - message: - "despite the actionStack being in the router state, the url shouldn't have any path", - }); - - await contains(".o_apps > .o_draggable:eq(0) > .o_app").click(); - await animationFrame(); - expect(router.current).toEqual( - { - action: 1001, - actionStack: [ - { - action: 1001, - displayName: "Client action 1001", - }, - ], - }, - { message: "clicking another app creates a new action stack (ie empties the breadcrumb)" } - ); - expect(browser.history.length).toBe(4); - expect(browser.location.href).toBe("http://example.com/odoo/action-1001"); - - browser.history.back(); - await animationFrame(); - expect(router.current).toEqual( - { - action: "menu", - actionStack: [ - { - action: 1002, - displayName: "Client action 1002", - }, - { - action: "menu", - displayName: "Home", - }, - ], - globalState: {}, - }, - { message: "actionStack was restored" } - ); - expect(browser.history.length).toBe(4, { - message: "the previous history entry still exists (available with forward button)", - }); - expect(browser.location.href).toBe("http://example.com/odoo"); - - await contains(".o_menu_toggle").click(); - await animationFrame(); - expect(router.current).toEqual({ - action: 1002, - actionStack: [ - { - action: 1002, - displayName: "Client action 1002", - }, - ], - }); - expect(browser.history.length).toBe(4); - expect(browser.location.href).toBe("http://example.com/odoo/action-1002"); -}); - -test.tags("desktop"); -test("underlying action's menu items are invisible when HomeMenu is displayed", async () => { - defineMenus([ - { - id: 1, - children: [ - { - id: 99, - name: "SubMenu", - appID: 1, - actionID: 1002, - xmlid: "", - webIconData: undefined, - webIcon: false, - }, - ], - }, - ]); - await mountWebClientOdex(); - expect("nav .o_menu_sections").toHaveCount(0); - expect("nav .o_menu_brand").toHaveCount(0); - await contains(".o_app.o_menuitem:nth-child(1)").click(); - await animationFrame(); - expect("nav .o_menu_sections").toHaveCount(1); - expect("nav .o_menu_brand").toHaveCount(1); - expect(".o_menu_sections").toBeVisible(); - expect(".o_menu_brand").toBeVisible(); - await contains(".o_menu_toggle").click(); - expect("nav .o_menu_sections").toHaveCount(1); - expect("nav .o_menu_brand").toHaveCount(1); - expect(".o_menu_sections").not.toBeVisible(); - expect(".o_menu_brand").not.toBeVisible(); -}); - -test("go back to home menu using browser back button", async () => { - await mountWebClientOdex(); - expect(".o_home_menu").toHaveCount(1); - expect(".o_main_navbar .o_menu_toggle").not.toBeVisible(); - - await contains(".o_apps > .o_draggable:nth-child(2) > .o_app").click(); - expect(".test_client_action").toHaveCount(0); - await animationFrame(); - expect(".test_client_action").toHaveCount(1); - expect(".o_home_menu").toHaveCount(0); - - browser.history.back(); - await animationFrame(); - await animationFrame(); - expect(".test_client_action").toHaveCount(0); - expect(".o_home_menu").toHaveCount(1); - expect(".o_main_navbar .o_menu_toggle").not.toBeVisible(); -}); - -test("initial action crashes", async () => { - expect.errors(1); - redirect("/odoo/action-__test__client__action__?menu_id=1"); - const ClientAction = registry.category("actions").get("__test__client__action__"); - class Override extends ClientAction { - setup() { - super.setup(); - expect.step("clientAction setup"); - throw new Error("my error"); - } - } - registry.category("actions").add("__test__client__action__", Override, { force: true }); - - await mountWebClientOdex(); - expect.verifySteps(["clientAction setup"]); - expect("nav .o_menu_toggle").toHaveCount(1); - expect("nav .o_menu_toggle").toBeVisible(); - expect(".o_action_manager").toHaveInnerHTML(""); - expect(router.current).toEqual({ - action: "__test__client__action__", - menu_id: 1, - actionStack: [ - { - action: "__test__client__action__", - }, - ], - }); - await animationFrame(); - expect.verifyErrors(["my error"]); -}); - -test("Apps are reordered at startup based on session's user settings", async () => { - // Config is written with apps xmlids order (default is menu_1, menu_2) - patchWithCleanup(user, { - get settings() { - return { id: 1, homemenu_config: '["menu_2","menu_1"]' }; - }, - }); - await mountWebClientOdex(); - - const apps = queryAll(".o_app"); - expect(apps[0]).toHaveAttribute("data-menu-xmlid", "menu_2", { - message: "first displayed app has menu_2 xmlid", - }); - expect(apps[1]).toHaveAttribute("data-menu-xmlid", "menu_1", { - message: "second displayed app has menu_1 xmlid", - }); - expect(apps[0]).toHaveText("App2", { message: "first displayed app is App2" }); - expect(apps[1]).toHaveText("App1", { message: "second displayed app is App1" }); -}); - -test.tags("desktop"); -test("Share URL item is present in the user menu when running as PWA", async () => { - mockMatchMedia({ ["display-mode"]: "standalone" }); - clearRegistry(registry.category("user_menuitems")); - // This service adds a "Dark Mode" item to the user menu items on start - registry.category("services").remove("color_scheme"); - registry.category("user_menuitems").add("share_url", shareUrlMenuItem); - - await mountWithCleanup(UserMenu); - await contains(".o_user_menu button").click(); - - expect(".o-dropdown--menu .dropdown-item").toHaveCount(1); - expect(".o-dropdown--menu .dropdown-item").toHaveText("Share"); -}); - -test.tags("desktop"); -test("Share URL item is not present in the user menu when not running as PWA", async () => { - mockMatchMedia({ ["display-mode"]: "browser" }); - clearRegistry(registry.category("user_menuitems")); - // This service adds a "Dark Mode" item to the user menu items on start - registry.category("services").remove("color_scheme"); - registry.category("user_menuitems").add("share_url", shareUrlMenuItem); - - await mountWithCleanup(UserMenu); - await contains(".o_user_menu button").click(); - - expect(".o-dropdown--menu .dropdown-item").not.toHaveCount(); -}); - -test("Navigate to an application from the HomeMenu should generate only one pushState", async () => { - patchWithCleanup(history, { - pushState(state, title, url) { - super.pushState(...arguments); - const parsedUrl = new URL(url); - expect.step(parsedUrl.pathname + parsedUrl.search); - }, - }); - await mountWebClientOdex(); - - await contains(".o_apps > .o_draggable:nth-child(2) > .o_app").click(); - await animationFrame(); - expect(".test_client_action").toHaveCount(1); - expect(".test_client_action").toHaveText("ClientAction_Id 2"); - - await goToHomeMenu(); - expect(".o_home_menu").toHaveCount(1); - - await contains(".o_apps > .o_draggable:nth-child(1) > .o_app").click(); - await animationFrame(); - expect(".test_client_action").toHaveCount(1); - expect(".test_client_action").toHaveText("ClientAction_Id 1"); - - await goToHomeMenu(); - await animationFrame(); - expect(".o_home_menu").toHaveCount(1); - expect.verifySteps(["/odoo", "/odoo/action-1002", "/odoo", "/odoo/action-1001", "/odoo"]); -}); - -test.tags("desktop"); -test("Should not crash when opening an app via palette and immediately entering input in the palette search", async () => { - await mountWebClientOdex(); - - const def = new Deferred(); - onRpc("web_search_read", () => def); - await keyDown("a"); - await animationFrame(); - await keyDown("Enter"); - await keyDown("a"); - await animationFrame(); - def.resolve(); - await animationFrame(); - expect(".test_client_action").toHaveCount(1); - expect(".test_client_action").toHaveText("ClientAction_Id 1"); -}); diff --git a/odex30_base/odex30_web/tests/__init__.py b/odex30_base/odex30_web/tests/__init__.py deleted file mode 100644 index 018fafd..0000000 --- a/odex30_base/odex30_web/tests/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ - -from . import test_odex diff --git a/odex30_base/odex30_web/tests/test_odex.py b/odex30_base/odex30_web/tests/test_odex.py deleted file mode 100644 index 9d6d88d..0000000 --- a/odex30_base/odex30_web/tests/test_odex.py +++ /dev/null @@ -1,68 +0,0 @@ -import base64 - -from odoo.tests.common import HttpCase, tagged - - -class LoadMenusTests(HttpCase): - - def setUp(self): - super().setUp() - self.menu = self.env["ir.ui.menu"].create({ - "name": "test_menu", - "parent_id": False, - }) - - def search(*args, **kwargs): - return self.menu - - self.patch(type(self.env["ir.ui.menu"]), "search", search) - self.authenticate("admin", "admin") - - def test_web_icon(self): - self.menu.web_icon = False - self.menu.web_icon_data = b"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+BCQAHBQICJmhD1AAAAABJRU5ErkJggg==" - - menu_loaded = self.url_open("/web/webclient/load_menus/1234") - - expected = { - str(self.menu.id): { - "actionID": False, - "actionModel": False, - "actionPath": False, - "appID": self.menu.id, - "children": [], - "id": self.menu.id, - "name": "test_menu", - "webIcon": False, - "webIconData": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+BCQAHBQICJmhD1AAAAABJRU5ErkJggg==", - "webIconDataMimetype": "image/png", - "xmlid": "" - }, - "root": { - "actionID": False, - "actionModel": False, - "actionPath": False, - "appID": False, - "children": [ - self.menu.id - ], - "id": "root", - "name": "root", - "webIcon": None, - "webIconData": None, - "webIconDataMimetype": None, - "xmlid": "", - "backgroundImage": None, - } - } - - self.assertDictEqual(menu_loaded.json(), expected) - - -@tagged("-at_install", "post_install") -class TestWeb(HttpCase): - def test_studio_list_upsell(self): - invoice_action = self.env.ref("account.action_move_out_invoice_type", raise_if_not_found=False) - if not invoice_action: - return - self.start_tour("/odoo/action-account.action_move_out_invoice_type", "odex30_web.test_studio_list_upsell", login="admin") diff --git a/odex30_base/odex30_web/version.py b/odex30_base/odex30_web/version.py deleted file mode 100644 index cf28214..0000000 --- a/odex30_base/odex30_web/version.py +++ /dev/null @@ -1,10 +0,0 @@ - -import odoo - -odoo.release.version_info = odoo.release.version_info[:5] + ('e',) -if '+e' not in odoo.release.version: - odoo.release.version = '{0}+e{1}{2}'.format(*odoo.release.version.partition('-')) - -odoo.service.common.RPC_VERSION_1.update( - server_version=odoo.release.version, - server_version_info=odoo.release.version_info) diff --git a/odex30_base/odex_sidebar_backend_theme2/i18n/ar_001.po b/odex30_base/odex_sidebar_backend_theme2/i18n/ar_001.po new file mode 100644 index 0000000..7fe9e39 --- /dev/null +++ b/odex30_base/odex_sidebar_backend_theme2/i18n/ar_001.po @@ -0,0 +1,106 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * odex_sidebar_backend_theme2 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.2a1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-06 05:41+0000\n" +"PO-Revision-Date: 2026-01-06 05:41+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: odex_sidebar_backend_theme2 +#. odoo-javascript +#: code:addons/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml:0 +msgid "CodingNepal" +msgstr "CodingNepal" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model,name:odex_sidebar_backend_theme2.model_res_config_settings +msgid "Config Settings" +msgstr "تهيئة الإعدادات " + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,field_description:odex_sidebar_backend_theme2.field_res_config_settings__disable_nav_menu_section +msgid "Disable Navigation Menu Section" +msgstr "تعطيل قسم قائمة التنقل" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,field_description:odex_sidebar_backend_theme2.field_res_config_settings__display_name +msgid "Display Name" +msgstr "الاسم المعروض" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,field_description:odex_sidebar_backend_theme2.field_res_config_settings__sidebar_menu_enable +msgid "Enable Sidebar Menu" +msgstr "تفعيل القائمة الجانبية" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,help:odex_sidebar_backend_theme2.field_res_config_settings__sidebar_menu_enable +msgid "Enable or disable the sidebar menu in the backend" +msgstr "تفعيل أو تعطيل القائمة الجانبية في الواجهة الخلفية" + +#. module: odex_sidebar_backend_theme2 +#: model_terms:ir.ui.view,arch_db:odex_sidebar_backend_theme2.res_config_settings_view_form_inherit_sidebar +msgid "" +"Enable or disable the sidebar menu in the backend\n" +" interface" +msgstr "تفعيل أو تعطيل القائمة الجانبية في الواجهة الخلفية" + +#. module: odex_sidebar_backend_theme2 +#: model_terms:ir.ui.view,arch_db:odex_sidebar_backend_theme2.res_config_settings_view_form_inherit_sidebar +msgid "" +"Enable or disable the top navigation bar menu section\n" +" in the backend interface" +msgstr "تفعيل أو تعطيل قسم شريط القائمة العلوي في الواجهة الخلفية" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,help:odex_sidebar_backend_theme2.field_res_config_settings__disable_nav_menu_section +msgid "" +"Enable or disable the top navigation bar menu section in the backend " +"interface" +msgstr "تفعيل أو تعطيل قسم شريط القائمة العلوي في الواجهة الخلفية" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,field_description:odex_sidebar_backend_theme2.field_res_config_settings__id +msgid "ID" +msgstr "المُعرف" + +#. module: odex_sidebar_backend_theme2 +#: model_terms:ir.ui.view,arch_db:odex_sidebar_backend_theme2.res_config_settings_view_form_inherit_sidebar +msgid "Odex Sidebar Menu" +msgstr "قائمة Odex الجانبية" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,field_description:odex_sidebar_backend_theme2.field_res_config_settings__sidebar_menu_icon +msgid "Sidebar Icon" +msgstr "أيقونة القائمة الجانبية" + +#. module: odex_sidebar_backend_theme2 +#. odoo-javascript +#: code:addons/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml:0 +msgid "Sign Out" +msgstr "تسجيل الخروج" + +#. module: odex_sidebar_backend_theme2 +#. odoo-javascript +#: code:addons/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml:0 +msgid "Support" +msgstr "الدعم" + +#. module: odex_sidebar_backend_theme2 +#. odoo-javascript +#: code:addons/odex_sidebar_backend_theme2/static/src/xml/navbar_patch.xml:0 +msgid "Toggle Sidebar" +msgstr "إظهار/إخفاء القائمة الجانبية" + +#. module: odex_sidebar_backend_theme2 +#: model:ir.model.fields,help:odex_sidebar_backend_theme2.field_res_config_settings__sidebar_menu_icon +msgid "Upload an icon for the sidebar menu." +msgstr "تحميل أيقونة للقائمة الجانبية." diff --git a/odex30_base/odex_sidebar_backend_theme2/static/description/icon.png b/odex30_base/odex_sidebar_backend_theme2/static/description/icon.png new file mode 100644 index 0000000..d3b8d45 Binary files /dev/null and b/odex30_base/odex_sidebar_backend_theme2/static/description/icon.png differ diff --git a/odex30_base/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml b/odex30_base/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml index 199a731..a91ffa1 100644 --- a/odex30_base/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml +++ b/odex30_base/odex_sidebar_backend_theme2/static/src/xml/sidebar_menu_template.xml @@ -36,7 +36,7 @@
- Support + Support
@@ -45,7 +45,7 @@