|
import { render } from "preact"; |
|
import { html, create, styled } from "./misc.mjs"; |
|
|
|
import { pages } from "./pages.mjs"; |
|
|
|
const useStore = create((set, get) => ({ |
|
page: Object.keys(pages).includes(location.hash.slice(1)) |
|
? location.hash.slice(1) |
|
: Object.keys(pages)[0], |
|
setPage: (page) => { |
|
set({ page }); |
|
location.hash = page; |
|
}, |
|
})); |
|
|
|
const NotFound = () => html`<div>Not Found</div>`; |
|
|
|
const Content = () => { |
|
const { page } = useStore(); |
|
const Page = pages[page]; |
|
return Page ? html`<${Page} />` : html`<${NotFound} />`; |
|
}; |
|
|
|
const NavButton = styled.button` |
|
background-color: transparent; |
|
border: none; |
|
color: white; |
|
cursor: pointer; |
|
font-size: 1rem; |
|
padding: 0.5rem 1rem; |
|
border-bottom: 1px solid transparent; |
|
|
|
&:hover { |
|
background-color: #444; |
|
} |
|
|
|
&.--active { |
|
border-bottom: 1px solid blue; |
|
} |
|
`; |
|
|
|
const HeaderNav = styled.nav` |
|
display: flex; |
|
padding: 4px 8px; |
|
background-color: #333; |
|
|
|
gap: 8px; |
|
|
|
user-select: none; |
|
|
|
.nav-icon { |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
} |
|
|
|
.nav-title { |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
} |
|
|
|
.divider { |
|
flex: 1; |
|
} |
|
`; |
|
|
|
const PageNav = () => { |
|
const { setPage, page: current } = useStore(); |
|
return html` |
|
<${HeaderNav}> |
|
<div class="nav-icon">🗣️</div> |
|
<div class="nav-title">ChatTTS Forge Playground</div> |
|
${Object.keys(pages).map( |
|
(page) => |
|
html` |
|
<${NavButton} |
|
onClick=${() => setPage(page)} |
|
className=${current === page ? "--active" : ""} |
|
> |
|
${page} |
|
<//> |
|
` |
|
)} |
|
<div class="divider"></div> |
|
<${NavButton} |
|
onClick=${() => { |
|
window.open("https://github.com/lenML/ChatTTS-Forge", "_blank"); |
|
}} |
|
> |
|
github |
|
<//> |
|
<//> |
|
`; |
|
}; |
|
|
|
const AppContent = styled.div` |
|
padding: 8px; |
|
flex: 1; |
|
overflow: auto; |
|
`; |
|
|
|
const App = () => { |
|
const { page } = useStore(); |
|
return html` |
|
<${PageNav} /> |
|
<${AppContent} className="pg-scrollbar"> |
|
<${Content} /> |
|
<//> |
|
`; |
|
}; |
|
|
|
render(html`<${App} />`, document.getElementById("app")); |
|
|