initial setup
This commit is contained in:
parent
9e3f3cf46b
commit
2ec83e2ccb
10 changed files with 172 additions and 26 deletions
|
@ -9,9 +9,6 @@ export default function App() {
|
|||
<Router
|
||||
root={props => (
|
||||
<MetaProvider>
|
||||
<Title>SolidStart - Basic</Title>
|
||||
<a href="/">Index</a>
|
||||
<a href="/about">About</a>
|
||||
<Suspense>{props.children}</Suspense>
|
||||
</MetaProvider>
|
||||
)}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// @refresh reload
|
||||
import { mount, StartClient } from "@solidjs/start/client";
|
||||
|
||||
mount(() => <StartClient />, document.getElementById("app")!);
|
||||
mount(() => <StartClient />, document.body);
|
||||
|
|
|
@ -12,7 +12,7 @@ export default createHandler(() => (
|
|||
{assets}
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">{children}</div>
|
||||
{children}
|
||||
{scripts}
|
||||
</body>
|
||||
</html>
|
||||
|
|
13
src/features/file/index.tsx
Normal file
13
src/features/file/index.tsx
Normal file
|
@ -0,0 +1,13 @@
|
|||
import { createContext, useContext } from "solid-js";
|
||||
|
||||
const FilesContext = createContext();
|
||||
|
||||
export const FilesProvider = (props) => {
|
||||
return <FilesContext.Provider value={undefined}>{props.children}</FilesContext.Provider>;
|
||||
}
|
||||
|
||||
export const useFiles = () => useContext(FilesContext);
|
||||
|
||||
export const open = () => {
|
||||
|
||||
};
|
113
src/features/menu/index.tsx
Normal file
113
src/features/menu/index.tsx
Normal file
|
@ -0,0 +1,113 @@
|
|||
import { Component, JSX, ParentComponent, children, createContext, createRenderEffect, createUniqueId, mergeProps, onCleanup, useContext } from "solid-js";
|
||||
import { isServer, ssr, useAssets } from "solid-js/web";
|
||||
|
||||
export interface MenuContextType {
|
||||
add(item: Item): number;
|
||||
remove(index: number): void;
|
||||
};
|
||||
|
||||
export interface Item {
|
||||
ref?: Element;
|
||||
id: string;
|
||||
label: string;
|
||||
children?: Omit<Item, 'children'>[];
|
||||
}
|
||||
|
||||
const MenuContext = createContext<MenuContextType>();
|
||||
|
||||
const initClientProvider = () => {
|
||||
console.log(document.querySelector('[data-app-menu="root"]'));
|
||||
console.log(document.querySelector('[data-app-menu="ssr-items"]'));
|
||||
|
||||
return {
|
||||
add(item: Item) {
|
||||
return -1;
|
||||
},
|
||||
remove(index: number) {},
|
||||
};
|
||||
};
|
||||
|
||||
const initServerProvider = () => {
|
||||
const items: Item[] = [];
|
||||
|
||||
useAssets(() => ssr(`<div data-app-menu="ssr-items">${JSON.stringify(items)}</div>`) as any);
|
||||
|
||||
return {
|
||||
add(item: Item) {
|
||||
return items.push(item);
|
||||
},
|
||||
remove(index: number) {},
|
||||
};
|
||||
};
|
||||
|
||||
export const MenuProvider: ParentComponent = (props) => {
|
||||
const ctx = isServer ? initServerProvider() : initClientProvider();
|
||||
|
||||
return <MenuContext.Provider value={ctx}>{props.children}</MenuContext.Provider>;
|
||||
}
|
||||
|
||||
const useMenu = () => {
|
||||
const context = useContext(MenuContext);
|
||||
|
||||
if(context === undefined) {
|
||||
throw new Error('<Menu /> is called outside of a <MenuProvider />');
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
export const MenuItem: ParentComponent<{ label: string }> = (props) => {
|
||||
const childItems = children(() => props.children);
|
||||
|
||||
return mergeProps(props, {
|
||||
get children() {
|
||||
return childItems();
|
||||
}
|
||||
}) as unknown as JSX.Element;
|
||||
}
|
||||
|
||||
export const Menu: ParentComponent<{}> = (props) => {
|
||||
const menu = useMenu();
|
||||
const items: { label: string, children?: { label: string }[] }[] = (isServer
|
||||
? props.children
|
||||
: props.children?.map(c => c())) ?? [];
|
||||
|
||||
createRenderEffect(() => {
|
||||
const indices = items.map(({ label, children }) =>
|
||||
menu.add({
|
||||
id: createUniqueId(),
|
||||
label,
|
||||
children: children?.map(({ label }) => ({ id: createUniqueId(), label }))
|
||||
})
|
||||
);
|
||||
|
||||
onCleanup(() => {
|
||||
for(const index of indices){
|
||||
menu.remove(index);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
export const MenuRoot: Component = () => {
|
||||
const menu = useMenu();
|
||||
|
||||
return <div data-app-menu="root"></div>
|
||||
|
||||
// return <For each={menu?.items()}>
|
||||
// {(item) => <>
|
||||
// <button {...(item.children ? { popovertarget: item.label } : {})}>{item.label}</button>
|
||||
|
||||
// <Show when={item.children}>
|
||||
// <div id={item.label} popover>
|
||||
// <For each={item.children}>
|
||||
// {(child) => <span>{child.label}</span>}
|
||||
// </For>
|
||||
// </div>
|
||||
// </Show>
|
||||
// </>
|
||||
// }
|
||||
// </For>;
|
||||
};
|
21
src/routes/(editor).tsx
Normal file
21
src/routes/(editor).tsx
Normal file
|
@ -0,0 +1,21 @@
|
|||
import { Title } from "@solidjs/meta";
|
||||
import { FilesProvider } from "~/features/file";
|
||||
import { MenuRoot, MenuProvider } from "~/features/menu";
|
||||
|
||||
|
||||
export default function Editor(props) {
|
||||
return <MenuProvider>
|
||||
<nav>
|
||||
<Title>Translation-Tool</Title>
|
||||
<a href="/">Index</a>
|
||||
<a href="/about">About</a>
|
||||
<MenuRoot />
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
<FilesProvider>
|
||||
{props.children}
|
||||
</FilesProvider>
|
||||
</main>
|
||||
</MenuProvider>
|
||||
}
|
|
@ -3,7 +3,7 @@ import { HttpStatusCode } from "@solidjs/start";
|
|||
|
||||
export default function NotFound() {
|
||||
return (
|
||||
<main>
|
||||
<>
|
||||
<Title>Not Found</Title>
|
||||
<HttpStatusCode code={404} />
|
||||
<h1>Page Not Found</h1>
|
||||
|
@ -14,6 +14,6 @@ export default function NotFound() {
|
|||
</a>{" "}
|
||||
to learn how to build SolidStart apps.
|
||||
</p>
|
||||
</main>
|
||||
</>
|
||||
);
|
||||
}
|
21
src/routes/(editor)/index.tsx
Normal file
21
src/routes/(editor)/index.tsx
Normal file
|
@ -0,0 +1,21 @@
|
|||
import { Menu, MenuItem } from "~/features/menu";
|
||||
|
||||
export default function Index() {
|
||||
return (
|
||||
<>
|
||||
<Menu>
|
||||
<MenuItem label="file">
|
||||
<MenuItem label="open" />
|
||||
|
||||
<MenuItem label="save" />
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem label="edit" />
|
||||
|
||||
<MenuItem label="selection" />
|
||||
|
||||
<MenuItem label="view" />
|
||||
</Menu>
|
||||
</>
|
||||
);
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
import { Title } from "@solidjs/meta";
|
||||
import Counter from "~/components/Counter";
|
||||
|
||||
export default function Home() {
|
||||
return (
|
||||
<main>
|
||||
<Title>Hello World</Title>
|
||||
<h1>Hello world!</h1>
|
||||
<Counter />
|
||||
<p>
|
||||
Visit{" "}
|
||||
<a href="https://start.solidjs.com" target="_blank">
|
||||
start.solidjs.com
|
||||
</a>{" "}
|
||||
to learn how to build SolidStart apps.
|
||||
</p>
|
||||
</main>
|
||||
);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue