diff options
| author | stefanorigano (SRI) <sri@odoo.com> | 2020-06-17 07:17:13 +0000 |
|---|---|---|
| committer | Xavier-Do <xdo@odoo.com> | 2020-08-27 17:07:33 +0000 |
| commit | 92c911fe1a8b24437ef5174d04c92ef8f185fc2c (patch) | |
| tree | 9c521c27b3f84d006a451e172bfe9b00dea84d30 /addons | |
| parent | 2d9667c2286354bf22c1cfea06c06a6b9250ba24 (diff) | |
[IMP] website: add ripple effect option for buttons
Part of https://github.com/odoo/odoo/pull/56427
task-2264627
Co-authored-by: qsm-odoo <qsm@odoo.com>
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/website/models/theme_models.py | 4 | ||||
| -rw-r--r-- | addons/website/static/src/js/content/ripple_effect.js | 72 | ||||
| -rw-r--r-- | addons/website/static/src/scss/options/ripple_effect.scss | 28 | ||||
| -rw-r--r-- | addons/website/static/src/scss/primary_variables.scss | 1 | ||||
| -rw-r--r-- | addons/website/views/snippets/snippets.xml | 4 | ||||
| -rw-r--r-- | addons/website/views/website_templates.xml | 10 |
6 files changed, 119 insertions, 0 deletions
diff --git a/addons/website/models/theme_models.py b/addons/website/models/theme_models.py index 4f50869301d..7ea51e50ce5 100644 --- a/addons/website/models/theme_models.py +++ b/addons/website/models/theme_models.py @@ -172,11 +172,15 @@ class Theme(models.AbstractModel): 'navbar-font': 'null', 'buttons-font': 'null', 'color-palettes-number': 'null', + 'btn-ripple': 'null', 'header-template': 'null', 'footer-template': 'null', } ) + # Reinitialize effets + self.disable_view('website.option_ripple_effect') + # Reinitialize header templates self.disable_view('website.template_header_hamburger') self.disable_view('website.template_header_hamburger_left') diff --git a/addons/website/static/src/js/content/ripple_effect.js b/addons/website/static/src/js/content/ripple_effect.js new file mode 100644 index 00000000000..2e61d5b7cd8 --- /dev/null +++ b/addons/website/static/src/js/content/ripple_effect.js @@ -0,0 +1,72 @@ +odoo.define('website.ripple_effect', function (require) { +'use strict'; + +const publicWidget = require('web.public.widget'); + +publicWidget.registry.RippleEffect = publicWidget.Widget.extend({ + selector: '.btn, .dropdown-toggle, .dropdown-item', + events: { + 'click': '_onClick', + }, + duration: 350, + + /** + * @override + */ + start: async function () { + this.diameter = Math.max(this.$el.outerWidth(), this.$el.outerHeight()); + this.offsetX = this.$el.offset().left; + this.offsetY = this.$el.offset().top; + return this._super(...arguments); + }, + /** + * @override + */ + destroy: function () { + this._super(...arguments); + if (this.rippleEl) { + this.rippleEl.remove(); + } + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @private + * @param {boolean} [toggle] + */ + _toggleRippleEffect: function (toggle) { + this.el.classList.toggle('o_js_ripple_effect', toggle); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {Event} ev + */ + _onClick: function (ev) { + if (!this.rippleEl) { + this.rippleEl = document.createElement('span'); + this.rippleEl.classList.add('o_ripple_item'); + this.rippleEl.style.animationDuration = `${this.duration}ms`; + this.rippleEl.style.width = `${this.diameter}px`; + this.rippleEl.style.height = `${this.diameter}px`; + this.el.appendChild(this.rippleEl); + } + + clearTimeout(this.timeoutID); + this._toggleRippleEffect(false); + + this.rippleEl.style.top = `${ev.pageY - this.offsetY - this.diameter / 2}px`; + this.rippleEl.style.left = `${ev.pageX - this.offsetX - this.diameter / 2}px`; + + this._toggleRippleEffect(true); + this.timeoutID = setTimeout(() => this._toggleRippleEffect(false), this.duration); + }, +}); +}); diff --git a/addons/website/static/src/scss/options/ripple_effect.scss b/addons/website/static/src/scss/options/ripple_effect.scss new file mode 100644 index 00000000000..cff35300d55 --- /dev/null +++ b/addons/website/static/src/scss/options/ripple_effect.scss @@ -0,0 +1,28 @@ +@keyframes o-btn-ripple { + 100% { + opacity: 0; + transform: scale(2.5); + } +} + +.o_ripple_item { + display: none; + position: absolute; + z-index: -1; + border-radius: 100%; + opacity: .3; + background: currentColor; + pointer-events: none; + transform: scale(0); +} + +.o_js_ripple_effect { + transform-style: preserve-3d; + position: relative !important; + overflow: hidden !important; + + .o_ripple_item { + display: block; + animation: o-btn-ripple ease-in; + } +} diff --git a/addons/website/static/src/scss/primary_variables.scss b/addons/website/static/src/scss/primary_variables.scss index c4c6d80a446..044f2629cf2 100644 --- a/addons/website/static/src/scss/primary_variables.scss +++ b/addons/website/static/src/scss/primary_variables.scss @@ -252,6 +252,7 @@ $o-base-website-values-palette: ( 'btn-primary-outline': false, 'btn-secondary-outline': false, 'link-underline': 'hover', // 'never' / 'hover' / 'always' + 'btn-ripple': false, // A key from the $o-theme-font-configs map (null = default to the first key) 'font': null, diff --git a/addons/website/views/snippets/snippets.xml b/addons/website/views/snippets/snippets.xml index d49d03291e8..1da86d618d6 100644 --- a/addons/website/views/snippets/snippets.xml +++ b/addons/website/views/snippets/snippets.xml @@ -916,6 +916,10 @@ <we-button data-customize-website-variable="false">Fill</we-button> <we-button data-customize-website-variable="true">Outline</we-button> </we-select> + <we-checkbox string="Ripple Buttons" + data-customize-website-views="website.option_ripple_effect" + data-customize-website-variable="false|true" + data-variable="btn-ripple"/> <we-select string="Link Style" data-variable="link-underline"> <we-button data-customize-website-variable="'never'">Normal</we-button> <we-button data-customize-website-variable="'hover'">Underline On Hover</we-button> diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 94685591390..c65f65ca386 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -721,6 +721,16 @@ <template id="pager" name="Pager" inherit_id="portal.pager"> </template> +<!-- Effect options --> +<template id="option_ripple_effect" inherit_id="website.assets_frontend" active="False"> + <xpath expr="//link[last()]" position="after"> + <link rel="stylesheet" type="text/scss" href="/website/static/src/scss/options/ripple_effect.scss"/> + </xpath> + <xpath expr="//script[last()]" position="after"> + <script type="text/javascript" src="/website/static/src/js/content/ripple_effect.js"/> + </xpath> +</template> + <!-- Layout options --> <template id="option_layout_boxed_variables" inherit_id="website._assets_primary_variables" active="False"> <xpath expr="//link[last()]" position="after"> |
