11/** @jsxImportSource preact */
22import { dhash } from "dhash_jsr" ;
33import { renderToString } from "preact-render-to-string" ;
4+ import docsConfig from "./deno.json" with { type : "json" } ;
45
56const MAX_FILES = 20 ;
67const MAX_BYTES = 10 * 1024 * 1024 ;
78
9+ const LIB_SPEC =
10+ ( docsConfig as { imports ?: Record < string , string > } ) . imports ?. dhash_jsr ??
11+ "jsr:@claudiu-ceia/dhash" ;
12+ const LIB_VERSION = ( ( ) => {
13+ // Example: "jsr:@claudiu-ceia/dhash@^0.3.2"
14+ const m = String ( LIB_SPEC ) . match ( / @ \^ ? ( \d + \. \d + \. \d + ) / ) ;
15+ return m ? m [ 1 ] : "" ;
16+ } ) ( ) ;
17+
818function json ( data : unknown , status = 200 ) : Response {
919 return new Response ( JSON . stringify ( data , null , 2 ) + "\n" , {
1020 status,
@@ -113,18 +123,18 @@ tailwind.config = {
113123 < div class = "absolute left-1/2 top-1/2 h-[36rem] w-[36rem] -translate-x-1/2 -translate-y-1/2 rounded-full bg-slate-200/30 blur-3xl" />
114124 </ div >
115125
116- < main class = "relative mx-auto w-full max-w-6xl px-4 py-10 sm:py-14 " >
126+ < main class = "relative mx-auto w-full max-w-7xl px-4 py-12 sm:py-16 " >
117127 < header class = "flex items-start justify-between gap-4" >
118128 < div class = "min-w-0" >
119129 < div class = "flex items-center gap-2" >
120- < h1 class = "text-2xl font-semibold tracking-tight text-slate-900 sm:text-3xl " >
130+ < h1 class = "text-3xl font-semibold tracking-tight text-slate-900 sm:text-4xl " >
121131 dHash demo
122132 </ h1 >
123133 < span class = "inline-flex items-center rounded-full border border-slate-200 bg-white/60 px-2 py-0.5 text-[11px] font-medium text-slate-600 shadow-sm" >
124134 perceptual hashing
125135 </ span >
126136 </ div >
127- < p class = "mt-2 max-w-2xl text-sm leading-relaxed text-slate-600" >
137+ < p class = "mt-3 max-w-2xl text-base leading-relaxed text-slate-600" >
128138 Upload up to{ " " }
129139 < span class = "font-semibold text-slate-900" > { MAX_FILES } </ span >
130140 { " " }
@@ -140,7 +150,7 @@ tailwind.config = {
140150 href = "https://github.com/ClaudiuCeia/dhash"
141151 target = "_blank"
142152 rel = "noreferrer"
143- class = "inline-flex h-9 w-9 items-center justify-center rounded-xl border border-slate-200 bg-white/70 text-slate-900 shadow-sm transition hover:-translate-y-0.5 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-300"
153+ class = "inline-flex h-10 w-10 items-center justify-center rounded-xl border border-slate-200 bg-white/75 text-slate-900 shadow-sm transition hover:shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-300"
144154 aria-label = "GitHub repository"
145155 title = "GitHub"
146156 >
@@ -150,7 +160,7 @@ tailwind.config = {
150160 href = "https://jsr.io/@claudiu-ceia/dhash"
151161 target = "_blank"
152162 rel = "noreferrer"
153- class = "inline-flex h-9 w-9 items-center justify-center rounded-xl border border-slate-200 bg-white/70 text-slate-900 shadow-sm transition hover:-translate-y-0.5 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-300"
163+ class = "inline-flex h-10 w-10 items-center justify-center rounded-xl border border-slate-200 bg-white/75 text-slate-900 shadow-sm transition hover:shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-300"
154164 aria-label = "JSR package"
155165 title = "JSR"
156166 >
@@ -159,8 +169,8 @@ tailwind.config = {
159169 </ nav >
160170 </ header >
161171
162- < section class = "mt-8 grid gap-6 lg:grid-cols-[1fr_360px ]" >
163- < div class = "rounded-3xl border border-slate-200/70 bg-white/60 p-5 shadow-soft backdrop-blur sm:p-6 " >
172+ < section class = "mt-10 grid gap-6 lg:grid-cols-[1fr_400px ]" >
173+ < div class = "rounded-3xl border border-slate-200/70 bg-white/60 p-6 shadow-soft backdrop-blur sm:p-7 " >
164174 < div class = "flex flex-wrap items-center justify-between gap-3" >
165175 < div class = "min-w-0" >
166176 < h2 class = "text-base font-semibold text-slate-900" >
@@ -175,14 +185,14 @@ tailwind.config = {
175185 < button
176186 id = "pick"
177187 type = "button"
178- class = "inline-flex items-center rounded-xl bg-slate-900 px-3 py-2 text-sm font-medium text-white shadow-sm transition hover:-translate-y-0.5 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-300"
188+ class = "inline-flex items-center rounded-xl bg-slate-900 px-4 py-2.5 text-sm font-medium text-white shadow-sm transition hover:shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-300"
179189 >
180190 Choose images
181191 </ button >
182192 < button
183193 id = "clear"
184194 type = "button"
185- class = "inline-flex items-center rounded-xl border border-slate-200 bg-white/70 px-3 py-2 text-sm font-medium text-slate-900 shadow-sm transition hover:-translate-y-0.5 hover:shadow-md disabled:opacity-60"
195+ class = "inline-flex items-center rounded-xl border border-slate-200 bg-white/75 px-4 py-2.5 text-sm font-medium text-slate-900 shadow-sm transition hover:shadow-md disabled:opacity-60"
186196 disabled
187197 >
188198 Clear
@@ -199,7 +209,7 @@ tailwind.config = {
199209 />
200210
201211 < div class = "mt-4 flex flex-wrap items-center gap-3" >
202- < div class = "inline-flex items-center rounded-2xl border border-slate-200 bg-white/70 px-3 py-2 text-xs text-slate-700 shadow-sm" >
212+ < div class = "inline-flex items-center rounded-2xl border border-slate-200 bg-white/75 px-3 py-2 text-xs text-slate-700 shadow-sm" >
203213 < span class = "mr-2 inline-flex h-2 w-2 rounded-full bg-emerald-400" />
204214 < span id = "fileLabel" > No files selected</ span >
205215 </ div >
@@ -212,11 +222,11 @@ tailwind.config = {
212222
213223 < div
214224 id = "grid"
215- class = "mt-6 grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3"
225+ class = "mt-7 grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3"
216226 />
217227 </ div >
218228
219- < aside class = "rounded-3xl border border-slate-200/70 bg-white/55 p-5 shadow-soft backdrop-blur sm:p-6 " >
229+ < aside class = "rounded-3xl border border-slate-200/70 bg-white/55 p-6 shadow-soft backdrop-blur sm:p-7 " >
220230 < h2 class = "text-base font-semibold text-slate-900" >
221231 How it works
222232 </ h2 >
@@ -263,6 +273,16 @@ tailwind.config = {
263273 </ code > { " " }
264274 on Deno Deploy.
265275 </ p >
276+ < div class = "mt-4 rounded-2xl border border-slate-200 bg-white/65 p-4 text-xs text-slate-700" >
277+ < div class = "flex items-center justify-between gap-3" >
278+ < span class = "font-medium text-slate-900" >
279+ Library version
280+ </ span >
281+ < code class = "rounded bg-slate-900/5 px-1 py-0.5 font-mono" >
282+ { LIB_VERSION ? `v${ LIB_VERSION } ` : "unknown" }
283+ </ code >
284+ </ div >
285+ </ div >
266286 </ aside >
267287 </ section >
268288 </ main >
@@ -283,7 +303,7 @@ const CSS = `
283303html, body { height: 100%; }
284304body {
285305 margin: 0;
286- background: #ffffff ;
306+ background: #fbfcff ;
287307}
288308` ;
289309
@@ -523,10 +543,11 @@ function render() {
523543 for (const { it, idx } of sorted) {
524544 const div = document.createElement("div");
525545 const pending = !it.hash;
526- const base = "group relative rounded-2xl border bg-white/75 p-4 shadow-sm backdrop-blur transition";
546+ const base =
547+ "group relative rounded-2xl border bg-white/80 p-4 shadow-sm backdrop-blur transition-shadow";
527548 const active = pending
528549 ? " opacity-50 cursor-not-allowed border-slate-200"
529- : " cursor-pointer border-slate-200 hover:-translate-y-0.5 hover: shadow-md";
550+ : " cursor-pointer border-slate-200 hover:shadow-md";
530551 const anchored = (idx === anchor)
531552 ? " ring-2 ring-emerald-300 border-emerald-200 shadow-[0_18px_45px_rgba(16,185,129,0.18)]"
532553 : "";
@@ -544,12 +565,14 @@ function render() {
544565 row.className = "flex items-start gap-3";
545566
546567 const img = document.createElement("img");
547- img.className = "h-24 w-24 shrink-0 rounded-xl border border-slate-200 bg-slate-50 object-cover";
568+ img.className =
569+ "h-24 w-24 shrink-0 rounded-xl border border-slate-300 bg-slate-100 object-cover shadow-inner";
548570 img.src = it.url;
549571 img.alt = it.name;
550572
551573 const canvas = document.createElement("canvas");
552- canvas.className = "h-24 w-24 shrink-0 rounded-xl border border-slate-200 bg-slate-50";
574+ canvas.className =
575+ "h-24 w-24 shrink-0 rounded-xl border border-slate-300 bg-slate-100 shadow-inner";
553576 canvas.width = 96;
554577 canvas.height = 96;
555578 if (it.hash) drawHash(canvas, it.hash);
0 commit comments