feat(web): polish the WASM site - UX, help, parsing, assets

- About panel (collapsible, closed by default with a pulsing "Help" badge)
  explaining the tool; the `help` command now prints a full command reference
  instead of "HELP" (benefits the CLI too).
- Live generation as you type; Store button; masked output that stays mono-width
  (gen masks only the password column, never the header); command history with
  Up/Down (persisted); console auto-scroll; Export fixed (uses `dump`); Import.
- Name field normalizes to its canonical parsed form on blur; quick-gen and Store
  resolve the real entry name, so a leading prefix like `*P0 test1` is handled
  correctly (new hel_parse / hel_parse_name wasm helpers).
- Parser: prefix-only forms now parse with defaults - `*P0 test1` ->
  `*P0 test1 R 99 <today>`, `*P0 test1 R`, `*P0 test1 20R` - via new qpname/npname
  rules mirroring qname/nname; the fully-qualified form is unchanged.
- Favicons + web app manifest + enso asset; pkg rebuilt.
This commit is contained in:
Oleksandr Kozachuk
2026-06-08 20:11:24 +02:00
parent 03c5dadccb
commit 3031105000
17 changed files with 503 additions and 98 deletions
+18 -1
View File
@@ -19,13 +19,30 @@ export function hel_init(): void;
*/
export function hel_load_script(script: string): string;
/**
* Parse a password spec (e.g. `exa91` or `exa91 20R 99 2020-01-01`) and return
* the canonical normalized form hel actually uses (name + mode + seq + date +
* comment), without touching state. Returns the input unchanged if it does not
* parse. Used by the UI to rewrite the name field on blur.
*/
export function hel_parse(spec: string): string;
/**
* Parse a spec and return just the entry name hel resolves it to. Handles a
* leading prefix (e.g. `*P0 test1 …` → `test1`), which a naive first-token
* split would get wrong. Falls back to the first whitespace token.
*/
export function hel_parse_name(spec: string): string;
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
export interface InitOutput {
readonly memory: WebAssembly.Memory;
readonly hel_command: (a: number, b: number) => [number, number];
readonly hel_init: () => void;
readonly hel_command: (a: number, b: number) => [number, number];
readonly hel_load_script: (a: number, b: number) => [number, number];
readonly hel_parse: (a: number, b: number) => [number, number];
readonly hel_parse_name: (a: number, b: number) => [number, number];
readonly __wbindgen_free: (a: number, b: number, c: number) => void;
readonly __wbindgen_malloc: (a: number, b: number) => number;
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
+45
View File
@@ -49,6 +49,51 @@ export function hel_load_script(script) {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
}
/**
* Parse a password spec (e.g. `exa91` or `exa91 20R 99 2020-01-01`) and return
* the canonical normalized form hel actually uses (name + mode + seq + date +
* comment), without touching state. Returns the input unchanged if it does not
* parse. Used by the UI to rewrite the name field on blur.
* @param {string} spec
* @returns {string}
*/
export function hel_parse(spec) {
let deferred2_0;
let deferred2_1;
try {
const ptr0 = passStringToWasm0(spec, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ret = wasm.hel_parse(ptr0, len0);
deferred2_0 = ret[0];
deferred2_1 = ret[1];
return getStringFromWasm0(ret[0], ret[1]);
} finally {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
}
/**
* Parse a spec and return just the entry name hel resolves it to. Handles a
* leading prefix (e.g. `*P0 test1 …` → `test1`), which a naive first-token
* split would get wrong. Falls back to the first whitespace token.
* @param {string} spec
* @returns {string}
*/
export function hel_parse_name(spec) {
let deferred2_0;
let deferred2_1;
try {
const ptr0 = passStringToWasm0(spec, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ret = wasm.hel_parse_name(ptr0, len0);
deferred2_0 = ret[0];
deferred2_1 = ret[1];
return getStringFromWasm0(ret[0], ret[1]);
} finally {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
}
function __wbg_get_imports() {
const import0 = {
__proto__: null,
Binary file not shown.
+3 -1
View File
@@ -1,9 +1,11 @@
/* tslint:disable */
/* eslint-disable */
export const memory: WebAssembly.Memory;
export const hel_command: (a: number, b: number) => [number, number];
export const hel_init: () => void;
export const hel_command: (a: number, b: number) => [number, number];
export const hel_load_script: (a: number, b: number) => [number, number];
export const hel_parse: (a: number, b: number) => [number, number];
export const hel_parse_name: (a: number, b: number) => [number, number];
export const __wbindgen_free: (a: number, b: number, c: number) => void;
export const __wbindgen_malloc: (a: number, b: number) => number;
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;