diff --git a/examples/emmer/namespace/nl.json b/examples/emmer/namespace/nl.json deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/tabs.tsx b/src/components/tabs.tsx index 17c6c96..5d360ff 100644 --- a/src/components/tabs.tsx +++ b/src/components/tabs.tsx @@ -1,4 +1,4 @@ -import { Accessor, children, createContext, createEffect, createMemo, createRenderEffect, createSignal, createUniqueId, For, JSX, onMount, ParentComponent, Show, useContext } from "solid-js"; +import { Accessor, children, createContext, createEffect, createMemo, createRenderEffect, createSignal, createUniqueId, For, JSX, onMount, ParentComponent, Setter, Show, useContext } from "solid-js"; import css from "./tabs.module.css"; interface TabsContextType { @@ -17,37 +17,18 @@ const useTabs = () => { return context!; } -export const Tabs: ParentComponent = (props) => { +export const Tabs: ParentComponent<{ active?: Setter }> = (props) => { const [active, setActive] = createSignal(undefined); const [tabs, setTabs] = createSignal<{ id: string, label: string }[]>([]); - // const resolved = children(() => props.children); - // const resolvedArray = createMemo(() => resolved.toArray()); - // const tabs = createMemo(() => resolvedArray().map(t => ({ id: t.id, label: t.dataset?.label ?? '' }))); - // createEffect(() => { - // for (const t of resolvedArray()) { - // console.log(t); - // } - // }); + createEffect(() => { + props.active?.(active()); + }); createEffect(() => { setActive(tabs().at(-1)?.id); }); - // createRenderEffect(() => { - // if (isServer) { - // return; - // } - - // for (const t of resolvedArray().filter(t => t instanceof HTMLElement)) { - // if (active() === t.id) { - // t.classList.add(css.active); - // } else { - // t.classList.remove(css.active); - // } - // } - // }); - const ctx = { register(id: string, label: string) { setTabs(tabs => [...tabs, { id, label }]); @@ -56,10 +37,6 @@ export const Tabs: ParentComponent = (props) => { }, }; - createEffect(() => { - console.log(tabs()); - }); - return
diff --git a/src/features/command/contextMenu.module.css b/src/features/command/contextMenu.module.css index 668b2ce..2b143a7 100644 --- a/src/features/command/contextMenu.module.css +++ b/src/features/command/contextMenu.module.css @@ -9,12 +9,12 @@ margin: 0; gap: var(--padding-m); - padding: var(--padding-m); + padding: var(--padding-m) 0; font-size: var(--text-s); background-color: var(--surface-1); color: var(--text-1); - border: 1px solid var(--text-1); + border: 1px solid var(--surface-5); border-radius: var(--radii-m); & > li { @@ -23,10 +23,16 @@ grid-template-columns: subgrid; align-items: center; + padding: var(--padding-s) var(--padding-m); + & > sub { color: var(--text-2); text-align: end; } + + &:hover { + background-color: var(--surface-4); + } } &:popover-open { diff --git a/src/features/file/grid.module.css b/src/features/file/grid.module.css index 98fbbc3..553c24a 100644 --- a/src/features/file/grid.module.css +++ b/src/features/file/grid.module.css @@ -17,7 +17,7 @@ & textarea { resize: vertical; - min-block-size: 2em; + min-block-size: max(2em, 100%); max-block-size: 50em; background-color: var(--surface-1); @@ -39,10 +39,6 @@ & > span { align-self: center; } - - & > textarea { - min-block-size: 100%; - } } & :is(.header, .main, .footer) { diff --git a/src/features/file/grid.tsx b/src/features/file/grid.tsx index 2323d22..6a3f709 100644 --- a/src/features/file/grid.tsx +++ b/src/features/file/grid.tsx @@ -1,4 +1,4 @@ -import { Accessor, Component, createContext, createEffect, createMemo, createRenderEffect, createSignal, For, onMount, ParentComponent, Show, useContext } from "solid-js"; +import { Accessor, Component, createContext, createEffect, createMemo, createRenderEffect, createSignal, createUniqueId, For, onMount, ParentComponent, Show, useContext } from "solid-js"; import { createStore, unwrap } from "solid-js/store"; import { SelectionProvider, useSelection, selectable } from "../selectable"; import { debounce, deepCopy, deepDiff, Mutation } from "~/utilities"; @@ -10,15 +10,17 @@ interface Leaf extends Record { } export interface Entry extends Record { } type Rows = Map>; +type SelectionItem = { key: string, value: Accessor>, element: WeakRef }; export interface GridContextType { readonly rows: Accessor>>; readonly mutations: Accessor; - readonly selection: Accessor; + readonly selection: Accessor; mutate(prop: string, lang: string, value: string): void; } export interface GridApi { + readonly selection: Accessor>>; readonly rows: Accessor>>; readonly mutations: Accessor; selectAll(): void; @@ -31,7 +33,7 @@ const isLeaf = (entry: Entry | Leaf): entry is Leaf => Object.values(entry).some const useGrid = () => useContext(GridContext)!; const GridProvider: ParentComponent<{ rows: Rows }> = (props) => { - const [selection, setSelection] = createSignal([]); + const [selection, setSelection] = createSignal([]); const [state, setState] = createStore<{ rows: Record>, snapshot: Rows, numberOfRows: number }>({ rows: {}, snapshot: new Map, @@ -106,9 +108,14 @@ export const Grid: Component<{ class?: string, columns: string[], rows: Rows, ap const Api: Component<{ api: undefined | ((api: GridApi) => any) }> = (props) => { const gridContext = useGrid(); - const selectionContext = useSelection(); + const selectionContext = useSelection<{ key: string, value: Accessor>, element: WeakRef }>(); const api: GridApi = { + selection: createMemo(() => { + const selection = selectionContext.selection(); + + return Object.fromEntries(selection.map(({ key, value }) => [key, value()] as const)); + }), rows: gridContext.rows, mutations: gridContext.mutations, selectAll() { @@ -160,7 +167,7 @@ const Row: Component<{ entry: Entry, path?: string[] }> = (props) => { return }>
- context.select([k])} /> + context.select([k])} on:pointerdown={e => e.stopPropagation()} />
@@ -217,6 +224,13 @@ const TextArea: Component<{ key: string, value: string, lang: string, oninput?: resize(); }); + const observer = new MutationObserver((e) => { + if (element()?.isConnected) { + resize(); + } + }); + observer.observe(document.body, { childList: true, subtree: true }); + return