From f860ba70f17066a6024cc8442e5c2c689fec6871 Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Wed, 2 Oct 2024 16:31:23 +0200 Subject: [PATCH] finished the menu and started implementing file IO --- bun.lockb | Bin 217137 -> 208668 bytes package.json | 25 +++--- src/app.css | 120 +++++++++++++++++++++++++++-- src/features/file/index.tsx | 65 ++++++++++++++-- src/features/menu/index.tsx | 109 +++++++++++++++++---------- src/features/menu/style.css | 28 ------- src/routes/(editor).tsx | 5 +- src/routes/(editor)/index.css | 8 ++ src/routes/(editor)/index.tsx | 138 +++++++++++++++++++++++++++++++++- tsconfig.json | 2 +- 10 files changed, 408 insertions(+), 92 deletions(-) delete mode 100644 src/features/menu/style.css create mode 100644 src/routes/(editor)/index.css diff --git a/bun.lockb b/bun.lockb index a01ed5a19fdf1b72a468cf75fd37b4ea143762e2..9f3d804f382fd1d08c3b90ba723b51de2f25d5e6 100644 GIT binary patch delta 31249 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 X;c|UlTz=Ap`(3Xjy=uDQ0>&8tQPSU> delta 36747 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 C;vF#n diff --git a/package.json b/package.json index 93a1ba6..4138368 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,25 @@ { "name": "example-basic", - "type": "module", + "dependencies": { + "@solidjs/meta": "^0.29.4", + "@solidjs/router": "^0.14.7", + "@solidjs/start": "^1.0.8", + "dexie": "^4.0.8", + "solid-icons": "^1.1.0", + "solid-js": "^1.9.1", + "vinxi": "^0.4.1" + }, + "engines": { + "node": ">=18" + }, "scripts": { "dev": "vinxi dev", "build": "vinxi build", "start": "vinxi start", "version": "vinxi version" }, - "dependencies": { - "@solidjs/meta": "^0.29.4", - "@solidjs/router": "^0.14.1", - "@solidjs/start": "^1.0.6", - "solid-js": "^1.8.18", - "vinxi": "^0.4.1" - }, - "engines": { - "node": ">=18" + "type": "module", + "devDependencies": { + "@types/wicg-file-system-access": "^2023.10.5" } } diff --git a/src/app.css b/src/app.css index 8596998..2789e4a 100644 --- a/src/app.css +++ b/src/app.css @@ -1,17 +1,125 @@ +html { + inline-size: 100%; + block-size: 100%; + overflow: clip; +} + body { + inline-size: 100%; + block-size: 100%; + overflow: clip; + + margin: 0; + font-family: Gordita, Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; + + * { + box-sizing: border-box; + } + + & .menu-root { + display: grid; + grid-auto-flow: column; + justify-content: start; + position: relative; + + gap: .5em; + padding-inline-start: 1em; + block-size: 2em; + + background-color: #eee; + + & > .logo { + inline-size: 3em; + block-size: 3em; + padding: .75em; + margin-block-end: -1em; + background-color: inherit; + border-radius: .25em; + } + + & > div { + display: contents; + } + + .menu-item { + padding: .5em 1em; + + border: none; + background-color: #eee; + cursor: pointer; + + text-align: start; + + &:hover { + background-color: #fff; + } + } + + .menu-child { + position: fixed; + inset-inline-start: anchor(self-start); + inset-block-start: anchor(end); + + grid-auto-flow: row; + place-content: start; + + gap: .5em; + padding: .5em 0; + inline-size: max-content; + + background-color: #fff; + border: 1px solid #eee; + border-block-start-width: 0; + margin: unset; + + &:popover-open { + display: grid; + } + + & > .menu-item { + background-color: #fff; + + &:hover { + background-color: #f8f8f8; + } + } + } + + :popover-open + .menu-item { + background-color: #fff; + } + } + + & > main { + block-size: 100%; + + padding: 1em; + padding-block-start: 1.5em; + + overflow: clip auto; + + & details { + & > summary::marker { + content: url('data:image/svg+xml;charset=UTF-8,'); + } + + &[open] > summary::marker { + content: url('data:image/svg+xml;charset=UTF-8,'); + } + + & span { + cursor: pointer; + } + } + + } } a { margin-right: 1rem; } -main { - text-align: center; - padding: 1em; - margin: 0 auto; -} - h1 { color: #335d92; text-transform: uppercase; diff --git a/src/features/file/index.tsx b/src/features/file/index.tsx index 50a54ea..37b95f6 100644 --- a/src/features/file/index.tsx +++ b/src/features/file/index.tsx @@ -1,12 +1,67 @@ -import { createContext, useContext } from "solid-js"; +import Dexie, { EntityTable } from "dexie"; +import { Component, createContext, useContext } from "solid-js"; +import { isServer } from "solid-js/web"; -const FilesContext = createContext(); +type Handle = FileSystemFileHandle|FileSystemDirectoryHandle; -export const FilesProvider = (props) => { - return {props.children}; +interface File { + name: string; + handle: Handle; } -export const useFiles = () => useContext(FilesContext); +type Store = Dexie & { + files: EntityTable; +}; + +interface FilesContextType { + set(name: string, handle: Handle): Promise; + get(name: string): Promise; + list(): Promise; +} + +const FilesContext = createContext(); + +const clientContext = (): FilesContextType => { + const db = new Dexie('Files') as Store; + + db.version(1).stores({ + files: 'name, handle' + }); + + return { + async set(name: string, handle: Handle) { + await db.files.put({ name, handle }); + }, + async get(name: string) { + return (await db.files.get(name))?.handle; + }, + async list() { + const files = await db.files.toArray(); + + return files.map(f => f.handle) + }, + } +}; + +const serverContext = (): FilesContextType => ({ + set(){ + return Promise.resolve(); + }, + get(name: string){ + return Promise.resolve(undefined); + }, + list(){ + return Promise.resolve([]); + }, +}); + +export const FilesProvider = (props) => { + const ctx = isServer ? serverContext() : clientContext(); + + return {props.children}; +} + +export const useFiles = () => useContext(FilesContext)!; export const open = () => { diff --git a/src/features/menu/index.tsx b/src/features/menu/index.tsx index 12dfccf..a5b7a12 100644 --- a/src/features/menu/index.tsx +++ b/src/features/menu/index.tsx @@ -1,6 +1,5 @@ -import { Accessor, Component, For, JSX, ParentComponent, Setter, Show, children, createContext, createMemo, createSignal, createUniqueId, mergeProps, onCleanup, onMount, splitProps, useContext } from "solid-js"; +import { Accessor, Component, For, JSX, ParentComponent, Setter, Show, children, createContext, createEffect, createMemo, createSignal, createUniqueId, mergeProps, onCleanup, onMount, splitProps, useContext } from "solid-js"; import { Portal, isServer } from "solid-js/web"; -import './style.css'; import { createStore } from "solid-js/store"; export interface MenuContextType { @@ -57,31 +56,13 @@ export const MenuProvider: ParentComponent = (props) => { const addItems = (items: (Item|ItemWithChildren)[]) => setStore('items', values => { for (const item of items) { - // const existing = values.get(item.id); - - // if(item.children && existing?.children instanceof Map) { - // for (const child of item.children) { - // existing.children.set(child.id, child); - // } - // } - // else if (item.children && existing === undefined){ - // values.set(item.id, { ...item, children: new Map(item.children.map(c => [ c.id, c ])) }); - // } - // else { - // values.set(item.id, item as Item); - // } values[item.id] = item; } return values; }); - const items = createMemo<(Item|ItemWithChildren)[]>(() => - Array.from( - Object.values(store.items), - // item => item.children instanceof Map ? { ...item, children: Array.from(item.children.values()) } : item - ) - ); - const commands = createMemo(() => items().map(item => item.children instanceof Array ? item.children.map(c => c.command) : item.command).flat()); + const items = () => Object.values(store.items); + const commands = () => Object.values(store.items).map(item => item.children?.map(c => c.command) ?? item.command).flat(); return {props.children}; } @@ -90,7 +71,7 @@ const useMenu = () => { const context = useContext(MenuContext); if(context === undefined) { - throw new Error(' is called outside of a '); + throw new Error(`MenuContext is called outside of a `); } return context; @@ -117,31 +98,81 @@ const Item: Component = (props) => { const Root: ParentComponent<{}> = (props) => { const menu = useMenu(); - - menu.addItems((isServer + const [ current, setCurrent ] = createSignal(); + const items = (isServer ? props.children - : props.children?.map(c => c())) ?? []) + : props.children?.map(c => c())) ?? []; + + menu.addItems(items) + + const close = () => { + const el = current(); + + if(el) { + el.hidePopover(); + + setCurrent(undefined); + } + }; + + const onExecute = (command: Command) => { + return async () => { + await command?.(); + + close(); + } + }; const Button: Component<{ label: string, command: Command }|{ [key: string]: any }> = (props) => { const [ local, rest ] = splitProps(props, ['label', 'command']); - return ; + return ; }; return - - {(item) => <> -