1module Container.Header where
4import Data.Int (toNumber)
5import Data.Maybe (Maybe(..))
6import Data.Monoid (guard)
7import Data.Newtype (class Newtype)
8import Data.Nullable (Nullable, null)
10import Effect.Class.Console (log)
11import JSS (jss, jssClasses)
12import React.Basic.DOM as R
13import React.Basic.Hooks (type (/\), Hook, ReactComponent, Ref, UseLayoutEffect, UseRef, UseState, coerceHook, component, element, readRefMaybe, useLayoutEffect, useRef, useState, (/\))
14import React.Basic.Hooks as React
16import Web.Event.EventTarget (EventListener, eventListener)
17import Web.HTML (HTMLElement, window)
18import Web.HTML.HTMLElement (offsetTop)
19import Web.HTML.HTMLElement as HTMLElement
20import Web.HTML.Window (scrollY)
21import Yoga.SVG.Icon (trianglelogoIcon)
22import Yoga.Scroll.Listener as Scroll
23import Yoga.Theme.Styles (makeStylesJSS)
24import Yoga.Theme.Types (CSSTheme)
25import Yoga.Typography.Header (HeadingLevel(..), mkH)
27mkHeader ∷ Effect (ReactComponent {})
32 $ jssClasses \(theme ∷ CSSTheme) ->
35 { backgroundColor: theme.interfaceColour
37 , fontFamily: theme.headingFontFamily
40 , alignItems: "center"
41 , justifyContent: "flex-end"
45 , paddingBottom: "10px"
47 , sticky: jss { position: "fixed", top: "0", zIndex: 10 }
48 , title: jss { paddingRight: "30px" }
56 , fill: theme.textColour
59 component "Header" \{} -> React.do
60 classes <- useStyles {}
61 shouldBeSticky /\ nodeRef <- useShouldBeSticky
65 , className: classes.header <> " " <> guard shouldBeSticky classes.sticky
67 [ element h { level: H2, text: "Rowtype Yoga", className: Just classes.title }
68 , R.div { children: [ element trianglelogoIcon {} ], className: classes.logo }
72newtype UseShouldBeSticky hooks
73 = UseShouldBeSticky (UseLayoutEffect Unit (UseState Boolean (UseRef (Nullable Node) hooks)))
75derive instance ntUseShouldBeSticky ∷ Newtype (UseShouldBeSticky hooks) _
76useShouldBeSticky ∷ Hook UseShouldBeSticky (Boolean /\ Ref (Nullable Node))
79 nodeRef <- useRef null
80 mustBeSticky /\ modifyMustBeSticky <- useState false
82 setSticky = modifyMustBeSticky <<< const
83 useLayoutEffect unit do
84 maybeNode <- readRefMaybe nodeRef
85 case maybeNode >>= HTMLElement.fromNode of
87 log "Could not register listener because there was no node"
90 listener <- makeListener setSticky element
91 Scroll.registerListener listener
92 pure (mustBeSticky /\ nodeRef)
94makeListener ∷ (Boolean -> Effect Unit) -> HTMLElement -> Effect EventListener
95makeListener setSticky element = do
96 nodeStartPos <- offsetTop element
99 yPos <- window >>= scrollY <#> toNumber
100 setSticky $ nodeStartPos < yPos
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list