From dc80e195b09f242a1843cf3dbe7e97eee1a89c91 Mon Sep 17 00:00:00 2001 From: Sonny Le Date: Fri, 20 Sep 2024 17:08:45 +0700 Subject: [PATCH] Add GSAP Lib and Hover Motion Gallery --- assets/vendor/gsap/Flip.min.js | 10 + {js => assets/vendor/gsap}/gsap.min.js | 0 assets/vendor/hover_motion/css/base.css | 140 +++++++++ assets/vendor/hover_motion/img/noise.png | Bin 0 -> 38299 bytes assets/vendor/hover_motion/js/index.js | 281 ++++++++++++++++++ .../hover_motion_gallery.php | 79 +++++ .../hover_motion_gallery.xml | 50 ++++ framework/library/astroid/Document.php | 27 +- language/en-GB/en-GB.astroid.ini | 8 +- 9 files changed, 583 insertions(+), 12 deletions(-) create mode 100644 assets/vendor/gsap/Flip.min.js rename {js => assets/vendor/gsap}/gsap.min.js (100%) create mode 100644 assets/vendor/hover_motion/css/base.css create mode 100644 assets/vendor/hover_motion/img/noise.png create mode 100644 assets/vendor/hover_motion/js/index.js create mode 100644 framework/elements/hover_motion_gallery/hover_motion_gallery.php create mode 100644 framework/elements/hover_motion_gallery/hover_motion_gallery.xml diff --git a/assets/vendor/gsap/Flip.min.js b/assets/vendor/gsap/Flip.min.js new file mode 100644 index 00000000..0372a61b --- /dev/null +++ b/assets/vendor/gsap/Flip.min.js @@ -0,0 +1,10 @@ +/*! + * Flip 3.12.5 + * https://gsap.com + * + * @license Copyright 2024, GreenSock. All rights reserved. + * Subject to the terms at https://gsap.com/standard-license or for Club GSAP members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).window=t.window||{})}(this,function(e){"use strict";function p(t){var e=t.ownerDocument||t;!(w in t.style)&&"msTransform"in t.style&&(k=(w="msTransform")+"Origin");for(;e.parentNode&&(e=e.parentNode););if(y=window,d=new M,e){a=(g=e).documentElement,b=e.body,(s=g.createElementNS("http://www.w3.org/2000/svg","g")).style.transform="none";var i=e.createElement("div"),n=e.createElement("div"),r=e&&(e.body||e.firstElementChild);r&&r.appendChild&&(r.appendChild(i),i.appendChild(n),i.setAttribute("style","position:static;transform:translate3d(0,0,1px)"),m=n.offsetParent!==i,r.removeChild(i))}return e}function t(){return y.pageYOffset||g.scrollTop||a.scrollTop||b.scrollTop||0}function u(){return y.pageXOffset||g.scrollLeft||a.scrollLeft||b.scrollLeft||0}function v(t){return t.ownerSVGElement||("svg"===(t.tagName+"").toLowerCase()?t:null)}function x(t,e){if(t.parentNode&&(g||p(t))){var i=v(t),n=i?i.getAttribute("xmlns")||"http://www.w3.org/2000/svg":"http://www.w3.org/1999/xhtml",r=i?e?"rect":"g":"div",a=2!==e?0:100,s=3===e?100:0,o="position:absolute;display:block;pointer-events:none;margin:0;padding:0;",l=g.createElementNS?g.createElementNS(n.replace(/^https/,"http"),r):g.createElement(r);return e&&(i?(f=f||x(t),l.setAttribute("width",.01),l.setAttribute("height",.01),l.setAttribute("transform","translate("+a+","+s+")"),f.appendChild(l)):(c||((c=x(t)).style.cssText=o),l.style.cssText=o+"width:0.1px;height:0.1px;top:"+s+"px;left:"+a+"px",c.appendChild(l))),l}throw"Need document and parent."}function z(t){var e,i=t.getCTM();return i||(e=t.style[w],t.style[w]="none",t.appendChild(s),i=s.getCTM(),t.removeChild(s),e?t.style[w]=e:t.style.removeProperty(w.replace(/([A-Z])/g,"-$1").toLowerCase())),i||d.clone()}function A(t,e){var i,n,r,a,s,o,l=v(t),u=t===l,p=l?C:E,h=t.parentNode;if(t===y)return t;if(p.length||p.push(x(t,1),x(t,2),x(t,3)),i=l?f:c,l)u?(a=-(r=z(t)).e/r.a,s=-r.f/r.d,n=d):t.getBBox?(r=t.getBBox(),a=(n=(n=t.transform?t.transform.baseVal:{}).numberOfItems?1=o;t&&!n&&ha(H,!x),L&&X(e,L,t?"remove":"add")})},k&&(S=H.filter(function(t){return!t.sd&&!t.a.isVisible&&t.b.isVisible}).map(function(t){return t.a.element})),tt?(S&&(y=tt._abs).push.apply(y,ka(H,S)),tt._run.push(m)):(S&&la(ka(H,S)),m());var K=tt?tt.timeline:R;return K.revert=function(){return lt(K,1,1)},K}function Da(t){for(var e,i=t.idLookup={},n=t.alt={},r=t.elementStates,a=r.length;a--;)i[(e=r[a]).id]?n[e.id]=e:i[e.id]=e}var I,Q,tt,r,o,P,T,l,n,h=1,F={},O=180/Math.PI,N=Math.PI/180,D={},Y={},et={},it=S("onStart,onUpdate,onComplete,onReverseComplete,onInterrupt"),nt=S("transform,transformOrigin,width,height,position,top,left,opacity,zIndex,maxWidth,maxHeight,minWidth,minHeight"),rt={zIndex:1,kill:1,simple:1,spin:1,clearProps:1,targets:1,toggleClass:1,onComplete:1,onUpdate:1,onInterrupt:1,onStart:1,delay:1,repeat:1,repeatDelay:1,yoyo:1,scale:1,fade:1,absolute:1,props:1,onEnter:1,onLeave:1,custom:1,paused:1,nested:1,prune:1,absoluteOnLeave:1},at={zIndex:1,simple:1,clearProps:1,scale:1,absolute:1,fitChild:1,getVars:1,props:1},st={},R="paddingTop,paddingRight,paddingBottom,paddingLeft,gridArea,transition".split(","),G=function _parseElementState(t,e,i,n){return t instanceof pt?t:t instanceof ut?function _findElStateInState(t,e){return e&&t.idLookup[G(e).id]||t.elementStates[0]}(t,n):new pt("string"==typeof t?V(t)||console.warn(t+" not found"):t,e,i)},ot=function _fit(t,e,i,n,r,a){var s,o,l,u,p,h,c,f=t.element,d=t.cache,m=t.parent,g=t.x,v=t.y,y=e.width,x=e.height,b=e.scaleX,w=e.scaleY,S=e.rotation,k=e.bounds,_=a&&T&&T(f,"transform"),C=t,V=e.matrix,E=V.e,M=V.f,B=t.bounds.width!==k.width||t.bounds.height!==k.height||t.scaleX!==b||t.scaleY!==w||t.rotation!==S,F=!B&&t.simple&&e.simple&&!r;return F||!m?(b=w=1,S=s=0):(h=(p=function _getInverseGlobalMatrix(t){var e=t._gsap||Q.core.getCache(t);return e.gmCache===Q.ticker.frame?e.gMatrix:(e.gmCache=Q.ticker.frame,e.gMatrix=getGlobalMatrix(t,!0,!1,!0))}(m)).clone().multiply(e.ctm?e.matrix.clone().multiply(e.ctm):e.matrix),S=W(Math.atan2(h.b,h.a)*O),s=W(Math.atan2(h.c,h.d)*O+S)%360,b=Math.sqrt(Math.pow(h.a,2)+Math.pow(h.b,2)),w=Math.sqrt(Math.pow(h.c,2)+Math.pow(h.d,2))*Math.cos(s*N),r&&(r=I(r)[0],u=Q.getProperty(r),c=r.getBBox&&"function"==typeof r.getBBox&&r.getBBox(),C={scaleX:u("scaleX"),scaleY:u("scaleY"),width:c?c.width:Math.ceil(parseFloat(u("width","px"))),height:c?c.height:parseFloat(u("height","px"))}),d.rotation=S+"deg",d.skewX=s+"deg"),i?(b*=y!==C.width&&C.width?y/C.width:1,w*=x!==C.height&&C.height?x/C.height:1,d.scaleX=b,d.scaleY=w):(y=P(y*b/C.scaleX,0),x=P(x*w/C.scaleY,0),f.style.width=y+"px",f.style.height=x+"px"),n&&pa(f,e.props),F||!m?(g+=E-t.matrix.e,v+=M-t.matrix.f):B||m!==e.parent?(d.renderTransform(1,d),h=getGlobalMatrix(r||f,!1,!1,!0),o=p.apply({x:h.e,y:h.f}),g+=(l=p.apply({x:E,y:M})).x-o.x,v+=l.y-o.y):(p.e=p.f=0,g+=(l=p.apply({x:E-t.matrix.e,y:M-t.matrix.f})).x,v+=l.y),g=P(g,.02),v=P(v,.02),!a||a instanceof pt?(d.x=g+"px",d.y=v+"px",d.renderTransform(1,d)):_&&_.revert(),a&&(a.x=g,a.y=v,a.rotation=S,a.skewX=s,i?(a.scaleX=b,a.scaleY=w):(a.width=y,a.height=x)),a||d},j=[],H="width,height,overflowX,overflowY".split(","),lt=function _killFlip(t,e,i){if(t&&t.progress()<1&&(!t.paused()||i))return e&&(function _interrupt(t){t.vars.onInterrupt&&t.vars.onInterrupt.apply(t,t.vars.onInterruptParams||[]),t.getChildren(!0,!1,!0).forEach(_interrupt)}(t),e<2&&t.progress(1),t.kill()),!0},ut=((n=FlipState.prototype).update=function update(t){var e=this;return this.elementStates=this.targets.map(function(t){return new pt(t,e.props,e.simple)}),Da(this),this.interrupt(t),this.recordInlineStyles(),this},n.clear=function clear(){return this.targets.length=this.elementStates.length=0,Da(this),this},n.fit=function fit(t,e,i){for(var n,r,a=ea(this.elementStates.slice(0),!1,!0),s=(t||this).idLookup,o=0;o .as-hover-motion-row-item-inner { + pointer-events: none; +} +.as-hover-motion-gallery-fullview .as-hover-motion-row-item-inner { + border-radius: 0px; +} \ No newline at end of file diff --git a/assets/vendor/hover_motion/img/noise.png b/assets/vendor/hover_motion/img/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..b7fe9e302902c8408606841212baeb3796d5a163 GIT binary patch literal 38299 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 qXe^8$fdx+FO (1 - n) * a + n * b; + const getMousePos = e => { + return { + x : e.clientX, + y : e.clientY + }; + }; + + // Registers the Flip plugin with GSAP + gsap.registerPlugin(Flip); + + const renderGallery = (gallery) => { + // const fullview = gallery.querySelector('.as-hover-motion-gallery-fullview'); // Reference to the fullview element + const grid = gallery.querySelector('.as-hover-motion-gallery-inner'); + const gridRows = grid.querySelectorAll('.as-hover-motion-row'); // Reference to all row elements within the grid + + // Cache window size and update on resize + let winsize = { width: window.innerWidth, height: window.innerHeight }; + window.addEventListener('resize', () => { + winsize = { width: window.innerWidth, height: window.innerHeight }; + }); + + // Initialize mouse position object + let mousepos = { x: winsize.width / 2, y: winsize.height / 2 }; + + // Configuration for enabling/disabling animations + const config = { + translateX: true, + skewX: false, + contrast: true, + scale: false, + brightness: true + }; + + // Total number of rows + const numRows = gridRows.length; + // Calculate the middle row assuming an odd number of rows + const middleRowIndex = Math.floor(numRows / 2); + + // amt represents the interpolation amount for each row's movement. + // A higher amt value means faster interpolation and less lag behind the mouse movement. + const baseAmt = 0.1; // The amt for the middle row, which will have the fastest response. + const minAmt = 0.05; // Minimum amt value to ensure rows have a noticeable movement lag. + const maxAmt = 0.1; // Maximum amt value to ensure rows have a noticeable movement lag. + + // Initialize rendered styles for each row with dynamically calculated amt values + let renderedStyles = Array.from({ length: numRows }, (v, index) => { + const distanceFromMiddle = Math.abs(index - middleRowIndex); + // Calculate amt dynamically based on the distance from the middle row + const amt = Math.max(baseAmt - distanceFromMiddle * 0.03, minAmt); + // Inverted amt for scale: outermost rows are faster + const scaleAmt = Math.min(baseAmt + distanceFromMiddle * 0.03, maxAmt); + let style = { amt, scaleAmt }; + + if (config.translateX) { + style.translateX = { previous: 0, current: 0 }; + } + if (config.skewX) { + style.skewX = { previous: 0, current: 0 }; + } + if (config.contrast) { + style.contrast = { previous: 100, current: 100 }; + } + if (config.scale) { + style.scale = { previous: 1, current: 1 }; + } + if (config.brightness) { + style.brightness = { previous: 100, current: 100 }; + } + return style; + }); + + // Tracks if the render loop is running + let requestId; + + // Update mouse position + const updateMousePosition = (ev) => { + const pos = getMousePos(ev); + mousepos.x = pos.x; + mousepos.y = pos.y; + }; + + // Map mouse position to translation range + const calculateMappedX = () => { + return ((mousepos.x / winsize.width) * 2 - 1) * 40 * winsize.width / 100; + }; + + // Map mouse position to skew range (-3 to 3) + const calculateMappedSkew = () => { + return ((mousepos.x / winsize.width) * 2 - 1) * 3; + }; + + // Map mouse position to contrast range (100 at center to 125 at edges) + const calculateMappedContrast = () => { + const centerContrast = 100; + const edgeContrast = 330; + const t = Math.abs((mousepos.x / winsize.width) * 2 - 1); + const factor = Math.pow(t, 2); // Quadratic factor for non-linear mapping + return centerContrast - factor * (centerContrast - edgeContrast); + }; + + // Map mouse position to scale range (1 at center to 0.95 at edges) + const calculateMappedScale = () => { + const centerScale = 1; + const edgeScale = 0.95; + return centerScale - Math.abs((mousepos.x / winsize.width) * 2 - 1) * (centerScale - edgeScale); + }; + + // Map mouse position to brightness range (100 at center to 15 at edges) + const calculateMappedBrightness = () => { + const centerBrightness = 100; + const edgeBrightness = 15; + const t = Math.abs((mousepos.x / winsize.width) * 2 - 1); + const factor = Math.pow(t, 2); // Quadratic factor for non-linear mapping + return centerBrightness - factor * (centerBrightness - edgeBrightness); + }; + + // Function to get the value of a CSS variable + const getCSSVariableValue = (element, variableName) => { + return getComputedStyle(element).getPropertyValue(variableName).trim(); + }; + + // Render the current frame + const render = () => { + const mappedValues = { + translateX: calculateMappedX(), + skewX: calculateMappedSkew(), + contrast: calculateMappedContrast(), + scale: calculateMappedScale(), + brightness: calculateMappedBrightness() + }; + + // Calculate and set the translation for each row + gridRows.forEach((row, index) => { + const style = renderedStyles[index]; + + // Update current positions and interpolate values + for (let prop in config) { + if (config[prop]) { + style[prop].current = mappedValues[prop]; + const amt = prop === 'scale' ? style.scaleAmt : style.amt; + style[prop].previous = lerp(style[prop].previous, style[prop].current, amt); + } + } + + // Apply the interpolated values + let gsapSettings = {}; + if (config.translateX) gsapSettings.x = style.translateX.previous; + if (config.skewX) gsapSettings.skewX = style.skewX.previous; + if (config.scale) gsapSettings.scale = style.scale.previous; + if (config.contrast) gsapSettings.filter = `contrast(${style.contrast.previous}%)`; + if (config.brightness) gsapSettings.filter = `${gsapSettings.filter ? gsapSettings.filter + ' ' : ''}brightness(${style.brightness.previous}%)`; + + gsap.set(row, gsapSettings); + }); + + // Continue the render loop + requestId = requestAnimationFrame(render); + }; + + // Start the render loop + const startRendering = () => { + if (!requestId) { + render(); + } + }; + + // Stop the render loop + const stopRendering = () => { + if (requestId) { + cancelAnimationFrame(requestId); + requestId = undefined; + } + }; + + const enterFullview = (element) => { + let parent = element.parentNode; + let fullview = document.createElement('div'); + let closebtn = document.createElement('div'); + closebtn.classList.add('as-hover-motion-close'); + closebtn.classList.add('position-absolute'); + closebtn.classList.add('top-0'); + closebtn.classList.add('end-0'); + closebtn.classList.add('p-4'); + let closeicon = document.createElement('i'); + closeicon.classList.add('fa-solid'); + closeicon.classList.add('fa-2xl'); + closeicon.classList.add('fa-xmark'); + closebtn.appendChild(closeicon); + fullview.appendChild(closebtn); + fullview.classList.add('as-hover-motion-gallery-fullview'); + document.body.appendChild(fullview); + // Logic to animate the middle image to full view using gsap Flip + // element.querySelector('.as-hover-motion-row-item-image').classList.add('as-hover-motion-row-item-img-large'); + const flipstate = Flip.getState(element); + // return; + fullview.prepend(element); + // Get the CSS variable value for the translation + // const transContent = getCSSVariableValue(content, '--trans-content'); + + // Create a GSAP timeline for the Flip animation + const tl = gsap.timeline(); + + // Add the Flip animation to the timeline + tl.add(Flip.from(flipstate, { + duration: 0.9, + ease: 'power4', + absolute: true, + onComplete: stopRendering + })) + // Scale and move + .to(element, { + scale: 1.2, + duration: 0.9, + ease: 'sine' + }, '<'); + + fullview.addEventListener('click', (ev) => { + const flipstate = Flip.getState(element); + parent.appendChild(element); + const tl = gsap.timeline(); + // Add the Flip animation to the timeline + tl.add(Flip.from(flipstate, { + duration: 0.9, + ease: 'power4', + absolute: true, + onComplete: startRendering + })).to(element, { + scale: 1, + y: '0', + duration: 0.9, + ease: 'power4' + }, '<'); + fullview.remove(); + }) + }; + + // Initialization function + const init = () => { + startRendering(); + // Initialize click event for the "Explore" button + $(gallery).find('.as-item-click').on('click', function () { + enterFullview(this); + }); + // Add touchstart event for mobile devices + $(gallery).find('.as-item-click').on('touchstart', function () { + enterFullview(this); + }); + }; + init(); + // Mouse movement event listener to update mouse position + window.addEventListener('mousemove', updateMousePosition); + // Touch move event listener for touch devices + window.addEventListener('touchmove', (ev) => { + const touch = ev.touches[0]; + updateMousePosition(touch); + }); + } + + // Preloading images and initializing setup when complete + $('.as-hover-motion-gallery').each(function (i, el) { + $(this).imagesLoaded( function() { + el.classList.remove('loading'); + renderGallery(el); + }); + }) + } + $( document ).ready(function() { + $(this).ImageMotion(); + }); +}(jQuery)); + diff --git a/framework/elements/hover_motion_gallery/hover_motion_gallery.php b/framework/elements/hover_motion_gallery/hover_motion_gallery.php new file mode 100644 index 00000000..ba6f41f8 --- /dev/null +++ b/framework/elements/hover_motion_gallery/hover_motion_gallery.php @@ -0,0 +1,79 @@ +get('images', ''); +if (empty($images)) { + return false; +} +$images = json_decode($images); +if (!count($images)) { + return false; +} +$document = Framework::getDocument(); + +$rows = $params->get('rows', 5); +$columns = ceil(count($images) / $rows); + +$images = array_merge($images, array_slice($images, 0, $columns)); +$rows++; + +$view_detail = $params->get('view_detail', 1); +$view_detail = $view_detail ? ' as-item-click' : ''; +$rounded_size = $params->get('rounded_size', '3'); +$border_radius = $params->get('border_radius', ''); +$height = $params->get('height', '80vh'); +if ($border_radius == 'rounded') { + $border_radius = ' ' . $border_radius . '-' . $rounded_size; +} else { + $border_radius = $border_radius !== '' ? ' ' . $border_radius : ''; +} + +echo ''; + +$document->loadGSAP('Flip'); +$document->loadImagesLoaded(); +$wa = Factory::getApplication()->getDocument()->getWebAssetManager(); +$wa->registerAndUseStyle('astroid.hovermotion', 'media/astroid/assets/vendor/hover_motion/css/base.css'); +$wa->registerAndUseScript('astroid.hovermotion', 'media/astroid/assets/vendor/hover_motion/js/index.js', ['relative' => true, 'version' => 'auto'], [], ['jquery']); +$element->style->child('.as-hover-motion-gallery')->addCss('height', $height); +$element->style->child('.as-hover-motion-gallery-inner')->addCss('grid-template-rows', 'repeat(' . $rows . ',1fr)'); +$element->style->child('.as-hover-motion-row')->addCss('grid-template-columns', 'repeat(' . $columns . ',1fr)'); \ No newline at end of file diff --git a/framework/elements/hover_motion_gallery/hover_motion_gallery.xml b/framework/elements/hover_motion_gallery/hover_motion_gallery.xml new file mode 100644 index 00000000..46c2867d --- /dev/null +++ b/framework/elements/hover_motion_gallery/hover_motion_gallery.xml @@ -0,0 +1,50 @@ + + + ASTROID_WIDGET_HOVER_MOTION_GALLERY_LABEL + ASTROID_WIDGET_HOVER_MOTION_GALLERY_LABEL + as-icon as-icon-select + ASTROID_ELEMENT_CATEGORY_MEDIA + widget +
+ +
+ + + + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
+ +
diff --git a/framework/library/astroid/Document.php b/framework/library/astroid/Document.php index 00bc4964..452d63e5 100644 --- a/framework/library/astroid/Document.php +++ b/framework/library/astroid/Document.php @@ -32,14 +32,15 @@ class Document protected $minify_css = false; protected $minify_js = false; protected $minify_html = false; - protected static $_fontawesome = false; - protected static $_fancybox = false; - protected static $_masonry = false; - protected static $_imagesloaded = false; - protected static $_gsap = false; - protected static $_slick = false; - protected static $_videojs = false; - protected static $_layout_paths = []; + protected static bool $_fontawesome = false; + protected static bool $_fancybox = false; + protected static bool $_masonry = false; + protected static bool $_imagesloaded = false; + protected static bool $_gsap = false; + protected static array $_gsap_plugins = []; + protected static bool $_slick = false; + protected static bool $_videojs = false; + protected static array $_layout_paths = []; protected $type = null; protected $modules = null; @@ -956,13 +957,17 @@ public function loadImagesLoaded(): void } } - public function loadGSAP(): void + public function loadGSAP($plugin = ''): void { + $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); if (!self::$_gsap) { - $wa = Factory::getApplication()->getDocument()->getWebAssetManager(); - $wa->registerAndUseScript('astroid.gsap', 'astroid/gsap.min.js', ['relative' => true, 'version' => 'auto']); + $wa->registerAndUseScript('astroid.gsap', 'media/astroid/assets/vendor/gsap/gsap.min.js', ['relative' => true, 'version' => 'auto']); self::$_gsap = true; } + if (!empty($plugin) && !in_array($plugin, self::$_gsap_plugins)) { + $wa->registerAndUseScript('astroid.gsap.' . $plugin, 'media/astroid/assets/vendor/gsap/'.$plugin.'.min.js', ['relative' => true, 'version' => 'auto']); + self::$_gsap_plugins[] = $plugin; + } } public function loadVideoBG(): void diff --git a/language/en-GB/en-GB.astroid.ini b/language/en-GB/en-GB.astroid.ini index 9dc43c66..cd8e4cfe 100644 --- a/language/en-GB/en-GB.astroid.ini +++ b/language/en-GB/en-GB.astroid.ini @@ -1651,4 +1651,10 @@ ASTROID_WIDGET_ACCORDION_ITEMS_LABEL="Accordion Items" ASTROID_WIDGET_ACCORDION_COLLAPSE_STYLE_LABEL="Collapse style" ASTROID_WIDGET_ACCORDION_CLOSE_ALL_LABEL="Close All" ASTROID_WIDGET_ACCORDION_OPEN_FIRST_ITEM_LABEL="Open first item" -ASTROID_WIDGET_ACCORDION_ALWAYS_OPEN_LABEL="Always Open?" \ No newline at end of file +ASTROID_WIDGET_ACCORDION_ALWAYS_OPEN_LABEL="Always Open?" + +; Hover Motion Gallery +ASTROID_WIDGET_HOVER_MOTION_GALLERY_LABEL="Hover Motion Gallery" +ASTROID_WIDGET_ROWS_LABEL="Rows" +ASTROID_WIDGET_HOVER_MOTION_GALLERY_ROWS_DESC="Determine the number of image rows on the Library" +ASTROID_WIDGET_VIEW_DETAIL="View Detail" \ No newline at end of file