@@ -0,0 +1,142 @@
1+module HeroUI.Modal where
2+
3+import Prelude
4+
5+import Effect.Uncurried (EffectFn1)
6+import React.Basic (JSX)
7+import Yoga.React.DOM.Internal (class IsJSX)
8+import Data.Function.Uncurried (runFn4)
9+import HeroUI.Internal (class CoerceHeroProps, createElementTransformImpl)
10+import HeroUI.Raw as Raw
11+
12+data Size = Xs | Sm | Md | Lg | Full | Cover
13+
14+derive instance Eq Size
15+derive instance Ord Size
16+
17+sizeToString :: Size -> String
18+sizeToString = case _ of
19+ Xs -> "xs"
20+ Sm -> "sm"
21+ Md -> "md"
22+ Lg -> "lg"
23+ Full -> "full"
24+ Cover -> "cover"
25+
26+data Placement = PlacementAuto | PlacementTop | PlacementCenter | PlacementBottom
27+
28+derive instance Eq Placement
29+derive instance Ord Placement
30+
31+placementToString :: Placement -> String
32+placementToString = case _ of
33+ PlacementAuto -> "auto"
34+ PlacementTop -> "top"
35+ PlacementCenter -> "center"
36+ PlacementBottom -> "bottom"
37+
38+data Backdrop = Blur | Opaque | Transparent
39+
40+derive instance Eq Backdrop
41+derive instance Ord Backdrop
42+
43+backdropToString :: Backdrop -> String
44+backdropToString = case _ of
45+ Blur -> "blur"
46+ Opaque -> "opaque"
47+ Transparent -> "transparent"
48+
49+data Scroll = ScrollInside | ScrollOutside
50+
51+derive instance Eq Scroll
52+derive instance Ord Scroll
53+
54+scrollToString :: Scroll -> String
55+scrollToString = case _ of
56+ ScrollInside -> "inside"
57+ ScrollOutside -> "outside"
58+
59+-- | The root wires the open state (react-aria `DialogTrigger`).
60+type ModalProps r =
61+ ( isOpen :: Boolean
62+ , defaultOpen :: Boolean
63+ , onOpenChange :: EffectFn1 Boolean Unit
64+ , isDismissable :: Boolean
65+ , className :: String
66+ | r
67+ )
68+
69+modal
70+ :: forall givenProps nonDataProps kids
71+ . IsJSX kids
72+ => CoerceHeroProps { | givenProps } { | nonDataProps } { | ModalProps () }
73+ => { | givenProps }
74+ -> kids
75+ -> JSX
76+modal props kids = runFn4 createElementTransformImpl {} Raw.modal props kids
77+
78+type ModalBackdropProps r = (variant :: Backdrop, isDismissable :: Boolean, className :: String | r)
79+
80+modalBackdrop
81+ :: forall givenProps nonDataProps kids
82+ . IsJSX kids
83+ => CoerceHeroProps { | givenProps } { | nonDataProps } { | ModalBackdropProps () }
84+ => { | givenProps }
85+ -> kids
86+ -> JSX
87+modalBackdrop props kids = runFn4 createElementTransformImpl { variant: backdropToString } Raw.modalBackdrop props kids
88+
89+type ModalContainerProps r =
90+ ( placement :: Placement
91+ , scroll :: Scroll
92+ , size :: Size
93+ , className :: String
94+ | r
95+ )
96+
97+modalContainerTransforms
98+ :: { placement :: Placement -> String, scroll :: Scroll -> String, size :: Size -> String }
99+modalContainerTransforms = { placement: placementToString, scroll: scrollToString, size: sizeToString }
100+
101+modalContainer
102+ :: forall givenProps nonDataProps kids
103+ . IsJSX kids
104+ => CoerceHeroProps { | givenProps } { | nonDataProps } { | ModalContainerProps () }
105+ => { | givenProps }
106+ -> kids
107+ -> JSX
108+modalContainer props kids = runFn4 createElementTransformImpl modalContainerTransforms Raw.modalContainer props kids
109+
110+type SectionProps r = (className :: String | r)
111+
112+modalTrigger
113+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
114+modalTrigger props kids = runFn4 createElementTransformImpl {} Raw.modalTrigger props kids
115+
116+modalDialog
117+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
118+modalDialog props kids = runFn4 createElementTransformImpl {} Raw.modalDialog props kids
119+
120+modalHeader
121+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
122+modalHeader props kids = runFn4 createElementTransformImpl {} Raw.modalHeader props kids
123+
124+modalIcon
125+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
126+modalIcon props kids = runFn4 createElementTransformImpl {} Raw.modalIcon props kids
127+
128+modalHeading
129+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
130+modalHeading props kids = runFn4 createElementTransformImpl {} Raw.modalHeading props kids
131+
132+modalBody
133+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
134+modalBody props kids = runFn4 createElementTransformImpl {} Raw.modalBody props kids
135+
136+modalFooter
137+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
138+modalFooter props kids = runFn4 createElementTransformImpl {} Raw.modalFooter props kids
139+
140+modalCloseTrigger
141+ :: forall g n k. IsJSX k => CoerceHeroProps { | g } { | n } { | SectionProps () } => { | g } -> k -> JSX
142+modalCloseTrigger props kids = runFn4 createElementTransformImpl {} Raw.modalCloseTrigger props kids