5import Data.Array as Array
6import Data.Array.NonEmpty as NEA
7import Data.Function.Uncurried (mkFn2)
8import Data.Maybe (Maybe(..), fromMaybe, isJust)
9import Data.Nullable (Nullable, toMaybe)
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, fragment)
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.Compiler.Types (Compiler)
29import Yoga.FillInTheGaps.Component as FillInTheGaps
30import Yoga.FillInTheGaps.Logic (complete, parseSegments)
31import Yoga.Header.Component (mkHeader)
32import Yoga.Helpers ((?||))
33import Yoga.InlineCode.Component as InlineCode
34import Yoga.Theme (fromTheme)
35import Yoga.Theme.CSSBaseline (mkCssBaseline)
36import Yoga.Theme.Default (darkTheme)
37import Yoga.Theme.Provider (mkThemeProvider)
38import Yoga.Theme.Styles (makeStylesJSS)
39import Yoga.Theme.Types (CSSTheme)
40import Yoga.Typography.Header (HeadingLevel(..), mkH)
41import Yoga.Typography.Paragraph (mkP)
42import Yoga.WithSidebar.Component (makeComponent) as WithSidebar
48 , menuLinks ∷ Array { name ∷ String, link ∷ String }
58 { mdxType ∷ Nullable String
59 , children ∷ Nullable String
60 , className ∷ Nullable String
69 { children ∷ ReactChildren JSX
70 , siteInfo ∷ SiteQueryResult
73mkLayout fetchImpl = do
74 themeProvider <- mkThemeProvider
75 mdxProviderComponent <- mkMdxProviderComponent (apiCompiler fetchImpl)
76 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
78 $ element themeProvider
79 { theme: fromTheme darkTheme
81 [ element mdxProviderComponent
88mkSecret ∷ Effect (ReactComponent { kids ∷ Array JSX, visible ∷ Boolean, register ∷ Effect Unit })
90 component "Secret" \{ kids, visible, register } -> React.do
92 unless visible register
96 { style: R.css { visibility: if visible then "visible" else "hidden" }
100mkMdxProviderComponent ∷
105 { children ∷ ReactChildren JSX
106 , siteInfo ∷ SiteQueryResult
109mkMdxProviderComponent compiler = do
110 cssBaseline <- mkCssBaseline
111 editor <- mkCompileEditor compiler
112 fillInTheGaps <- FillInTheGaps.makeComponent
113 box <- Box.makeComponent
116 yogaInlineCode <- InlineCode.makeComponent
122 $ jssClasses \(theme ∷ CSSTheme) ->
124 { fontFamily: theme.codeFontFamily # NEA.head
125 , backgroundColor: theme.interfaceColour
127 , border: "1px solid #383c39"
129 , borderRadius: "3px"
133 , flexDirection: "row"
136 componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
137 classes <- useStyles {}
138 visibleThrough /\ updateVisible <- useState 1
140 baseline child = element cssBaseline { kids: child }
142 kids = reactChildrenToArray children
144 foldVisible ∷ { i ∷ Int, acc ∷ Array JSX } -> JSX -> { i ∷ Int, acc ∷ Array JSX }
145 foldVisible { i, acc } a =
146 if i >= visibleThrough then
149 if (unsafeCoerce a).props.mdxType == "pre"
150 && ((unsafeCoerce a).props.children.props.className == "language-purescript")
151 && ((unsafeCoerce a).props.children.props.mdxType == "code")
152 && ((unsafeCoerce a).props.children.props.children # parseSegments # isJust) then
153 { i: i + 1, acc: A.snoc acc a }
155 { i, acc: A.snoc acc a }
157 visibleKids = kids # A.foldl foldVisible { i: 0, acc: [] ∷ Array JSX } # _.acc
162 [ jsx header { className: "" } [ R.text siteInfo.site.siteMetadata.title ]
163 , element sidebar { links: siteInfo.site.siteMetadata.menuLinks }
164 , jsx box {} visibleKids
171 element h ({ level: H2, text: props.children, className: Nothing })
174 element h { level: H3, text: props.children, className: Nothing }
177 element h { level: H4, text: props.children, className: Nothing }
178 , hr: (const $ R.hr {})
182 { children: [ element p { text: props.children } ]
186 R.span { className: classes.code, children: props.children }
188 \(props ∷ PreProps) -> do
190 childrenQ = Nullable.toMaybe props.children
192 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
194 mdxTypeQ = (_.mdxType >>> Nullable.toMaybe) =<< propsQ
196 childrenQ2 = (_.children >>> Nullable.toMaybe) =<< propsQ
198 classNameQ = (_.className >>> Nullable.toMaybe) =<< propsQ
200 isCode = fromMaybe false (mdxTypeQ <#> eq "code")
205 (fromMaybe 200 >>> show >>> (_ <> "px")) do
208 ( String.split (String.Pattern "\n") code
210 # \x -> (x * 12) + 100
213 language = fromMaybe "" (classNameQ >>= String.stripPrefix (String.Pattern "language-"))
215 segmentsQ = parseSegments (codeQ ?|| "")
216 case isCode, language, segmentsQ of
217 true, "purescript", Just initialSegments ->
219 [ element fillInTheGaps
230 { initialCode: fromMaybe "" codeQ
234 false, _, _ -> element (unsafeCreateDOMComponent "pre") props
238 [ element mdxProvider
242 , components: mdxComponents
247 withSidebar <- WithSidebar.makeComponent
250 $ jssClasses \(theme ∷ CSSTheme) ->
254 , flexDirection: "row"
259 component "Sidebar" \{ links } -> React.do
260 classes <- useStyles {}
262 $ element withSidebar
264 { sidebarChildren: [ R.div_ [ R.text "hahahaha" ] ]
265 , notSidebarChildren: [] ∷ Array JSX
269foreign import mdxProvider ∷
272 { components ∷ { | r } -- TODO Don't lie
273 , 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