diff --git a/third_party_addons/ica_web_responsive/__init__.py b/third_party_addons/ica_web_responsive/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/third_party_addons/ica_web_responsive/__manifest__.py b/third_party_addons/ica_web_responsive/__manifest__.py
new file mode 100644
index 000000000..234385321
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/__manifest__.py
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+{
+ 'name': 'ICA Web Responsive',
+ 'author':"Agga, IdeaCode Academy",
+ 'version': '18.0.1.0',
+ 'depends': ['web', 'base_setup'],
+ # 'auto_install': ['web'],
+ 'auto_install': False,
+ 'data': [
+ 'views/webclient_templates.xml',
+ ],
+ 'assets': {
+ 'web._assets_primary_variables': [
+ ('after', 'web/static/src/scss/primary_variables.scss', 'ica_web_responsive/static/src/**/*.variables.scss'),
+ ('before', 'web/static/src/scss/primary_variables.scss', 'ica_web_responsive/static/src/scss/primary_variables.scss'),
+ ],
+ 'web._assets_secondary_variables': [
+ ('before', 'web/static/src/scss/secondary_variables.scss', 'ica_web_responsive/static/src/scss/secondary_variables.scss'),
+ ],
+ 'web._assets_backend_helpers': [
+ ('before', 'web/static/src/scss/bootstrap_overridden.scss', 'ica_web_responsive/static/src/scss/bootstrap_overridden.scss'),
+ ],
+ 'web.assets_frontend': [
+ 'ica_web_responsive/static/src/webclient/home_menu/home_menu_background.scss', # used by login page
+ 'ica_web_responsive/static/src/webclient/navbar/navbar.scss',
+ ],
+ 'web.assets_backend': [
+ 'ica_web_responsive/static/src/webclient/**/*.scss',
+ 'ica_web_responsive/static/src/views/**/*.scss',
+
+ 'ica_web_responsive/static/src/core/**/*',
+ 'ica_web_responsive/static/src/webclient/**/*.js',
+ ('after', 'web/static/src/views/list/list_renderer.xml', 'ica_web_responsive/static/src/views/list/list_renderer_desktop.xml'),
+ 'ica_web_responsive/static/src/webclient/**/*.xml',
+ 'ica_web_responsive/static/src/views/**/*.js',
+ 'ica_web_responsive/static/src/views/**/*.xml',
+ ('remove', 'ica_web_responsive/static/src/views/pivot/**'),
+
+ # Don't include dark mode files in light mode
+ ('remove', 'ica_web_responsive/static/src/**/*.dark.scss'),
+ ],
+ 'web.assets_backend_lazy': [
+ 'ica_web_responsive/static/src/views/pivot/**',
+ ],
+ 'web.assets_backend_lazy_dark': [
+ ('include', 'web.dark_mode_variables'),
+ # web._assets_backend_helpers
+ ('before', 'ica_web_responsive/static/src/scss/bootstrap_overridden.scss', 'ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss'),
+ ('after', 'web/static/lib/bootstrap/scss/_functions.scss', 'ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss'),
+ ],
+ 'web.assets_web': [
+ ('replace', 'web/static/src/main.js', 'ica_web_responsive/static/src/main.js'),
+ ],
+ # ========= Dark Mode =========
+ "web.dark_mode_variables": [
+ # web._assets_primary_variables
+ ('before', 'ica_web_responsive/static/src/scss/primary_variables.scss', 'ica_web_responsive/static/src/scss/primary_variables.dark.scss'),
+ ('before', 'ica_web_responsive/static/src/**/*.variables.scss', 'ica_web_responsive/static/src/**/*.variables.dark.scss'),
+ # web._assets_secondary_variables
+ ('before', 'ica_web_responsive/static/src/scss/secondary_variables.scss', 'ica_web_responsive/static/src/scss/secondary_variables.dark.scss'),
+ ],
+ "web.assets_web_dark": [
+ ('include', 'web.dark_mode_variables'),
+ # web._assets_backend_helpers
+ ('before', 'ica_web_responsive/static/src/scss/bootstrap_overridden.scss', 'ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss'),
+ ('after', 'web/static/lib/bootstrap/scss/_functions.scss', 'ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss'),
+ # assets_backend
+ 'ica_web_responsive/static/src/**/*.dark.scss',
+ ],
+ },
+ 'license': 'LGPL-3',
+
+ "images":["static/description/img.png"],
+}
diff --git a/third_party_addons/ica_web_responsive/static/description/icon.png b/third_party_addons/ica_web_responsive/static/description/icon.png
new file mode 100644
index 000000000..16dd80994
Binary files /dev/null and b/third_party_addons/ica_web_responsive/static/description/icon.png differ
diff --git a/third_party_addons/ica_web_responsive/static/description/img.png b/third_party_addons/ica_web_responsive/static/description/img.png
new file mode 100644
index 000000000..18fdf457d
Binary files /dev/null and b/third_party_addons/ica_web_responsive/static/description/img.png differ
diff --git a/third_party_addons/ica_web_responsive/static/img/automation.svg b/third_party_addons/ica_web_responsive/static/img/automation.svg
new file mode 100755
index 000000000..3e22456e6
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/img/automation.svg
@@ -0,0 +1,25 @@
+
diff --git a/third_party_addons/ica_web_responsive/static/img/background-dark.jpg b/third_party_addons/ica_web_responsive/static/img/background-dark.jpg
new file mode 100644
index 000000000..ce69f9532
Binary files /dev/null and b/third_party_addons/ica_web_responsive/static/img/background-dark.jpg differ
diff --git a/third_party_addons/ica_web_responsive/static/img/background-light.svg b/third_party_addons/ica_web_responsive/static/img/background-light.svg
new file mode 100644
index 000000000..aa437a117
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/img/background-light.svg
@@ -0,0 +1,35 @@
+
diff --git a/third_party_addons/ica_web_responsive/static/src/@types/main.d.ts b/third_party_addons/ica_web_responsive/static/src/@types/main.d.ts
new file mode 100644
index 000000000..851df0085
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/@types/main.d.ts
@@ -0,0 +1,3 @@
+declare module "@odoo/owl" {
+ export * from "@odoo/owl/dist/types/owl"
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/core/colorlist/colorlist.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/colorlist/colorlist.dark.scss
new file mode 100644
index 000000000..b68b1de02
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/core/colorlist/colorlist.dark.scss
@@ -0,0 +1,8 @@
+// Overrides the existing classes to fit the text-color of
+// tag_list.dark.scss
+@for $size from 2 through length($o-colors) {
+ .o_colorlist_item_color_#{$size - 1} {
+ --background-color: #{adjust-color(nth($o-colors, $size), $lightness: -5%, $saturation: -15%)};
+ --color: #{mix(nth($o-colors, $size), $o-view-background-color, 15%)};
+ }
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/core/dropdown/dropdown.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/dropdown/dropdown.dark.scss
new file mode 100644
index 000000000..1fc28544b
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/core/dropdown/dropdown.dark.scss
@@ -0,0 +1,8 @@
+// = Dropdowns
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o-dropdown {
+ --border-color: #{$dropdown-border-color};
+ --o-input-border-color: #{$dropdown-border-color};
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/core/notebook/notebook.scss b/third_party_addons/ica_web_responsive/static/src/core/notebook/notebook.scss
new file mode 100644
index 000000000..8cf0ca977
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/core/notebook/notebook.scss
@@ -0,0 +1,12 @@
+// Custom SCSS for enterprise version of notebook tabs
+
+.o_notebook {
+ --notebook-link-border-color: #{$border-color};
+ --notebook-link-border-color-hover: #{$border-color};
+ --notebook-link-border-color-active-accent: #{$o-brand-odoo};
+
+ .modal & {
+ --notebook-padding-x: #{$modal-inner-padding};
+ --notebook-margin-x: -#{$modal-inner-padding};
+ }
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/core/popover/popover.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/popover/popover.dark.scss
new file mode 100644
index 000000000..ff451eeb9
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/core/popover/popover.dark.scss
@@ -0,0 +1,15 @@
+// = Popovers
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o_popover {
+ --border-color: #{$popover-border-color};
+
+ .table {
+ --table-bg: #{$popover-bg};
+ }
+
+ .o_input {
+ --o-input-border-color: #{$popover-border-color};
+ }
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/core/tags_list/tags_list.dark.scss b/third_party_addons/ica_web_responsive/static/src/core/tags_list/tags_list.dark.scss
new file mode 100644
index 000000000..c7484ddb2
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/core/tags_list/tags_list.dark.scss
@@ -0,0 +1,13 @@
+.o_tag {
+ @for $size from 1 through length($o-colors) {
+ &.o_tag_color_#{$size - 1} {
+ --background-color: #{mix(nth($o-colors, $size), $o-view-background-color, 15%)};
+ --color: #{adjust-color(nth($o-colors, $size), $lightness: 5%, $saturation: -15%)};
+
+ &::after {
+ --background-color: var(--background-color);
+ --color: var(--color);
+ }
+ }
+ }
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/main.js b/third_party_addons/ica_web_responsive/static/src/main.js
new file mode 100644
index 000000000..b4d4340c1
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/main.js
@@ -0,0 +1,11 @@
+/** @odoo-module **/
+
+import { startWebClient } from "@web/start";
+import { WebClientEnterprise } from "./webclient/webclient";
+
+/**
+ * This file starts the enterprise webclient. In the manifest, it replaces
+ * the community main.js to load a different webclient class
+ * (WebClientEnterprise instead of WebClient)
+ */
+startWebClient(WebClientEnterprise);
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss
new file mode 100644
index 000000000..bbb2ee320
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.dark.scss
@@ -0,0 +1,180 @@
+///
+/// This file is a copy of the bootstrap _variables.scss file where all the
+/// left-untouched variables definition have been removed.
+///
+
+
+// == Color system
+$danger: $o-danger !default;
+
+$min-contrast-ratio: 4.5 !default;
+
+$info-text-emphasis: shift-color($o-info, 90%) !default;
+$info-bg-subtle: shift-color($o-info, -65%) !default;
+$info-border-subtle: shift-color($o-info, 0%) !default;
+
+// == Characters which are escaped by the escape-svg function
+
+
+// == Options
+
+
+// == Prefix for :root CSS variables
+
+
+// == Gradient
+
+
+// == Spacing
+
+
+// == Position
+
+
+// == Body
+
+// == Links
+
+$link-shade-percentage: 15% !default;
+$link-hover-color: shift-color($o-action, 30%) !default;
+
+// == Paragraphs
+
+
+// == Grid breakpoints
+
+
+// == Grid containers
+
+
+// == Grid columns
+
+
+// == Components
+$box-shadow: 0 .5rem 1rem rgba($o-white, .3) !default;
+$box-shadow-sm: 0 .125rem .25rem rgba($o-white, .15) !default;
+$box-shadow-lg: 0 1rem 3rem rgba($o-white, .3) !default;
+$box-shadow-inset: inset 0 1px 2px rgba($o-white, .15) !default;
+
+$component-active-bg: $o-gray-300 !default;
+
+
+// == Typography
+$mark-bg: #ffdebc !default;
+
+// == Tables
+$table-bg: $o-view-background-color !default;
+$table-border-color: $o-gray-300 !default;
+$table-group-separator-color: $o-gray-300 !default;
+$table-bg-scale: -70% !default;
+$table-striped-bg-factor: .02 !default;
+$table-hover-bg-factor: .1 !default;
+$table-active-bg-factor: .1 !default;
+
+// == Buttons + Forms
+
+
+// == Buttons
+
+
+// == Forms
+$input-border-color: $o-gray-300 !default;
+$input-placeholder-color: mix($o-gray-500, $o-gray-600) !default;
+$input-focus-bg: inherit !default;
+$form-range-thumb-active-bg: lighten($o-brand-primary, 10%);
+$form-range-track-bg: $o-gray-300 !default;
+
+$form-switch-color: rgba($o-black, .5) !default;
+$form-switch-focus-color: $o-black !default;
+$form-switch-checked-color: $o-view-background-color !default;
+
+// == Form validation
+
+
+// == Z-index master list
+
+
+// == Navs
+
+
+// == Navbar
+
+
+// == Dropdowns
+$dropdown-bg: $o-gray-300 !default;
+$dropdown-border-color: $o-gray-400 !default;
+$dropdown-header-color: $o-gray-700 !default;
+
+
+// == Pagination
+
+
+// == Placeholders
+
+
+// == Cards
+$card-cap-bg: $o-view-background-color !default;
+
+// == Accordion
+
+
+// == Tooltips
+$tooltip-color: $o-gray-800 !default;
+$tooltip-bg: $o-gray-300 !default;
+
+
+// == Form tooltips must come after regular tooltips
+
+
+// == Popovers
+$popover-bg: $o-gray-300 !default;
+$popover-border-color: $o-gray-400 !default;
+
+// == Toasts
+
+
+// == Badges
+
+
+// == Modals
+
+
+// == Alerts
+$alert-bg-scale: -65% !default;
+$alert-border-scale: 0% !default;
+$alert-color-scale: 90% !default;
+
+// == Progress bars
+
+
+// == List group
+$list-group-bg: $o-view-background-color !default;
+
+
+// == Image thumbnails
+
+
+// == Figures
+
+
+// == Breadcrumbs
+
+
+// == Carousel
+
+
+// == Spinners
+
+
+// == Close
+
+
+// == Offcanvas
+
+
+// == Code
+
+// == Keyboard Input
+$kbd-color: $o-gray-200 !default;
+$kbd-bg: $o-gray-900 !default;
+$kbd-box-shadow: 0px 1px 1px rgba($o-white, 0.2), inset 0px -1px 1px 1px rgba($o-gray-800, 0.8), inset 0px 2px 0px 0px rgba($o-black, 0.8) !default;
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.scss b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.scss
new file mode 100644
index 000000000..0fd68b229
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/bootstrap_overridden.scss
@@ -0,0 +1,136 @@
+///
+/// This file is a copy of the bootstrap _variables.scss file where all the
+/// left-untouched variables definition have been removed.
+///
+
+//
+// Color system
+//
+
+$light: $o-white !default;
+$dark: $o-gray-900 !default;
+$warning: #e99d00 !default;
+$danger: #d44c59 !default;
+
+
+// Options
+
+// Enable predefined decorative box-shadow styles on various components.
+// Does not affect box-shadows used for focus states.
+
+$enable-shadows: true !default;
+
+// Components
+//
+// Define common padding and border radius sizes and more.
+
+$component-active-color: unset !default;
+$component-active-bg: mix($o-enterprise-action-color, $o-white, 10%) !default;
+
+$nav-tabs-border-radius: 0 !default;
+$nav-pills-border-radius: 0 !default;
+$card-border-radius: 0 !default;
+$accordion-border-radius: 0 !default;
+$toast-border-radius: 0 !default;
+$badge-border-radius: 0 !default;
+$progress-border-radius: 0 !default;
+$list-group-border-radius: 0 !default;
+$thumbnail-border-radius: 0 !default;
+$form-check-input-border-radius: 0 !default;
+
+// Typography
+//
+// Font, line-height, and color for body text, headings, and more.
+
+$h1-font-size: $o-font-size-base * 2.4 !default;
+$h2-font-size: $o-font-size-base * 1.5 !default;
+$h3-font-size: $o-font-size-base * 1.3 !default;
+$h4-font-size: $o-font-size-base * 1.2 !default;
+$h5-font-size: $o-font-size-base * 1.1 !default;
+
+// Buttons
+//
+// For each of Bootstrap's buttons, define text, background, and border color.
+
+$btn-transition: none !default;
+
+$btn-box-shadow: 0 !default;
+$btn-active-box-shadow: 0 !default;
+$btn-focus-box-shadow: 0 !default;
+
+// Dropdowns
+//
+// Dropdown menu container and contents.
+
+$dropdown-box-shadow: 0 .3rem 1rem rgba(#000, .1) !default;
+
+// Forms
+//
+
+$input-border-color: $o-gray-200 !default;
+$input-box-shadow: 0 !default;
+
+$input-focus-bg: $o-white !default;
+$input-focus-box-shadow: 0 !default;
+$input-focus-border-color: mix($o-enterprise-action-color, $o-gray-200) !default;
+
+$form-check-input-checked-color: $o-white !default;
+$form-check-input-checked-border-color: $o-enterprise-action-color !default;
+$form-check-input-checked-bg-color: $o-enterprise-action-color !default;
+
+$form-select-focus-box-shadow: 0 !default;
+
+$form-range-track-box-shadow: 0 !default;
+
+// Z-index master list
+//
+// Change the z-index of the modal-backdrop elements to be equal to the
+// modal elements' ones. Bootstrap does not support multi-modals, and without
+// this rule all the modal-backdrops are below all the opened modals.
+// Indeed, bootstrap forces them to a lower z-index as the modal-backdrop
+// element (unique in their supported cases) might be put after the modal
+// element (if the modal is already in the DOM, hidden, then opened). This
+// cannot happen in odoo though as modals are not hidden but removed from
+// the DOM and are always put at the end of the body when opened.
+//
+// TODO the following code was disabled because it is saas-incompatible
+//
+// $zindex-modal-backdrop: $zindex-modal;
+
+// Navs
+$nav-link-color: $o-main-text-color !default;
+$nav-tabs-link-active-color: $o-main-headings-color !default;
+$nav-tabs-link-active-bg: transparent !default;
+
+
+// Badges
+
+$badge-border-radius: $o-border-radius !default;
+$badge-font-weight: normal !default;
+
+// Alerts
+//
+// Define alert colors, border radius, and padding.
+
+$alert-border-width: 0 !default;
+
+// Progress bars
+
+$progress-box-shadow: 0 !default;
+
+// List group
+
+$list-group-active-color: $o-enterprise-action-color !default;
+$list-group-active-bg: $component-active-bg !default;
+$list-group-active-border-color: $o-enterprise-action-color !default;
+
+
+// Image thumbnails
+
+$thumbnail-box-shadow: 0 !default;
+
+
+// Breadcrumbs
+
+$breadcrumb-active-color: $o-main-text-color !default;
+$breadcrumb-divider-color: $o-main-color-muted !default;
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss
new file mode 100644
index 000000000..9e27515ea
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/bs_functions_overridden.dark.scss
@@ -0,0 +1,14 @@
+///
+/// This file is a copy of the bootstrap _functions.scss file where all the
+/// left-untouched function definition have been removed.
+///
+
+// Tint a color: mix a color with black
+@function tint-color($color, $weight) {
+ @return mix(#000, $color, $weight);
+}
+
+// Shade a color: mix a color with white
+@function shade-color($color, $weight) {
+ @return mix(#FFF, $color, $weight);
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.dark.scss
new file mode 100644
index 000000000..eb9fd55ec
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.dark.scss
@@ -0,0 +1,193 @@
+///
+/// Odoo Dark-Mode
+///
+///
+
+// = Colors
+// ============================================================================
+
+$o-white: #000 !default;
+$o-black: #FFF !default;
+
+$o-gray-100: #1B1D26 !default;
+$o-gray-200: #262A36 !default;
+$o-gray-300: #3C3E4B !default;
+$o-gray-400: #5A5E6B !default;
+$o-gray-500: #6B707F !default;
+$o-gray-600: #7E8392 !default;
+$o-gray-700: #B1B3BC !default;
+$o-gray-800: #D1D1D1 !default;
+$o-gray-900: #E4E4E4 !default;
+
+$o-enterprise-color: #6b3e66 !default;
+$o-brand-primary: $o-enterprise-color !default;
+$o-enterprise-action-color: #02c7b5 !default;
+
+$o-success: #1dc959 !default;
+$o-info: #6AB5FB !default;
+$o-warning: #FBB56A !default;
+$o-danger: #b83232 !default;
+$o-action: $o-enterprise-action-color !default;
+$light: $o-gray-300 !default;
+$dark: $o-gray-700 !default;
+
+
+// = Text
+// ============================================================================
+
+$o-main-text-color: $o-gray-800 !default;
+$o-main-link-color: $o-action !default;
+$o-enterprise-color: $o-brand-odoo !default;
+$o-main-favorite-color: #ffd532 !default;
+$o-main-code-color: #c58bc8 !default;
+
+// = Fine-tune contextual text colors.
+$o-theme-text-colors: (
+ "primary": #b972a6,
+ "success": #1dc959,
+ "info": #6AB5FB,
+ "warning": #FBB56A,
+ "danger": #ff5757,
+) !default;
+
+
+// = Webclient
+// ============================================================================
+$o-webclient-color-scheme: dark !default;
+$o-webclient-background-color: $o-gray-100 !default;
+$o-view-background-color: $o-gray-200 !default;
+
+// = Inputs
+$o-input-border-required: $o-black !default;
+
+// = Components
+// ============================================================================
+$o-component-active-bg: mix($o-action, $o-gray-300, 10%) !default;
+$o-form-lightsecondary: $o-gray-300 !default;
+
+// = List-group
+$o-list-group-active-color: $o-gray-900 !default;
+$o-list-group-active-bg: rgba(saturate(adjust-hue($o-info, 15), 1.8), .5) !default;
+
+// = Modal
+$modal-backdrop-bg: $o-white !default;
+
+// = Buttons
+$o-btns-bs-override: () !default;
+$o-btns-bs-override: map-merge((
+ "primary": (
+ background: $o-brand-primary,
+ border: $o-brand-primary,
+ color: $o-black,
+
+ hover-background: lighten($o-brand-primary, 5%),
+ hover-border: lighten($o-brand-primary, 5%),
+ hover-color: $o-black,
+
+ active-background: lighten($o-brand-primary, 10%),
+ active-border: lighten($o-brand-primary, 10%),
+ active-color: $o-black,
+ ),
+
+ "secondary": (
+ background: $o-gray-300,
+ border: $o-gray-300,
+ color: $o-gray-900,
+
+ hover-background: $o-gray-400,
+ hover-border: $o-gray-400,
+ hover-color: $o-gray-900,
+
+ active-background: mix($o-action, $o-gray-100, 15%),
+ active-border: lighten($o-action, 10%),
+ active-color: $o-black,
+ ),
+
+ "light": (
+ background: $o-gray-200,
+ border: $o-gray-200,
+ color: $o-gray-800,
+
+ hover-background: $o-gray-300,
+ hover-border: $o-gray-300,
+ hover-color: $o-gray-900,
+
+ active-background: mix($o-action, $o-gray-100, 15%),
+ active-border: darken($o-action, 10%),
+ active-color: $o-black,
+ ),
+
+ "danger": (
+ background: $o-danger,
+ border: $o-danger,
+ color: $o-black,
+
+ hover-background: lighten($o-danger, 5%),
+ hover-border: lighten($o-danger, 5%),
+ hover-color: $o-black,
+
+ active-background: lighten($o-danger, 10%),
+ active-border: lighten($o-danger, 10%),
+ active-color: $o-black,
+ ),
+), $o-btns-bs-override);
+
+
+$o-btns-bs-outline-override: () !default;
+$o-btns-bs-outline-override: map-merge((
+
+ "primary": (
+ background: transparent,
+ border: map-get($o-theme-text-colors, 'primary'),
+ color: map-get($o-theme-text-colors, 'primary'),
+
+ hover-background: lighten($o-brand-primary, 5%),
+ hover-border: lighten($o-brand-primary, 5%),
+ hover-color: $o-black,
+
+ active-background: lighten($o-brand-primary, 10%),
+ active-border: lighten($o-brand-primary, 10%),
+ active-color: $o-black,
+ ),
+ "secondary": (
+ background: transparent,
+ border: $o-gray-300,
+ color: $o-gray-700,
+
+ hover-background: $o-gray-300,
+ hover-border: $o-gray-300,
+ hover-color: $o-black,
+
+ active-background: mix($o-action, $o-gray-100, 15%),
+ active-border: lighten($o-action, 10%),
+ active-color: $o-black,
+ ),
+
+ "light": (
+ background: transparent,
+ border: $o-gray-300,
+ color: $o-black,
+
+ hover-background: $o-gray-300,
+ hover-border: $o-gray-300,
+ hover-color: $o-gray-900,
+
+ active-background: mix($o-action, $o-gray-100, 15%),
+ active-border: lighten($o-action, 10%),
+ active-color: $o-black,
+ ),
+
+ "danger": (
+ background: transparent,
+ border: $o-danger,
+ color: $o-danger,
+
+ hover-background: lighten($o-danger, 5%),
+ hover-border: lighten($o-danger, 5%),
+ hover-color: $o-black,
+
+ active-background: lighten($o-danger, 10%),
+ active-border: lighten($o-danger, 10%),
+ active-color: $o-black,
+ ),
+), $o-btns-bs-outline-override);
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.scss b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.scss
new file mode 100644
index 000000000..5e95dbf23
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/primary_variables.scss
@@ -0,0 +1,107 @@
+///
+/// This file regroups the variables that style odoo components.
+/// They are available in every asset bundle.
+///
+
+// Colors
+$o-white: #FFF !default;
+$o-black: #000 !default;
+
+$o-gray-100: #F9FAFB !default;
+$o-gray-200: #e7e9ed !default;
+$o-gray-300: #d8dadd !default;
+$o-gray-400: #9a9ca5 !default;
+$o-gray-500: #7c7f89 !default;
+$o-gray-600: #5f636f !default;
+$o-gray-700: #374151 !default;
+$o-gray-800: #1F2937 !default;
+$o-gray-900: #111827 !default;
+
+$o-enterprise-color: #714B67 !default;
+$o-enterprise-action-color: #017e84 !default;
+
+$o-opacity-disabled: .5 !default;
+$o-opacity-muted: .76 !default;
+
+$o-brand-odoo: $o-enterprise-color !default;
+$o-brand-primary: $o-brand-odoo !default;
+$o-brand-secondary: #8f8f8f !default;
+$o-brand-lightsecondary: $o-gray-100 !default;
+
+$o-action: $o-enterprise-action-color !default;
+$o-main-text-color: $o-gray-700 !default;
+$o-main-link-color: $o-enterprise-action-color !default;
+$o-main-color-muted: rgba($o-main-text-color, $o-opacity-muted) !default;
+
+// Components
+$o-component-active-color: $o-gray-900 !default;
+$o-component-active-bg: mix($o-action, $o-white, 10%) !default;
+$o-component-active-border: $o-action !default;
+
+$o-list-group-header-color: $o-gray-900 !default;
+$o-list-footer-color: $o-gray-900 !default;
+$o-list-footer-bg-color: transparent !default;
+$o-list-footer-font-weight: 500 !default;
+
+$o-form-lightsecondary: $o-gray-200 !default;
+
+// o-inputs
+$o-input-padding-y: 1px !default;
+$o-input-padding-x: 0 !default;
+
+$o-input-border-required: $o-gray-900 !default;
+
+// Badges
+$o-badge-min-width: 2.7ch !default !default;
+
+// Buttons
+// Map of customized values for each button. If a button's design is defined
+// here, the relative values will take priority over default BS ones.
+// Notice: each map's entry is passed directly to the Bootstrap mixin, meaning
+// that all states must be defined, there can't be omissions.
+$o-btns-bs-override: () !default;
+$o-btns-bs-override: map-merge((
+ "primary": (
+ background: $o-brand-primary,
+ border: $o-brand-primary,
+ color: $o-white,
+
+ hover-background: darken($o-brand-primary, 10%),
+ hover-border: darken($o-brand-primary, 10%),
+ hover-color: $o-white,
+
+ active-background: mix($o-brand-primary, $o-white, 10%),
+ active-border: $o-brand-primary,
+ active-color:$o-brand-primary,
+ ),
+ "secondary": (
+ background: $o-gray-200,
+ border: $o-gray-200,
+ color: $o-gray-700,
+
+ hover-background: $o-gray-300,
+ hover-border: $o-gray-300,
+ hover-color: $o-gray-800,
+
+ active-background: $o-component-active-bg,
+ active-border: $o-component-active-border,
+ active-color: $o-component-active-color,
+ ),
+), $o-btns-bs-override);
+
+$o-btns-bs-outline-override: () !default;
+$o-btns-bs-outline-override: map-merge((
+ "secondary": (
+ background: transparent,
+ border: $o-gray-300,
+ color: $o-gray-700,
+
+ hover-background: $o-gray-200,
+ hover-border: $o-gray-300,
+ hover-color: $o-gray-800,
+
+ active-background: mix($o-enterprise-action-color, $o-white, 10%),
+ active-border: $o-enterprise-action-color,
+ active-color: $o-gray-900,
+ ),
+), $o-btns-bs-outline-override);
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.dark.scss b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.dark.scss
new file mode 100644
index 000000000..3db856613
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.dark.scss
@@ -0,0 +1,19 @@
+$o-colors-original: lighten(#000, 46.7%), #f07b50, #f4b660, #F7CD1F, #6cedeb, #8d5482,
+ #e74e4e, #2C8397, #475577, #dc0457, #30C381, #9365B8 !default;
+
+$o-colors-secondary-original: #aa4b6b, #30C381, #97743a, #F7CD1F, #4285F4, #8E24AA,
+ #D6145F, #173e43, #348F50, #AA3A38, #795548, #5e0231,
+ #6be585, #999966, #e9d362, #b56969, #bdc3c7, #649173 !default;
+
+$o-colors: ()!default;
+$o-colors-secondary: ()!default;
+
+@each $-color in $o-colors-original {
+ $-adjusted: saturate(mix($-color, $o-black, 50%), 60%);
+ $o-colors: append($o-colors, $-adjusted);
+}
+
+@each $-color in $o-colors-secondary-original {
+ $-adjusted: saturate(mix($-color, $o-black, 50%), 80%);
+ $o-colors-secondary: append($o-colors-secondary, $-adjusted);
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.scss b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.scss
new file mode 100644
index 000000000..9dba4643e
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/scss/secondary_variables.scss
@@ -0,0 +1,4 @@
+// Needed for having no spacing between sheet and mail body in mass_mailing:
+// Different required cancel paddings between web and ica_web_responsive
+$o-sheet-cancel-tpadding: $o-horizontal-padding !default;
+$o-sheet-cancel-bpadding: $o-horizontal-padding + $o-sheet-vpadding !default;
diff --git a/third_party_addons/ica_web_responsive/static/src/search/search_bar/search_bar.dark.scss b/third_party_addons/ica_web_responsive/static/src/search/search_bar/search_bar.dark.scss
new file mode 100644
index 000000000..e5e3bbdb8
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/search/search_bar/search_bar.dark.scss
@@ -0,0 +1,7 @@
+// = Search Bar
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o_searchview_facet {
+ --SearchBar-facet-background: #{$o-black};
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/search/search_panel/search_view.dark.scss b/third_party_addons/ica_web_responsive/static/src/search/search_panel/search_view.dark.scss
new file mode 100644
index 000000000..ab7f4b56f
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/search/search_panel/search_view.dark.scss
@@ -0,0 +1,12 @@
+// = Mobile Search
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o_mobile_search {
+ --mobileSearch-bg: #{$o-gray-200};
+ --mobileSearch__header-bg: #{$o-gray-100};
+}
+
+.o_searchview {
+ --SearchBar-background-color: #{$o-gray-100};
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/dashboard/dashboard_controller.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/dashboard/dashboard_controller.dark.scss
new file mode 100644
index 000000000..5d13f1c5f
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/dashboard/dashboard_controller.dark.scss
@@ -0,0 +1,10 @@
+// = Dashboard View
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o_dashboard_view {
+ --DashboardView-background-color: #{$o-gray-100};
+ --DashboardView__controlPanel-background-color: transparent;
+ --DashboardView__pieChart-background-color: transparent;
+}
+
diff --git a/third_party_addons/ica_web_responsive/static/src/views/fields/image/image_field.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/fields/image/image_field.dark.scss
new file mode 100644
index 000000000..3b5078522
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/fields/image/image_field.dark.scss
@@ -0,0 +1,7 @@
+// = Image Field
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o_field_image {
+ --ImageField-background-color: #{$o-gray-900};
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/fields/properties/properties_field.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/fields/properties/properties_field.dark.scss
new file mode 100644
index 000000000..e45f6a1c2
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/fields/properties/properties_field.dark.scss
@@ -0,0 +1,19 @@
+.o_field_property_definition_type, .o_field_property_definition_type_menu {
+ .o_field_property_dropdown > img {
+ -webkit-filter: invert(100%);
+ filter: invert(100%);
+ }
+}
+.o_property_field_value {
+ select {
+ option {
+ background-color: $border-color;
+ }
+ }
+}
+.o_field_property_definition_type_popover.popover {
+ .dropdown-item img {
+ -webkit-filter: invert(100%);
+ filter: invert(100%);
+ }
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/form/button_box/button_box.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/form/button_box/button_box.dark.scss
new file mode 100644
index 000000000..f95694fa4
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/form/button_box/button_box.dark.scss
@@ -0,0 +1,4 @@
+.o-form-buttonbox {
+ --o-stat-button-color: currentColor;
+ --o-stat-text-color: #{o-text-color('primary')};
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/gantt/web_gantt.variables.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/gantt/web_gantt.variables.dark.scss
new file mode 100644
index 000000000..fc39ad93c
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/gantt/web_gantt.variables.dark.scss
@@ -0,0 +1,9 @@
+// = Gantt View Variables
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+$gantt-highlight-today-border: rgba($o-warning, 0.5) !default;
+$gantt-highlight-today-bg: rgba($o-warning, 0.15)!default;
+$gantt-highlight-hover-row: rgba($o-brand-primary, .1) !default;
+$gantt-row-open-bg: $o-gray-100 !default;
+$gantt-unavailability-bg: $o-gray-200 !default;
diff --git a/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_controller.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_controller.dark.scss
new file mode 100644
index 000000000..5d953cbc6
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_controller.dark.scss
@@ -0,0 +1,11 @@
+// = Kanban Rendered
+// ============================================================================
+// No CSS hacks, variables overrides only
+
+.o_kanban_renderer {
+ --KanbanGroup-grouped-bg: #{$o-view-background-color};
+ --KanbanRecord__image-bg-color: #{$o-gray-900};
+ --KanbanColumn__highlight-background: #{mix($o-action, $o-gray-100, 15%)};
+ --KanbanColumn__highlight-border: #{$o-component-active-border};
+ --Kanban-background: #{$gray-100};
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_header_patch.js b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_header_patch.js
new file mode 100644
index 000000000..01ec724d1
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_header_patch.js
@@ -0,0 +1,44 @@
+/* @odoo-module */
+
+import { registry } from "@web/core/registry";
+import { patch } from "@web/core/utils/patch";
+import { KanbanHeader } from "@web/views/kanban/kanban_header";
+import { PromoteStudioAutomationDialog } from "@ica_web_responsive/webclient/promote_studio_dialog/promote_studio_dialog";
+import { _t } from "@web/core/l10n/translation";
+import { user } from "@web/core/user";
+
+patch(KanbanHeader.prototype, {
+ /**
+ * @override
+ */
+ get permissions() {
+ const permissions = super.permissions;
+ Object.defineProperty(permissions, "canEditAutomations", {
+ get: () => user.isAdmin,
+ configurable: true,
+ });
+ return permissions;
+ },
+
+ async openAutomations() {
+ if (typeof this._openAutomations === "function") {
+ // this is the case if base_automation is installed
+ return this._openAutomations();
+ } else {
+ this.env.services.dialog.add(PromoteStudioAutomationDialog, {
+ title: _t("Odoo Studio - Customize workflows in minutes"),
+ });
+ }
+ },
+});
+
+registry.category("kanban_header_config_items").add(
+ "open_automations",
+ {
+ label: _t("Automations"),
+ method: "openAutomations",
+ isVisible: ({ permissions }) => permissions.canEditAutomations,
+ class: "o_column_automations",
+ },
+ { sequence: 25, force: true }
+);
diff --git a/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_view.scss b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_view.scss
new file mode 100644
index 000000000..5ea95e165
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/kanban/kanban_view.scss
@@ -0,0 +1,14 @@
+.o_kanban_view {
+
+ .o_column_quick_create .o_kanban_quick_create {
+ input {
+ &, &:focus, &:hover {
+ background: transparent;
+ border-bottom: 1px solid map-get($grays, '600');
+ }
+ }
+ .input-group-append, .input-group-prepend {
+ border-left: 10px solid map-get($grays, '200');
+ }
+ }
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.dark.scss b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.dark.scss
new file mode 100644
index 000000000..219e84e50
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.dark.scss
@@ -0,0 +1,4 @@
+// = ListRenderer
+// ============================================================================
+// No CSS hacks, variables overrides only
+
diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.scss b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.scss
new file mode 100644
index 000000000..8eb931c41
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_controller.scss
@@ -0,0 +1,3 @@
+.o_list_renderer {
+ --ListRenderer-thead-border-end-color: transparent;
+}
diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.js b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.js
new file mode 100644
index 000000000..589f63b91
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.js
@@ -0,0 +1,100 @@
+/** @odoo-module */
+
+import { isMobileOS } from "@web/core/browser/feature_detection";
+import { user } from "@web/core/user";
+import { useService } from "@web/core/utils/hooks";
+import { patch } from "@web/core/utils/patch";
+import { ListRenderer } from "@web/views/list/list_renderer";
+import { PromoteStudioDialog } from "@ica_web_responsive/webclient/promote_studio_dialog/promote_studio_dialog";
+import { _t } from "@web/core/l10n/translation";
+import { onWillDestroy, useState } from "@odoo/owl";
+
+export const patchListRendererDesktop = () => ({
+ setup() {
+ super.setup(...arguments);
+ this.actionService = useService("action");
+ const list = this.props.list;
+
+ const { actionId, actionType } = this.env.config || {};
+
+ // Start by determining if the current ListRenderer is in a context that would
+ // allow the edition of the arch by studio.
+ // It needs to be a full list view, in an action
+ // (not a X2Many list, and not an "embedded" list in another component)
+ // Also, there is not enough information when an action is in target new,
+ // and this use case is fairly outside of the feature's scope
+ const isPotentiallyEditable =
+ !isMobileOS() &&
+ !this.env.inDialog &&
+ user.isSystem &&
+ list === list.model.root &&
+ actionId &&
+ actionType === "ir.actions.act_window";
+ this.studioEditable = useState({ value: isPotentiallyEditable });
+
+ if (isPotentiallyEditable) {
+ const computeStudioEditable = (action) => {
+ // Finalize the computation when the actionService is ready.
+ // The following code is copied from studioService.
+ if (!action.xml_id) {
+ return false;
+ }
+ if (
+ action.res_model.indexOf("settings") > -1 &&
+ action.res_model.indexOf("x_") !== 0
+ ) {
+ return false; // settings views aren't editable; but x_settings is
+ }
+ if (action.res_model === "board.board") {
+ return false; // dashboard isn't editable
+ }
+ if (action.view_mode === "qweb") {
+ // Apparently there is a QWebView that allows to
+ // implement ActWindow actions that are completely custom
+ // but not editable by studio
+ return false;
+ }
+ if (action.res_model === "knowledge.article") {
+ // The knowledge form view is very specific and custom, it doesn't make sense
+ // to edit it. Editing the list and kanban is more debatable, but for simplicity's sake
+ // we set them to not editable too.
+ return false;
+ }
+ return Boolean(action.res_model);
+ };
+ const onUiUpdated = () => {
+ const action = this.actionService.currentController.action;
+ if (action.id === actionId) {
+ this.studioEditable.value = computeStudioEditable(action);
+ }
+ stopListening();
+ };
+ const stopListening = () =>
+ this.env.bus.removeEventListener("ACTION_MANAGER:UI-UPDATED", onUiUpdated);
+ this.env.bus.addEventListener("ACTION_MANAGER:UI-UPDATED", onUiUpdated);
+
+ onWillDestroy(stopListening);
+ }
+ },
+
+ isStudioEditable() {
+ return this.studioEditable.value;
+ },
+
+ get displayOptionalFields() {
+ return this.isStudioEditable() || super.displayOptionalFields;
+ },
+
+ /**
+ * This function opens promote studio dialog
+ *
+ * @private
+ */
+ onSelectedAddCustomField() {
+ this.env.services.dialog.add(PromoteStudioDialog, {
+ title: _t("Odoo Studio - Add new fields to any view"),
+ });
+ },
+});
+
+export const unpatchListRendererDesktop = patch(ListRenderer.prototype, patchListRendererDesktop());
diff --git a/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.xml b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.xml
new file mode 100644
index 000000000..dbab49517
--- /dev/null
+++ b/third_party_addons/ica_web_responsive/static/src/views/list/list_renderer_desktop.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+