From 536db5c64fc0199b76c4c10348d29f8d4af3a836 Mon Sep 17 00:00:00 2001 From: "stefanorigano (SRI)" Date: Tue, 12 Oct 2021 14:27:38 +0000 Subject: [PATCH] [IMP] website_sale: new products-list designs This commit makes use of CSS variables to define new design and options for the /shop page. In detail, options now toggle classes that contains CSS variables definition. These variable are used to style the "default template" that is designed in SCSS only once. This approach allow us to add more designs without increase the SCSS (actually reducing it) and without creating complex xpath difficult to customize. task#2667024 Part-of: odoo/odoo#79651 --- .../static/src/scss/website_sale.scss | 347 +++++++----------- .../website_sale/views/snippets/snippets.xml | 48 +++ addons/website_sale/views/templates.xml | 84 +++-- 3 files changed, 244 insertions(+), 235 deletions(-) diff --git a/addons/website_sale/static/src/scss/website_sale.scss b/addons/website_sale/static/src/scss/website_sale.scss index 404c4853f30..5dc5aa77674 100644 --- a/addons/website_sale/static/src/scss/website_sale.scss +++ b/addons/website_sale/static/src/scss/website_sale.scss @@ -5,16 +5,51 @@ $o-wsale-products-layout-grid-gutter-width: $grid-gutter-width / 2 !default; $o-wsale-products-layout-grid-gutter-width: min($grid-gutter-width / 2, $o-wsale-products-layout-grid-gutter-width); @mixin wsale-break-table-to-list() { - .o_wsale_products_grid_table_wrapper > table, - .o_wsale_products_grid_table_wrapper > table > tbody, - .o_wsale_products_grid_table_wrapper > table > tbody > tr, - .o_wsale_products_grid_table_wrapper > table > tbody > tr > td { - display: block; - width: 100%; + .o_wsale_products_grid_table_wrapper { + table, tbody, tr, td { + display: block; + width: 100%; + } } } .oe_website_sale { + // ==== Products list designs + .o_wsale_design_cards { + --o-wsale-card-border-width: 1px; + --o-wsale-card-border-radius: #{$card-border-radius}; + --o-wsale-card-info-padding: #{map-get($spacers, 2)}; + --o-wsale-card-bg: #{$card-bg}; + + $-br-top: calc(#{$card-border-radius} - 1px); + --o-wsale-card-thumb-border-radius: #{$-br-top} #{$-br-top} 0 0; + } + .o_wsale_design_thumbs { + --o-wsale-card-border-width: 0; + --o-wsale-card-info-padding: #{map-get($spacers, 3)} 0; + --o-wsale-card-thumb-border-radius: #{$o-wsale-products-layout-grid-gutter-width * .5}; + --o-wsale-card-thumb-shadow: 0 13px 27px -5px #{scale-color(theme-color('primary'), $alpha: -90%)}, + 0 8px 16px -8px rgba(0, 0, 0, .28); + } + .o_wsale_design_grid { + --o-wsale-grid-border: 1px solid #{$card-border-color}; + --o-wsale-card-border-width: 0; + } + + // ==== Products list thumb options + .o_wsale_context_thumb_4_3 { + --o-wsale-card-thumb-aspect-ratio: 4/3; + } + .o_wsale_context_thumb_4_5 { + --o-wsale-card-thumb-aspect-ratio: 4/5; + } + .o_wsale_context_thumb_2_3 { + --o-wsale-card-thumb-aspect-ratio: 2/3; + } + .o_wsale_context_thumb_cover { + --o-wsale-card-thumb-fill-mode: cover; + } + ul ul { margin-left: 1.5rem; } @@ -95,9 +130,6 @@ $o-wsale-products-layout-grid-gutter-width: min($grid-gutter-width / 2, $o-wsale padding-bottom: 0.75rem; } #products_grid_before { - @include media-breakpoint-up(lg) { - border-right: 1px solid gray('400'); - } #wsale_products_categories_collapse { label { &:hover { @@ -173,81 +205,48 @@ $o-wsale-products-layout-grid-gutter-width: min($grid-gutter-width / 2, $o-wsale // Base style for a product card with image/description .oe_product_cart { + flex-direction: var(--o-wsale-card-flex-direction, column); + border: $card-border-width solid $card-border-color; + border-width: var(--o-wsale-card-border-width, 0 0 1px); + border-radius: var(--o-wsale-card-border-radius, 0); + padding: var(--o-wsale-card-padding, 0); + background-color: var(--o-wsale-card-bg); + .oe_product_image { - height: 0; - text-align: center; + min-width: var(--o-wsale-card-thumb-size); + width: var(--o-wsale-card-thumb-size); - img { - height: 100%; - width: 100%; - object-fit: scale-down; + .oe_product_image_link { + padding-top: calc(100% / (var(--o-wsale-card-thumb-aspect-ratio, 1))); + + .oe_product_image_img_wrapper { + @include o-position-absolute(0, 0, 0, 0); + + img { + box-shadow: var(--o-wsale-card-thumb-shadow); + border-radius: var(--o-wsale-card-thumb-border-radius); + object-fit: var(--o-wsale-card-thumb-fill-mode, contain); + } + } } } + .o_wsale_product_information { - position: relative; - flex: 0 0 auto; - transition: .3s ease; + padding: var(--o-wsale-card-info-padding, #{map-get($spacers, 2)} 0); } - .oe_subdescription { - max-height: 0; + + [data-oe-field="description_sale"][data-oe-type] { + min-height: calc(#{$font-size-sm * 1.1} * 2); overflow: hidden; - font-size: $font-size-sm; - margin-bottom: map-get($spacers, 1); - opacity: 0; - transform: scale(1, 0); - transition: all ease 0.3s; - } - .o_wsale_product_btn { - @include o-position-absolute(auto, auto, 100%, 0); - padding-bottom: map-get($spacers, 1); - z-index: 2; - - .btn { - width: 46px; - padding: 0.375rem 0.75rem; // prevent default Bootstrap padding from being modified by theme variables - line-height: 32px; - border-radius: 50%; - transform: scale(0); - opacity: 0; - transition: transform ease 200ms 0s, opacity ease 50ms; - } - - &:empty { - display: none !important; - } + display: -webkit-box; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + line-height: 1.1; } - &:hover { - .o_wsale_product_information { - background-color: white !important; - } - .oe_subdescription { - max-height: $line-height-base * 1em; // Max 1 line - @include media-breakpoint-up(lg) { - max-height: $line-height-base * 2em; // Max 2 lines - } - @include media-breakpoint-up(xl) { - max-height: $line-height-base * 3em; // Max 3 lines - } - } - .oe_subdescription, - .o_wsale_product_btn .btn { - transform: scale(1); - opacity: 1; - } - } - - @include media-breakpoint-down(sm) { - &, &:hover { - .oe_subdescription { - max-height: $line-height-base * 3em; // Max 3 lines - } - } - .oe_subdescription, - .o_wsale_product_btn .btn { - transform: scale(1); - opacity: 1; - } + .o_wsale_product_btn:empty { + display: none !important; } .o_ribbon_left, .o_ribbon_right { @@ -260,19 +259,7 @@ $o-wsale-products-layout-grid-gutter-width: min($grid-gutter-width / 2, $o-wsale } } -// Options relative to where the product card is put -.oe_product { - // Image full option - &.oe_image_full { - .oe_product_image { - @include border-bottom-radius($card-inner-border-radius); - } - .o_wsale_product_information { - @include o-position-absolute(auto, 0, 0, 0); // The wrapper is always relatively positioned - } - } -} - +// ==== THE GRID #products_grid { .o_wsale_products_searchbar_form { @include media-breakpoint-up(md) { @@ -280,50 +267,15 @@ $o-wsale-products-layout-grid-gutter-width: min($grid-gutter-width / 2, $o-wsale } } - .o_wsale_products_grid_table_wrapper > .table { + .o_wsale_products_grid_table_wrapper .table { table-layout: fixed; - > tbody { - > tr > td { - margin-top: $o-wsale-products-layout-grid-gutter-width; // For list and mobile design - padding: 0; + td { + padding: $o-wsale-products-layout-grid-gutter-width * .5; + border: var(--o-wsale-grid-border, 0); - @if $o-wsale-products-layout-grid-gutter-width <= 0 { - border: $card-border-width solid $card-border-color; - } - } - - > tr:first-child > td:first-child { - margin-top: 0; // For list and mobile design - } - } - - .o_wsale_product_grid_wrapper { - position: relative; - - @for $x from 1 through 4 { - @for $y from 1 through 4 { - &.o_wsale_product_grid_wrapper_#{$x}_#{$y} { - padding-top: 100% * $o-wsale-products-layout-grid-ratio * $y / $x; - } - } - } - - > * { - $-pos: ($o-wsale-products-layout-grid-gutter-width / 2); - @include o-position-absolute($-pos, $-pos, $-pos, $-pos); - - &.card { - border: none; - - @if $o-wsale-products-layout-grid-gutter-width > 0 { - border-bottom: 1px solid gray('400'); - } - - &, .card-body { - border-radius: 0; - } - } + @if $o-wsale-products-layout-grid-gutter-width <= 0 { + border: $card-border-width solid $card-border-color; } } } @@ -338,95 +290,68 @@ $o-wsale-products-layout-grid-gutter-width: min($grid-gutter-width / 2, $o-wsale // outer border spacing as part of the design. margin: (-$o-wsale-products-layout-grid-gutter-width / 2); } +} - @include media-breakpoint-down(sm) { +#products_grid:not(.o_wsale_layout_list) { + @include media-breakpoint-down(md) { @include wsale-break-table-to-list(); + } - .table .o_wsale_product_grid_wrapper { - padding-top: 100% !important; + @include media-breakpoint-up(lg) { + td.oe_product { + height: 1px; // Will adapt to its content + padding-bottom: $o-wsale-products-layout-grid-gutter-width * .5; + + .o_wsale_product_btn { + @include o-position-absolute(auto, auto, calc(100% + #{map-get($spacers, 2)}), map-get($spacers, 2)); + z-index: 2; + } + + &:not(:hover) .o_wsale_product_btn { + opacity: 0; + } + } + + // Sliglty increase padding for larger blocks + @for $x from 2 through 4 { + [class*="o_wsale_product_grid_wrapper_#{$x}_"] { + --o-wsale-card-info-padding: #{map-get($spacers, 3)} 0 #{map-get($spacers, 2)}; + } + + .o_wsale_design_cards [class*="o_wsale_product_grid_wrapper_#{$x}_"] { + --o-wsale-card-info-padding: #{map-get($spacers, 3)} #{map-get($spacers, 3)} #{map-get($spacers, 2)}; + } + } + } +} + +#products_grid.o_wsale_layout_list { + @include wsale-break-table-to-list(); + + .oe_product { + --o-wsale-card-border-radius: 0; + --o-wsale-card-flex-direction: row; + --o-wsale-card-info-padding: 0 #{map-get($spacers, 3)}; + + // The more an image is portait, the more its size decreases + --o-wsale-card-thumb-size: calc(100px * var(--o-wsale-card-thumb-aspect-ratio, 1)); + + @include media-breakpoint-up(lg) { + --o-wsale-card-thumb-size: calc(160px * var(--o-wsale-card-thumb-aspect-ratio, 1)); + + h6, .h6 { + font-size: $font-size-base * 1.3; + } } } - &.o_wsale_layout_list { - @include media-breakpoint-up(sm) { - @include wsale-break-table-to-list(); + .oe_product { + --o-wsale-card-padding: #{0 0 $o-wsale-products-layout-grid-gutter-width}; + } - .o_wsale_products_grid_table_wrapper { - margin: 0; - } - - .table .o_wsale_product_grid_wrapper { - padding-top: 0 !important; - - > * { - @include o-position-absolute(0, 0, 0, 0); - position: relative; - } - } - - .oe_product_cart { - $-wsale-list-layout-height: 12rem; - - flex-flow: row nowrap; - min-height: $-wsale-list-layout-height; - - .oe_product_image { - flex: 0 0 auto; - width: $-wsale-list-layout-height; - max-width: 35%; - min-width: 100px; - height: auto; - padding: $spacer/2 !important; - } - .o_wsale_product_information { - position: static; - display: flex; - flex: 1 1 auto; - text-align: left !important; - } - .o_wsale_product_information_text { - flex: 1 1 auto; - margin-left: $spacer*2; - margin-right: $spacer; - - .o_wsale_products_item_title { - font-size: $h5-font-size; - padding-bottom: $spacer/3; - border-bottom: 1px solid gray('300'); - } - .oe_subdescription { - font-size: 0.9rem; - margin-top: $spacer/2; - } - } - .o_wsale_product_btn { - flex: 0 0 auto; - position: static; - display: flex; - align-items: flex-end; - padding: map-get($spacers, 2); - - .btn + .btn { - margin-left: map-get($spacers, 2); - } - } - - .oe_subdescription { - max-height: none !important; - } - .oe_subdescription, - .o_wsale_product_btn .btn { - transform: scale(1) !important; - opacity: 1; - } - - &:hover { - .o_wsale_product_information { - background-color: $white !important; - } - } - } - } + .o_wsale_design_cards .oe_product { + --o-wsale-card-padding: #{$o-wsale-products-layout-grid-gutter-width * .5}; + --o-wsale-card-info-padding: #{map-get($spacers, 2)} #{map-get($spacers, 3)}; } } diff --git a/addons/website_sale/views/snippets/snippets.xml b/addons/website_sale/views/snippets/snippets.xml index 39853b28d01..b7a525dafd2 100644 --- a/addons/website_sale/views/snippets/snippets.xml +++ b/addons/website_sale/views/snippets/snippets.xml @@ -23,6 +23,54 @@ + + + Default + + + Cards + + + Thumbnails + + + Grid + + + + + Landscape (4/3) + + + Default (1/1) + + + Portrait (4/5) + + + Vertical (2/3) + + + + + + + +
-
- -