git.iko.soy/rowtype-yoga/ry-blocks
on main help sign in
Drop Tooltip
commit6bb0bfa071ae340fb829dba21b4188cc28225d81 authorMark Eibes <mark.eibes@gmail.com> dateMon 25 Apr 2022, 17:55 (4 years ago) parent0590f89
6 files changed−248
src/Yoga/Block.purs−4 src/Yoga/Block/Atom/Tooltip.purs−5 src/Yoga/Block/Atom/Tooltip/Spec.purs−16 src/Yoga/Block/Atom/Tooltip/Story.purs−39 src/Yoga/Block/Atom/Tooltip/Style.purs−58 src/Yoga/Block/Atom/Tooltip/View.purs−126
src/Yoga/Block.purs−4
@@ -10,7 +10,6 @@ import Yoga.Block.Atom.Popover as Popover
1010import Yoga.Block.Atom.Range as Range
1111import Yoga.Block.Atom.Segmented as Segmented
1212import Yoga.Block.Atom.Toggle as Toggle
13−import Yoga.Block.Atom.Tooltip as Tooltip
1413import Yoga.Block.Container as Container
1514import Yoga.Block.Layout.Box as Box
1615import Yoga.Block.Layout.Centre as Centre
@@ -129,8 +128,5 @@ switcher = Switcher.component
129128toggle ∷ ∀ p q. Union p q Toggle.Props ⇒ ReactComponent { | p }
130129toggle = Toggle.component
131130
132−tooltip ∷ ∀ p q. Union p q Tooltip.Props ⇒ ReactComponent { | Tooltip.MandatoryProps p }
133−tooltip = Tooltip.component
134−
135131readMore ∷ ∀ p q. Union p q ReadMore.Props ⇒ ReactComponent (Record p)
136132readMore = ReadMore.component
src/Yoga/Block/Atom/Tooltip.pursdeleted−5
@@ -1,5 +0,0 @@
1−module Yoga.Block.Atom.Tooltip
2− ( module Yoga.Block.Atom.Tooltip.View
3− ) where
4−
5−import Yoga.Block.Atom.Tooltip.View (Props, MandatoryProps, component)
src/Yoga/Block/Atom/Tooltip/Spec.pursdeleted−16
@@ -1,16 +0,0 @@
1−module Yoga.Block.Atom.Tooltip.Spec where
2−
3−import Yoga.Prelude.Spec
4−import React.Basic.DOM as R
5−import Yoga.Block.Atom.Tooltip as Tooltip
6−
7−spec ∷ Spec Unit
8−spec =
9− after_ cleanup do
10− describe "The tooltip" do
11− it "renders without errors" do
12− void
13− $ renderComponent Tooltip.component
14− { theTip: R.text "Tip"
15− , target: R.text "Target"
16− }
src/Yoga/Block/Atom/Tooltip/Story.pursdeleted−39
@@ -1,39 +0,0 @@
1−module Yoga.Block.Atom.Tooltip.Story where
2−
3−import Prelude
4−import Effect (Effect)
5−import Effect.Unsafe (unsafePerformEffect)
6−import React.Basic (JSX, element, fragment)
7−import React.Basic.DOM as R
8−import React.Basic.Emotion as E
9−import Yoga (el)
10−import Yoga.Block.Atom.Tooltip as Tooltip
11−import Yoga.Block.Container.Style as Styles
12−
13−default ∷
14− { decorators ∷ Array (Effect JSX -> JSX)
15− , title ∷ String
16− }
17−default =
18− { title: "Atom/Tooltip"
19− , decorators:
20− [ \storyFn ->
21− R.div_
22− [ element E.global { styles: Styles.global }
23− , unsafePerformEffect storyFn
24− ]
25− ]
26− }
27−
28−tooltip ∷ Effect JSX
29−tooltip = do
30− pure
31− $ fragment
32− [ R.div_
33− [ R.h2_ [ R.text "Basics" ]
34− , element Tooltip.component
35− { theTip: R.text "Hi"
36− , target: el R.button' {} [ R.text "Holzkop" ]
37− }
38− ]
39− ]
src/Yoga/Block/Atom/Tooltip/Style.pursdeleted−58
@@ -1,58 +0,0 @@
1−module Yoga.Block.Atom.Tooltip.Style where
2−
3−import Yoga.Prelude.Style
4−import Yoga.Block.Container.Style (colour)
5−
6−type Props :: forall k. (Type -> k) -> Row k -> Row k
7−type Props f r =
8− ( css ∷ f Style
9− , backgroundColour ∷ f Color
10− | r
11− )
12−
13−backgroundColour ∷ String
14−backgroundColour = colour.text
15−
16−arrow ∷ ∀ r. { | Props OptionalProp r } -> Style
17−arrow props =
18− css
19− { position: str "absolute"
20− , width: str "12px"
21− , height: str "12px"
22− , zIndex: str "0"
23− , "&::before":
24− nest
25− { position: str "absolute"
26− , width: str "12px"
27− , height: str "12px"
28− , borderRadius: str "2px"
29− , content: str "''"
30− , transform: str "rotate(45deg)"
31− , background: str $ (cssStringRGBA <$> props.backgroundColour) ?|| backgroundColour
32− }
33− }
34−
35−content ∷ ∀ r. { | Props OptionalProp r } -> Style
36−content props =
37− css
38− { background: str $ (cssStringRGBA <$> props.backgroundColour) ?|| backgroundColour
39− , minWidth: str "50px"
40− , padding: str "6px"
41− , zIndex: str "-1"
42− , color: str colour.background
43− , boxShadow: str "0 1px 8px rgba(0,0,0,0.33)"
44− , borderRadius: var "--s-2"
45− }
46−
47−popper ∷ Style
48−popper =
49− css
50− { "&[data-popper-placement^='top'] > * > .popper-arrow":
51− nest { bottom: str "-4px" }
52− , "&[data-popper-placement^='bottom'] > * > .popper-arrow":
53− nest { top: str "-4px" }
54− , "&[data-popper-placement^='left'] > * > .popper-arrow":
55− nest { right: str "-4px" }
56− , "&[data-popper-placement^='right'] > * > .popper-arrow":
57− nest { left: str "-4px" }
58− }
src/Yoga/Block/Atom/Tooltip/View.pursdeleted−126
@@ -1,126 +0,0 @@
1−module Yoga.Block.Atom.Tooltip.View (component, MandatoryProps, Props, PropsF) where
2−
3−import Yoga.Prelude.View
4−import Effect.Aff (Milliseconds(..), delay)
5−import Effect.Uncurried (mkEffectFn1)
6−import Framer.Motion as Motion
7−import React.Basic.DOM (css)
8−import React.Basic.DOM as R
9−import React.Basic.Hooks as React
10−import React.Basic.Hooks.Aff (useAff)
11−import React.Basic.Popper (modifierArrow, modifierOffset, nullRef)
12−import React.Basic.Popper.Hook (usePopper)
13−import Unsafe.Coerce (unsafeCoerce)
14−import Yoga.Block.Atom.Tooltip.Style as Style
15−
16−type PropsF f =
17− ( className ∷ f String
18− , hideDelay ∷ f Milliseconds
19− | Style.Props f (MandatoryProps ())
20− )
21−
22−type MandatoryProps r =
23− ( theTip ∷ JSX
24− , target ∷ JSX
25− | r
26− )
27−
28−type Props =
29− PropsF Id
30−
31−type PropsOptional =
32− PropsF OptionalProp
33−
34−component ∷ ∀ p p_. Union p p_ Props => ReactComponent { | MandatoryProps p }
35−component = rawComponent
36−
37−rawComponent ∷ ∀ p. ReactComponent (Record p)
38−rawComponent =
39− mkForwardRefComponent "Tooltip" do
40− \(props ∷ { | PropsOptional }) _ref -> React.do
41− -- Hooks
42− referenceElement /\ setReferenceElement <- React.useState' nullRef
43− popperElement /\ setPopperElement <- React.useState' nullRef
44− arrowElement /\ setArrowElement <- React.useState' nullRef
45− { styles, attributes } <-
46− usePopper referenceElement popperElement
47− { modifiers:
48− [ modifierArrow { element: arrowElement, padding: 8 }
49− , modifierOffset { x: 0.0, y: 12.0 }
50− ]
51− }
52− visible /\ setVisible <- React.useState' false
53− touching /\ setTouching <- React.useState' false
54− hovering /\ setHovering <- React.useState' false
55− useAff hovering do
56− if hovering then
57− setVisible true # liftEffect
58− else do
59− delay (props.hideDelay ?|| (0.0 # Milliseconds))
60− setVisible false # liftEffect
61− useAff touching do
62− if touching then do
63− delay (1000.0 # Milliseconds)
64− setVisible true # liftEffect
65− else do
66− delay (props.hideDelay ?|| (450.0 # Milliseconds))
67− setVisible false # liftEffect
68− -- Handlers
69− let
70− hoveredIn = setHovering true
71− hoveredOut = setHovering false
72− touchStarted = setTouching true
73− touchEnded = setTouching false
74− -- Elements
75− let
76− result =
77− fragment
78− $ [ refElem [ props.target ]
79− , popperEl
80− [ animatePresence
81− $ guard visible
82− [ content
83− [ props.theTip
84− , arrow
85− ]
86− ]
87− ]
88− ]
89− animatePresence = Motion.animatePresence </ { initial: false }
90− content =
91− Motion.div
92− </* { className: "popper-element-content"
93− , css: Style.content props
94− , initial: Motion.initial $ R.css { opacity: [ 1.0, 0.8, 0.0 ], scale: [ 1.0, 0.85 ] }
95− , animate: Motion.animate $ R.css { opacity: [ 0.0, 0.3, 1.0 ], scale: [ 0.0, 1.05, 1.0, 0.98, 1.01, 1.0 ] }
96− , exit: Motion.exit $ R.css { opacity: [ 1.0, 0.8, 0.0 ], scale: [ 1.0, 0.85 ] }
97− , transition: Motion.transition { duration: 0.2 }
98− , key: "container"
99− }
100− popperEl =
101− div
102− </* { className: "popper-element"
103− , css: Style.popper
104− , ref: unsafeCoerce (mkEffectFn1 setPopperElement)
105− , style: styles.popper
106− , _data: attributes.popper
107− }
108− arrow =
109− div
110− </*> { className: "popper-arrow"
111− , id: "arrow"
112− , css: Style.arrow props
113− , ref: unsafeCoerce (mkEffectFn1 setArrowElement)
114− , style: styles.arrow
115− , _data: attributes.arrow
116− }
117− refElem =
118− Motion.div
119− </ { ref: unsafeCoerce (mkEffectFn1 setReferenceElement)
120− , style: css { display: "inline-block" }
121− , onHoverStart: Motion.onHoverStart \_ _ -> hoveredIn
122− , onHoverEnd: Motion.onHoverEnd \_ _ -> hoveredOut
123− , onTouchStart: handler_ touchStarted
124− , onTouchEnd: handler_ touchEnded
125− }
126− pure result