diff --git a/core/modules/macros/story/story.js b/core/modules/macros/story/story.js index b0f8398c3..2557c4713 100644 --- a/core/modules/macros/story/story.js +++ b/core/modules/macros/story/story.js @@ -151,8 +151,13 @@ exports.eventMap["tw-CloseTiddler"] = function(event) { for(t=story.tiddlers.length-1; t>=0; t--) { if(story.tiddlers[t].title === event.tiddlerTitle) { storyElement = this.storyNode.children[t]; - // Remove the DOM node - storyElement.domNode.parentNode.removeChild(storyElement.domNode); + // Invoke the storyview to animate the closure + if(this.storyview && this.storyview.close) { + if(!this.storyview.close(storyElement,this.lastNavigationEvent)) { + // Only delete the DOM element if the storyview.close() returned false + storyElement.domNode.parentNode.removeChild(storyElement.domNode); + } + } // Remove the story element node this.storyNode.children.splice(t,1); // Remove the record in the story diff --git a/core/modules/macros/story/views/classic.js b/core/modules/macros/story/views/classic.js index deb6da3d5..25a367787 100644 --- a/core/modules/macros/story/views/classic.js +++ b/core/modules/macros/story/views/classic.js @@ -26,6 +26,38 @@ ClassicScroller.prototype.navigate = function(targetTiddlerNode,isNew,sourceEven $tw.utils.scrollIntoView(targetTiddlerNode.domNode); }; +ClassicScroller.prototype.close = function(targetTiddlerNode,sourceEvent) { + var targetElement = targetTiddlerNode.domNode; + // Get the current height of the tiddler + var currHeight = targetElement.offsetHeight; + // Put a wrapper around the dom node we're closing + var wrapperElement = document.createElement("div"); + targetElement.parentNode.insertBefore(wrapperElement,targetElement); + wrapperElement.appendChild(targetElement); + // Animate the closure + var d = ($tw.config.preferences.animationDuration/1000).toFixed(8) + "s" + wrapperElement.style[$tw.browser.transformorigin] = "0% 0%"; + wrapperElement.style[$tw.browser.transform] = "translateX(0px)"; + wrapperElement.style.opacity = "1.0"; + wrapperElement.style.height = currHeight + "px"; + wrapperElement.style[$tw.browser.transition] = "-" + $tw.browser.prefix.toLowerCase() + "-transform " + d + " ease-in-out, " + + "opacity " + d + " ease-out, " + + "height " + d + " ease-in-out"; + $tw.utils.nextTick(function() { + wrapperElement.style[$tw.browser.transform] = "translateX(" + window.innerWidth + "px)"; + wrapperElement.style.opacity = "0.0"; + wrapperElement.style.height = "0px"; + }); + // Attach an event handler for th eend of the transition + wrapperElement.addEventListener("webkitTransitionEnd",function(event) { + if(wrapperElement.parentNode) { + wrapperElement.parentNode.removeChild(wrapperElement); + } + },true); + // Returning true causes the DOM node not to be deleted + return true; +}; + exports.classic = ClassicScroller; })();