|
1 | | -<h1>Hello</h1> |
| 1 | +<!DOCTYPE html> |
| 2 | +<html lang="en"> |
| 3 | +<head> |
| 4 | +<meta charset="utf-8"> |
| 5 | +<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> |
| 6 | +<meta name="theme-color" content="#0B1220"> |
| 7 | +<meta name="apple-mobile-web-app-capable" content="yes"> |
| 8 | +<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> |
| 9 | +<meta name="apple-mobile-web-app-title" content="Study Hub"> |
| 10 | +<title>realmathmodel — study hub</title> |
| 11 | +<link rel="apple-touch-icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Crect width='180' height='180' rx='38' fill='%230B1220'/%3E%3Ctext x='26' y='118' font-family='monospace' font-size='62' fill='%23E0B23C'%3E%26gt;_%3C/text%3E%3C/svg%3E"> |
| 12 | +<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Crect width='32' height='32' rx='7' fill='%230B1220'/%3E%3Ctext x='4' y='23' font-family='monospace' font-size='18' fill='%23E0B23C'%3E%26gt;_%3C/text%3E%3C/svg%3E"> |
| 13 | +<style> |
| 14 | +:root{ |
| 15 | + --bg:#0B1220; --bg2:#0E1726; --panel:#141E33; --panel2:#192541; |
| 16 | + --line:#26334E; --line2:#33425f; |
| 17 | + --ink:#E7ECF7; --muted:#8A97AD; --faint:#5C6981; |
| 18 | + --amber:#E7B53D; --amber-dim:#9c7a25; |
| 19 | + --good:#4FC08A; --bad:#EB6A4E; |
| 20 | + --blue:#6F9BE8; --purple:#B79BE0; --orange:#E08A5B; --teal:#4FB89A; --green:#4FC08A; |
| 21 | + --mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,Consolas,"Liberation Mono",monospace; |
| 22 | + --sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; |
| 23 | +} |
| 24 | +*{box-sizing:border-box} |
| 25 | +html,body{margin:0;padding:0} |
| 26 | +body{ |
| 27 | + background: |
| 28 | + radial-gradient(1200px 600px at 70% -10%, rgba(231,181,61,.06), transparent 60%), |
| 29 | + radial-gradient(900px 500px at -10% 110%, rgba(79,184,154,.06), transparent 55%), |
| 30 | + var(--bg); |
| 31 | + color:var(--ink); font-family:var(--sans); |
| 32 | + -webkit-font-smoothing:antialiased; line-height:1.5; |
| 33 | + min-height:100vh; min-height:100dvh; |
| 34 | +} |
| 35 | +.wrap{max-width:740px; margin:0 auto; padding:0 16px env(safe-area-inset-bottom) 16px; |
| 36 | + padding-top:calc(12px + env(safe-area-inset-top));} |
| 37 | +.term{background:linear-gradient(180deg,var(--panel),var(--bg2)); |
| 38 | + border:1px solid var(--line); border-radius:12px; overflow:hidden; |
| 39 | + box-shadow:0 24px 60px -28px rgba(0,0,0,.7), inset 0 1px 0 rgba(255,255,255,.03);} |
| 40 | +.termbar{display:flex; align-items:center; gap:8px; padding:10px 14px; |
| 41 | + background:rgba(255,255,255,.02); border-bottom:1px solid var(--line);} |
| 42 | +.dot{width:11px;height:11px;border-radius:50%} |
| 43 | +.dot.r{background:#e8654b}.dot.y{background:#e7b53d}.dot.g{background:#4fc08a} |
| 44 | +.termtitle{font-family:var(--mono); font-size:12px; color:var(--faint); margin-left:8px; letter-spacing:.02em} |
| 45 | +.termbody{padding:18px 18px 22px} |
| 46 | +@media(min-width:560px){.termbody{padding:24px 26px 28px}} |
| 47 | +.prompt{font-family:var(--mono); font-size:13px; color:var(--muted); margin:0 0 4px} |
| 48 | +.prompt .u{color:var(--good)} .prompt .p{color:var(--blue)} .prompt .d{color:var(--amber)} |
| 49 | +.cursor{display:inline-block;width:8px;height:15px;background:var(--amber); |
| 50 | + vertical-align:-2px;margin-left:2px;animation:blink 1.1s steps(1) infinite} |
| 51 | +@keyframes blink{50%{opacity:0}} |
| 52 | +h1{font-family:var(--mono); font-weight:700; font-size:26px; letter-spacing:-.01em; |
| 53 | + margin:6px 0 2px; line-height:1.12} |
| 54 | +@media(min-width:560px){h1{font-size:31px}} |
| 55 | +h1 .ac{color:var(--amber)} |
| 56 | +.sub{color:var(--muted); font-size:14px; margin:0 0 16px} |
| 57 | +.label{font-family:var(--mono); font-size:11px; letter-spacing:.16em; text-transform:uppercase; |
| 58 | + color:var(--faint); margin:18px 0 10px; display:flex; align-items:center; gap:8px} |
| 59 | +.label::before{content:""; width:14px; height:1px; background:var(--line2)} |
| 60 | +/* search */ |
| 61 | +.search{display:flex; align-items:center; gap:9px; background:var(--bg2); |
| 62 | + border:1px solid var(--line); border-radius:9px; padding:10px 13px; margin:2px 0 4px} |
| 63 | +.search span{font-family:var(--mono); color:var(--amber); font-size:13px} |
| 64 | +.search input{flex:1; background:none; border:none; outline:none; color:var(--ink); |
| 65 | + font-family:var(--mono); font-size:13px} |
| 66 | +.search input::placeholder{color:var(--faint)} |
| 67 | +/* category grid */ |
| 68 | +.grid{display:grid; grid-template-columns:1fr; gap:9px; margin-top:4px} |
| 69 | +@media(min-width:560px){.grid{grid-template-columns:1fr 1fr}} |
| 70 | +.card{display:flex; align-items:center; gap:13px; padding:13px 14px; cursor:pointer; |
| 71 | + background:var(--panel); border:1px solid var(--line); border-radius:10px; |
| 72 | + text-decoration:none; color:inherit; |
| 73 | + transition:border-color .15s, background .15s, transform .12s;} |
| 74 | +.card:hover{border-color:var(--line2); background:linear-gradient(var(--panel),var(--panel2))} |
| 75 | +.card:active{transform:translateY(1px)} |
| 76 | +.ic{width:40px;height:40px;border-radius:9px;flex:0 0 auto; display:grid; place-items:center; |
| 77 | + font-family:var(--mono); font-size:18px; font-weight:700; color:#0d1322; |
| 78 | + border:1px solid transparent} |
| 79 | +.ic.amber{background:rgba(231,181,61,.16); color:var(--amber); border-color:rgba(231,181,61,.3)} |
| 80 | +.ic.blue{background:rgba(111,155,232,.16); color:var(--blue); border-color:rgba(111,155,232,.3)} |
| 81 | +.ic.purple{background:rgba(183,155,224,.16); color:var(--purple); border-color:rgba(183,155,224,.3)} |
| 82 | +.ic.orange{background:rgba(224,138,91,.16); color:var(--orange); border-color:rgba(224,138,91,.3)} |
| 83 | +.ic.teal{background:rgba(79,184,154,.16); color:var(--teal); border-color:rgba(79,184,154,.3)} |
| 84 | +.ic.green{background:rgba(79,192,138,.16); color:var(--green); border-color:rgba(79,192,138,.3)} |
| 85 | +.cbody{flex:1 1 auto; min-width:0} |
| 86 | +.ctitle{font-size:14.5px; color:var(--ink); font-weight:600; display:flex; align-items:center; gap:8px} |
| 87 | +.tag{font-family:var(--mono); font-size:9.5px; letter-spacing:.08em; padding:2px 6px; border-radius:5px; |
| 88 | + border:1px solid var(--line2); color:var(--muted); flex:0 0 auto} |
| 89 | +.cblurb{font-size:12.5px; color:var(--muted); margin-top:2px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap} |
| 90 | +.cmeta{font-family:var(--mono); font-size:11px; color:var(--faint); flex:0 0 auto; display:flex; flex-direction:column; align-items:flex-end; gap:2px} |
| 91 | +.arrow{color:var(--faint); font-family:var(--mono); font-size:16px; flex:0 0 auto; transition:color .15s, transform .15s} |
| 92 | +.card:hover .arrow{color:var(--amber); transform:translateX(2px)} |
| 93 | +.empty{color:var(--faint); font-family:var(--mono); font-size:13px; padding:18px 2px} |
| 94 | +.note{color:var(--faint); font-size:12.5px; line-height:1.6; margin:20px 2px 4px; border-top:1px solid var(--line); padding-top:14px} |
| 95 | +.note b{color:var(--muted); font-weight:600} |
| 96 | +.note code{font-family:var(--mono); color:var(--amber); font-size:12px} |
| 97 | +.foot{font-family:var(--mono); font-size:11px; color:var(--faint); text-align:center; margin:16px 0 6px} |
| 98 | +</style> |
| 99 | +</head> |
| 100 | +<body> |
| 101 | +<div class="wrap"> |
| 102 | + <div class="term"> |
| 103 | + <div class="termbar"> |
| 104 | + <span class="dot r"></span><span class="dot y"></span><span class="dot g"></span> |
| 105 | + <span class="termtitle">realmathmodel — bash — 80×24</span> |
| 106 | + </div> |
| 107 | + <div class="termbody"> |
| 108 | + <p class="prompt"><span class="u" id="who">hasan</span>@<span class="p" id="host">iug</span>:<span class="d">~</span>$ ls ./study<span class="cursor"></span></p> |
| 109 | + <h1>Study <span class="ac">Hub</span></h1> |
| 110 | + <p class="sub">Pick an area — each opens a page listing its resources.</p> |
| 111 | + |
| 112 | + <div class="search"> |
| 113 | + <span>/</span> |
| 114 | + <input id="q" type="text" inputmode="search" autocomplete="off" placeholder="filter areas…"> |
| 115 | + </div> |
| 116 | + |
| 117 | + <div class="label" id="count-label">areas</div> |
| 118 | + <div class="grid" id="grid"></div> |
| 119 | + <div class="empty" id="empty" style="display:none">no area matches that.</div> |
| 120 | + |
| 121 | + <p class="note">Edit <code>catalog.js</code> to add an area or a link. Cards with a dashed |
| 122 | + <b>TODO</b> resource are placeholders waiting for an internal page — drop the file in your repo and set its <code>href</code>.</p> |
| 123 | + <p class="foot">> realmathmodel.github.io</p> |
| 124 | + </div> |
| 125 | + </div> |
| 126 | +</div> |
| 127 | + |
| 128 | +<script src="catalog.js"></script> |
| 129 | +<script> |
| 130 | +(function(){ |
| 131 | + var cats = (window.CATALOG && CATALOG.categories) || []; |
| 132 | + document.getElementById('who').textContent = (CATALOG && CATALOG.owner) || 'hasan'; |
| 133 | + document.getElementById('host').textContent = (CATALOG && CATALOG.host) || 'iug'; |
| 134 | + var grid = document.getElementById('grid'); |
| 135 | + var empty = document.getElementById('empty'); |
| 136 | + var label = document.getElementById('count-label'); |
| 137 | + |
| 138 | + function render(list){ |
| 139 | + grid.innerHTML = ''; |
| 140 | + label.textContent = list.length + (list.length===1?' area':' areas'); |
| 141 | + if(!list.length){ empty.style.display='block'; return; } |
| 142 | + empty.style.display='none'; |
| 143 | + list.forEach(function(c){ |
| 144 | + var n = (c.resources||[]).length; |
| 145 | + var ext = (c.resources||[]).filter(function(r){return r.type==='external';}).length; |
| 146 | + var a = document.createElement('a'); |
| 147 | + a.className = 'card'; |
| 148 | + a.href = 'category.html?id=' + encodeURIComponent(c.id); |
| 149 | + a.innerHTML = |
| 150 | + '<div class="ic '+(c.accent||'amber')+'">'+esc(c.icon||'•')+'</div>'+ |
| 151 | + '<div class="cbody">'+ |
| 152 | + '<div class="ctitle">'+esc(c.title)+(c.tag?'<span class="tag">'+esc(c.tag)+'</span>':'')+'</div>'+ |
| 153 | + (c.blurb?'<div class="cblurb">'+esc(c.blurb)+'</div>':'')+ |
| 154 | + '</div>'+ |
| 155 | + '<div class="cmeta"><span>'+n+' link'+(n===1?'':'s')+'</span><span>'+ext+' ext</span></div>'+ |
| 156 | + '<span class="arrow">›</span>'; |
| 157 | + grid.appendChild(a); |
| 158 | + }); |
| 159 | + } |
| 160 | + function esc(s){return String(s).replace(/[&<>"]/g,function(c){return({'&':'&','<':'<','>':'>','"':'"'}[c]);});} |
| 161 | + |
| 162 | + render(cats); |
| 163 | + |
| 164 | + var q = document.getElementById('q'); |
| 165 | + q.addEventListener('input', function(){ |
| 166 | + var t = q.value.trim().toLowerCase(); |
| 167 | + if(!t){ render(cats); return; } |
| 168 | + render(cats.filter(function(c){ |
| 169 | + return (c.title+' '+(c.blurb||'')+' '+(c.tag||'')+' '+ |
| 170 | + (c.resources||[]).map(function(r){return r.label;}).join(' ')).toLowerCase().indexOf(t) > -1; |
| 171 | + })); |
| 172 | + }); |
| 173 | +})(); |
| 174 | +</script> |
| 175 | +</body> |
| 176 | +</html> |
0 commit comments