From 552ba7f3c9a8268d8c070c85b8ba0a42856dbced Mon Sep 17 00:00:00 2001 From: Chris Kruining Date: Thu, 10 Oct 2024 13:24:02 +0200 Subject: [PATCH] - fixed grouped rows - added shortcut hint in menu items --- bun.lockb | Bin 208668 -> 209079 bytes package.json | 1 + src/app.css | 24 ++++++++++++++----- src/entry-server.tsx | 3 +++ src/features/file/grid.css | 8 +++---- src/features/file/grid.tsx | 25 +++++++++++++++++-- src/features/menu/index.tsx | 45 ++++++++++++++++++----------------- src/global.d.ts | 7 ------ src/routes/(editor)/edit.tsx | 2 -- 9 files changed, 71 insertions(+), 44 deletions(-) diff --git a/bun.lockb b/bun.lockb index c9a452e83d6feddd5eb08735271e88942504d14e..6e10afadcd8356ee129f9a1388045f01bab4867d 100644 GIT binary patch delta 29723 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 YLT|cKKU3@W1N}@fled>CGduDE0Cyanv;Y7A diff --git a/package.json b/package.json index 4138368..4d2d8fc 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "@solidjs/router": "^0.14.7", "@solidjs/start": "^1.0.8", "dexie": "^4.0.8", + "iterator-helpers-polyfill": "^3.0.1", "solid-icons": "^1.1.0", "solid-js": "^1.9.1", "vinxi": "^0.4.1" diff --git a/src/app.css b/src/app.css index 2fcad67..097d704 100644 --- a/src/app.css +++ b/src/app.css @@ -4,10 +4,11 @@ --surface-1: #eee; --surface-2: #f8f8f8; --surface-3: #fff; - --text: #222; + --text-1: #222; + --text-2: #282828; --primary: #41c6b3; - color: var(--text); + color: var(--text-1); accent-color: var(--primary); --info: oklch(.71 .17 249); @@ -21,7 +22,8 @@ --surface-1: #333; --surface-2: #383838; --surface-3: #444; - --text: #eee; + --text-1: #eee; + --text-2: #d8d8d8; --primary: #6be8d6; @@ -68,7 +70,7 @@ body { block-size: 2em; background-color: var(--surface-2); - color: var(--text); + color: var(--text-1); & > .logo { inline-size: 3em; @@ -93,7 +95,7 @@ body { padding: .5em 1em; background-color: inherit; - color: var(--text); + color: var(--text-1); border: none; cursor: pointer; @@ -109,7 +111,7 @@ body { inset-inline-start: anchor(self-start); inset-block-start: anchor(end); - grid-auto-flow: row; + grid-template-columns: auto auto; place-content: start; gap: .5em; @@ -126,11 +128,21 @@ body { } & > .menu-item { + grid-column: span 2; + display: grid; + grid-template-columns: subgrid; + align-items: center; + background-color: var(--surface-2); &:hover { background-color: var(--surface-3); } + + & > sub { + color: var(--text-2); + text-align: end; + } } } diff --git a/src/entry-server.tsx b/src/entry-server.tsx index e7a6a25..f66a790 100644 --- a/src/entry-server.tsx +++ b/src/entry-server.tsx @@ -1,5 +1,8 @@ // @refresh reload import { createHandler, StartServer } from "@solidjs/start/server"; +import { installIntoGlobal } from "iterator-helpers-polyfill"; + +installIntoGlobal(); export default createHandler(() => ( summary { grid-column: 2 / span calc(1 + var(--columns)); + padding: .5em; + padding-inline-start: calc(var(--depth) * 1em + .5em); - &.cell { - padding-inline-start: calc((var(--depth) + 1) * 1em); - } } & > label > .cell > span { - padding-inline-start: calc(var(--depth) * 1.25em); + padding-inline-start: calc(var(--depth) * 1em); } } } diff --git a/src/features/file/grid.tsx b/src/features/file/grid.tsx index cfae495..fe90151 100644 --- a/src/features/file/grid.tsx +++ b/src/features/file/grid.tsx @@ -61,7 +61,28 @@ const SelectionProvider: ParentComponent<{ rows: Map, context?: (ctx: SelectionContextType) => any }> = (props) => { const columnCount = createMemo(() => props.columns.length - 1); const root = createMemo(() => { - return Object.fromEntries(props.rows.entries().map(([key, value]) => [key, Object.fromEntries(Object.entries(value).map(([lang, { value }]) => [lang, value]))])); + return props.rows + ?.entries() + .map(([key, value]) => [key, Object.fromEntries(Object.entries(value).map(([lang, { value }]) => [lang, value]))] as const) + .reduce((aggregate, [key, entry]) => { + let obj: any = aggregate; + const parts = key.split('.'); + + for (const [i, part] of parts.entries()) { + if (Object.hasOwn(obj, part) === false) { + obj[part] = {}; + } + + if (i === (parts.length - 1)) { + obj[part] = entry; + } + else { + obj = obj[part]; + } + } + + return aggregate; + }, {}); }); return

@@ -127,7 +148,7 @@ const Row: Component<{ entry: Entry, path?: string[] }> = (props) => { const Group: Component<{ key: string, entry: Entry, path: string[] }> = (props) => { return
- {props.key} + {props.key}
; diff --git a/src/features/menu/index.tsx b/src/features/menu/index.tsx index 6bbfe76..3a992f2 100644 --- a/src/features/menu/index.tsx +++ b/src/features/menu/index.tsx @@ -12,6 +12,7 @@ export interface MenuContextType { }; export enum Modifier { + None = 0, Shift = 1 << 0, Control = 1 << 1, Meta = 1 << 2, @@ -22,7 +23,7 @@ export interface Command { (): any; shortcut?: { key: string; - modifier?: Modifier; + modifier: Modifier; }; } @@ -115,17 +116,31 @@ const Root: ParentComponent<{}> = (props) => { } }; - const onExecute = (command: Command) => { - return async () => { - await command?.(); + const onExecute = (command?: Command) => { + return command + ? async () => { + await command?.(); - close(); - } + close(); + } + : () => { } }; - const Button: Component<{ label: string, command: Command } | { [key: string]: any }> = (props) => { + const Button: Component<{ label: string, command?: Command } & { [key: string]: any }> = (props) => { const [local, rest] = splitProps(props, ['label', 'command']); - return ; + return ; }; return @@ -151,20 +166,6 @@ const Root: ParentComponent<{}> = (props) => {