1- import { marked } from 'https://unpkg.com/marked@17.0.1/lib/marked.esm.js'
21import hljs from 'https://unpkg.com/@highlightjs/cdn-assets@11.11.1/es/core.min.js'
32
43import hljsXML from 'https://unpkg.com/@highlightjs/cdn-assets@11.11.1/es/languages/xml.min.js'
54import hljsMarkdown from 'https://unpkg.com/@highlightjs/cdn-assets@11.11.1/es/languages/markdown.min.js'
65
6+ import loadContent from './content.js'
7+ import loadResponsivity from './responsivity.js'
8+ import loadChangelog from './changelog.js'
9+
710hljs . registerLanguage ( 'html' , hljsXML )
811hljs . registerLanguage ( 'md' , hljsMarkdown )
912
10- import preprocess from '/src/preprocessor.js'
11- import postprocess from '/src/postprocessor.js'
12-
13- const contents = {
14- ...await fetch ( '/content/index.json' )
15- . then ( ( r ) => r . json ( ) )
16- . catch ( console . error )
17- }
18-
19- const main = document . querySelector ( 'main' )
20-
21- const path = location . pathname . slice ( 1 )
22- const content = path ? contents [ path ] ?. path || '/content/not-found.md' : '/content/index.md'
23-
24- const nav = document . querySelector ( 'nav' )
25- const navContainer = document . getElementById ( 'nav-container' )
26- const navButton = document . getElementById ( 'nav-button' )
27- const navCloseButton = document . getElementById ( 'nav-close-button' )
28- const navOverlay = document . getElementById ( 'nav-overlay' )
29-
30- const changelogRoot = document . getElementById ( 'changelog' )
31- const changelogContainer = document . getElementById ( 'changelog-container' )
32-
33- const responsiveEvent = window . matchMedia ( "only screen and (max-width: 768px)" )
34-
35- let navHidden = responsiveEvent . matches
36- nav . classList . toggle ( 'hidden' , navHidden )
37-
38- const recalcResponsiveSize = ( ) => {
39- const sideWidth = `calc(${ main . getBoundingClientRect ( ) . x } px - 32px)`
40-
41- nav . style . width = sideWidth
42- changelogRoot . style . width = sideWidth
43- }
44-
45- const recalcNavRight = ( immediate = false ) => {
46- const outside = responsiveEvent . matches
47- ? '-100%'
48- : `calc(-${ main . getBoundingClientRect ( ) . x } px - 32px - 2px)`
49-
50- const inside = responsiveEvent . matches
51- ? '0'
52- : '16px'
53-
54- if ( immediate )
55- nav . classList . toggle ( 'no-transition' , true )
56-
57- nav . style . right = navHidden ? outside : inside
58-
59- if ( immediate )
60- setTimeout (
61- ( ) => nav . classList . toggle ( 'no-transition' , false ) ,
62- 100
63- )
64- }
65-
66- const toggleNav = ( force = undefined ) => {
67- navHidden = ( force !== undefined && ! force ) || ! navHidden
68- nav . classList . toggle ( 'hidden' , navHidden )
69- recalcNavRight ( )
70- }
71-
72- const recalcResponsive = ( immediate = false ) => {
73- recalcResponsiveSize ( )
74- recalcNavRight ( immediate )
75- }
76-
77- recalcResponsive ( true )
78-
79- navContainer . replaceChildren (
80- ...Object
81- . entries ( contents )
82- . filter ( ( [ _ , { metadata } ] ) => ! metadata ?. delisted )
83- . flatMap ( ( [ name , { metadata } ] ) => {
84- const e = document . createElement ( 'a' )
85- e . innerText = metadata ?. name || name
86-
87- const path = metadata ?. path || name
88- e . href = path . startsWith ( '/' ) ? path : '/' + path
89-
90- return [ e , ' ' ]
91- } )
92- )
93-
94- navButton . addEventListener ( 'click' , toggleNav )
95- navCloseButton . addEventListener ( 'click' , ( ) => toggleNav ( false ) )
96- responsiveEvent . addEventListener ( 'change' , recalcResponsive )
97- navOverlay . addEventListener ( 'click' , ( ) => toggleNav ( false ) )
98-
99- if ( content )
100- fetch ( content )
101- . then ( ( r ) => r . text ( ) )
102- . then ( ( text ) => text . replace ( / - - - [ \r \n ] .* ?[ \r \n ] - - - / s, '' ) )
103- . then ( ( text ) => main . replaceChildren (
104- ...postprocess ( marked . parse (
105- preprocess ( text )
106- ) )
107- )
108- )
109- . catch ( console . error )
110-
111- const changelog = await fetch ( '/content/changelog.json' )
112- . then ( ( r ) => r . json ( ) )
113- . catch ( console . error )
114-
115- if ( changelog )
116- changelogContainer . replaceChildren (
117- ...changelog . map ( ( [ hash , title ] ) => {
118- const line = document . createElement ( 'div' )
119- line . className = 'line'
120-
121- const hashLabel = document . createElement ( 'code' )
122- hashLabel . className = 'hash'
123- hashLabel . classList . toggle ( 'latest' , title . includes ( 'origin/main' ) )
124- hashLabel . classList . toggle ( 'local-latest' , title . includes ( 'HEAD ->' ) )
125- hashLabel . textContent = hash . substring ( 0 , 7 )
126- hashLabel . title = hash
127-
128- const titleLabel = document . createElement ( 'div' )
129- titleLabel . className = 'changelog-title'
130- titleLabel . textContent = title . includes ( 'origin/HEAD' ) || title . includes ( 'HEAD ->' )
131- ? title . replace ( / ^ \( .+ \) / , '' )
132- : title
133- titleLabel . title = title
134-
135- line . append ( hashLabel , titleLabel )
136-
137- return line
138- } )
139- )
140-
141- // okay since it's not rendering sometimes let's just make it wait a bit...
142- await new Promise ( ( r ) => setTimeout ( r , 500 ) )
143- . then ( ( ) => hljs . highlightAll ( ) )
13+ await loadResponsivity ( )
14+ await loadContent ( ) . then ( ( ) => hljs . highlightAll ( ) )
15+ await loadChangelog ( )
0 commit comments