diff --git a/artifacts/personal-tool-console/index.html b/artifacts/personal-tool-console/index.html index 5d4bce9..f19de2b 100644 --- a/artifacts/personal-tool-console/index.html +++ b/artifacts/personal-tool-console/index.html @@ -1,21 +1,42 @@ - +
- -{tool.name}
++ {tool.description} +
++ {tool.description} +
+ {tool.commands && tool.commands.length > 0 && ( ++ input {input.length} chars → output {output.length} chars +
+{error}
} +{computed.error}
+ ) : ( + <> ++ {computed.result} +
+base {toBase}
+base {r.base}
++ {r.out} +
++ Operands are treated as 32-bit two's complement integers. NOT ignores + operand B. +
+{rows.length} bytes
+| index | +char | +hex | +binary | +dec | +
|---|---|---|---|---|
| {i} | +{charOf(r.dec)} | +{r.hex} | +{r.binary} | +{r.dec} | +
{result.error}
+ )} + {!result.error && expr && ( +
+ {code || " "}
+
+ + Estimated size: {width} × {height} px +
+{error}
} + {output !== "" &&Invalid JSON
+ {typeof result.line === "number" && ( +At line {result.line}
+ )} + {result.error &&{result.error}
} +{palette.error}
+ ) : ( + <> ++ {c} +
+{computed.error}
+ ) : ( + <> +{computed.error}
+ ) : ( + <> + +{computed.error}
+ ) : ( + <> + ++ {pct > 0 ? `+${pct}` : pct}% +
++ {c} +
+{computed.error}
+ ) : ( + <> ++ {i * 25}% +
+{error}
} + {output && ( ++ The same key and IV must be used to decrypt. GCM uses a 12-byte IV; CBC + uses 16 bytes. +
+{error}
} + {(hex || b64) && ( +{error}
} + {decoded && ( +{error}
} +| Code | +Rate | +
|---|---|
| {code.toUpperCase()} | ++ {CURRENCY_RATES[code]} + | +
+ {domain.trim()} ·{" "} + + {meta.status} + {" "} + · {meta.responseMs} ms · via cloudflare-dns.com +
+ )} ++ {error} +
+ )} + + {rows.length > 0 && ( +| Type | +Name | +TTL | +Value | +
|---|---|---|---|
| + {r.type} + | ++ {r.name} + | +{r.ttl ?? "—"} | +{r.value} | +
+ No records yet — enter a domain and pick at least one record type. + Records resolve via cloudflare-dns.com DNS-over-HTTPS. +
+ )} ++ Expected checksum contains invalid hex characters. +
+ )} + {exp.length > 0 && expValid && hashes["SHA-256"] && ( ++ {expMatch + ? "✓ Matches the SHA-256 digest." + : "✗ Does not match the SHA-256 digest."} +
+ )} +{error}
} + {img && ( ++ Original: {img.naturalWidth} × {img.naturalHeight}px +
+{error}
} + {img && ( +{error}
} + {avg && ( +{avg.rgb}
++ 8 × 8 color grid +
+{error}
} + {img && ( ++ Move to sample, click to lock. +
+Magnifier
+{picked.hex}
++ {picked.rgb} +
+{error}
} + {file && ( ++ Source: {(file.size / 1024).toFixed(1)} KB · Encoded:{" "} + {(encoded.length / 1024).toFixed(1)} KB ({sizeRatio}%) +
++ Preview truncated in the box — full string is copied/downloaded. +
+ )} ++ Run validation to check your JSON. +
+ ) : validation.valid ? ( +Invalid JSON
+ {typeof validation.line === "number" && ( +Line {validation.line}
+ )} + {validation.error && ( +{validation.error}
+ )} +Error: {error}
} + {output &&Invalid JSON: {error}
} + + {!input.trim() && ( ++ bits {bitsText(bits)}{" "} + — octal{" "} + {bitsToOctStr(bits)}{" "} + — symbolic{" "} + {bitsToSym(bits)} +
+{parsed.error}
+ ) : ( + parsed.data && ( ++ {r.who} +
++ special bit set +
+ )} ++ {label} · {values.length} value{values.length === 1 ? "" : "s"} +
++ {values.slice(0, 14).join(",")} + {values.length > 14 ? "…" : ""} +
+{parsed.error}
} + {parsed.schedule && ( + <> + {parsed.six && ( +| name | +uid | +gid | +description | +
|---|---|---|---|
| {r.name} | +{r.uid} | +{r.gid} | ++ {r.description} + | +
+ No entries match “{q}”. +
+ )} +{error}
} + {result && ( ++ History +
+| Name | +Country | +City | +Phone | +|
|---|---|---|---|---|
| {u.name} | ++ {u.email} + | ++ {u.country} + | ++ {u.city} + | +{u.phone} | +
+ Depth previews +
+{result.error}
+ ) : null} + {!result.error && ( ++ Type items in the left panel… +
+ )} + {items.map((item) => { + const isIn = setMembership(item, pool); + return ( ++ {tool.name} is on + the roadmap and will be available in a future release. +
++ {tool.description} +
++ Try another tool in the same category, or head back to the catalog to + explore the rest of the toolbox. +
+
+ {value}
+
+ Preview
++ {url.replace(/^https?:\/\//, "")} +
++ {title || "Title preview"} +
++ {description || "Description preview"} +
+Meta tags
+Preview
++ {site || "@yourhandle"} +
++ {title || "Title preview"} +
++ {description || "Description preview"} +
++ Twitter meta tags +
++ Video ID: {id} +
+{s.name}
++ {s.w}×{s.h} +
+Embed code
+{error}
} + {data && ( +{data.title}
++ Native size: {data.width}×{data.height} +
++ Available sizes +
++ {s.name} +
++ {s.w}×{s.h} +
+{error}
} ++ Link card preview +
++ {siteName || domain || "example.com"} +
++ {title} +
++ {description} +
+Phone shell
++ {title} +
++ {description} +
++ {siteName || domain} +
++ Structured data +
++ Drop a photo or click to browse +
+ )} +{error}
} ++ Results are a rough estimate. Upload runs against the app's API + endpoint; download and ping hit speed.cloudflare.com. Large transfers + may vary with network conditions. +
++ No options — the tool runs straight on the input. +
+ ) : ( ++ Type some input and press Run to see the result. +
+ )} ++ {result.error} +
+ ) : ( +{error}
+ ) : ( + transform() !== "" && ( +{decoded.error}
+ ) : ( ++ {bytes.length} bytes total +
+| offset | +hex | +dec | +binary | +
|---|---|---|---|
| + {b.offset} + | +{b.hex} | ++ {b.dec} + | +{b.binary} | +
+ {rows.length} codepoint{rows.length === 1 ? "" : "s"} +
+| char | +codepoint | +utf-8 | +html | +js escape | +
|---|---|---|---|---|
| + {r.char === " " ? "␣" : r.char} + | +{r.hex} | ++ {r.utf8 || "—"} + | ++ {r.html} + | ++ {r.js} + | +
{decoded.error}
+ ) : ( ++ v1 is not generated client-side (no MAC/timestamp source). +
+{computed.error}
+ ) : ( +{computed.error}
+ ) : ( +{computed.error}
+ ) : ( ++ Works for simple XML without mixed content or namespaces. Errors from + either direction are shown inline. +
++ {tool.description} +
+ {tool.commands && tool.commands[0] && ( +
+ {tool.commands[0]}
+
+ )}
+
+ );
+}
+
+function SectionGrid({
+ meta,
+ tools,
+}: {
+ meta: ToolCategoryMeta;
+ tools: ToolDefinition[];
+}) {
+ const Icon = meta.icon;
+ const groups = useMemo(() => {
+ const map = new Map
+
+ {totalReady} practical utilities across {categories.length} categories + — no sign-up, no uploads. Find a tool, or type a command into the + console. +
++ Nothing matched “{query.trim()}”. Try a broader term, or browse a + category below. +
+ ) : ( +{status}
+- Did you forget to add the page to the router? -
-+ Error 404 +
++ The link may be broken, or the page may have moved. Start from the + catalog, or run a command in the console. +
++ 404 +
++ “{slug}” isn’t in the toolbox. Check the URL, or browse the catalog to + find what you need. +
+ + Back to catalog + +