From 59642b2ff5c7adda59283dd9f999fc1e5e62461e Mon Sep 17 00:00:00 2001 From: Misode Date: Tue, 28 Jan 2025 01:14:35 +0100 Subject: [PATCH] Use fancy menu for presets --- src/app/components/FancyMenu.tsx | 10 ++++--- src/app/components/Header.tsx | 2 +- src/app/components/forms/SearchList.tsx | 24 ----------------- src/app/components/forms/index.ts | 1 - .../components/generator/SchemaGenerator.tsx | 26 ++++++++++++++++--- src/locales/en.json | 3 ++- src/styles/global.css | 13 +++++----- 7 files changed, 38 insertions(+), 41 deletions(-) delete mode 100644 src/app/components/forms/SearchList.tsx diff --git a/src/app/components/FancyMenu.tsx b/src/app/components/FancyMenu.tsx index 16f144ee..2f124b7f 100644 --- a/src/app/components/FancyMenu.tsx +++ b/src/app/components/FancyMenu.tsx @@ -4,10 +4,12 @@ import { useFocus } from '../hooks/index.js' interface Props { placeholder?: string + relative?: boolean + class?: string getResults: (search: string, close: () => void) => ComponentChildren children: ComponentChildren } -export function FancyMenu({ placeholder, getResults, children }: Props) { +export function FancyMenu({ placeholder, relative, class: clazz, getResults, children }: Props) { const [active, setActive] = useFocus() const [search, setSearch] = useState('') const inputRef = useRef(null) @@ -51,13 +53,13 @@ export function FancyMenu({ placeholder, getResults, children }: Props) { } }, [setActive, inputRef]) - return
+ return
{children}
-
+
setSearch((e.target as HTMLInputElement).value)} onClick={(e) => e.stopPropagation()} /> - {active &&
+ {active &&
{results}
}
diff --git a/src/app/components/Header.tsx b/src/app/components/Header.tsx index 2d62c88d..7f76c1f6 100644 --- a/src/app/components/Header.tsx +++ b/src/app/components/Header.tsx @@ -82,7 +82,7 @@ function GeneratorTitle({ title, gen }: GeneratorTitleProps) { return [{locale('generators.no_results')}] } return results.map(g => - + {locale(`generator.${g.id}`)} {Object.keys(Icons).includes(g.id) ? Icons[g.id as keyof typeof Icons] : undefined}
diff --git a/src/app/components/forms/SearchList.tsx b/src/app/components/forms/SearchList.tsx deleted file mode 100644 index db1c2cfe..00000000 --- a/src/app/components/forms/SearchList.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useMemo, useState } from 'preact/hooks' -import { Btn, BtnInput } from '../index.js' - -interface Props { - values?: string[], - onSelect?: (value: string) => unknown, - searchPlaceholder?: string, - noResults?: string, -} -export function SearchList({ values, onSelect, searchPlaceholder, noResults }: Props) { - const [search, setSearch] = useState('') - const results = useMemo(() => { - const terms = search.trim().split(' ') - return values?.filter(v => terms.every(t => v.includes(t))) ?? [] - }, [values, search]) - - return <> - -
- {results.map(v => onSelect?.(v)} />)} - {results.length === 0 && } -
- -} diff --git a/src/app/components/forms/index.ts b/src/app/components/forms/index.ts index 9a6aaf06..f8ca1f14 100644 --- a/src/app/components/forms/index.ts +++ b/src/app/components/forms/index.ts @@ -1,3 +1,2 @@ export * from './Checkbox.js' export * from './Input.js' -export * from './SearchList.js' diff --git a/src/app/components/generator/SchemaGenerator.tsx b/src/app/components/generator/SchemaGenerator.tsx index 16d26936..dce031f3 100644 --- a/src/app/components/generator/SchemaGenerator.tsx +++ b/src/app/components/generator/SchemaGenerator.tsx @@ -13,7 +13,8 @@ import { checkVersion, fetchDependencyMcdoc, fetchPreset, fetchRegistries, getSn import { DEPENDENCY_URI } from '../../services/Spyglass.js' import { Store } from '../../Store.js' import { cleanUrl, genPath } from '../../Utils.js' -import { Ad, Btn, BtnMenu, ErrorPanel, FileCreation, FileView, Footer, HasPreview, Octicon, PreviewPanel, ProjectPanel, SearchList, SourcePanel, TextInput, VersionSwitcher } from '../index.js' +import { FancyMenu } from '../FancyMenu.jsx' +import { Ad, Btn, BtnMenu, ErrorPanel, FileCreation, FileView, Footer, HasPreview, Octicon, PreviewPanel, ProjectPanel, SourcePanel, TextInput, VersionSwitcher } from '../index.js' import { getRootDefault } from './McdocHelpers.js' export const SHARE_KEY = 'share' @@ -199,6 +200,23 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) { return entries.map(e => e.startsWith('minecraft:') ? e.slice(10) : e) }, [version, gen.id]) + const getPresets = useCallback((search: string, close: () => void) => { + if (presets === undefined) { + return {locale('loading')} + } + if (!presets || presets.length === 0) { + return {locale('presets.no_results')} + } + const terms = search.trim().split(' ') + const results = presets?.filter(v => terms.every(t => v.includes(t))).slice(0, 100) ?? [] + if (results.length === 0) { + return {locale('presets.no_results_for_query')} + } + return results.map(r => ) + }, [presets]) + const selectPreset = (id: string) => { Analytics.loadPreset(gen.id, id) setSharedSnippetId(undefined, true) @@ -372,9 +390,9 @@ export function SchemaGenerator({ gen, allowedVersions }: Props) { {Octicon.mortar_board} {locale('wiki')} } - - - + + + diff --git a/src/locales/en.json b/src/locales/en.json index 0b4fa3ad..102c7252 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -184,7 +184,6 @@ "move_down": "Move down", "move_up": "Move up", "no_file_chosen": "No file chosen", - "no_presets": "No presets", "normalize": "Normalize", "not_found.description": "The page you were looking for does not exist.", "output_settings": "Output settings", @@ -196,6 +195,8 @@ "partner.ohthetreesyoullgrow": "Oh The Trees You'll Grow", "partner.sky_aesthetics": "Sky Aesthetics", "presets": "Presets", + "presets.no_results": "No presets", + "presets.no_results_for_query": "No presets for this query", "preview": "Visualize", "preview.auto_scroll": "Auto scroll", "preview.biome": "Biome", diff --git a/src/styles/global.css b/src/styles/global.css index aedf36b0..f80705b6 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -226,6 +226,7 @@ nav li .btn svg { } .fancy-menu { + max-width: calc(100vw - 32px); background-color: var(--background-2); color: var(--text-2); } @@ -234,11 +235,11 @@ nav li .btn svg { background-color: var(--background-1); } -.gen-result { +.fancy-menu-results > * { outline-offset: -2px; } -.gen-result svg { +.fancy-menu-results > * svg { width: 16px; height: 16px; fill: var(--nav); @@ -247,13 +248,13 @@ nav li .btn svg { transition: margin 0.2s; } -.gen-result:focus-visible, -.gen-result:hover { +.fancy-menu-results > *:focus-visible, +.fancy-menu-results > *:hover { background-color: var(--background-3); } -.gen-result:focus-visible svg, -.gen-result:hover svg { +.fancy-menu-results > *:focus-visible svg, +.fancy-menu-results > *:hover svg { margin-left: 14px; margin-right: 0px; }