6import Data.Array as Array
7import Data.Array.NonEmpty as NEA
8import Data.Function.Uncurried (mkFn2)
9import Data.Maybe (Maybe(..), fromMaybe, isJust)
10import Data.Nullable (Nullable, toMaybe)
11import Data.Nullable as Nullable
12import Data.String as String
13import Data.Tuple.Nested ((/\))
14import Debug.Trace (spy)
16import JSS (jss, jssClasses)
17import Justifill (justifill)
18import Milkis.Impl (FetchImpl)
19import React.Basic (JSX, ReactComponent, fragment)
20import React.Basic.DOM (unsafeCreateDOMComponent)
21import React.Basic.DOM as R
22import React.Basic.Helpers (jsx)
23import React.Basic.Hooks (ReactChildren, component, componentWithChildren, element, reactChildrenToArray, useEffect, useState)
24import React.Basic.Hooks as React
25import Unsafe.Coerce (unsafeCoerce)
26import Yoga.Box.Component as Box
27import Yoga.CompileEditor.Component (mkCompileEditor)
28import Yoga.Compiler.Api (apiCompiler)
29import Yoga.Compiler.Types (Compiler)
30import Yoga.FillInTheGaps.Component as FillInTheGaps
31import Yoga.FillInTheGaps.Logic (complete, parseSegments)
32import Yoga.Header.Component (mkHeader)
33import Yoga.Helpers ((?||))
34import Yoga.InlineCode.Component as InlineCode
35import Yoga.Theme (fromTheme)
36import Yoga.Theme.CSSBaseline (mkCssBaseline)
37import Yoga.Theme.Default (darkTheme)
38import Yoga.Theme.Provider (mkThemeProvider)
39import Yoga.Theme.Styles (makeStylesJSS)
40import Yoga.Theme.Types (CSSTheme)
41import Yoga.Typography.Header (HeadingLevel(..), mkH)
42import Yoga.Typography.Paragraph (mkP)
43import Yoga.WithSidebar.Component (makeComponent) as WithSidebar
49 , menuLinks ∷ Array { name ∷ String, link ∷ String }
59 { mdxType ∷ Nullable String
60 , children ∷ Nullable String
61 , className ∷ Nullable String
70 { children ∷ ReactChildren JSX
71 , siteInfo ∷ SiteQueryResult
74mkLayout fetchImpl = do
75 themeProvider <- mkThemeProvider
76 mdxProviderComponent <- mkMdxProviderComponent (apiCompiler fetchImpl)
77 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
79 $ element themeProvider
80 { theme: fromTheme darkTheme
82 [ element mdxProviderComponent
89mkSecret ∷ Effect (ReactComponent { kids ∷ Array JSX, visible ∷ Boolean, register ∷ Effect Unit })
91 component "Secret" \{ kids, visible, register } -> React.do
93 unless visible register
97 { style: R.css { visibility: if visible then "visible" else "hidden" }
101mkMdxProviderComponent ∷
106 { children ∷ ReactChildren JSX
107 , siteInfo ∷ SiteQueryResult
110mkMdxProviderComponent compiler = do
111 cssBaseline <- mkCssBaseline
112 editor <- mkCompileEditor compiler
113 fillInTheGaps <- FillInTheGaps.makeComponent
114 box <- Box.makeComponent
117 yogaInlineCode <- InlineCode.makeComponent
123 $ jssClasses \(theme ∷ CSSTheme) ->
125 { fontFamily: theme.codeFontFamily # NEA.head
126 , backgroundColor: theme.interfaceColour
128 , border: "1px solid #383c39"
130 , borderRadius: "3px"
134 , flexDirection: "row"
137 componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
138 classes <- useStyles {}
139 visibleThrough /\ updateVisible <- useState 1
141 baseline child = element cssBaseline { kids: child }
143 kids = reactChildrenToArray children
150 [ jsx header { className: "" } [ R.text siteInfo.site.siteMetadata.title ]
151 , element sidebar { links: siteInfo.site.siteMetadata.menuLinks }
152 , jsx box {} visibleKids
159 element h ({ level: H2, text: props.children, className: Nothing })
162 element h { level: H3, text: props.children, className: Nothing }
165 element h { level: H4, text: props.children, className: Nothing }
166 , hr: (const $ R.hr {})
170 { children: [ element p { text: props.children } ]
174 R.span { className: classes.code, children: props.children }
176 \(props ∷ PreProps) -> do
178 childrenQ = Nullable.toMaybe props.children
180 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
182 mdxTypeQ = (_.mdxType >>> Nullable.toMaybe) =<< propsQ
184 childrenQ2 = (_.children >>> Nullable.toMaybe) =<< propsQ
186 classNameQ = (_.className >>> Nullable.toMaybe) =<< propsQ
188 isCode = fromMaybe false (mdxTypeQ <#> eq "code")
193 (fromMaybe 200 >>> show >>> (_ <> "px")) do
196 ( String.split (String.Pattern "\n") code
198 # \x -> (x * 12) + 100
201 language = fromMaybe "" (classNameQ >>= String.stripPrefix (String.Pattern "language-"))
203 segmentsQ = parseSegments (codeQ ?|| "")
204 case isCode, language, segmentsQ of
205 true, "purescript", Just initialSegments ->
207 [ element fillInTheGaps
213 (\_ -> spy "setting key to" (unsafeCoerce props).key)
218 { initialCode: fromMaybe "" codeQ
222 false, _, _ -> element (unsafeCreateDOMComponent "pre") props
224 useEffect (A.length kids) do
226 firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" &&
227 ((unsafeCoerce x).props.children.props.className == "language-purescript") &&
228 ((unsafeCoerce x).props.children.props.mdxType == "code") &&
229 ((unsafeCoerce x).props.children.props.children # parseSegments # isJust)
230 ) <#> (\x -> spy "first boy" $ (unsafeCoerce x).key)
232 lastKey = kids # A.last # unsafeCoerce # _.key
233 updateVisible (const (firstGaps ?|| lastKey))
237 [ element mdxProvider
241 , components: mdxComponents
246 withSidebar <- WithSidebar.makeComponent
249 $ jssClasses \(theme ∷ CSSTheme) ->
253 , flexDirection: "row"
258 component "Sidebar" \{ links } -> React.do
259 classes <- useStyles {}
261 $ element withSidebar
263 { sidebarChildren: [ R.div_ [ R.text "hahahaha" ] ]
264 , notSidebarChildren: [] ∷ Array JSX
268foreign import mdxProvider ∷
271 { components ∷ { | r } -- TODO Don't lie
272 , 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