Skip to content

Commit c7bcf5e

Browse files
committed
Add scroll, scrollTo, scrollBy, scrollIntoView
We add [`Element.scroll]`[1], [`Element.scrollTo`][2], [`Element.scrollBy`][3], and [`Element.scrollIntoView`][4]. [1]: https://developer.mozilla.org/en-US/docs/Web/API/Element/scroll [2]: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTo [3]: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollBy [4]: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
1 parent ae891c5 commit c7bcf5e

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

src/Web/DOM/Element.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,42 @@ exports.setScrollLeft = function (scrollLeft) {
133133
};
134134
};
135135

136+
exports._scroll = function (scrollToOptions) {
137+
return function (node) {
138+
return function () {
139+
node.scroll(scrollToOptions);
140+
return {};
141+
};
142+
};
143+
};
144+
145+
exports._scrollTo = function (scrollToOptions) {
146+
return function (node) {
147+
return function () {
148+
node.scrollTo(scrollToOptions);
149+
return {};
150+
};
151+
};
152+
};
153+
154+
exports._scrollBy = function (scrollToOptions) {
155+
return function (node) {
156+
return function () {
157+
node.scrollBy(scrollToOptions);
158+
return {};
159+
};
160+
};
161+
};
162+
163+
exports._scrollIntoView = function (scrollIntoViewOptions) {
164+
return function (node) {
165+
return function () {
166+
node.scrollIntoView(scrollIntoViewOptions);
167+
return {};
168+
};
169+
};
170+
};
171+
136172
exports.scrollWidth = function (el) {
137173
return function () {
138174
return el.scrollWidth;

src/Web/DOM/Element.purs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ module Web.DOM.Element
2929
, setScrollTop
3030
, scrollLeft
3131
, setScrollLeft
32+
, ScrollBehavior
33+
, ScrollAlignment
34+
, scroll
35+
, scrollBy
36+
, ScrollToOptions
37+
, scrollIntoView
38+
, ScrollIntoViewOptions
3239
, scrollWidth
3340
, scrollHeight
3441
, clientTop
@@ -121,6 +128,79 @@ foreign import setScrollTop :: Number -> Element -> Effect Unit
121128
foreign import scrollLeft :: Element -> Effect Number
122129
foreign import setScrollLeft :: Number -> Element -> Effect Unit
123130

131+
data ScrollBehavior = Auto | Smooth
132+
133+
stringScrollBehavior :: ScrollBehavior -> String
134+
stringScrollBehavior Auto = "Auto"
135+
stringScrollBehavior Smooth = "Smooth"
136+
137+
type ScrollToOptions =
138+
{ top :: Number
139+
, left :: Number
140+
, behavior :: ScrollBehavior
141+
}
142+
143+
type ScrollToOptions_ =
144+
{ top :: Number
145+
, left :: Number
146+
, behavior :: String
147+
}
148+
149+
foreign import _scroll :: Element -> ScrollToOptions_ -> Effect Unit
150+
151+
scroll :: Element -> ScrollToOptions -> Effect Unit
152+
scroll elem _opts = _scroll elem opts
153+
where
154+
opts = let { top,left, behavior } = _opts
155+
in { top, left, behavior: stringScrollBehavior behavior }
156+
157+
foreign import _scrollTo :: Element -> ScrollToOptions_ -> Effect Unit
158+
159+
scrollTo :: Element -> ScrollToOptions -> Effect Unit
160+
scrollTo elem _opts = _scrollTo elem opts
161+
where
162+
opts = let { top,left, behavior } = _opts
163+
in { top, left, behavior: stringScrollBehavior behavior }
164+
165+
foreign import _scrollBy :: Element -> ScrollToOptions_ -> Effect Unit
166+
167+
scrollBy :: Element -> ScrollToOptions -> Effect Unit
168+
scrollBy elem _opts = _scrollBy elem opts
169+
where
170+
opts = let { top,left, behavior } = _opts
171+
in { top, left, behavior: stringScrollBehavior behavior }
172+
173+
data ScrollAlignment = Start | Center | End | Nearest
174+
175+
stringScrollAlignment :: ScrollAlignment -> String
176+
stringScrollAlignment Start = "Start"
177+
stringScrollAlignment Center = "Center"
178+
stringScrollAlignment End = "End"
179+
stringScrollAlignment Nearest = "Nearest"
180+
181+
type ScrollIntoViewOptions =
182+
{ behavior :: ScrollBehavior
183+
, block :: ScrollAlignment
184+
, inline :: ScrollAlignment
185+
}
186+
187+
type ScrollIntoViewOptions_ =
188+
{ behavior :: String
189+
, block :: String
190+
, inline :: String
191+
}
192+
193+
foreign import _scrollIntoView :: Element -> ScrollIntoViewOptions_ -> Effect Unit
194+
195+
scrollIntoView :: Element -> ScrollIntoViewOptions -> Effect Unit
196+
scrollIntoView elem _opts = _scrollIntoView elem opts
197+
where
198+
opts = let { behavior, block, inline } = _opts
199+
in { behavior: stringScrollBehavior behavior
200+
, block: stringScrollAlignment block
201+
, inline: stringScrollAlignment inline
202+
}
203+
124204
foreign import scrollWidth :: Element -> Effect Number
125205
foreign import scrollHeight :: Element -> Effect Number
126206
foreign import clientTop :: Element -> Effect Number

0 commit comments

Comments
 (0)