Skip to content

Add scroll, scrollTo, scrollBy, scrollIntoView #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/Web/DOM/Element.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
71 changes: 71 additions & 0 deletions src/Web/DOM/Element.purs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ module Web.DOM.Element
, setScrollTop
, scrollLeft
, setScrollLeft
, ScrollToOptions
, ScrollBehavior(..)
, ScrollAlignment(..)
, scroll
, scrollTo
, scrollBy
, ScrollIntoViewOptions
, scrollIntoView
, scrollWidth
, scrollHeight
, clientTop
Expand Down Expand Up @@ -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
Expand Down