@@ -1,29 +1,43 @@
11module Yoga.Blocks.Internal
22 ( mkForwardRefComponent
3+ , mkForwardRefComponentEffect
34 , unsafeEmotion
5+ , unsafeDiv
46 , dangerous
57 , DivProps
68 , DivPropsF
9+ , InputProps
10+ , InputPropsF
711 , emotionDiv
12+ , emotionDiv_
13+ , emotionInput
814 , module Yoga.Blocks.Internal.OptionalProp
915 , module Yoga.Blocks.Internal.CSS
1016 ) where
1117
18+import Prelude
19+import Yoga.Blocks.Internal.OptionalProp
20+import Data.Array (fromFoldable)
21+import Data.Function.Uncurried (Fn2, runFn2)
1222import Data.Nullable (Nullable)
23+import Effect (Effect)
1324import Effect.Unsafe (unsafePerformEffect)
1425import Foreign.Object (Object)
1526import Prelude (Unit, (<<<))
1627import Prim.Row (class Union)
17−import React.Basic.DOM (unsafeCreateDOMComponent, CSS)
28+import Prim.Row as Row
29+import Prim.RowList as RL
30+import React.Basic.DOM (CSS, Props_div, Props_input, unsafeCreateDOMComponent)
1831import React.Basic.Emotion (Style)
1932import React.Basic.Emotion as E
2033import React.Basic.Events (EventHandler)
2134import React.Basic.Hooks (JSX, ReactComponent, Ref, Render)
22−import Record.Extra (pick)
35+import Record.Extra (class Keys, keys)
2336import Record.Unsafe.Union (unsafeUnion)
37+import Type.Data.Row (RProxy(..))
38+import Untagged.Coercible (class Coercible)
2439import Web.DOM (Node)
2540import Yoga.Blocks.Internal.CSS (_0, auto, borderBox, center, column, contentBox, flex, flexStart, left, nest, nestDynamic, right, (~:))
26−import Yoga.Blocks.Internal.OptionalProp
2741
2842foreign import mkForwardRefComponent ∷
2943 ∀ inputProps props a hooks.
@@ -31,8 +45,14 @@ foreign import mkForwardRefComponent ∷
3145 ({ | inputProps } -> Ref a -> Render Unit hooks JSX) ->
3246 ReactComponent { | props }
3347
34−unsafeEmotion ∷ ∀ propsA propsB ref. String -> Record propsA -> { className ∷ String, css ∷ E.Style, ref ∷ Ref ref | propsB } -> JSX
35−unsafeEmotion name propsA propsB = E.element (dangerous name) (unsafeUnion propsA propsB)
48+foreign import mkForwardRefComponentEffect ∷
49+ ∀ inputProps props a hooks.
50+ String ->
51+ ({ | inputProps } -> Ref a -> Render Unit hooks JSX) ->
52+ Effect (ReactComponent { | props })
53+
54+unsafeEmotion ∷ ∀ props propsA propsB ref. ReactComponent { className ∷ String, css ∷ E.Style, ref ∷ Ref ref | props } -> Record propsA -> { className ∷ String, css ∷ E.Style, ref ∷ Ref ref | propsB } -> JSX
55+unsafeEmotion component propsA propsB = E.element component (unsafeUnion propsB propsA)
3656
3757emotionDiv_ ∷
3858 ∀ props props_.
@@ -44,13 +64,47 @@ emotionDiv_ ∷
4464 | props
4565 } ->
4666 JSX
47−emotionDiv_ = unsafeEmotion "div"
67+emotionDiv_ = unsafeEmotion unsafeDiv
68+
69+emotionDiv = emotionDiv_ <<< pickDefined
70+
71+foreign import pickDefinedFn ∷ ∀ r1 r2. Fn2 (Array String) (Record r1) (Record r2)
72+
73+pickDefined ∷
74+ ∀ a r b l.
75+ Row.Union b r a =>
76+ RL.RowToList b l =>
77+ Keys l =>
78+ Record a ->
79+ Record b
80+pickDefined = runFn2 pickDefinedFn ks
81+ where
82+ ks = fromFoldable $ keys (RProxy ∷ RProxy b)
83+
84+unsafeDiv = dangerous "div"
85+
86+emotionInput_ ∷
87+ ∀ props props_.
88+ Union props props_ ( className ∷ String, css ∷ Style, ref ∷ Ref (Nullable Node) | InputProps ) =>
89+ (Record (InputProps)) ->
90+ { className ∷ String
91+ , css ∷ Style
92+ , ref ∷ Ref (Nullable Node)
93+ | props
94+ } ->
95+ JSX
96+emotionInput_ = unsafeEmotion unsafeInput
97+
98+emotionInput = emotionInput_ <<< pickDefined
4899
49−emotionDiv = emotionDiv_ <<< pick
100+unsafeInput = dangerous "input"
50101
51102dangerous ∷ ∀ props. String -> ReactComponent (Record props)
52103dangerous = unsafePerformEffect <<< unsafeCreateDOMComponent
53104
105+-- type DivProps =
106+-- Props_div
107+
54108type DivProps =
55109 DivPropsF Id
56110
@@ -164,24 +218,187 @@ type DivPropsF f =
164218 , property ∷ f String
165219 , radioGroup ∷ f String
166220 , readOnly ∷ f Boolean
221+ -- , ref ∷ f (Ref (Nullable Node))
222+ , resource ∷ f String
223+ , role ∷ f String
224+ , rowSpan ∷ f Int
225+ , scoped ∷ f Boolean
226+ , seamless ∷ f Boolean
227+ , security ∷ f String
228+ , spellCheck ∷ f Boolean
229+ , srcDoc ∷ f JSX
230+ , srcLang ∷ f String
231+ , srcSet ∷ f String
232+ , style ∷ f CSS
233+ , suppressContentEditableWarning ∷ f Boolean
234+ , tabIndex ∷ f Int
235+ , title ∷ f String
236+ , typeof ∷ f String
237+ , unselectable ∷ f Boolean
238+ , useMap ∷ f String
239+ , vocab ∷ f String
240+ , wmode ∷ f String
241+ )
242+
243+type InputProps =
244+ InputPropsF Id
245+
246+type InputPropsF f =
247+ ( _aria ∷ f (Object String)
248+ , _data ∷ f (Object String)
249+ , about ∷ f String
250+ , accept ∷ f String
251+ , acceptCharset ∷ f String
252+ , accessKey ∷ f String
253+ , allowFullScreen ∷ f Boolean
254+ , alt ∷ f String
255+ , autoCapitalize ∷ f String
256+ , autoComplete ∷ f String
257+ , autoCorrect ∷ f String
258+ , autoFocus ∷ f Boolean
259+ , autoPlay ∷ f Boolean
260+ , autoSave ∷ f String
261+ , capture ∷ f Boolean
262+ , cellPadding ∷ f String
263+ , cellSpacing ∷ f String
264+ , charSet ∷ f String
265+ , checked ∷ f Boolean
266+ , classID ∷ f String
267+ , colSpan ∷ f Int
268+ , contentEditable ∷ f Boolean
269+ , contextMenu ∷ f String
270+ , crossOrigin ∷ f String
271+ , dangerouslySetInnerHTML ∷ f { __html ∷ f String }
272+ , datatype ∷ f String
273+ , dateTime ∷ f String
274+ , defaultChecked ∷ f String
275+ , defaultValue ∷ f String
276+ , dir ∷ f String
277+ , disabled ∷ f Boolean
278+ , draggable ∷ f Boolean
279+ , encType ∷ f String
280+ , form ∷ f String
281+ , formAction ∷ f String
282+ , formEncType ∷ f String
283+ , formMethod ∷ f String
284+ , formNoValidate ∷ f Boolean
285+ , formTarget ∷ f String
286+ , frameBorder ∷ f String
287+ , height ∷ f String
288+ , hidden ∷ f Boolean
289+ , hrefLang ∷ f String
290+ , htmlFor ∷ f String
291+ , httpEquiv ∷ f String
292+ , icon ∷ f String
293+ , id ∷ f String
294+ , inlist ∷ f String
295+ , inputMode ∷ f String
296+ , is ∷ f String
297+ , itemID ∷ f String
298+ , itemProp ∷ f String
299+ , itemRef ∷ f String
300+ , itemScope ∷ f Boolean
301+ , itemType ∷ f String
302+ , key ∷ f String
303+ , keyParams ∷ f String
304+ , keyType ∷ f String
305+ , lang ∷ f String
306+ , list ∷ f String
307+ , marginHeight ∷ f String
308+ , marginWidth ∷ f String
309+ , maxLength ∷ f Int
310+ , mediaGroup ∷ f String
311+ , minLength ∷ f Int
312+ , multiple ∷ f Boolean
313+ , name ∷ f String
314+ , noValidate ∷ f Boolean
315+ , onAnimationEnd ∷ f EventHandler
316+ , onAnimationIteration ∷ f EventHandler
317+ , onAnimationStart ∷ f EventHandler
318+ , onBlur ∷ f EventHandler
319+ , onChange ∷ f EventHandler
320+ , onClick ∷ f EventHandler
321+ , onCompositionEnd ∷ f EventHandler
322+ , onCompositionStart ∷ f EventHandler
323+ , onCompositionUpdate ∷ f EventHandler
324+ , onContextMenu ∷ f EventHandler
325+ , onCopy ∷ f EventHandler
326+ , onCut ∷ f EventHandler
327+ , onDoubleClick ∷ f EventHandler
328+ , onDrag ∷ f EventHandler
329+ , onDragEnd ∷ f EventHandler
330+ , onDragEnter ∷ f EventHandler
331+ , onDragExit ∷ f EventHandler
332+ , onDragLeave ∷ f EventHandler
333+ , onDragOver ∷ f EventHandler
334+ , onDragStart ∷ f EventHandler
335+ , onDrop ∷ f EventHandler
336+ , onFocus ∷ f EventHandler
337+ , onGotPointerCapture ∷ f EventHandler
338+ , onInvalid ∷ f EventHandler
339+ , onKeyDown ∷ f EventHandler
340+ , onKeyPress ∷ f EventHandler
341+ , onKeyUp ∷ f EventHandler
342+ , onLostPointerCapture ∷ f EventHandler
343+ , onMouseDown ∷ f EventHandler
344+ , onMouseEnter ∷ f EventHandler
345+ , onMouseLeave ∷ f EventHandler
346+ , onMouseMove ∷ f EventHandler
347+ , onMouseOut ∷ f EventHandler
348+ , onMouseOver ∷ f EventHandler
349+ , onMouseUp ∷ f EventHandler
350+ , onPaste ∷ f EventHandler
351+ , onPointerCancel ∷ f EventHandler
352+ , onPointerDown ∷ f EventHandler
353+ , onPointerEnter ∷ f EventHandler
354+ , onPointerLeave ∷ f EventHandler
355+ , onPointerMove ∷ f EventHandler
356+ , onPointerOut ∷ f EventHandler
357+ , onPointerOver ∷ f EventHandler
358+ , onPointerUp ∷ f EventHandler
359+ , onSelect ∷ f EventHandler
360+ , onSubmit ∷ f EventHandler
361+ , onTouchCancel ∷ f EventHandler
362+ , onTouchEnd ∷ f EventHandler
363+ , onTouchMove ∷ f EventHandler
364+ , onTouchStart ∷ f EventHandler
365+ , onTransitionEnd ∷ f EventHandler
366+ , onWheel ∷ f EventHandler
367+ , pattern ∷ f String
368+ , placeholder ∷ f String
369+ , prefix ∷ f String
370+ , property ∷ f String
371+ , radioGroup ∷ f String
372+ , readOnly ∷ f Boolean
167373 , ref ∷ f (Ref (Nullable Node))
374+ , required ∷ f Boolean
168375 , resource ∷ f String
376+ , results ∷ f String
169377 , role ∷ f String
170378 , rowSpan ∷ f Int
171379 , scoped ∷ f Boolean
172380 , seamless ∷ f Boolean
173381 , security ∷ f String
382+ , size ∷ f Int
174383 , spellCheck ∷ f Boolean
384+ , src ∷ f String
175385 , srcDoc ∷ f JSX
176386 , srcLang ∷ f String
177387 , srcSet ∷ f String
388+ , step ∷ f String
178389 , style ∷ f CSS
179390 , suppressContentEditableWarning ∷ f Boolean
180391 , tabIndex ∷ f Int
181392 , title ∷ f String
393+ , title ∷ f String
394+ , type ∷ f String
182395 , typeof ∷ f String
183396 , unselectable ∷ f Boolean
184397 , useMap ∷ f String
398+ , value ∷ f String
185399 , vocab ∷ f String
400+ , width ∷ f String
186401 , wmode ∷ f String
402+ , min ∷ f (String)
403+ , max ∷ f (String)
187404 )