6import Data.Array as Array
7import Data.Array.NonEmpty as NEA
8import Data.Maybe (Maybe(..), fromMaybe)
9import Data.Nullable (Nullable)
10import Data.Nullable as Nullable
11import Data.String as String
12import Data.Tuple.Nested ((/\))
13import Debug.Trace (spy)
15import JSS (jss, jssClasses)
16import Justifill (justifill)
17import Milkis.Impl (FetchImpl)
18import React.Basic (JSX, ReactComponent)
19import React.Basic.DOM (unsafeCreateDOMComponent)
20import React.Basic.DOM as R
21import React.Basic.Helpers (jsx)
22import React.Basic.Hooks (ReactChildren, component, componentWithChildren, element, reactChildrenToArray, useEffect, useState)
23import React.Basic.Hooks as React
24import Unsafe.Coerce (unsafeCoerce)
25import Yoga.Box.Component as Box
26import Yoga.CompileEditor.Component (mkCompileEditor)
27import Yoga.Compiler.Api (apiCompiler)
28import Yoga.FillInTheGaps.Component as FillInTheGaps
29import Yoga.Header.Component (mkHeader)
30import Yoga.Helpers ((?||))
31import Yoga.InlineCode.Component as InlineCode
32import Yoga.Theme (fromTheme)
33import Yoga.Theme.CSSBaseline (mkCssBaseline)
34import Yoga.Theme.Default (darkTheme)
35import Yoga.Theme.Provider (mkThemeProvider)
36import Yoga.Theme.Styles (makeStylesJSS)
37import Yoga.Theme.Types (CSSTheme)
38import Yoga.Typography.Header (HeadingLevel(..), mkH)
39import Yoga.Typography.Paragraph (mkP)
40import Yoga.WithSidebar.Component (makeComponent) as WithSidebar
46 , menuLinks ∷ Array { name ∷ String, link ∷ String }
56 { mdxType ∷ Nullable String
57 , children ∷ Nullable String
58 , className ∷ Nullable String
67 { children ∷ ReactChildren JSX
68 , siteInfo ∷ SiteQueryResult
71mkLayout fetchImpl = do
72 themeProvider <- mkThemeProvider
73 mdxProviderComponent <- mkMdxProviderComponent fetchImpl
74 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
76 $ element themeProvider
77 { theme: fromTheme darkTheme
79 [ element mdxProviderComponent
86mkSecret :: Effect ( ReactComponent { kids ∷ Array JSX , visible ∷ Boolean, register :: Effect Unit })
88 component "Secret" \{ kids, visible, register } -> React.do
90 unless visible register
94 { style: R.css { visibility: if visible then "visible" else "hidden" }
98mkMdxProviderComponent ∷
102 { children ∷ ReactChildren JSX
103 , siteInfo ∷ SiteQueryResult
106mkMdxProviderComponent fetchImpl = do
107 cssBaseline <- mkCssBaseline
108 editor <- mkCompileEditor fetchImpl
109 fillInTheGaps <- FillInTheGaps.makeComponent (apiCompiler fetchImpl)
110 box <- Box.makeComponent
113 yogaInlineCode <- InlineCode.makeComponent
119 $ jssClasses \(theme ∷ CSSTheme) ->
121 { fontFamily: theme.codeFontFamily # NEA.head
122 , backgroundColor: theme.interfaceColour
124 , border: "1px solid #383c39"
126 , borderRadius: "3px"
130 , flexDirection: "row"
133 componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
134 classes <- useStyles {}
135 visibleThroughKey /\ updateVisible <- useState ""
137 baseline child = element cssBaseline { kids: child }
138 kids = reactChildrenToArray children
139 visibleKids = spy "visibleKids" $ fromMaybe kids do
140 i <- kids # A.findIndex (\x -> (unsafeCoerce x).key == visibleThroughKey)
141 pure $ A.take (i+1) kids
146 [ jsx header { className: "" } [ R.text siteInfo.site.siteMetadata.title ]
147 , element sidebar { links: siteInfo.site.siteMetadata.menuLinks }
148 , jsx box {} visibleKids
155 element h ({ level: H2, text: props.children, className: Nothing })
158 element h { level: H3, text: props.children, className: Nothing }
161 element h { level: H4, text: props.children, className: Nothing }
165 { children: [ element p { text: props.children } ]
168 -- \props -> jsx secret { register: updateSections (Map.insert ) }
171 R.span { className: classes.code, children: props.children }
173 \(props ∷ PreProps) -> do
175 childrenQ = Nullable.toMaybe props.children
177 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
179 mdxTypeQ = (_.mdxType >>> Nullable.toMaybe) =<< propsQ
181 childrenQ2 = (_.children >>> Nullable.toMaybe) =<< propsQ
183 classNameQ = (_.className >>> Nullable.toMaybe) =<< propsQ
185 isCode = fromMaybe false (mdxTypeQ <#> eq "code")
190 (fromMaybe 200 >>> show >>> (_ <> "px")) do
193 ( String.split (String.Pattern "\n") code
195 # \x -> (x * 12) + 100
198 language = fromMaybe "" (classNameQ >>= String.stripPrefix (String.Pattern "language-"))
199 case isCode, language of
200 true, "puregaps" -> element fillInTheGaps { code: fromMaybe "" codeQ }
203 { initialCode: fromMaybe "" codeQ
207 false, _ -> element (unsafeCreateDOMComponent "pre") props
210 useEffect (A.length kids) do
212 firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" && ((unsafeCoerce x).props.children.props.className == "language-puregaps")) <#> (\x -> (unsafeCoerce x).key)
213 lastKey = kids # A.last # unsafeCoerce # _.key
214 updateVisible (const (firstGaps ?|| lastKey))
218 [ element mdxProvider
222 , components: mdxComponents
227 withSidebar <- WithSidebar.makeComponent
230 $ jssClasses \(theme ∷ CSSTheme) ->
234 , flexDirection: "row"
239 component "Sidebar" \{ links } -> React.do
240 classes <- useStyles {}
242 $ element withSidebar
244 { sidebarChildren: [ R.div_ [ R.text "hahahaha" ] ]
245 , notSidebarChildren: [] ∷ Array JSX
249foreign import mdxProvider ∷
252 { components ∷ { | r } -- TODO Don't lie
253 , children ∷ Array JSX
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