Skip to content

Commit 3adcd65

Browse files
lsgroLuigi Sgro
and
Luigi Sgro
authored
Add support for ShadowRoot API (#34)
* Update compiler version to rc5 in CI config * Add ShadowRoot module * Move element-related members to Element module * Improve code style Co-authored-by: Luigi Sgro <[email protected]>
1 parent 67a0bd8 commit 3adcd65

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

src/Web/DOM/Element.js

+8
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,11 @@ exports.clientHeight = function (el) {
170170
return el.clientHeight;
171171
};
172172
};
173+
174+
exports._attachShadow = function(props) {
175+
return function (el) {
176+
return function() {
177+
return el.attachShadow(props);
178+
};
179+
};
180+
};

src/Web/DOM/Element.purs

+24
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ module Web.DOM.Element
3636
, clientLeft
3737
, clientWidth
3838
, clientHeight
39+
, ShadowRootInit
40+
, attachShadow
3941
) where
4042

4143
import Prelude
@@ -50,6 +52,7 @@ import Web.DOM.Internal.Types (Element) as Exports
5052
import Web.DOM.Internal.Types (Element, HTMLCollection, Node)
5153
import Web.DOM.NonDocumentTypeChildNode (NonDocumentTypeChildNode)
5254
import Web.DOM.ParentNode (ParentNode)
55+
import Web.DOM.ShadowRoot (ShadowRoot, ShadowRootMode)
5356
import Web.Event.EventTarget (EventTarget)
5457
import Web.Internal.FFI (unsafeReadProtoTagged)
5558

@@ -130,3 +133,24 @@ foreign import clientTop :: Element -> Effect Number
130133
foreign import clientLeft :: Element -> Effect Number
131134
foreign import clientWidth :: Element -> Effect Number
132135
foreign import clientHeight :: Element -> Effect Number
136+
137+
type ShadowRootInit = {
138+
mode :: ShadowRootMode,
139+
delegatesFocus :: Boolean
140+
}
141+
142+
attachShadow :: ShadowRootInit -> Element -> Effect ShadowRoot
143+
attachShadow = _attachShadow <<< initToProps
144+
145+
type ShadowRootProps = {
146+
mode :: String,
147+
delegatesFocus :: Boolean
148+
}
149+
150+
initToProps :: ShadowRootInit -> ShadowRootProps
151+
initToProps init = {
152+
mode: show init.mode,
153+
delegatesFocus: init.delegatesFocus
154+
}
155+
156+
foreign import _attachShadow :: ShadowRootProps -> Element -> Effect ShadowRoot

src/Web/DOM/ShadowRoot.js

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"use strict";
2+
3+
exports._mode = function (el) {
4+
return el.mode;
5+
};
6+
7+
exports.host = function (el) {
8+
return function() {
9+
return el.host;
10+
};
11+
};

src/Web/DOM/ShadowRoot.purs

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
module Web.DOM.ShadowRoot
2+
( ShadowRoot
3+
, ShadowRootMode (..)
4+
, toNode
5+
, host
6+
, mode
7+
) where
8+
9+
import Prelude
10+
import Data.Maybe (Maybe(..))
11+
import Effect (Effect)
12+
import Unsafe.Coerce (unsafeCoerce)
13+
import Web.DOM.Internal.Types (Element, Node)
14+
15+
foreign import data ShadowRoot :: Type
16+
17+
toNode :: ShadowRoot -> Node
18+
toNode = unsafeCoerce
19+
20+
data ShadowRootMode = Open | Closed
21+
22+
instance showShadowRootMode :: Show ShadowRootMode where
23+
show Open = "open"
24+
show Closed = "closed"
25+
26+
mode :: ShadowRoot -> Maybe ShadowRootMode
27+
mode = modeFromString <<< _mode
28+
where
29+
modeFromString = case _ of
30+
"open" -> Just Open
31+
"closed" -> Just Closed
32+
_ -> Nothing
33+
34+
foreign import host :: ShadowRoot -> Effect Element
35+
foreign import _mode :: ShadowRoot -> String

0 commit comments

Comments
 (0)