git.iko.soy/rowtype-yoga/ry-blocks
on main help sign in
Fix tests
cccc9e0Mark Eibes
src/Yoga/Block.purs+3−3
@@ -1,7 +1,7 @@
1module Yoga.Block where
1module Yoga.Block where
2
2
3import Prim.Row (class Union)
3import Prim.Row (class Union)
4−import React.Basic (ReactComponent)
4+import React.Basic (JSX, ReactComponent)
5import Yoga.Block.Atom.Button as Button
5import Yoga.Block.Atom.Button as Button
6import Yoga.Block.Atom.Icon as Icon
6import Yoga.Block.Atom.Icon as Icon
7import Yoga.Block.Atom.Range as Range
7import Yoga.Block.Atom.Range as Range
@@ -47,10 +47,10 @@ range = Range.component
47segmented ∷ ReactComponent Segmented.Props
47segmented ∷ ReactComponent Segmented.Props
48segmented = Segmented.component
48segmented = Segmented.component
49
49
50−sidebar ∷ ∀ p q. Union p q Sidebar.Props => ReactComponent { | p }
50+sidebar ∷ ∀ p q. Union p q Sidebar.Props => ReactComponent { children ∷ Array JSX | p }
51sidebar = Sidebar.component
51sidebar = Sidebar.component
52
52
53−stack ∷ ∀ p q. Union p q Stack.Props => ReactComponent { | p }
53+stack ∷ ∀ p q. Union p q Stack.Props => ReactComponent { children ∷ Array JSX | p }
54stack = Stack.component
54stack = Stack.component
55
55
56switcher ∷ ∀ p q. Union p q Switcher.Props => ReactComponent { | p }
56switcher ∷ ∀ p q. Union p q Switcher.Props => ReactComponent { | p }
src/Yoga/Block/Atom/Button/Style.purs+57−56
@@ -4,10 +4,10 @@ import Yoga.Prelude.Style
4import Data.Interpolate (i)
4import Data.Interpolate (i)
5import Yoga.Block.Container.Style (colour)
5import Yoga.Block.Container.Style (colour)
6
6
7−type Props f r =
7+type Props f r
8− ( css ∷ f Style
8+ = ( css ∷ f Style
9− | r
9+ | r
10− )
10+ )
11
11
12gradientBackground ∷ StyleProperty
12gradientBackground ∷ StyleProperty
13gradientBackground =
13gradientBackground =
@@ -40,7 +40,8 @@ button =
40 , borderTop: str $ i "1px solid " colour.interfaceBackgroundHighlight
40 , borderTop: str $ i "1px solid " colour.interfaceBackgroundHighlight
41 , borderBottom: str $ i "1px solid " colour.interfaceBackgroundShadow
41 , borderBottom: str $ i "1px solid " colour.interfaceBackgroundShadow
42 , display: inlineFlex
42 , display: inlineFlex
43− , padding: str "calc(var(--s-1) * 0.85) var(--s0)"
43+ , padding: str "calc(var(--s-1) * 0.8) var(--s0)"
44+ , paddingBottom: str "calc(var(--s-1) * 0.8 + 1px)"
44 , justifyContent: center
45 , justifyContent: center
45 , alignItems: center
46 , alignItems: center
46 , borderRadius: var "--s-1"
47 , borderRadius: var "--s-1"
@@ -53,61 +54,61 @@ button =
53 , userSelect: none
54 , userSelect: none
54 , transition: str "all 0.2s ease-out" <> str "transform 50ms ease-in"
55 , transition: str "all 0.2s ease-out" <> str "transform 50ms ease-in"
55 , """&[data-button-shape="pill"]""":
56 , """&[data-button-shape="pill"]""":
56− nest
57+ nest
57− { borderRadius: str "calc(var(--s1) * 0.85)"
58+ { borderRadius: str "calc(var(--s1) * 0.85)"
58− , padding: str "calc(var(--s-1) * 0.85) var(--s0)"
59+ , padding: str "calc(var(--s-1) * 0.85) var(--s0)"
59− , paddingBottom: str "calc(var(--s-1))"
60+ , paddingBottom: str "calc(var(--s-1))"
60− }
61+ }
61 , """&[data-button-type="primary"]""":
62 , """&[data-button-type="primary"]""":
62− nest
63+ nest
63− { background: gradientBackground
64+ { background: gradientBackground
64− , backgroundSize: str "200% 200%"
65+ , backgroundSize: str "200% 200%"
65− , fontWeight: str "600"
66+ , fontWeight: str "600"
66− , letterSpacing: str "calc(var(--s-5)* (0.1))"
67+ , letterSpacing: str "calc(var(--s-5)* (0.1))"
67− , animation: backgroundAnimation <> str " alternate ease-out 10s infinite"
68+ , animation: backgroundAnimation <> str " alternate ease-out 10s infinite"
68− , boxShadow: str "0 1px 4px 0px rgba(0,0,0,0.40)"
69+ , boxShadow: str "0 1px 4px 0px rgba(0,0,0,0.40)"
69− , borderColor: str "transparent"
70+ , borderColor: str "transparent"
70− , color: str colour.highlightText
71+ , color: str colour.highlightText
71− , """&:focus-visible""":
72+ , """&:focus-visible""":
72− nest
73+ nest
73− { borderColor: str "inherit"
74+ { borderColor: str "inherit"
74− }
75+ }
75− , """&:active""":
76+ , """&:active""":
76− nest
77+ nest
77− { boxShadow: str "inset 0 1px 6px rgba(0,0,0,0.40)"
78+ { boxShadow: str "inset 0 1px 6px rgba(0,0,0,0.40)"
78− , border: str $ i "1px solid transparent"
79+ , border: str $ i "1px solid transparent"
79− }
80+ }
80− , "&:disabled":
81+ , "&:disabled":
81− nest
82+ nest
82− { background: str colour.highlightDisabled
83+ { background: str colour.highlightDisabled
83− }
84+ }
84− }
85+ }
85 , """&[data-button-type="dangerous"]""":
86 , """&[data-button-type="dangerous"]""":
86− nest
87+ nest
87− { color: str $ colour.interfaceDangerousText
88+ { color: str $ colour.interfaceDangerousText
88− , background: str $ colour.interfaceBackgroundDangerous
89+ , background: str $ colour.interfaceBackgroundDangerous
89− , fontWeight: str "600"
90+ , fontWeight: str "600"
90− , letterSpacing: str "calc(var(--s-5) * -0.10)"
91+ , letterSpacing: str "calc(var(--s-5) * -0.10)"
91− }
92+ }
92 , """&:focus""": nest { outline: none }
93 , """&:focus""": nest { outline: none }
93 , """&:focus-visible""":
94 , """&:focus-visible""":
94− nest
95+ nest
95− { boxShadow: str $ "0 0 0 var(--s-4) " <> colour.highlight
96+ { boxShadow: str $ "0 0 0 var(--s-4) " <> colour.highlight
96− }
97+ }
97 , """&:active""":
98 , """&:active""":
98− nest
99+ nest
99− { boxShadow: str $ "inset 0 1px var(--s-1) rgba(0,0,0,0.20)"
100+ { boxShadow: str $ "inset 0 1px var(--s-1) rgba(0,0,0,0.20)"
100− , borderTop: str $ i "1px solid " colour.interfaceBackgroundShadow
101+ , borderTop: str $ i "1px solid " colour.interfaceBackgroundShadow
101− , borderBottom: str $ i "1px solid " colour.interfaceBackgroundShadow
102+ , borderBottom: str $ i "1px solid " colour.interfaceBackgroundShadow
102− , transform: str "scale3d(0.95,0.95,0.95)"
103+ , transform: str "scale3d(0.95,0.95,0.95)"
103− , transition: str "transform 50ms ease"
104+ , transition: str "transform 50ms ease"
104− }
105+ }
105 , "&:disabled":
106 , "&:disabled":
106− nest
107+ nest
107− { color: str colour.interfaceTextDisabled
108+ { color: str colour.interfaceTextDisabled
108− , boxShadow: none
109+ , boxShadow: none
109− , background: str colour.interfaceBackgroundDisabled
110+ , background: str colour.interfaceBackgroundDisabled
110− , borderTop: str $ i "1px solid " colour.interfaceBackgroundShadow
111+ , borderTop: str $ i "1px solid " colour.interfaceBackgroundShadow
111− , borderBottom: str $ i "1px solid " colour.interfaceBackgroundShadow
112+ , borderBottom: str $ i "1px solid " colour.interfaceBackgroundShadow
112− }
113+ }
113 }
114 }
src/Yoga/Block/Atom/Icon/Story.purs+6−6
@@ -17,12 +17,12 @@ default ∷
17default =
17default =
18 { title: "Atom/Icon"
18 { title: "Atom/Icon"
19 , decorators:
19 , decorators:
20− [ \storyFn ->
20+ [ \storyFn ->
21− R.div_
21+ R.div_
22− [ element E.global { styles: Styles.global }
22+ [ element E.global { styles: Styles.global }
23− , unsafePerformEffect storyFn
23+ , unsafePerformEffect storyFn
24− ]
24+ ]
25− ]
25+ ]
26 }
26 }
27
27
28icon ∷ Effect JSX
28icon ∷ Effect JSX
src/Yoga/Block/Atom/Segmented/View/ActiveIndicator.purs+125−72
@@ -13,7 +13,7 @@ import Literals.Undefined (undefined)
13import MotionValue (useMotionValue)
13import MotionValue (useMotionValue)
14import MotionValue as MotionValue
14import MotionValue as MotionValue
15import Partial.Unsafe (unsafeCrashWith)
15import Partial.Unsafe (unsafeCrashWith)
16−import React.Basic.DOM (css)
16+import React.Basic.DOM (CSS, css)
17import React.Basic.Emotion as Emotion
17import React.Basic.Emotion as Emotion
18import React.Basic.Hooks (reactComponent)
18import React.Basic.Hooks (reactComponent)
19import React.Basic.Hooks as React
19import React.Basic.Hooks as React
@@ -21,12 +21,12 @@ import Unsafe.Coerce (unsafeCoerce)
21import Yoga.Block.Atom.Segmented.Style as Style
21import Yoga.Block.Atom.Segmented.Style as Style
22import Yoga.Block.Hook.Scroll (useScrollPosition)
22import Yoga.Block.Hook.Scroll (useScrollPosition)
23
23
24−type Props =
24+type Props
25− { activeItemRefs ∷ TwoOrMore (Ref (Nullable Node))
25+ = { activeItemRefs ∷ TwoOrMore (Ref (Nullable Node))
26− , activeItemIndex ∷ Int
26+ , activeItemIndex ∷ Int
27− , updateActiveIndex ∷ Int -> Effect Unit
27+ , updateActiveIndex ∷ Int -> Effect Unit
28− , windowWidth ∷ Number
28+ , windowWidth ∷ Number
29− }
29+ }
30
30
31component ∷ ReactComponent Props
31component ∷ ReactComponent Props
32component =
32component =
@@ -42,14 +42,17 @@ component =
42 _ <-
42 _ <-
43 runMaybeT do
43 runMaybeT do
44 rawStyles <- traverse getStyle props.activeItemRefs
44 rawStyles <- traverse getStyle props.activeItemRefs
45+ let
46+ -- [TODO] ScrollX is questionable
45− let styles = rawStyles <#> \s -> s { left = s.left + scrollX }
47+ styles = rawStyles <#> \s -> s { left = s.left + scrollX }
46 unless (maybeAnimationVariants == Just styles) do
48 unless (maybeAnimationVariants == Just styles) do
47 setVariants (Just styles) # lift
49 setVariants (Just styles) # lift
48 mempty
50 mempty
49 useLayoutEffect maybeDragX do
51 useLayoutEffect maybeDragX do
50 case maybeDragX, maybeAnimationVariants of
52 case maybeDragX, maybeAnimationVariants of
51 Just x, Just animationVariants -> do
53 Just x, Just animationVariants -> do
54+ let
52− let { left, width } = handleDrag { activeItemIndex: props.activeItemIndex, animationVariants, x }
55+ { left, width } = handleDrag { activeItemIndex: props.activeItemIndex, animationVariants, x }
53 activeLeft # MotionValue.set left
56 activeLeft # MotionValue.set left
54 activeWidth # MotionValue.set width
57 activeWidth # MotionValue.set width
55 _, _ -> mempty
58 _, _ -> mempty
@@ -76,42 +79,44 @@ component =
76 , dragMomentum: Motion.dragMomentum false
79 , dragMomentum: Motion.dragMomentum false
77 , animate: Motion.animate $ indexToVariant props.activeItemIndex
80 , animate: Motion.animate $ indexToVariant props.activeItemIndex
78 , style:
81 , style:
79− css
82+ css
80− { left: activeLeft
83+ { left: activeLeft
81− , width: activeWidth
84+ , width: activeWidth
82− }
85+ }
83 , onDragStart:
86 , onDragStart:
84− Motion.onDragStart \_ pi -> do
87+ Motion.onDragStart \_ pi -> do
85− setDragX (Just pi.point.x)
88+ setDragX (Just pi.point.x)
86 , onDrag:
89 , onDrag:
87− Motion.onDrag \_ pi -> do
90+ Motion.onDrag \_ pi -> do
88− when (isJust maybeDragX) $ setDragX (Just pi.point.x)
91+ when (isJust maybeDragX) $ setDragX (Just pi.point.x)
89 , onDragEnd:
92 , onDragEnd:
90− Motion.onDragEnd \_ pi -> do
93+ Motion.onDragEnd \_ pi -> do
91− let
94+ let
92− x =
95+ x =
93− maybeDragX
96+ maybeDragX
94− # fromMaybe' \_ -> unsafeCrashWith "no x"
97+ # fromMaybe' \_ -> unsafeCrashWith "no x"
98+
95− newIdx =
99+ newIdx =
96− findOverlapping
100+ findOverlapping
97− props.activeItemIndex
101+ props.activeItemIndex
98− animationVariants
102+ animationVariants
99− x
103+ x
104+
100− v =
105+ v =
101− animationVariants TwoOrMore.!! newIdx
106+ animationVariants TwoOrMore.!! newIdx
102− # fromMaybe' \_ -> unsafeCrashWith "omg"
107+ # fromMaybe' \_ -> unsafeCrashWith "omg"
103− setDragX Nothing
108+ setDragX Nothing
104− activeLeft # MotionValue.set v.left
109+ activeLeft # MotionValue.set v.left
105− activeWidth # MotionValue.set v.width
110+ activeWidth # MotionValue.set v.width
106− props.updateActiveIndex newIdx
111+ props.updateActiveIndex newIdx
107 , dragConstraints: Motion.dragConstraints { left: 0, right: 0 }
112 , dragConstraints: Motion.dragConstraints { left: 0, right: 0 }
108 , dragElastic: Motion.dragElastic false
113 , dragElastic: Motion.dragElastic false
109 , transition:
114 , transition:
110− Motion.transition
115+ Motion.transition
111− { type: "tween"
116+ { type: "tween"
112− , duration: if isJust maybeDragX then 0.0 else 0.167
117+ , duration: if isJust maybeDragX then 0.0 else 0.167
113− , ease: "easeOut"
118+ , ease: "easeOut"
114− }
119+ }
115 , _aria: Object.fromHomogeneous { hidden: "true" }
120 , _aria: Object.fromHomogeneous { hidden: "true" }
116 }
121 }
117
122
@@ -127,21 +132,49 @@ getStyle itemRef = do
127 , top: br.top
132 , top: br.top
128 }
133 }
129
134
135+mkVariantForIndex :: Int -> CSS
136+mkVariantForIndex i =
137+ css
138+ { width: unsafeStyle _.width
139+ , height: unsafeStyle _.height
140+ , x: unsafeStyle _.left
141+ , y: unsafeStyle _.top
142+ }
143+ where
144+ unsafeStyle :: _ -> TwoOrMore NodeRef -> Number
145+ unsafeStyle fn refs =
146+ unsafeGetRefAtI refs
147+ # unsafeGetBoundingBoxFromRef
148+ <#> fn
149+ # fromMaybe 0.0
150+
151+ unsafeGetRefAtI :: TwoOrMore NodeRef -> NodeRef
152+ unsafeGetRefAtI x =
153+ (x TwoOrMore.!! i)
154+ # fromMaybe' \_ -> unsafeCrashWith "Trying to get non-existing index"
155+
156+ unsafeGetBoundingBoxFromRef = unsafePerformEffect <<< getBoundingBoxFromRef
157+
130indexToVariant ∷ Int -> VariantLabel
158indexToVariant ∷ Int -> VariantLabel
131indexToVariant = show >>> unsafeCoerce
159indexToVariant = show >>> unsafeCoerce
132
160
133−type BBox =
161+type BBox
134− { top ∷ Number, left ∷ Number, width ∷ Number, height ∷ Number }
162+ = { top ∷ Number, left ∷ Number, width ∷ Number, height ∷ Number }
135
163
136findOverlapping ∷ Int -> TwoOrMore BBox -> Number -> Int
164findOverlapping ∷ Int -> TwoOrMore BBox -> Number -> Int
137findOverlapping activeIndex styles x =
165findOverlapping activeIndex styles x =
138 fromMaybe activeIndex do
166 fromMaybe activeIndex do
139 curr <- styles TwoOrMore.!! activeIndex
167 curr <- styles TwoOrMore.!! activeIndex
168+ let
140− let fst = TwoOrMore.head styles
169+ fst = TwoOrMore.head styles
170+ let
141− let lst = TwoOrMore.last styles
171+ lst = TwoOrMore.last styles
172+ let
142− let inside e = (e.left < x) && (e.left + e.width) >= x
173+ inside e = (e.left < x) && (e.left + e.width) >= x
174+ let
143− let tooFarLeft = MZ.guard (x <= fst.left + fst.width) $> 0
175+ tooFarLeft = MZ.guard (x <= fst.left + fst.width) $> 0
176+ let
144− let tooFarRight = MZ.guard (x >= lst.left) $> TwoOrMore.length styles - 1
177+ tooFarRight = MZ.guard (x >= lst.left) $> TwoOrMore.length styles - 1
145 TwoOrMore.findIndex inside styles <|> tooFarLeft <|> tooFarRight
178 TwoOrMore.findIndex inside styles <|> tooFarLeft <|> tooFarRight
146
179
147handleDrag ∷
180handleDrag ∷
@@ -151,11 +184,16 @@ handleDrag ∷
151 } ->
184 } ->
152 { left ∷ Number, width ∷ Number }
185 { left ∷ Number, width ∷ Number }
153handleDrag { x, activeItemIndex, animationVariants } = do
186handleDrag { x, activeItemIndex, animationVariants } = do
187+ let
154− let idx = findOverlapping activeItemIndex animationVariants x
188+ idx = findOverlapping activeItemIndex animationVariants x
189+ let
155− let av = animationVariants
190+ av = animationVariants
191+ let
156− let firstVariant = av # TwoOrMore.head
192+ firstVariant = av # TwoOrMore.head
193+ let
157− let lastVariant = av # TwoOrMore.last
194+ lastVariant = av # TwoOrMore.last
195+ let
158− let baseVariant = av TwoOrMore.!! idx # fromMaybe' \_ -> unsafeCrashWith "shit"
196+ baseVariant = av TwoOrMore.!! idx # fromMaybe' \_ -> unsafeCrashWith "shit"
159 let
197 let
160 closestVariant =
198 closestVariant =
161 if x >= (baseVariant.left + (baseVariant.width / 2.0)) then
199 if x >= (baseVariant.left + (baseVariant.width / 2.0)) then
@@ -169,29 +207,44 @@ handleDrag { x, activeItemIndex, animationVariants } = do
169 else
207 else
170 closestVariant /\ baseVariant
208 closestVariant /\ baseVariant
171 -- Total
209 -- Total
210+ let
172− let rangeStart = smaller.left + (smaller.width / 2.0)
211+ rangeStart = smaller.left + (smaller.width / 2.0)
212+ let
173− let rangeEnd = greater.left + (greater.width / 2.0)
213+ rangeEnd = greater.left + (greater.width / 2.0)
214+ let
174− let range = rangeEnd - rangeStart
215+ range = rangeEnd - rangeStart
216+ let
175− let ratio = ((x - rangeStart) / range)
217+ ratio = ((x - rangeStart) / range)
218+ let
176− let interpolatedWidth = (greater.width * ratio) + smaller.width * (1.0 - ratio)
219+ interpolatedWidth = (greater.width * ratio) + smaller.width * (1.0 - ratio)
177 -- Right
220 -- Right
221+ let
178− let rangeStartRight = smaller.left + smaller.width
222+ rangeStartRight = smaller.left + smaller.width
223+ let
179− let rangeEndRight = greater.left + greater.width
224+ rangeEndRight = greater.left + greater.width
225+ let
180− let rangeRight = rangeEndRight - rangeStartRight
226+ rangeRight = rangeEndRight - rangeStartRight
227+ let
181− let ratioRight = ((x + (interpolatedWidth / 2.0) - rangeStartRight) / rangeRight)
228+ ratioRight = ((x + (interpolatedWidth / 2.0) - rangeStartRight) / rangeRight)
182 -- Left
229 -- Left
230+ let
183− let rangeStartLeft = smaller.left
231+ rangeStartLeft = smaller.left
232+ let
184− let rangeEndLeft = greater.left
233+ rangeEndLeft = greater.left
234+ let
185− let rangeLeft = rangeEndLeft - rangeStartLeft
235+ rangeLeft = rangeEndLeft - rangeStartLeft
236+ let
186− let ratioLeft = (((x - (interpolatedWidth / 2.0)) - rangeStartLeft) / rangeLeft)
237+ ratioLeft = (((x - (interpolatedWidth / 2.0)) - rangeStartLeft) / rangeLeft)
187 -- Individual
238 -- Individual
239+ let
188− let left = rangeStartLeft + (ratioLeft * rangeLeft)
240+ left = rangeStartLeft + (ratioLeft * rangeLeft)
241+ let
189− let right = rangeStartRight + (ratioRight * rangeRight)
242+ right = rangeStartRight + (ratioRight * rangeRight)
243+ let
190− let width = right - left
244+ width = right - left
191 if x < firstVariant.left then
245 if x < firstVariant.left then
192 { left: firstVariant.left, width: firstVariant.width }
246 { left: firstVariant.left, width: firstVariant.width }
193− else
194− if x >= lastVariant.left + lastVariant.width then do
247+ else if x >= lastVariant.left + lastVariant.width then do
195− { left: lastVariant.left, width: lastVariant.width }
248+ { left: lastVariant.left, width: lastVariant.width }
196− else do
249+ else do
197− { left, width }
250+ { left, width }
src/Yoga/Block/Container/Style.purs+1−1
@@ -108,7 +108,7 @@ mkGlobal maybeMode =
108 }
108 }
109 , "&:visited":
109 , "&:visited":
110 nest
110 nest
111− { color: str colour.backgroundLayer1
111+ { color: str colour.text
112 , textDecorationColor: str colour.backgroundLayer1
112 , textDecorationColor: str colour.backgroundLayer1
113 }
113 }
114 }
114 }
src/Yoga/Block/Internal.purs+442−459
@@ -67,8 +67,8 @@ foreign import mkForwardRefComponentEffect ∷
67
67
68foreign import createRef ∷ ∀ a. Effect (Ref a)
68foreign import createRef ∷ ∀ a. Effect (Ref a)
69
69
70−type NodeRef =
70+type NodeRef
71− Ref (Nullable Node)
71+ = Ref (Nullable Node)
72
72
73getBoundingBoxFromRef ∷ Ref (Nullable Node) -> Effect (Maybe DOMRect)
73getBoundingBoxFromRef ∷ Ref (Nullable Node) -> Effect (Maybe DOMRect)
74getBoundingBoxFromRef itemRef = do
74getBoundingBoxFromRef itemRef = do
@@ -84,8 +84,8 @@ getHTMLElementFromRef itemRef =
84forwardedRefAsMaybe ∷ ∀ a. Ref a -> Maybe (Ref a)
84forwardedRefAsMaybe ∷ ∀ a. Ref a -> Maybe (Ref a)
85forwardedRefAsMaybe r = safelyWrapped # uorToMaybe >>= Nullable.toMaybe
85forwardedRefAsMaybe r = safelyWrapped # uorToMaybe >>= Nullable.toMaybe
86 where
86 where
87− safelyWrapped ∷ UndefinedOr (Nullable (Ref a))
87+ safelyWrapped ∷ UndefinedOr (Nullable (Ref a))
88− safelyWrapped = unsafeCoerce r
88+ safelyWrapped = unsafeCoerce r
89
89
90foreign import unsafeUnionDroppingUndefined ∷ ∀ r1 r2 r3. Record r1 -> Record r2 -> Record r3
90foreign import unsafeUnionDroppingUndefined ∷ ∀ r1 r2 r3. Record r1 -> Record r2 -> Record r3
91
91
@@ -94,9 +94,6 @@ foreign import unsafeMergeSecond ∷ ∀ r1 r2 r3. Record r1 -> Record r2 -> Rec
94unsafeEmotion ∷ ∀ props propsA propsB. ReactComponent { className ∷ String, css ∷ E.Style | props } -> Record propsA -> { className ∷ String, css ∷ E.Style | propsB } -> JSX
94unsafeEmotion ∷ ∀ props propsA propsB. ReactComponent { className ∷ String, css ∷ E.Style | props } -> Record propsA -> { className ∷ String, css ∷ E.Style | propsB } -> JSX
95unsafeEmotion component propsA propsB = E.element component (unsafeUnionDroppingUndefined propsB propsA)
95unsafeEmotion component propsA propsB = E.element component (unsafeUnionDroppingUndefined propsB propsA)
96
96
97−unsafeEmotionKeyed ∷ ∀ props propsA propsB. ReactComponent { className ∷ String, css ∷ E.Style, key ∷ String | props } -> Record propsA -> { className ∷ String, css ∷ E.Style | propsB } -> JSX
98−unsafeEmotionKeyed component propsA propsB = E.elementKeyed component (unsafeUnionDroppingUndefined propsB propsA)
99−
100emotionDiv_ ∷
97emotionDiv_ ∷
101 ∀ props props_.
98 ∀ props props_.
102 Lacks "ref" props =>
99 Lacks "ref" props =>
@@ -137,21 +134,7 @@ pickDefined ∷
137 { ref ∷ Ref (Nullable Node) | b }
134 { ref ∷ Ref (Nullable Node) | b }
138pickDefined ref = runFn3 pickDefinedFn ref ks
135pickDefined ref = runFn3 pickDefinedFn ref ks
139 where
136 where
140− ks = Array.fromFoldable $ keys (RProxy ∷ RProxy b)
137+ ks = Array.fromFoldable $ keys (RProxy ∷ RProxy b)
141−
142−-- [TODO] Delete?
143−emotionInputKeyed_ ∷
144− ∀ props props_.
145− Lacks "ref" props =>
146− Union props props_ ( className ∷ String, css ∷ Style, ref ∷ Ref (Nullable Node), key ∷ String | InputProps ) =>
147− { | InputProps } ->
148− { className ∷ String
149− , css ∷ Style
150− , key ∷ String
151− | props
152− } ->
153− JSX
154−emotionInputKeyed_ = unsafeEmotionKeyed unsafeInput
155
138
156emotionInput_ ∷
139emotionInput_ ∷
157 ∀ props props_.
140 ∀ props props_.
@@ -178,8 +161,8 @@ emotionInput ∷
178 JSX
161 JSX
179emotionInput ref = emotionInput_ <<< pickDefined ref <<< coerceUnOptional
162emotionInput ref = emotionInput_ <<< pickDefined ref <<< coerceUnOptional
180 where
163 where
181− coerceUnOptional ∷ { | InputPropsF OptionalProp more } -> { | InputPropsF Id more }
164+ coerceUnOptional ∷ { | InputPropsF OptionalProp more } -> { | InputPropsF Id more }
182− coerceUnOptional = unsafeCoerce
165+ coerceUnOptional = unsafeCoerce
183
166
184unsafeInput ∷ ∀ r. ReactComponent (Record r)
167unsafeInput ∷ ∀ r. ReactComponent (Record r)
185unsafeInput = dangerous "input"
168unsafeInput = dangerous "input"
@@ -217,443 +200,443 @@ dangerous = unsafePerformEffect <<< unsafeCreateDOMComponent
217
200
218-- type DivProps =
201-- type DivProps =
219-- Props_div
202-- Props_div
220−type DivProps =
203+type DivProps
221− DivPropsF Id ()
204+ = DivPropsF Id ()
222
205
223−type DivPropsF f more =
206+type DivPropsF f more
224− ( _aria ∷ f (Object String)
207+ = ( _aria ∷ f (Object String)
225− , _data ∷ f (Object String)
208+ , _data ∷ f (Object String)
226− , about ∷ f String
209+ , about ∷ f String
227− , acceptCharset ∷ f String
210+ , acceptCharset ∷ f String
228− , accessKey ∷ f String
211+ , accessKey ∷ f String
229− , allowFullScreen ∷ f Boolean
212+ , allowFullScreen ∷ f Boolean
230− , autoFocus ∷ f Boolean
213+ , autoFocus ∷ f Boolean
231− , autoPlay ∷ f Boolean
214+ , autoPlay ∷ f Boolean
232− , capture ∷ f Boolean
215+ , capture ∷ f Boolean
233− , cellPadding ∷ f String
216+ , cellPadding ∷ f String
234− , cellSpacing ∷ f String
217+ , cellSpacing ∷ f String
235− , charSet ∷ f String
218+ , charSet ∷ f String
236− , children ∷ f (Array JSX)
219+ , children ∷ f (Array JSX)
237− , classID ∷ f String
220+ , classID ∷ f String
238− , colSpan ∷ f Int
221+ , colSpan ∷ f Int
239− , contentEditable ∷ f Boolean
222+ , contentEditable ∷ f Boolean
240− , contextMenu ∷ f String
223+ , contextMenu ∷ f String
241− , crossOrigin ∷ f String
224+ , crossOrigin ∷ f String
242− , dangerouslySetInnerHTML ∷ f { __html ∷ f String }
225+ , dangerouslySetInnerHTML ∷ f { __html ∷ f String }
243− , datatype ∷ f String
226+ , datatype ∷ f String
244− , dateTime ∷ f String
227+ , dateTime ∷ f String
245− , dir ∷ f String
228+ , dir ∷ f String
246− , draggable ∷ f Boolean
229+ , draggable ∷ f Boolean
247− , encType ∷ f String
230+ , encType ∷ f String
248− , formAction ∷ f String
231+ , formAction ∷ f String
249− , formEncType ∷ f String
232+ , formEncType ∷ f String
250− , formMethod ∷ f String
233+ , formMethod ∷ f String
251− , formNoValidate ∷ f Boolean
234+ , formNoValidate ∷ f Boolean
252− , formTarget ∷ f String
235+ , formTarget ∷ f String
253− , frameBorder ∷ f String
236+ , frameBorder ∷ f String
254− , hidden ∷ f Boolean
237+ , hidden ∷ f Boolean
255− , hrefLang ∷ f String
238+ , hrefLang ∷ f String
256− , htmlFor ∷ f String
239+ , htmlFor ∷ f String
257− , httpEquiv ∷ f String
240+ , httpEquiv ∷ f String
258− , icon ∷ f String
241+ , icon ∷ f String
259− , id ∷ f String
242+ , id ∷ f String
260− , inlist ∷ f String
243+ , inlist ∷ f String
261− , inputMode ∷ f String
244+ , inputMode ∷ f String
262− , is ∷ f String
245+ , is ∷ f String
263− , itemID ∷ f String
246+ , itemID ∷ f String
264− , itemProp ∷ f String
247+ , itemProp ∷ f String
265− , itemRef ∷ f String
248+ , itemRef ∷ f String
266− , itemScope ∷ f Boolean
249+ , itemScope ∷ f Boolean
267− , itemType ∷ f String
250+ , itemType ∷ f String
268− , keyParams ∷ f String
251+ , keyParams ∷ f String
269− , keyType ∷ f String
252+ , keyType ∷ f String
270− , lang ∷ f String
253+ , lang ∷ f String
271− , marginHeight ∷ f String
254+ , marginHeight ∷ f String
272− , marginWidth ∷ f String
255+ , marginWidth ∷ f String
273− , maxLength ∷ f Int
256+ , maxLength ∷ f Int
274− , mediaGroup ∷ f String
257+ , mediaGroup ∷ f String
275− , minLength ∷ f Int
258+ , minLength ∷ f Int
276− , noValidate ∷ f Boolean
259+ , noValidate ∷ f Boolean
277− , onAnimationEnd ∷ f EventHandler
260+ , onAnimationEnd ∷ f EventHandler
278− , onAnimationIteration ∷ f EventHandler
261+ , onAnimationIteration ∷ f EventHandler
279− , onAnimationStart ∷ f EventHandler
262+ , onAnimationStart ∷ f EventHandler
280− , onBlur ∷ f EventHandler
263+ , onBlur ∷ f EventHandler
281− , onClick ∷ f EventHandler
264+ , onClick ∷ f EventHandler
282− , onCompositionEnd ∷ f EventHandler
265+ , onCompositionEnd ∷ f EventHandler
283− , onCompositionStart ∷ f EventHandler
266+ , onCompositionStart ∷ f EventHandler
284− , onCompositionUpdate ∷ f EventHandler
267+ , onCompositionUpdate ∷ f EventHandler
285− , onContextMenu ∷ f EventHandler
268+ , onContextMenu ∷ f EventHandler
286− , onCopy ∷ f EventHandler
269+ , onCopy ∷ f EventHandler
287− , onCut ∷ f EventHandler
270+ , onCut ∷ f EventHandler
288− , onDoubleClick ∷ f EventHandler
271+ , onDoubleClick ∷ f EventHandler
289− , onDrag ∷ f EventHandler
272+ , onDrag ∷ f EventHandler
290− , onDragEnd ∷ f EventHandler
273+ , onDragEnd ∷ f EventHandler
291− , onDragEnter ∷ f EventHandler
274+ , onDragEnter ∷ f EventHandler
292− , onDragExit ∷ f EventHandler
275+ , onDragExit ∷ f EventHandler
293− , onDragLeave ∷ f EventHandler
276+ , onDragLeave ∷ f EventHandler
294− , onDragOver ∷ f EventHandler
277+ , onDragOver ∷ f EventHandler
295− , onDragStart ∷ f EventHandler
278+ , onDragStart ∷ f EventHandler
296− , onDrop ∷ f EventHandler
279+ , onDrop ∷ f EventHandler
297− , onFocus ∷ f EventHandler
280+ , onFocus ∷ f EventHandler
298− , onGotPointerCapture ∷ f EventHandler
281+ , onGotPointerCapture ∷ f EventHandler
299− , onInvalid ∷ f EventHandler
282+ , onInvalid ∷ f EventHandler
300− , onKeyDown ∷ f EventHandler
283+ , onKeyDown ∷ f EventHandler
301− , onKeyPress ∷ f EventHandler
284+ , onKeyPress ∷ f EventHandler
302− , onKeyUp ∷ f EventHandler
285+ , onKeyUp ∷ f EventHandler
303− , onLostPointerCapture ∷ f EventHandler
286+ , onLostPointerCapture ∷ f EventHandler
304− , onMouseDown ∷ f EventHandler
287+ , onMouseDown ∷ f EventHandler
305− , onMouseEnter ∷ f EventHandler
288+ , onMouseEnter ∷ f EventHandler
306− , onMouseLeave ∷ f EventHandler
289+ , onMouseLeave ∷ f EventHandler
307− , onMouseMove ∷ f EventHandler
290+ , onMouseMove ∷ f EventHandler
308− , onMouseOut ∷ f EventHandler
291+ , onMouseOut ∷ f EventHandler
309− , onMouseOver ∷ f EventHandler
292+ , onMouseOver ∷ f EventHandler
310− , onMouseUp ∷ f EventHandler
293+ , onMouseUp ∷ f EventHandler
311− , onPaste ∷ f EventHandler
294+ , onPaste ∷ f EventHandler
312− , onPointerCancel ∷ f EventHandler
295+ , onPointerCancel ∷ f EventHandler
313− , onPointerDown ∷ f EventHandler
296+ , onPointerDown ∷ f EventHandler
314− , onPointerEnter ∷ f EventHandler
297+ , onPointerEnter ∷ f EventHandler
315− , onPointerLeave ∷ f EventHandler
298+ , onPointerLeave ∷ f EventHandler
316− , onPointerMove ∷ f EventHandler
299+ , onPointerMove ∷ f EventHandler
317− , onPointerOut ∷ f EventHandler
300+ , onPointerOut ∷ f EventHandler
318− , onPointerOver ∷ f EventHandler
301+ , onPointerOver ∷ f EventHandler
319− , onPointerUp ∷ f EventHandler
302+ , onPointerUp ∷ f EventHandler
320− , onSelect ∷ f EventHandler
303+ , onSelect ∷ f EventHandler
321− , onSubmit ∷ f EventHandler
304+ , onSubmit ∷ f EventHandler
322− , onTouchCancel ∷ f EventHandler
305+ , onTouchCancel ∷ f EventHandler
323− , onTouchEnd ∷ f EventHandler
306+ , onTouchEnd ∷ f EventHandler
324− , onTouchMove ∷ f EventHandler
307+ , onTouchMove ∷ f EventHandler
325− , onTouchStart ∷ f EventHandler
308+ , onTouchStart ∷ f EventHandler
326− , onTransitionEnd ∷ f EventHandler
309+ , onTransitionEnd ∷ f EventHandler
327− , onWheel ∷ f EventHandler
310+ , onWheel ∷ f EventHandler
328− , prefix ∷ f String
311+ , prefix ∷ f String
329− , property ∷ f String
312+ , property ∷ f String
330− , radioGroup ∷ f String
313+ , radioGroup ∷ f String
331− , readOnly ∷ f Boolean
314+ , readOnly ∷ f Boolean
332− , ref ∷ f (Ref (Nullable Node))
315+ , ref ∷ f (Ref (Nullable Node))
333− , resource ∷ f String
316+ , resource ∷ f String
334− , role ∷ f String
317+ , role ∷ f String
335− , rowSpan ∷ f Int
318+ , rowSpan ∷ f Int
336− , scoped ∷ f Boolean
319+ , scoped ∷ f Boolean
337− , seamless ∷ f Boolean
320+ , seamless ∷ f Boolean
338− , security ∷ f String
321+ , security ∷ f String
339− , spellCheck ∷ f Boolean
322+ , spellCheck ∷ f Boolean
340− , srcDoc ∷ f JSX
323+ , srcDoc ∷ f JSX
341− , srcLang ∷ f String
324+ , srcLang ∷ f String
342− , srcSet ∷ f String
325+ , srcSet ∷ f String
343− , style ∷ f CSS
326+ , style ∷ f CSS
344− , suppressContentEditableWarning ∷ f Boolean
327+ , suppressContentEditableWarning ∷ f Boolean
345− , tabIndex ∷ f Int
328+ , tabIndex ∷ f Int
346− , title ∷ f String
329+ , title ∷ f String
347− , typeof ∷ f String
330+ , typeof ∷ f String
348− , unselectable ∷ f Boolean
331+ , unselectable ∷ f Boolean
349− , useMap ∷ f String
332+ , useMap ∷ f String
350− , vocab ∷ f String
333+ , vocab ∷ f String
351− , wmode ∷ f String
334+ , wmode ∷ f String
352− | more
335+ | more
353− )
336+ )
354
337
355−type InputProps =
338+type InputProps
356− InputPropsF Id ()
339+ = InputPropsF Id ()
357
340
358−type InputPropsF f more =
341+type InputPropsF f more
359− ( _aria ∷ f (Object String)
342+ = ( _aria ∷ f (Object String)
360− , _data ∷ f (Object String)
343+ , _data ∷ f (Object String)
361− , about ∷ f String
344+ , about ∷ f String
362− , accept ∷ f String
345+ , accept ∷ f String
363− , acceptCharset ∷ f String
346+ , acceptCharset ∷ f String
364− , accessKey ∷ f String
347+ , accessKey ∷ f String
365− , allowFullScreen ∷ f Boolean
348+ , allowFullScreen ∷ f Boolean
366− , alt ∷ f String
349+ , alt ∷ f String
367− , autoCapitalize ∷ f String
350+ , autoCapitalize ∷ f String
368− , autoComplete ∷ f String
351+ , autoComplete ∷ f String
369− , autoCorrect ∷ f String
352+ , autoCorrect ∷ f String
370− , autoFocus ∷ f Boolean
353+ , autoFocus ∷ f Boolean
371− , autoPlay ∷ f Boolean
354+ , autoPlay ∷ f Boolean
372− , autoSave ∷ f String
355+ , autoSave ∷ f String
373− , capture ∷ f Boolean
356+ , capture ∷ f Boolean
374− , cellPadding ∷ f String
357+ , cellPadding ∷ f String
375− , cellSpacing ∷ f String
358+ , cellSpacing ∷ f String
376− , charSet ∷ f String
359+ , charSet ∷ f String
377− , checked ∷ f Boolean
360+ , checked ∷ f Boolean
378− , classID ∷ f String
361+ , classID ∷ f String
379− , colSpan ∷ f Int
362+ , colSpan ∷ f Int
380− , contentEditable ∷ f Boolean
363+ , contentEditable ∷ f Boolean
381− , contextMenu ∷ f String
364+ , contextMenu ∷ f String
382− , crossOrigin ∷ f String
365+ , crossOrigin ∷ f String
383− , dangerouslySetInnerHTML ∷ f { __html ∷ f String }
366+ , dangerouslySetInnerHTML ∷ f { __html ∷ f String }
384− , datatype ∷ f String
367+ , datatype ∷ f String
385− , dateTime ∷ f String
368+ , dateTime ∷ f String
386− , defaultChecked ∷ f String
369+ , defaultChecked ∷ f String
387− , defaultValue ∷ f String
370+ , defaultValue ∷ f String
388− , dir ∷ f String
371+ , dir ∷ f String
389− , disabled ∷ f Boolean
372+ , disabled ∷ f Boolean
390− , draggable ∷ f Boolean
373+ , draggable ∷ f Boolean
391− , encType ∷ f String
374+ , encType ∷ f String
392− , form ∷ f String
375+ , form ∷ f String
393− , formAction ∷ f String
376+ , formAction ∷ f String
394− , formEncType ∷ f String
377+ , formEncType ∷ f String
395− , formMethod ∷ f String
378+ , formMethod ∷ f String
396− , formNoValidate ∷ f Boolean
379+ , formNoValidate ∷ f Boolean
397− , formTarget ∷ f String
380+ , formTarget ∷ f String
398− , frameBorder ∷ f String
381+ , frameBorder ∷ f String
399− , height ∷ f String
382+ , height ∷ f String
400− , hidden ∷ f Boolean
383+ , hidden ∷ f Boolean
401− , hrefLang ∷ f String
384+ , hrefLang ∷ f String
402− , htmlFor ∷ f String
385+ , htmlFor ∷ f String
403− , httpEquiv ∷ f String
386+ , httpEquiv ∷ f String
404− , icon ∷ f String
387+ , icon ∷ f String
405− , id ∷ f String
388+ , id ∷ f String
406− , inlist ∷ f String
389+ , inlist ∷ f String
407− , inputMode ∷ f String
390+ , inputMode ∷ f String
408− , is ∷ f String
391+ , is ∷ f String
409− , itemID ∷ f String
392+ , itemID ∷ f String
410− , itemProp ∷ f String
393+ , itemProp ∷ f String
411− , itemRef ∷ f String
394+ , itemRef ∷ f String
412− , itemScope ∷ f Boolean
395+ , itemScope ∷ f Boolean
413− , itemType ∷ f String
396+ , itemType ∷ f String
414− , keyParams ∷ f String
397+ , keyParams ∷ f String
415− , keyType ∷ f String
398+ , keyType ∷ f String
416− , lang ∷ f String
399+ , lang ∷ f String
417− , list ∷ f String
400+ , list ∷ f String
418− , marginHeight ∷ f String
401+ , marginHeight ∷ f String
419− , marginWidth ∷ f String
402+ , marginWidth ∷ f String
420− , maxLength ∷ f Int
403+ , maxLength ∷ f Int
421− , mediaGroup ∷ f String
404+ , mediaGroup ∷ f String
422− , minLength ∷ f Int
405+ , minLength ∷ f Int
423− , multiple ∷ f Boolean
406+ , multiple ∷ f Boolean
424− , name ∷ f String
407+ , name ∷ f String
425− , noValidate ∷ f Boolean
408+ , noValidate ∷ f Boolean
426− , onAnimationEnd ∷ f EventHandler
409+ , onAnimationEnd ∷ f EventHandler
427− , onAnimationIteration ∷ f EventHandler
410+ , onAnimationIteration ∷ f EventHandler
428− , onAnimationStart ∷ f EventHandler
411+ , onAnimationStart ∷ f EventHandler
429− , onBlur ∷ f EventHandler
412+ , onBlur ∷ f EventHandler
430− , onChange ∷ f EventHandler
413+ , onChange ∷ f EventHandler
431− , onClick ∷ f EventHandler
414+ , onClick ∷ f EventHandler
432− , onCompositionEnd ∷ f EventHandler
415+ , onCompositionEnd ∷ f EventHandler
433− , onCompositionStart ∷ f EventHandler
416+ , onCompositionStart ∷ f EventHandler
434− , onCompositionUpdate ∷ f EventHandler
417+ , onCompositionUpdate ∷ f EventHandler
435− , onContextMenu ∷ f EventHandler
418+ , onContextMenu ∷ f EventHandler
436− , onCopy ∷ f EventHandler
419+ , onCopy ∷ f EventHandler
437− , onCut ∷ f EventHandler
420+ , onCut ∷ f EventHandler
438− , onDoubleClick ∷ f EventHandler
421+ , onDoubleClick ∷ f EventHandler
439− , onDrag ∷ f EventHandler
422+ , onDrag ∷ f EventHandler
440− , onDragEnd ∷ f EventHandler
423+ , onDragEnd ∷ f EventHandler
441− , onDragEnter ∷ f EventHandler
424+ , onDragEnter ∷ f EventHandler
442− , onDragExit ∷ f EventHandler
425+ , onDragExit ∷ f EventHandler
443− , onDragLeave ∷ f EventHandler
426+ , onDragLeave ∷ f EventHandler
444− , onDragOver ∷ f EventHandler
427+ , onDragOver ∷ f EventHandler
445− , onDragStart ∷ f EventHandler
428+ , onDragStart ∷ f EventHandler
446− , onDrop ∷ f EventHandler
429+ , onDrop ∷ f EventHandler
447− , onFocus ∷ f EventHandler
430+ , onFocus ∷ f EventHandler
448− , onGotPointerCapture ∷ f EventHandler
431+ , onGotPointerCapture ∷ f EventHandler
449− , onInvalid ∷ f EventHandler
432+ , onInvalid ∷ f EventHandler
450− , onKeyDown ∷ f EventHandler
433+ , onKeyDown ∷ f EventHandler
451− , onKeyPress ∷ f EventHandler
434+ , onKeyPress ∷ f EventHandler
452− , onKeyUp ∷ f EventHandler
435+ , onKeyUp ∷ f EventHandler
453− , onLostPointerCapture ∷ f EventHandler
436+ , onLostPointerCapture ∷ f EventHandler
454− , onMouseDown ∷ f EventHandler
437+ , onMouseDown ∷ f EventHandler
455− , onMouseEnter ∷ f EventHandler
438+ , onMouseEnter ∷ f EventHandler
456− , onMouseLeave ∷ f EventHandler
439+ , onMouseLeave ∷ f EventHandler
457− , onMouseMove ∷ f EventHandler
440+ , onMouseMove ∷ f EventHandler
458− , onMouseOut ∷ f EventHandler
441+ , onMouseOut ∷ f EventHandler
459− , onMouseOver ∷ f EventHandler
442+ , onMouseOver ∷ f EventHandler
460− , onMouseUp ∷ f EventHandler
443+ , onMouseUp ∷ f EventHandler
461− , onPaste ∷ f EventHandler
444+ , onPaste ∷ f EventHandler
462− , onPointerCancel ∷ f EventHandler
445+ , onPointerCancel ∷ f EventHandler
463− , onPointerDown ∷ f EventHandler
446+ , onPointerDown ∷ f EventHandler
464− , onPointerEnter ∷ f EventHandler
447+ , onPointerEnter ∷ f EventHandler
465− , onPointerLeave ∷ f EventHandler
448+ , onPointerLeave ∷ f EventHandler
466− , onPointerMove ∷ f EventHandler
449+ , onPointerMove ∷ f EventHandler
467− , onPointerOut ∷ f EventHandler
450+ , onPointerOut ∷ f EventHandler
468− , onPointerOver ∷ f EventHandler
451+ , onPointerOver ∷ f EventHandler
469− , onPointerUp ∷ f EventHandler
452+ , onPointerUp ∷ f EventHandler
470− , onSelect ∷ f EventHandler
453+ , onSelect ∷ f EventHandler
471− , onSubmit ∷ f EventHandler
454+ , onSubmit ∷ f EventHandler
472− , onTouchCancel ∷ f EventHandler
455+ , onTouchCancel ∷ f EventHandler
473− , onTouchEnd ∷ f EventHandler
456+ , onTouchEnd ∷ f EventHandler
474− , onTouchMove ∷ f EventHandler
457+ , onTouchMove ∷ f EventHandler
475− , onTouchStart ∷ f EventHandler
458+ , onTouchStart ∷ f EventHandler
476− , onTransitionEnd ∷ f EventHandler
459+ , onTransitionEnd ∷ f EventHandler
477− , onWheel ∷ f EventHandler
460+ , onWheel ∷ f EventHandler
478− , pattern ∷ f String
461+ , pattern ∷ f String
479− , placeholder ∷ f String
462+ , placeholder ∷ f String
480− , prefix ∷ f String
463+ , prefix ∷ f String
481− , property ∷ f String
464+ , property ∷ f String
482− , radioGroup ∷ f String
465+ , radioGroup ∷ f String
483− , ref ∷ f (Ref (Nullable Node))
466+ , ref ∷ f (Ref (Nullable Node))
484− , readOnly ∷ f Boolean
467+ , readOnly ∷ f Boolean
485− , required ∷ f Boolean
468+ , required ∷ f Boolean
486− , resource ∷ f String
469+ , resource ∷ f String
487− , results ∷ f String
470+ , results ∷ f String
488− , role ∷ f String
471+ , role ∷ f String
489− , rowSpan ∷ f Int
472+ , rowSpan ∷ f Int
490− , scoped ∷ f Boolean
473+ , scoped ∷ f Boolean
491− , seamless ∷ f Boolean
474+ , seamless ∷ f Boolean
492− , security ∷ f String
475+ , security ∷ f String
493− , size ∷ f Int
476+ , size ∷ f Int
494− , spellCheck ∷ f Boolean
477+ , spellCheck ∷ f Boolean
495− , src ∷ f String
478+ , src ∷ f String
496− , srcDoc ∷ f JSX
479+ , srcDoc ∷ f JSX
497− , srcLang ∷ f String
480+ , srcLang ∷ f String
498− , srcSet ∷ f String
481+ , srcSet ∷ f String
499− , step ∷ f String
482+ , step ∷ f String
500− , style ∷ f CSS
483+ , style ∷ f CSS
501− , suppressContentEditableWarning ∷ f Boolean
484+ , suppressContentEditableWarning ∷ f Boolean
502− , tabIndex ∷ f Int
485+ , tabIndex ∷ f Int
503− , title ∷ f String
486+ , title ∷ f String
504− , title ∷ f String
487+ , title ∷ f String
505− , type ∷ f String
488+ , type ∷ f String
506− , typeof ∷ f String
489+ , typeof ∷ f String
507− , unselectable ∷ f Boolean
490+ , unselectable ∷ f Boolean
508− , useMap ∷ f String
491+ , useMap ∷ f String
509− , value ∷ f String
492+ , value ∷ f String
510− , vocab ∷ f String
493+ , vocab ∷ f String
511− , width ∷ f String
494+ , width ∷ f String
512− , wmode ∷ f String
495+ , wmode ∷ f String
513− , min ∷ f (String)
496+ , min ∷ f (String)
514− , max ∷ f (String)
497+ , max ∷ f (String)
515− | more
498+ | more
516− )
499+ )
517
500
518−type ButtonProps =
501+type ButtonProps
519− ButtonPropsF Id ()
502+ = ButtonPropsF Id ()
520
503
521−type ButtonPropsF f more =
504+type ButtonPropsF f more
522− ( _aria ∷ f (Object String)
505+ = ( _aria ∷ f (Object String)
523− , _data ∷ f (Object String)
506+ , _data ∷ f (Object String)
524− , about ∷ f String
507+ , about ∷ f String
525− , acceptCharset ∷ f String
508+ , acceptCharset ∷ f String
526− , accessKey ∷ f String
509+ , accessKey ∷ f String
527− , allowFullScreen ∷ f Boolean
510+ , allowFullScreen ∷ f Boolean
528− , allowTransparency ∷ f Boolean
511+ , allowTransparency ∷ f Boolean
529− , autoFocus ∷ f Boolean
512+ , autoFocus ∷ f Boolean
530− , autoPlay ∷ f Boolean
513+ , autoPlay ∷ f Boolean
531− , capture ∷ f Boolean
514+ , capture ∷ f Boolean
532− , cellPadding ∷ f String
515+ , cellPadding ∷ f String
533− , cellSpacing ∷ f String
516+ , cellSpacing ∷ f String
534− , charSet ∷ f String
517+ , charSet ∷ f String
535− , children ∷ f (Array JSX)
518+ , children ∷ f (Array JSX)
536− , classID ∷ f String
519+ , classID ∷ f String
537− , className ∷ f String
520+ , className ∷ f String
538− , colSpan ∷ f Int
521+ , colSpan ∷ f Int
539− , contentEditable ∷ f Boolean
522+ , contentEditable ∷ f Boolean
540− , contextMenu ∷ f String
523+ , contextMenu ∷ f String
541− , crossOrigin ∷ f String
524+ , crossOrigin ∷ f String
542− , dangerouslySetInnerHTML ∷ f { __html ∷ String }
525+ , dangerouslySetInnerHTML ∷ f { __html ∷ String }
543− , datatype ∷ f String
526+ , datatype ∷ f String
544− , dateTime ∷ f String
527+ , dateTime ∷ f String
545− , dir ∷ f String
528+ , dir ∷ f String
546− , disabled ∷ f Boolean
529+ , disabled ∷ f Boolean
547− , draggable ∷ f Boolean
530+ , draggable ∷ f Boolean
548− , encType ∷ f String
531+ , encType ∷ f String
549− , form ∷ f String
532+ , form ∷ f String
550− , formAction ∷ f String
533+ , formAction ∷ f String
551− , formEncType ∷ f String
534+ , formEncType ∷ f String
552− , formMethod ∷ f String
535+ , formMethod ∷ f String
553− , formNoValidate ∷ f Boolean
536+ , formNoValidate ∷ f Boolean
554− , formTarget ∷ f String
537+ , formTarget ∷ f String
555− , frameBorder ∷ f String
538+ , frameBorder ∷ f String
556− , hidden ∷ f Boolean
539+ , hidden ∷ f Boolean
557− , hrefLang ∷ f String
540+ , hrefLang ∷ f String
558− , htmlFor ∷ f String
541+ , htmlFor ∷ f String
559− , httpEquiv ∷ f String
542+ , httpEquiv ∷ f String
560− , icon ∷ f String
543+ , icon ∷ f String
561− , id ∷ f String
544+ , id ∷ f String
562− , inlist ∷ f String
545+ , inlist ∷ f String
563− , inputMode ∷ f String
546+ , inputMode ∷ f String
564− , is ∷ f String
547+ , is ∷ f String
565− , itemID ∷ f String
548+ , itemID ∷ f String
566− , itemProp ∷ f String
549+ , itemProp ∷ f String
567− , itemRef ∷ f String
550+ , itemRef ∷ f String
568− , itemScope ∷ f Boolean
551+ , itemScope ∷ f Boolean
569− , itemType ∷ f String
552+ , itemType ∷ f String
570− , key ∷ f String
553+ , key ∷ f String
571− , keyParams ∷ f String
554+ , keyParams ∷ f String
572− , keyType ∷ f String
555+ , keyType ∷ f String
573− , lang ∷ f String
556+ , lang ∷ f String
574− , marginHeight ∷ f String
557+ , marginHeight ∷ f String
575− , marginWidth ∷ f String
558+ , marginWidth ∷ f String
576− , maxLength ∷ f Int
559+ , maxLength ∷ f Int
577− , mediaGroup ∷ f String
560+ , mediaGroup ∷ f String
578− , minLength ∷ f Int
561+ , minLength ∷ f Int
579− , name ∷ f String
562+ , name ∷ f String
580− , noValidate ∷ f Boolean
563+ , noValidate ∷ f Boolean
581− , onAnimationEnd ∷ f EventHandler
564+ , onAnimationEnd ∷ f EventHandler
582− , onAnimationIteration ∷ f EventHandler
565+ , onAnimationIteration ∷ f EventHandler
583− , onAnimationStart ∷ f EventHandler
566+ , onAnimationStart ∷ f EventHandler
584− , onBlur ∷ f EventHandler
567+ , onBlur ∷ f EventHandler
585− , onClick ∷ f EventHandler
568+ , onClick ∷ f EventHandler
586− , onCompositionEnd ∷ f EventHandler
569+ , onCompositionEnd ∷ f EventHandler
587− , onCompositionStart ∷ f EventHandler
570+ , onCompositionStart ∷ f EventHandler
588− , onCompositionUpdate ∷ f EventHandler
571+ , onCompositionUpdate ∷ f EventHandler
589− , onContextMenu ∷ f EventHandler
572+ , onContextMenu ∷ f EventHandler
590− , onCopy ∷ f EventHandler
573+ , onCopy ∷ f EventHandler
591− , onCut ∷ f EventHandler
574+ , onCut ∷ f EventHandler
592− , onDoubleClick ∷ f EventHandler
575+ , onDoubleClick ∷ f EventHandler
593− , onDrag ∷ f EventHandler
576+ , onDrag ∷ f EventHandler
594− , onDragEnd ∷ f EventHandler
577+ , onDragEnd ∷ f EventHandler
595− , onDragEnter ∷ f EventHandler
578+ , onDragEnter ∷ f EventHandler
596− , onDragExit ∷ f EventHandler
579+ , onDragExit ∷ f EventHandler
597− , onDragLeave ∷ f EventHandler
580+ , onDragLeave ∷ f EventHandler
598− , onDragOver ∷ f EventHandler
581+ , onDragOver ∷ f EventHandler
599− , onDragStart ∷ f EventHandler
582+ , onDragStart ∷ f EventHandler
600− , onDrop ∷ f EventHandler
583+ , onDrop ∷ f EventHandler
601− , onFocus ∷ f EventHandler
584+ , onFocus ∷ f EventHandler
602− , onGotPointerCapture ∷ f EventHandler
585+ , onGotPointerCapture ∷ f EventHandler
603− , onInvalid ∷ f EventHandler
586+ , onInvalid ∷ f EventHandler
604− , onKeyDown ∷ f EventHandler
587+ , onKeyDown ∷ f EventHandler
605− , onKeyPress ∷ f EventHandler
588+ , onKeyPress ∷ f EventHandler
606− , onKeyUp ∷ f EventHandler
589+ , onKeyUp ∷ f EventHandler
607− , onLostPointerCapture ∷ f EventHandler
590+ , onLostPointerCapture ∷ f EventHandler
608− , onMouseDown ∷ f EventHandler
591+ , onMouseDown ∷ f EventHandler
609− , onMouseEnter ∷ f EventHandler
592+ , onMouseEnter ∷ f EventHandler
610− , onMouseLeave ∷ f EventHandler
593+ , onMouseLeave ∷ f EventHandler
611− , onMouseMove ∷ f EventHandler
594+ , onMouseMove ∷ f EventHandler
612− , onMouseOut ∷ f EventHandler
595+ , onMouseOut ∷ f EventHandler
613− , onMouseOver ∷ f EventHandler
596+ , onMouseOver ∷ f EventHandler
614− , onMouseUp ∷ f EventHandler
597+ , onMouseUp ∷ f EventHandler
615− , onPaste ∷ f EventHandler
598+ , onPaste ∷ f EventHandler
616− , onPointerCancel ∷ f EventHandler
599+ , onPointerCancel ∷ f EventHandler
617− , onPointerDown ∷ f EventHandler
600+ , onPointerDown ∷ f EventHandler
618− , onPointerEnter ∷ f EventHandler
601+ , onPointerEnter ∷ f EventHandler
619− , onPointerLeave ∷ f EventHandler
602+ , onPointerLeave ∷ f EventHandler
620− , onPointerMove ∷ f EventHandler
603+ , onPointerMove ∷ f EventHandler
621− , onPointerOut ∷ f EventHandler
604+ , onPointerOut ∷ f EventHandler
622− , onPointerOver ∷ f EventHandler
605+ , onPointerOver ∷ f EventHandler
623− , onPointerUp ∷ f EventHandler
606+ , onPointerUp ∷ f EventHandler
624− , onSelect ∷ f EventHandler
607+ , onSelect ∷ f EventHandler
625− , onSubmit ∷ f EventHandler
608+ , onSubmit ∷ f EventHandler
626− , onTouchCancel ∷ f EventHandler
609+ , onTouchCancel ∷ f EventHandler
627− , onTouchEnd ∷ f EventHandler
610+ , onTouchEnd ∷ f EventHandler
628− , onTouchMove ∷ f EventHandler
611+ , onTouchMove ∷ f EventHandler
629− , onTouchStart ∷ f EventHandler
612+ , onTouchStart ∷ f EventHandler
630− , onTransitionEnd ∷ f EventHandler
613+ , onTransitionEnd ∷ f EventHandler
631− , onWheel ∷ f EventHandler
614+ , onWheel ∷ f EventHandler
632− , prefix ∷ f String
615+ , prefix ∷ f String
633− , property ∷ f String
616+ , property ∷ f String
634− , radioGroup ∷ f String
617+ , radioGroup ∷ f String
635− , readOnly ∷ f Boolean
618+ , readOnly ∷ f Boolean
636− , ref ∷ f (Ref (Nullable Node))
619+ , ref ∷ f (Ref (Nullable Node))
637− , resource ∷ f String
620+ , resource ∷ f String
638− , role ∷ f String
621+ , role ∷ f String
639− , rowSpan ∷ f Int
622+ , rowSpan ∷ f Int
640− , scoped ∷ f Boolean
623+ , scoped ∷ f Boolean
641− , seamless ∷ f Boolean
624+ , seamless ∷ f Boolean
642− , security ∷ f String
625+ , security ∷ f String
643− , spellCheck ∷ f Boolean
626+ , spellCheck ∷ f Boolean
644− , srcDoc ∷ f JSX
627+ , srcDoc ∷ f JSX
645− , srcLang ∷ f String
628+ , srcLang ∷ f String
646− , srcSet ∷ f String
629+ , srcSet ∷ f String
647− , style ∷ f CSS
630+ , style ∷ f CSS
648− , suppressContentEditableWarning ∷ f Boolean
631+ , suppressContentEditableWarning ∷ f Boolean
649− , tabIndex ∷ f Int
632+ , tabIndex ∷ f Int
650− , title ∷ f String
633+ , title ∷ f String
651− , type ∷ f String
634+ , type ∷ f String
652− , typeof ∷ f String
635+ , typeof ∷ f String
653− , unselectable ∷ f Boolean
636+ , unselectable ∷ f Boolean
654− , useMap ∷ f String
637+ , useMap ∷ f String
655− , value ∷ f String
638+ , value ∷ f String
656− , vocab ∷ f String
639+ , vocab ∷ f String
657− , wmode ∷ f String
640+ , wmode ∷ f String
658− | more
641+ | more
659− )
642+ )
src/Yoga/Block/Layout/Sidebar/Spec.purs+4−3
@@ -1,8 +1,8 @@
1module Yoga.Block.Layout.Sidebar.Spec where
1module Yoga.Block.Layout.Sidebar.Spec where
2
2
3import Yoga.Prelude.Spec
3import Yoga.Prelude.Spec
4−import Yoga.Block.Layout.Sidebar as Sidebar
5import React.Basic.DOM as R
4import React.Basic.DOM as R
5+import Yoga.Block.Layout.Sidebar as Sidebar
6
6
7spec ∷ Spec Unit
7spec ∷ Spec Unit
8spec =
8spec =
@@ -10,7 +10,7 @@ spec =
10 describe "The sidebar" do
10 describe "The sidebar" do
11 it "renders without errors" do
11 it "renders without errors" do
12 void
12 void
13− $ renderComponent Sidebar.component {}
13+ $ renderComponent Sidebar.component { children: [] }
14 it "accepts div props" do
14 it "accepts div props" do
15 { findByText } <-
15 { findByText } <-
16 renderComponent Sidebar.component
16 renderComponent Sidebar.component
@@ -18,4 +18,5 @@ spec =
18 , children: [ R.text "Find me!" ]
18 , children: [ R.text "Find me!" ]
19 }
19 }
20 elem <- findByText "Find me!"
20 elem <- findByText "Find me!"
21+ parent <- elem # getParentOrFailWith "Sidebar has no parent"
21− elem `shouldHaveAttribute` "role"
22+ parent `shouldHaveAttribute` "role"
src/Yoga/Block/Layout/Sidebar/View.purs+9−9
@@ -3,18 +3,18 @@ module Yoga.Block.Layout.Sidebar.View (component, Props, PropsF) where
3import Yoga.Prelude.View
3import Yoga.Prelude.View
4import Yoga.Block.Layout.Sidebar.Style as Style
4import Yoga.Block.Layout.Sidebar.Style as Style
5
5
6−type PropsF f =
6+type PropsF f
7− ( className ∷ f String
7+ = ( className ∷ f String
8− | Style.Props f DivProps
8+ | Style.Props f DivProps
9− )
9+ )
10
10
11−type Props =
11+type Props
12− PropsF Id
12+ = PropsF Id
13
13
14−type PropsOptional =
14+type PropsOptional
15− PropsF OptionalProp
15+ = PropsF OptionalProp
16
16
17−component ∷ ∀ p p_. Union p p_ Props => ReactComponent { | p }
17+component ∷ ∀ p p_. Union p p_ Props => ReactComponent { children :: Array JSX | p }
18component = rawComponent
18component = rawComponent
19
19
20rawComponent ∷ ∀ p. ReactComponent { | p }
20rawComponent ∷ ∀ p. ReactComponent { | p }
src/Yoga/Block/Layout/Stack/Spec.purs+3−2
@@ -10,7 +10,7 @@ spec =
10 describe "The stack" do
10 describe "The stack" do
11 it "renders without errors" do
11 it "renders without errors" do
12 void
12 void
13− $ renderComponent Stack.component {}
13+ $ renderComponent Stack.component { children: [] }
14 it "accepts div props" do
14 it "accepts div props" do
15 { findByText } <-
15 { findByText } <-
16 renderComponent Stack.component
16 renderComponent Stack.component
@@ -18,4 +18,5 @@ spec =
18 , children: [ R.text "Find me!" ]
18 , children: [ R.text "Find me!" ]
19 }
19 }
20 elem <- findByText "Find me!"
20 elem <- findByText "Find me!"
21+ parent <- elem # getParentOrFailWith "No parent!"
21− elem `shouldHaveAttribute` "role"
22+ parent `shouldHaveAttribute` "role"
src/Yoga/Block/Layout/Stack/View.purs+5−2
@@ -1,6 +1,7 @@
1module Yoga.Block.Layout.Stack.View (component, Props, PropsF) where
1module Yoga.Block.Layout.Stack.View (component, Props, PropsF) where
2
2
3import Yoga.Prelude.View
3import Yoga.Prelude.View
4+import Unsafe.Coerce (unsafeCoerce)
4import Yoga.Block.Layout.Stack.Style as Style
5import Yoga.Block.Layout.Stack.Style as Style
5
6
6type PropsF f =
7type PropsF f =
@@ -14,16 +15,18 @@ type Props =
14type PropsOptional =
15type PropsOptional =
15 PropsF OptionalProp
16 PropsF OptionalProp
16
17
17−component ∷ ∀ p q. Union p q Props => ReactComponent { | p }
18+component ∷ ∀ p q. Union p q Props => ReactComponent { children ∷ Array JSX | p }
18component = rawComponent
19component = rawComponent
19
20
20rawComponent ∷ ∀ p. ReactComponent { | p }
21rawComponent ∷ ∀ p. ReactComponent { | p }
21rawComponent =
22rawComponent =
22 mkForwardRefComponent "Stack" do
23 mkForwardRefComponent "Stack" do
23 \(props ∷ { | PropsOptional }) ref -> React.do
24 \(props ∷ { | PropsOptional }) ref -> React.do
25+ -- Must be careful here because React fiddles with children
26+ let safeChildren = reactChildrenToArray (unsafeCoerce props.children)
24 -- Wrapping children to use `:nth-of-type` instead of `:nth-child`
27 -- Wrapping children to use `:nth-of-type` instead of `:nth-child`
25 -- in CSS because the latter is problematic in SSR
28 -- in CSS because the latter is problematic in SSR
26− let wrappedChildren = props.children <#> \c -> div </ {} /> [ c ]
29+ let wrappedChildren = safeChildren <#> \c -> div </ {} /> [ c ]
27 pure
30 pure
28 $ emotionDiv ref props
31 $ emotionDiv ref props
29 { className: "ry-stack " <>? props.className
32 { className: "ry-stack " <>? props.className
src/Yoga/Prelude/Spec.purs+1−1
@@ -12,4 +12,4 @@ import Effect.Aff (Aff)
12import React.Basic (ReactComponent)
12import React.Basic (ReactComponent)
13import React.TestingLibrary (class TextMatch, FakeKeyboardEvent, RenderQueries, cleanup, defaultKeyboardEvent, describeComponent, findByText, fireEvent, fireEventAbort, fireEventAnimationEnd, fireEventAnimationIteration, fireEventAnimationStart, fireEventBlur, fireEventCanPlay, fireEventCanPlayThrough, fireEventChange, fireEventClick, fireEventCompositionEnd, fireEventCompositionStart, fireEventCompositionUpdate, fireEventContextMenu, fireEventCopy, fireEventCut, fireEventDblClick, fireEventDoubleClick, fireEventDrag, fireEventDragEnd, fireEventDragEnter, fireEventDragExit, fireEventDragLeave, fireEventDragOver, fireEventDragStart, fireEventDrop, fireEventDurationChange, fireEventEmptied, fireEventEncrypted, fireEventEnded, fireEventError, fireEventFocus, fireEventFocusIn, fireEventFocusOut, fireEventInput, fireEventInvalid, fireEventKeyDown, fireEventKeyPress, fireEventKeyUp, fireEventLoad, fireEventLoadStart, fireEventLoadedData, fireEventLoadedMetadata, fireEventMouseDown, fireEventMouseEnter, fireEventMouseLeave, fireEventMouseMove, fireEventMouseOut, fireEventMouseOver, fireEventMouseUp, fireEventPaste, fireEventPause, fireEventPlay, fireEventPlaying, fireEventPointerCancel, fireEventPointerDown, fireEventPointerMove, fireEventPointerOut, fireEventPointerOver, fireEventPointerUp, fireEventProgress, fireEventRateChange, fireEventScroll, fireEventSeeked, fireEventSeeking, fireEventSelect, fireEventStalled, fireEventSubmit, fireEventSuspend, fireEventTimeUpdate, fireEventTouchCancel, fireEventTouchEnd, fireEventTouchMove, fireEventTouchStart, fireEventTransitionEnd, fireEventVolumeChange, fireEventWaiting, fireEventWheel, render, renderComponent, typeText)
13import React.TestingLibrary (class TextMatch, FakeKeyboardEvent, RenderQueries, cleanup, defaultKeyboardEvent, describeComponent, findByText, fireEvent, fireEventAbort, fireEventAnimationEnd, fireEventAnimationIteration, fireEventAnimationStart, fireEventBlur, fireEventCanPlay, fireEventCanPlayThrough, fireEventChange, fireEventClick, fireEventCompositionEnd, fireEventCompositionStart, fireEventCompositionUpdate, fireEventContextMenu, fireEventCopy, fireEventCut, fireEventDblClick, fireEventDoubleClick, fireEventDrag, fireEventDragEnd, fireEventDragEnter, fireEventDragExit, fireEventDragLeave, fireEventDragOver, fireEventDragStart, fireEventDrop, fireEventDurationChange, fireEventEmptied, fireEventEncrypted, fireEventEnded, fireEventError, fireEventFocus, fireEventFocusIn, fireEventFocusOut, fireEventInput, fireEventInvalid, fireEventKeyDown, fireEventKeyPress, fireEventKeyUp, fireEventLoad, fireEventLoadStart, fireEventLoadedData, fireEventLoadedMetadata, fireEventMouseDown, fireEventMouseEnter, fireEventMouseLeave, fireEventMouseMove, fireEventMouseOut, fireEventMouseOver, fireEventMouseUp, fireEventPaste, fireEventPause, fireEventPlay, fireEventPlaying, fireEventPointerCancel, fireEventPointerDown, fireEventPointerMove, fireEventPointerOut, fireEventPointerOver, fireEventPointerUp, fireEventProgress, fireEventRateChange, fireEventScroll, fireEventSeeked, fireEventSeeking, fireEventSelect, fireEventStalled, fireEventSubmit, fireEventSuspend, fireEventTimeUpdate, fireEventTouchCancel, fireEventTouchEnd, fireEventTouchMove, fireEventTouchStart, fireEventTransitionEnd, fireEventVolumeChange, fireEventWaiting, fireEventWheel, render, renderComponent, typeText)
14import Test.Spec (class Example, class FocusWarning, ActionWith, ComputationType(..), Item(..), Spec, SpecT(..), SpecTree, Tree(..), after, afterAll, afterAll_, after_, around, aroundWith, around_, before, beforeAll, beforeAll_, beforeWith, before_, collect, describe, describeOnly, evaluateExample, focus, hoistSpec, it, itOnly, mapSpecTree, parallel, pending, pending', sequential)
14import Test.Spec (class Example, class FocusWarning, ActionWith, ComputationType(..), Item(..), Spec, SpecT(..), SpecTree, Tree(..), after, afterAll, afterAll_, after_, around, aroundWith, around_, before, beforeAll, beforeAll_, beforeWith, before_, collect, describe, describeOnly, evaluateExample, focus, hoistSpec, it, itOnly, mapSpecTree, parallel, pending, pending', sequential)
15−import Test.Spec.Assertions.DOM (shouldHaveAttribute, shouldHaveAttributeWithValue, textContentShouldEqual, valueShouldEqual)
15+import Test.Spec.Assertions.DOM (getParentOrFailWith, shouldHaveAttribute, shouldHaveAttributeWithValue, textContentShouldEqual, valueShouldEqual)