/**
* FlowOS Bootloader
*
*/
import Kernel, { spaces } from './kernel'
import HTML from './HTML'
import logo from './assets/flow.png'
const body = new HTML(document.body)
body.html('')
body.style({
margin: '0',
width: '100vw',
height: '100vh',
overflow: 'hidden'
})
const boot = new HTML('div').styleJs({
display: 'flex',
flexDirection: 'column',
height: '100%',
width: '100%',
background: '#11111b',
padding: '100px',
'font-family': 'monospace',
userSelect: 'none',
overflow: 'hidden'
}).appendTo(body)
boot.appendMany(
new HTML('div')
.styleJs({
display: 'flex',
height: '40px',
alignItems: 'center',
gap: '10px'
})
.appendMany(
new HTML('img').attr({
src: logo,
height: '40px'
}),
new HTML('h1').text('FlowOS').styleJs({
color: 'white'
})
),
new HTML('img').attr({
src: logo
}).styleJs({
position: 'absolute',
right: '-8vw',
top: '-7vw',
opacity: '0.03',
height: '50vw',
'pointer-events': 'none',
zIndex: '0'
})
)
const terminal = new HTML('div').style({
color: '#89b4fa',
padding: '10px 3px',
'word-break': 'break-all',
'white-space': 'pre-wrap',
flex: '1',
'user-select': 'text',
position: 'relative',
zIndex: '2'
}).appendTo(boot)
const progress = new HTML('div').style({
width: '0',
background: '#89b4fa',
transition: 'width 0.5s cubic-bezier(1,0,0,1)',
height: '5px'
})
new HTML('div').style({
height: '5px',
width: '100%',
background: '#181825'
}).appendTo(boot)
.append(progress)
const write = (content: string): void => {
terminal.text(terminal.getText() + content)
}
const writeln = (content = ''): void => {
write(`${content}\n`)
}
const originalConsoleLog = console.log
const originalConsoleError = console.error
const originalConsoleWarn = console.warn
const originalConsoleGroup = console.group
window.console.log = (...args: any) => {
originalConsoleLog(...args)
writeln(args)
}
window.console.warn = (...args: any) => {
originalConsoleWarn(...args)
writeln(args)
}
window.console.error = (...args: any) => {
originalConsoleError(...args)
writeln(args)
}
window.console.group = (...args: any) => {
originalConsoleGroup(...args)
writeln(spaces + String(args))
}
try {
const args = new URLSearchParams(window.location.search)
const kernel = new Kernel()
await kernel.boot(boot, progress, args)
} catch (e) {
writeln()
writeln('An error occured while booting FlowOS.')
writeln('Please report this error to Flow Works.')
writeln()
console.error(e.stack)
writeln()
terminal.html(terminal.getHTML() + 'Would you like to reset the VirtualFS?')
}