malikachaaban
app
22c0953
Raw
History Blame Contribute Delete
22.5 kB
:root{
--ink:#1B3A4B;
--teal:#0D7377;
--teal-deep:#0A5A5D;
--mint:#32E0C4;
--paper:#FFFFFF;
--paper-dim:#F4F8F8;
--line:#E1E8E8;
--line-strong:#C7D4D4;
--teal-tint:#E3F3F3;
--mint-tint:#E5FBF6;
--text-soft:#5B6E70;
--risk-low:#2F7D52;
--risk-low-tint:#E8F3EC;
--risk-mod:#B8862B;
--risk-mod-tint:#FBF1E1;
--risk-high:#C44536;
--risk-high-tint:#FCEAE7;
--font-display:'Fraunces', serif;
--font-body:'Inter', sans-serif;
--font-mono:'JetBrains Mono', monospace;
/* Spacing scale */
--sp-xs:8px;
--sp-sm:14px;
--sp-md:22px;
--sp-lg:32px;
--sp-xl:48px;
}
/* ── Reset ── */
*{margin:0;padding:0;box-sizing:border-box;}
body{
background:var(--paper);
color:var(--ink);
font-family:var(--font-body);
line-height:1.5;
-webkit-font-smoothing:antialiased;
/* prevent horizontal overflow on all devices */
overflow-x:hidden;
}
a{color:inherit;}
img,svg{max-width:100%;}
/* ── App wrapper ── */
.app{
max-width:1180px;
margin:0 auto;
padding:0 clamp(14px, 4vw, 28px) 80px;
}
/* ══════════════════════════════════════
TOPBAR
══════════════════════════════════════ */
.topbar{
display:flex;
align-items:center;
justify-content:space-between;
flex-wrap:wrap;
gap:10px;
padding:18px 0 14px;
border-bottom:1px solid var(--line);
margin-bottom:28px;
}
.logo{height:clamp(36px,5vw,48px);display:block;}
.topbar-right{display:flex;align-items:center;}
.proto-tag{
font-family:var(--font-mono);
font-size:clamp(9px,2vw,11px);
letter-spacing:.03em;
color:var(--teal-deep);
background:var(--teal-tint);
border:1px solid #BFE0E0;
padding:5px 10px;
border-radius:5px;
font-weight:500;
white-space:nowrap;
}
/* ══════════════════════════════════════
DISCLAIMER
══════════════════════════════════════ */
.disclaimer{
display:flex;
gap:12px;
align-items:flex-start;
background:var(--ink);
color:#fff;
border-radius:10px;
padding:clamp(10px,3vw,14px) clamp(12px,4vw,18px);
margin-bottom:clamp(22px,4vw,36px);
}
.disclaimer svg{width:16px;height:16px;flex-shrink:0;margin-top:2px;color:var(--mint);}
.disclaimer p{font-size:clamp(12px,2.5vw,13px);line-height:1.55;color:#D9E4E4;}
.disclaimer strong{color:#fff;font-weight:600;}
/* ══════════════════════════════════════
PAGE TITLE
══════════════════════════════════════ */
.page-title{
font-family:var(--font-display);
font-size:clamp(20px,4vw,27px);
font-weight:600;
letter-spacing:-0.01em;
margin-bottom:8px;
line-height:1.2;
}
.page-subtitle{
font-size:clamp(13px,2.5vw,14px);
color:var(--text-soft);
margin-bottom:16px;
max-width:560px;
}
/* ══════════════════════════════════════
INPUT CARD
══════════════════════════════════════ */
.input-card{
border:1px solid var(--line);
border-radius:14px;
padding:clamp(16px,4vw,24px);
background:var(--paper-dim);
margin-bottom:clamp(28px,5vw,44px);
}
.input-grid{
display:grid;
grid-template-columns:1fr 56px 1fr;
gap:16px;
align-items:end;
}
.field{display:flex;flex-direction:column;gap:8px;position:relative;}
.field label{
font-size:11px;
font-weight:600;
letter-spacing:.04em;
text-transform:uppercase;
color:var(--text-soft);
}
.autocomplete-wrap{position:relative;}
.field input{
width:100%;
font-family:var(--font-body);
font-size:clamp(14px,3vw,14.5px);
font-weight:500;
padding:clamp(11px,2.5vw,13px) 14px;
border:1.5px solid var(--line-strong);
border-radius:9px;
background:var(--paper);
color:var(--ink);
outline:none;
transition:border-color .15s, box-shadow .15s;
/* prevent zoom on iOS */
font-size:max(16px, 14px);
}
.field input:focus{
border-color:var(--teal);
box-shadow:0 0 0 3px rgba(13,115,119,0.12);
}
.swap-col{display:flex;align-items:center;justify-content:center;height:46px;}
.swap-btn{
width:38px;height:38px;border-radius:50%;
border:1px solid var(--line-strong);
background:var(--paper);
display:flex;align-items:center;justify-content:center;
cursor:pointer;
transition:border-color .15s, transform .25s;
/* touch target minimum 44px */
min-width:44px;min-height:44px;
}
.swap-btn:hover{border-color:var(--teal);transform:rotate(180deg);}
.swap-btn svg{width:16px;height:16px;color:var(--teal-deep);}
.suggestions{
position:absolute;
top:calc(100% + 4px);
left:0;right:0;
background:var(--paper);
border:1px solid var(--line-strong);
border-radius:9px;
box-shadow:0 8px 24px rgba(27,58,75,0.12);
z-index:20;
overflow:hidden;
display:none;
/* max-height for long lists on mobile */
max-height:220px;
overflow-y:auto;
}
.suggestions.open{display:block;}
.suggestion-item{
padding:clamp(10px,2vw,9px) 14px;
font-size:clamp(13px,3vw,13.5px);
cursor:pointer;
transition:background .1s;
/* larger touch target */
min-height:44px;
display:flex;
align-items:center;
}
.suggestion-item:hover,.suggestion-item.active{background:var(--teal-tint);}
.input-footer{
display:flex;
justify-content:space-between;
align-items:center;
margin-top:16px;
gap:12px;
flex-wrap:wrap;
}
.sample-pairs{display:flex;gap:8px;flex-wrap:wrap;flex:1;}
.sample-chip{
font-family:var(--font-mono);
font-size:clamp(10px,2vw,11px);
padding:6px 10px;
border-radius:6px;
border:1px solid var(--line-strong);
background:var(--paper);
cursor:pointer;
color:var(--text-soft);
transition:all .15s;
min-height:36px;
display:flex;
align-items:center;
}
.sample-chip:hover{border-color:var(--teal);color:var(--teal-deep);background:var(--teal-tint);}
.analyze-btn{
font-family:var(--font-body);
font-weight:600;
font-size:clamp(13px,3vw,14px);
color:#fff;
background:var(--ink);
border:none;
padding:clamp(11px,2.5vw,13px) clamp(18px,4vw,26px);
border-radius:9px;
cursor:pointer;
display:flex;align-items:center;justify-content:center;gap:9px;
transition:background .15s;
white-space:nowrap;
min-height:48px;
}
.analyze-btn:hover{background:var(--teal-deep);}
.analyze-btn:disabled{opacity:.6;cursor:default;}
.analyze-btn svg{width:15px;height:15px;flex-shrink:0;}
.error-banner{
margin-top:14px;
padding:12px 16px;
background:var(--risk-high-tint);
border:1px solid #F0C9C2;
border-radius:9px;
color:#8C3327;
font-size:clamp(12.5px,3vw,13.5px);
line-height:1.5;
}
/* ══════════════════════════════════════
RESULTS
══════════════════════════════════════ */
.results{display:flex;flex-direction:column;gap:clamp(22px,4vw,36px);}
.section-title{
font-family:var(--font-display);
font-size:clamp(16px,3.5vw,19px);
font-weight:600;
margin-bottom:14px;
}
/* result hero */
.result-hero{
display:grid;
grid-template-columns:220px 1fr;
gap:clamp(20px,4vw,36px);
border:1px solid var(--line);
border-radius:16px;
padding:clamp(20px,4vw,32px);
position:relative;
overflow:hidden;
}
.result-hero::before{
content:"";
position:absolute;
top:0;left:0;bottom:0;
width:4px;
}
.result-hero.risk-low::before{background:var(--risk-low);}
.result-hero.risk-modere::before{background:var(--risk-mod);}
.result-hero.risk-eleve::before{background:var(--risk-high);}
.gauge-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;}
.gauge-label{font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-soft);}
.result-main{display:flex;flex-direction:column;gap:16px;}
.result-pair{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.drug-pill{
font-family:var(--font-mono);
font-size:clamp(11.5px,2.5vw,13px);
font-weight:600;
padding:6px 12px;
border-radius:7px;
background:var(--ink);
color:#fff;
word-break:break-all;
}
.result-pair .x{color:var(--text-soft);font-size:13px;}
.risk-badge{
display:inline-flex;align-items:center;gap:7px;
font-size:clamp(12px,2.5vw,13px);font-weight:600;
padding:7px 14px;
border-radius:99px;
width:fit-content;
text-transform:capitalize;
}
.risk-badge.low{background:var(--risk-low-tint);color:var(--risk-low);}
.risk-badge.modere{background:var(--risk-mod-tint);color:var(--risk-mod);}
.risk-badge.eleve{background:var(--risk-high-tint);color:var(--risk-high);}
.risk-badge .dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0;}
.result-headline{
font-family:var(--font-display);
font-size:clamp(17px,4vw,22px);
font-weight:600;
letter-spacing:-0.01em;
line-height:1.35;
}
.result-headline em{font-style:normal;font-weight:700;}
.result-headline em.low{color:var(--risk-low);}
.result-headline em.modere{color:var(--risk-mod);}
.result-headline em.eleve{color:var(--risk-high);}
.confidence-row{
display:flex;align-items:center;gap:12px;
padding-top:8px;
border-top:1px solid var(--line);
flex-wrap:wrap;
}
.confidence-label{font-size:12px;color:var(--text-soft);font-weight:500;white-space:nowrap;}
.confidence-bar{flex:1;min-width:80px;height:6px;background:var(--line);border-radius:99px;overflow:hidden;}
.confidence-fill{height:100%;background:var(--teal);border-radius:99px;}
.confidence-value{font-family:var(--font-mono);font-size:13px;font-weight:600;color:var(--teal-deep);}
/* molecules */
.mol-row{display:flex;gap:16px;margin-top:6px;flex-wrap:wrap;}
.mol-card{
flex:1;
min-width:120px;
border:1px solid var(--line);
border-radius:10px;
padding:10px;
background:var(--paper-dim);
text-align:center;
}
.mol-card svg{max-width:100%;width:100%;height:auto;display:block;margin:0 auto;}
.mol-card .mol-label{font-size:11.5px;color:var(--text-soft);margin-top:4px;font-weight:500;}
/* grid 2 cards */
.grid-2{display:grid;grid-template-columns:1.1fr 1fr;gap:20px;}
.card{
border:1px solid var(--line);
border-radius:14px;
padding:clamp(16px,3vw,22px);
background:var(--paper);
}
.card h3{
font-family:var(--font-display);
font-size:clamp(14px,3vw,16px);
font-weight:600;
margin-bottom:14px;
}
/* reasons */
.reason-item{display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);}
.reason-item:last-child{border-bottom:none;padding-bottom:0;}
.reason-icon{
width:28px;height:28px;border-radius:7px;
background:var(--teal-tint);
color:var(--teal-deep);
display:flex;align-items:center;justify-content:center;
flex-shrink:0;
}
.reason-icon svg{width:14px;height:14px;}
.reason-text .t{font-size:clamp(12.5px,3vw,13.5px);font-weight:600;margin-bottom:2px;}
.reason-text .d{font-size:clamp(11.5px,2.5vw,12.5px);color:var(--text-soft);line-height:1.5;}
/* feature bars */
.feat-row{display:flex;align-items:center;gap:8px;padding:8px 0;}
.feat-name{
font-family:var(--font-mono);
font-size:clamp(10px,2vw,11.5px);
/* fluid width instead of fixed */
width:clamp(90px,20vw,150px);
flex-shrink:0;
color:var(--ink);
word-break:break-word;
line-height:1.3;
}
.feat-track{flex:1;height:16px;background:var(--paper-dim);border-radius:4px;min-width:40px;}
.feat-fill{height:100%;border-radius:4px;}
.feat-fill.pos{background:var(--risk-high);}
.feat-fill.neg{background:var(--teal);}
.feat-val{font-family:var(--font-mono);font-size:11px;font-weight:600;width:44px;text-align:right;flex-shrink:0;}
.mol-note{
margin-top:14px;
padding:12px 14px;
background:var(--paper-dim);
border-radius:9px;
font-size:clamp(11.5px,2.5vw,12px);
color:var(--text-soft);
line-height:1.6;
}
.mol-note strong{color:var(--ink);}
.frag-chip-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;}
.frag-chip{
font-family:var(--font-mono);
font-size:clamp(10.5px,2vw,11.5px);
padding:5px 10px;
border-radius:7px;
background:var(--mint-tint);
border:1px solid #B7EEDF;
color:var(--teal-deep);
}
/* side effects */
.se-tags{display:flex;flex-wrap:wrap;gap:8px;}
.se-tag{
font-size:clamp(11.5px,2.5vw,12.5px);
padding:7px 12px;
border-radius:8px;
background:var(--risk-mod-tint);
color:#8A6213;
font-weight:500;
border:1px solid #EFE0BD;
}
/* clinical ranking */
.rank-row{display:flex;align-items:center;gap:8px;padding:7px 0;}
.rank-name{
font-size:clamp(11.5px,2.5vw,12.5px);
font-weight:500;
/* fluid width */
width:clamp(110px,25vw,200px);
flex-shrink:0;
line-height:1.3;
}
.rank-track{flex:1;height:8px;background:var(--paper-dim);border-radius:99px;min-width:30px;}
.rank-fill{height:100%;background:var(--mint);border-radius:99px;}
.rank-val{font-family:var(--font-mono);font-size:11px;width:40px;text-align:right;color:var(--text-soft);flex-shrink:0;}
/* pharmacist sheet */
.sheet-card{
border:1.5px dashed var(--line-strong);
border-radius:14px;
padding:clamp(16px,4vw,24px);
background:var(--paper-dim);
}
.sheet-header{
display:flex;
justify-content:space-between;
align-items:flex-start;
margin-bottom:18px;
gap:14px;
flex-wrap:wrap;
}
.sheet-header h3{font-family:var(--font-display);font-size:clamp(15px,3.5vw,18px);font-weight:600;}
.sheet-header .sub{font-size:12px;color:var(--text-soft);margin-top:4px;}
.export-btn{
font-family:var(--font-body);
font-size:13px;font-weight:600;
color:var(--teal-deep);
background:var(--paper);
border:1.5px solid var(--teal);
padding:9px 16px;
border-radius:8px;
cursor:pointer;
display:flex;align-items:center;gap:7px;
transition:background .15s;
white-space:nowrap;
min-height:44px;
}
.export-btn:hover{background:var(--teal-tint);}
.export-btn svg{width:14px;height:14px;}
.sheet-grid{display:grid;grid-template-columns:repeat(4, 1fr);gap:12px;}
.sheet-stat{
background:var(--paper);
border:1px solid var(--line);
border-radius:10px;
padding:clamp(10px,3vw,14px);
}
.sheet-stat .label{
font-size:clamp(9.5px,2vw,10.5px);
text-transform:uppercase;
letter-spacing:.05em;
color:var(--text-soft);
font-weight:600;
margin-bottom:6px;
line-height:1.3;
}
.sheet-stat .value{
font-family:var(--font-display);
font-size:clamp(15px,3.5vw,18px);
font-weight:600;
}
.sheet-stat .value.risk-level{text-transform:capitalize;}
.sheet-stat .value.low{color:var(--risk-low);}
.sheet-stat .value.modere{color:var(--risk-mod);}
.sheet-stat .value.eleve{color:var(--risk-high);}
/* footer */
.footer{
border-top:1px solid var(--line);
padding-top:18px;
margin-top:36px;
display:flex;
justify-content:space-between;
align-items:center;
font-size:clamp(10.5px,2vw,11.5px);
color:var(--text-soft);
flex-wrap:wrap;
gap:10px;
}
.footer .left{display:flex;gap:14px;flex-wrap:wrap;}
/* loading */
.loading-row{display:flex;align-items:center;gap:10px;color:var(--text-soft);font-size:13.5px;padding:20px 0;}
.spinner{
width:16px;height:16px;border-radius:50%;
border:2px solid var(--line-strong);
border-top-color:var(--teal);
animation:spin .7s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg);}}
/* ══════════════════════════════════════
RESPONSIVE β€” Tablette (≀ 860px)
══════════════════════════════════════ */
@media (max-width:860px){
.input-grid{grid-template-columns:1fr;}
.swap-col{
display:flex;
height:auto;
justify-content:flex-start;
}
.swap-btn{transform:rotate(90deg);}
.swap-btn:hover{transform:rotate(270deg);}
.result-hero{grid-template-columns:1fr;}
.gauge-col{flex-direction:row;justify-content:flex-start;gap:16px;}
.grid-2{grid-template-columns:1fr;}
.sheet-grid{grid-template-columns:repeat(2,1fr);}
.mol-row{flex-direction:column;}
.mol-card{min-width:unset;}
}
/* ══════════════════════════════════════
RESPONSIVE β€” Mobile (≀ 600px)
══════════════════════════════════════ */
@media (max-width:600px){
.app{padding:0 14px 60px;}
/* Topbar */
.topbar{padding:14px 0 12px;}
.proto-tag{font-size:9.5px;padding:4px 8px;}
/* Title */
.page-title{font-size:20px;}
/* Input */
.input-card{padding:14px;border-radius:12px;}
.swap-col{display:none;}
.input-footer{flex-direction:column;align-items:stretch;gap:10px;}
.sample-pairs{order:2;}
.analyze-btn{
width:100%;
justify-content:center;
order:1;
font-size:15px;
padding:14px;
}
.sample-chip{font-size:10px;padding:5px 8px;}
/* Results */
.result-hero{padding:16px 14px;border-radius:12px;}
.section-title{font-size:16px;}
.gauge-col{flex-direction:row;gap:12px;flex-wrap:wrap;}
/* Cards */
.card{padding:14px;border-radius:12px;}
.sheet-card{padding:14px;border-radius:12px;}
/* Feature bars β€” collapse label above bar */
.feat-row{flex-wrap:wrap;gap:6px;}
.feat-name{width:100%;font-size:10.5px;}
.feat-track{min-width:0;}
.feat-val{width:auto;}
/* Rank rows */
.rank-row{flex-wrap:wrap;}
.rank-name{width:100%;font-size:12px;}
.rank-track{min-width:0;}
/* Sheet grid β†’ 2 cols */
.sheet-grid{grid-template-columns:1fr 1fr;gap:10px;}
.sheet-header{flex-direction:column;align-items:stretch;}
.export-btn{width:100%;justify-content:center;}
/* Confidence */
.confidence-row{flex-wrap:wrap;gap:8px;}
.confidence-bar{min-width:100%;order:3;}
/* Footer */
.footer{flex-direction:column;align-items:flex-start;gap:6px;}
}
/* ══════════════════════════════════════
RESPONSIVE β€” TrΓ¨s petit mobile (≀ 380px)
══════════════════════════════════════ */
@media (max-width:380px){
.app{padding:0 10px 50px;}
.page-title{font-size:18px;}
.sheet-grid{grid-template-columns:1fr;}
.drug-pill{font-size:11px;padding:5px 8px;}
.result-headline{font-size:16px;}
.proto-tag{display:none;}
}
/* ══════════════════════════════════════
ACCESSIBILITÉ
══════════════════════════════════════ */
:focus-visible{outline:2px solid var(--teal);outline-offset:2px;}
/* Touch : agrandir zones cliquables */
@media (pointer:coarse){
.suggestion-item{min-height:48px;}
.sample-chip{min-height:40px;}
.swap-btn{min-width:48px;min-height:48px;}
.analyze-btn{min-height:52px;}
.export-btn{min-height:48px;}
}
@media (prefers-reduced-motion:reduce){
*{transition:none !important;animation:none !important;}
}
/* ══════════════════════════════════════
PRINT β€” Fiche pharmacien A4
══════════════════════════════════════ */
.print-header{display:none;}
.print-footer{display:none;}
@media print{
@page{size:A4;margin:16mm 14mm;}
body{background:#fff;}
.app{max-width:100%;padding:0;margin:0;}
.topbar,.disclaimer,.page-title,.page-subtitle,
.input-card,.suggestions,.error-banner,.export-btn,.footer{
display:none !important;
}
button,.swap-btn{display:none !important;}
.print-header{
display:flex;
align-items:center;
flex-wrap:wrap;
gap:14px 22px;
padding-bottom:14px;
margin-bottom:18px;
border-bottom:2px solid var(--ink);
page-break-after:avoid;
page-break-inside:avoid;
}
.print-logo{height:34px;}
.print-header-text{flex:1;min-width:220px;}
.print-header-text h1{
font-family:var(--font-display);
font-size:18px;font-weight:600;color:var(--ink);
}
.print-meta{font-size:10.5px;color:var(--text-soft);margin-top:2px;}
.print-pair{
font-family:var(--font-mono);font-size:12px;font-weight:600;
color:var(--ink);display:flex;align-items:center;gap:8px;
}
.print-x{color:var(--text-soft);}
.print-risk-badge{
font-size:11px;font-weight:700;padding:5px 11px;
border-radius:99px;text-transform:capitalize;
border:1.3px solid currentColor;
}
.print-risk-badge.risk-low{color:var(--risk-low);}
.print-risk-badge.risk-modere{color:var(--risk-mod);}
.print-risk-badge.risk-eleve{color:var(--risk-high);}
.print-footer{
display:block;margin-top:22px;padding-top:12px;
border-top:1px solid var(--line-strong);
font-size:10px;line-height:1.5;color:var(--text-soft);
}
.print-footer strong{color:var(--ink);}
.results{gap:16px;}
.section-title{font-size:14.5px;margin-top:4px;margin-bottom:8px;page-break-after:avoid;}
section{page-break-inside:avoid;}
.result-hero,.card,.sheet-card,.mol-card{
border:1px solid #B9C4C4 !important;
box-shadow:none !important;
page-break-inside:avoid;
}
.result-hero{
padding:18px;gap:20px;
grid-template-columns:140px 1fr !important;
}
.sheet-card{border-style:solid !important;background:#fff !important;}
.card{padding:16px;}
/* RΓ©imposer la mise en page large pour A4 */
.gauge-col{flex-direction:column !important;}
.mol-row{flex-direction:row !important;}
.grid-2{grid-template-columns:1fr 1fr !important;}
.sheet-grid{grid-template-columns:repeat(4,1fr) !important;}
.feat-row{flex-wrap:nowrap !important;}
.feat-name{width:150px !important;}
.rank-row{flex-wrap:nowrap !important;}
.rank-name{width:200px !important;}
.confidence-row{flex-wrap:nowrap !important;}
.confidence-bar{min-width:auto !important;order:unset !important;}
.gauge-col svg{width:120px;height:120px;}
.risk-badge,.print-risk-badge,.feat-fill,.confidence-fill,
.rank-fill,.se-tag,.result-hero::before{
-webkit-print-color-adjust:exact;
print-color-adjust:exact;
color-adjust:exact;
}
.reason-item,.feat-row,.rank-row{page-break-inside:avoid;}
a{color:inherit;text-decoration:none;}
}