raidAthmaneBenlala commited on
Commit
863ef50
·
1 Parent(s): fe24149

✨ Render Circular Odontogram teeth with dynamic Quadrant matching colors

Browse files
Files changed (1) hide show
  1. toothmap_frontend/src/App.jsx +25 -9
toothmap_frontend/src/App.jsx CHANGED
@@ -57,6 +57,17 @@ function getRadialStyle(index, isUpper) {
57
  };
58
  }
59
 
 
 
 
 
 
 
 
 
 
 
 
60
  function computeIoU(b1, b2) {
61
  const ix = Math.max(b1[0], b2[0]), iy = Math.max(b1[1], b2[1]);
62
  const iw = Math.min(b1[2], b2[2]) - ix, ih = Math.min(b1[3], b2[3]) - iy;
@@ -331,10 +342,10 @@ export default function App() {
331
  return (
332
  <div key={t}
333
  style={styleNode.wrapper}
334
- className={`w-9 h-12 rounded-t-sm rounded-b-[16px] flex items-center justify-center text-sm font-bold transition-all shadow-lg ${
335
  uniquePipelineResults.some(r => r.fdi === t)
336
- ? 'bg-gradient-to-b from-green-500/20 to-green-500/40 text-green-300 border border-green-500/60 shadow-[0_0_15px_rgba(34,197,94,0.3)]'
337
- : 'bg-zinc-800 text-zinc-500 border border-zinc-700/50'
338
  }`}>
339
  <span style={styleNode.text}>{t}</span>
340
  </div>
@@ -348,10 +359,10 @@ export default function App() {
348
  return (
349
  <div key={t}
350
  style={styleNode.wrapper}
351
- className={`w-9 h-12 rounded-b-sm rounded-t-[16px] flex items-center justify-center text-sm font-bold transition-all shadow-lg ${
352
  uniquePipelineResults.some(r => r.fdi === t)
353
- ? 'bg-gradient-to-t from-green-500/20 to-green-500/40 text-green-300 border border-green-500/60 shadow-[0_0_15px_rgba(34,197,94,0.3)]'
354
- : 'bg-zinc-800 text-zinc-500 border border-zinc-700/50'
355
  }`}>
356
  <span style={styleNode.text}>{t}</span>
357
  </div>
@@ -366,9 +377,14 @@ export default function App() {
366
  </div>
367
 
368
  {/* Legend below chart */}
369
- <div className="flex justify-center gap-8 mt-4 text-sm text-zinc-400 font-medium">
370
- <div className="flex items-center gap-2">
371
- <span className="w-4 h-4 rounded-md bg-green-500/30 border-2 border-green-500/60 shadow-[0_0_8px_rgba(34,197,94,0.4)]"></span>
 
 
 
 
 
372
  Detected Tooth
373
  </div>
374
  <div className="flex items-center gap-2">
 
57
  };
58
  }
59
 
60
+ function getToothClasses(fdi, isUpper) {
61
+ const quad = Math.floor(fdi / 10);
62
+ switch (quad) {
63
+ case 1: return `text-blue-300 border-blue-500/60 shadow-[0_0_15px_rgba(59,130,246,0.3)] ${isUpper ? 'bg-gradient-to-b from-blue-500/20 to-blue-500/40' : 'bg-gradient-to-t from-blue-500/20 to-blue-500/40'}`;
64
+ case 2: return `text-green-300 border-green-500/60 shadow-[0_0_15px_rgba(34,197,94,0.3)] ${isUpper ? 'bg-gradient-to-b from-green-500/20 to-green-500/40' : 'bg-gradient-to-t from-green-500/20 to-green-500/40'}`;
65
+ case 3: return `text-amber-300 border-amber-500/60 shadow-[0_0_15px_rgba(245,158,11,0.3)] ${isUpper ? 'bg-gradient-to-b from-amber-500/20 to-amber-500/40' : 'bg-gradient-to-t from-amber-500/20 to-amber-500/40'}`;
66
+ case 4: return `text-red-300 border-red-500/60 shadow-[0_0_15px_rgba(239,68,68,0.3)] ${isUpper ? 'bg-gradient-to-b from-red-500/20 to-red-500/40' : 'bg-gradient-to-t from-red-500/20 to-red-500/40'}`;
67
+ default: return 'text-purple-300 border-purple-500/60 shadow-[0_0_15px_rgba(168,85,247,0.3)] bg-purple-500/20';
68
+ }
69
+ }
70
+
71
  function computeIoU(b1, b2) {
72
  const ix = Math.max(b1[0], b2[0]), iy = Math.max(b1[1], b2[1]);
73
  const iw = Math.min(b1[2], b2[2]) - ix, ih = Math.min(b1[3], b2[3]) - iy;
 
342
  return (
343
  <div key={t}
344
  style={styleNode.wrapper}
345
+ className={`w-9 h-12 rounded-t-sm rounded-b-[16px] flex items-center justify-center text-sm font-bold transition-all shadow-lg border ${
346
  uniquePipelineResults.some(r => r.fdi === t)
347
+ ? getToothClasses(t, true)
348
+ : 'bg-zinc-800 text-zinc-500 border-zinc-700/50'
349
  }`}>
350
  <span style={styleNode.text}>{t}</span>
351
  </div>
 
359
  return (
360
  <div key={t}
361
  style={styleNode.wrapper}
362
+ className={`w-9 h-12 rounded-b-sm rounded-t-[16px] flex items-center justify-center text-sm font-bold transition-all shadow-lg border ${
363
  uniquePipelineResults.some(r => r.fdi === t)
364
+ ? getToothClasses(t, false)
365
+ : 'bg-zinc-800 text-zinc-500 border-zinc-700/50'
366
  }`}>
367
  <span style={styleNode.text}>{t}</span>
368
  </div>
 
377
  </div>
378
 
379
  {/* Legend below chart */}
380
+ <div className="flex justify-center gap-10 mt-4 text-sm text-zinc-400 font-medium">
381
+ <div className="flex items-center gap-3">
382
+ <div className="flex align-center -space-x-1.5 opacity-90">
383
+ <span className="w-4 h-4 rounded-full bg-gradient-to-bl from-blue-400 to-blue-600 border border-zinc-900 shadow-sm relative z-40"></span>
384
+ <span className="w-4 h-4 rounded-full bg-gradient-to-bl from-green-400 to-green-600 border border-zinc-900 shadow-sm relative z-30"></span>
385
+ <span className="w-4 h-4 rounded-full bg-gradient-to-bl from-amber-400 to-amber-600 border border-zinc-900 shadow-sm relative z-20"></span>
386
+ <span className="w-4 h-4 rounded-full bg-gradient-to-bl from-red-400 to-red-600 border border-zinc-900 shadow-sm relative z-10"></span>
387
+ </div>
388
  Detected Tooth
389
  </div>
390
  <div className="flex items-center gap-2">