diff --git a/src/Web/DOM/Element.js b/src/Web/DOM/Element.js index b6dd761..01b6188 100644 --- a/src/Web/DOM/Element.js +++ b/src/Web/DOM/Element.js @@ -133,6 +133,42 @@ exports.setScrollLeft = function (scrollLeft) { }; }; +exports._scroll = function (scrollToOptions) { + return function (node) { + return function () { + node.scroll(scrollToOptions); + return {}; + }; + }; +}; + +exports._scrollTo = function (scrollToOptions) { + return function (node) { + return function () { + node.scrollTo(scrollToOptions); + return {}; + }; + }; +}; + +exports._scrollBy = function (scrollToOptions) { + return function (node) { + return function () { + node.scrollBy(scrollToOptions); + return {}; + }; + }; +}; + +exports._scrollIntoView = function (scrollIntoViewOptions) { + return function (node) { + return function () { + node.scrollIntoView(scrollIntoViewOptions); + return {}; + }; + }; +}; + exports.scrollWidth = function (el) { return function () { return el.scrollWidth; diff --git a/src/Web/DOM/Element.purs b/src/Web/DOM/Element.purs index b02366e..9cc9feb 100644 --- a/src/Web/DOM/Element.purs +++ b/src/Web/DOM/Element.purs @@ -29,6 +29,14 @@ module Web.DOM.Element , setScrollTop , scrollLeft , setScrollLeft + , ScrollToOptions + , ScrollBehavior(..) + , ScrollAlignment(..) + , scroll + , scrollTo + , scrollBy + , ScrollIntoViewOptions + , scrollIntoView , scrollWidth , scrollHeight , clientTop @@ -121,6 +129,69 @@ foreign import setScrollTop :: Number -> Element -> Effect Unit foreign import scrollLeft :: Element -> Effect Number foreign import setScrollLeft :: Number -> Element -> Effect Unit +data ScrollBehavior = Auto | Smooth + +stringScrollBehavior :: ScrollBehavior -> String +stringScrollBehavior Auto = "auto" +stringScrollBehavior Smooth = "smooth" + +type ScrollToOptions = + { top :: Number + , left :: Number + , behavior :: ScrollBehavior + } + +type ScrollToOptions_ = + { top :: Number + , left :: Number + , behavior :: String + } + +foreign import _scroll :: ScrollToOptions_ -> Element -> Effect Unit + +scroll :: ScrollToOptions -> Element -> Effect Unit +scroll opts = _scroll (opts { behavior = stringScrollBehavior opts.behavior }) + +foreign import _scrollTo :: ScrollToOptions_ -> Element -> Effect Unit + +scrollTo :: ScrollToOptions -> Element -> Effect Unit +scrollTo opts = _scrollTo (opts { behavior = stringScrollBehavior opts.behavior }) + +foreign import _scrollBy :: ScrollToOptions_ -> Element -> Effect Unit + +scrollBy :: ScrollToOptions -> Element -> Effect Unit +scrollBy opts = _scrollBy (opts { behavior = stringScrollBehavior opts.behavior }) + +data ScrollAlignment = Start | Center | End | Nearest + +stringScrollAlignment :: ScrollAlignment -> String +stringScrollAlignment Start = "start" +stringScrollAlignment Center = "center" +stringScrollAlignment End = "end" +stringScrollAlignment Nearest = "nearest" + +type ScrollIntoViewOptions = + { behavior :: ScrollBehavior + , block :: ScrollAlignment + , inline :: ScrollAlignment + } + +type ScrollIntoViewOptions_ = + { behavior :: String + , block :: String + , inline :: String + } + +foreign import _scrollIntoView :: ScrollIntoViewOptions_ -> Element -> Effect Unit + +scrollIntoView :: ScrollIntoViewOptions -> Element -> Effect Unit +scrollIntoView _opts = _scrollIntoView opts + where + opts = { behavior: stringScrollBehavior _opts.behavior + , block: stringScrollAlignment _opts.block + , inline: stringScrollAlignment _opts.inline + } + foreign import scrollWidth :: Element -> Effect Number foreign import scrollHeight :: Element -> Effect Number foreign import clientTop :: Element -> Effect Number