From 1a08cb97b8c3fca707cfba9bd7f55f1c26612386 Mon Sep 17 00:00:00 2001 From: Kresna <13603341+slaveofcode@users.noreply.github.com> Date: Fri, 14 Aug 2026 08:09:05 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20add=207=20tools=20=E2=80=94=20hash=20te?= =?UTF-8?q?xt,=20minifier,=20PPTX=20viewer,=20subtitle=20editor,=20voice?= =?UTF-8?q?=20recorder,=20PDF=20image=20extract,=20CIDR=20calc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hash Text (Dev): MD5/SHA-1/256/512/CRC32 of pasted text via hash-wasm. - CIDR Calculator (Dev): IPv4 subnet math — network/broadcast/mask/host range. - HTML/CSS/JS Minifier (Dev): csso + terser (dynamic) + a safe HTML collapser. - Subtitle Editor (Media): parse, retime and convert SRT <-> WebVTT. - Voice Recorder (Media): mic capture via the shared useAudioRecorder hook. - Extract Images from PDF (PDF): embedded image objects via pdf.js. - PPTX Viewer (Documents): lightweight OOXML slide text + image reader. All client-side. Pure libs unit-tested; EN + ID SEO with how-to for each. --- astro.config.mjs | 2 + .../plans/2026-08-14-tools-batch-7.md | 36 +++ package-lock.json | 47 +++- package.json | 2 + src/islands/dev/CidrCalculator.tsx | 97 +++++++ src/islands/dev/HashText.tsx | 68 +++++ src/islands/dev/Minifier.tsx | 111 ++++++++ src/islands/documents/PptxViewer.tsx | 112 +++++++++ src/islands/media/SubtitleEditor.tsx | 117 +++++++++ src/islands/media/VoiceRecorder.tsx | 114 +++++++++ src/islands/pdf/PdfExtractImages.tsx | 114 +++++++++ src/registry/tool-seo.ts | 236 ++++++++++++++++++ src/registry/tools.ts | 79 +++++- src/tools/dev/cidr.lib.test.ts | 44 ++++ src/tools/dev/cidr.lib.ts | 86 +++++++ src/tools/dev/hash-text.lib.test.ts | 25 ++ src/tools/dev/hash-text.lib.ts | 35 +++ src/tools/dev/minify.lib.test.ts | 40 +++ src/tools/dev/minify.lib.ts | 48 ++++ src/tools/documents/pptx.lib.test.ts | 49 ++++ src/tools/documents/pptx.lib.ts | 101 ++++++++ src/tools/media/subtitle.lib.test.ts | 62 +++++ src/tools/media/subtitle.lib.ts | 78 ++++++ src/tools/pdf/extract-images.lib.test.ts | 13 + src/tools/pdf/extract-images.lib.ts | 118 +++++++++ src/types/csso.d.ts | 3 + 26 files changed, 1827 insertions(+), 10 deletions(-) create mode 100644 docs/superpowers/plans/2026-08-14-tools-batch-7.md create mode 100644 src/islands/dev/CidrCalculator.tsx create mode 100644 src/islands/dev/HashText.tsx create mode 100644 src/islands/dev/Minifier.tsx create mode 100644 src/islands/documents/PptxViewer.tsx create mode 100644 src/islands/media/SubtitleEditor.tsx create mode 100644 src/islands/media/VoiceRecorder.tsx create mode 100644 src/islands/pdf/PdfExtractImages.tsx create mode 100644 src/tools/dev/cidr.lib.test.ts create mode 100644 src/tools/dev/cidr.lib.ts create mode 100644 src/tools/dev/hash-text.lib.test.ts create mode 100644 src/tools/dev/hash-text.lib.ts create mode 100644 src/tools/dev/minify.lib.test.ts create mode 100644 src/tools/dev/minify.lib.ts create mode 100644 src/tools/documents/pptx.lib.test.ts create mode 100644 src/tools/documents/pptx.lib.ts create mode 100644 src/tools/media/subtitle.lib.test.ts create mode 100644 src/tools/media/subtitle.lib.ts create mode 100644 src/tools/pdf/extract-images.lib.test.ts create mode 100644 src/tools/pdf/extract-images.lib.ts create mode 100644 src/types/csso.d.ts diff --git a/astro.config.mjs b/astro.config.mjs index e8701e7..16c02d5 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -135,6 +135,8 @@ export default defineConfig({ '**/html2canvas*.js', '**/heic-to*.js', '**/libheif*.js', + '**/terser*.js', + '**/csso*.js', 'og/*.png', ], runtimeCaching: [ diff --git a/docs/superpowers/plans/2026-08-14-tools-batch-7.md b/docs/superpowers/plans/2026-08-14-tools-batch-7.md new file mode 100644 index 0000000..4ceabfb --- /dev/null +++ b/docs/superpowers/plans/2026-08-14-tools-batch-7.md @@ -0,0 +1,36 @@ +# Seven-Tool Batch — Spec + Plan + +**Date:** 2026-08-14. One branch (`feat/tools-batch-7`), one PR → develop, bundled prod promotion. + +All client-side. Each tool: pure lib (+ Vitest) where there's real logic, thin island, registry entry, **EN + ID SEO with howTo**. Bahasa uses "tool" loanword. + +## Global Constraints +- Commit under personal noreply identity; no AI-attribution trailers; no absolute machine paths. +- Heavy deps dynamic-imported in the lib + chunk added to `workbox.globIgnores`. +- New tools `status: 'beta'`. + +## Tools + +### 1. CIDR Calculator (`cidr-calculator`, Dev, icon `Network`) +Pure lib `src/tools/dev/cidr.lib.ts`: `parseCidr('192.168.1.0/24')` → network, broadcast, netmask, wildcard, first/last host, host count, /prefix. IPv4. Unit-tested (parse, edge /31 /32, invalid). Island: input → summary rows + Copy. + +### 2. Hash Text (`hash-text`, Dev, icon `Hash`) +Lib `src/tools/dev/hash-text.lib.ts`: `hashText(text, algo)` via `hash-wasm` one-shot (md5/sha1/sha256/sha512/crc32), `ALGORITHMS` list. Dynamic-import hash-wasm. Tested with a known vector (`sha256('abc')`). Island: textarea → all-algos or selected → rows + Copy. + +### 3. SRT/VTT Editor (`subtitle-editor`, Media, icon `Subtitles`) +Lib `src/tools/media/subtitle.lib.ts`: `parseSubtitles(text)` (auto-detect SRT vs VTT) → `Cue[] = {index,start,end,text}`; `toSrt(cues)`, `toVtt(cues)`, `formatTimestamp`. Unit-tested (round-trip, cross-convert, malformed tolerance). Island: paste/upload → editable cue list + convert + download .srt/.vtt. + +### 4. HTML/CSS/JS Minifier (`minifier`, Dev, icon `Minimize2`) +Lib `src/tools/dev/minify.lib.ts`: `minifyCss(css)` (csso, dynamic), `minifyJs(js)` (terser, dynamic, async), `minifyHtml(html)` (hand-rolled: strip comments, collapse inter-tag whitespace, preserve `
/