|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>AI STEM Lab</title> |
|
|
<style> |
|
|
:root { |
|
|
|
|
|
--bg-color: #121212; |
|
|
--card-bg: #1e1e1e; |
|
|
--accent-color: #0a84ff; |
|
|
--accent-hover: #409cff; |
|
|
--text-main: #f5f5f7; |
|
|
--text-secondary: #a1a1a6; |
|
|
|
|
|
|
|
|
--mac-window-bg: #2c2c2e; |
|
|
--mac-header-bg: #3a3a3c; |
|
|
--mac-border: rgba(0, 0, 0, 0.5); |
|
|
} |
|
|
|
|
|
body { |
|
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; |
|
|
background-color: var(--bg-color); |
|
|
color: var(--text-main); |
|
|
margin: 0; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
min-height: 100vh; |
|
|
padding: 20px; |
|
|
} |
|
|
|
|
|
|
|
|
header { |
|
|
margin-bottom: 50px; |
|
|
text-align: center; |
|
|
max-width: 800px; |
|
|
} |
|
|
|
|
|
h1 { |
|
|
color: var(--text-main); |
|
|
font-weight: 800; |
|
|
font-size: 3rem; |
|
|
margin: 0 0 15px 0; |
|
|
letter-spacing: -0.03em; |
|
|
background: linear-gradient(90deg, #fff, #a1a1a6); |
|
|
-webkit-background-clip: text; |
|
|
-webkit-text-fill-color: transparent; |
|
|
} |
|
|
|
|
|
p.subtitle { |
|
|
color: var(--text-secondary); |
|
|
font-size: 1.3rem; |
|
|
line-height: 1.5; |
|
|
} |
|
|
|
|
|
|
|
|
.playground-grid { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); |
|
|
gap: 30px; |
|
|
width: 95%; |
|
|
max-width: 1400px; |
|
|
} |
|
|
|
|
|
|
|
|
.card { |
|
|
background: var(--card-bg); |
|
|
border-radius: 24px; |
|
|
padding: 40px; |
|
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); |
|
|
transition: transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1), box-shadow 0.3s ease; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
align-items: flex-start; |
|
|
border: 1px solid rgba(255,255,255,0.08); |
|
|
position: relative; |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.card:hover { |
|
|
transform: translateY(-8px); |
|
|
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5); |
|
|
border-color: rgba(255,255,255,0.2); |
|
|
} |
|
|
|
|
|
.card::before { |
|
|
content: ''; |
|
|
position: absolute; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 6px; |
|
|
background: linear-gradient(90deg, var(--accent-color), #bc52ff); |
|
|
opacity: 0.7; |
|
|
} |
|
|
|
|
|
.icon-box { |
|
|
width: 64px; |
|
|
height: 64px; |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
border-radius: 16px; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
font-size: 32px; |
|
|
margin-bottom: 25px; |
|
|
} |
|
|
|
|
|
.card h2 { |
|
|
margin: 0 0 15px 0; |
|
|
font-size: 1.8rem; |
|
|
font-weight: 700; |
|
|
color: var(--text-main); |
|
|
} |
|
|
|
|
|
.card p { |
|
|
margin: 0 0 30px 0; |
|
|
color: var(--text-secondary); |
|
|
line-height: 1.6; |
|
|
font-size: 1.1rem; |
|
|
flex-grow: 1; |
|
|
} |
|
|
|
|
|
.card strong { |
|
|
color: #fff; |
|
|
font-weight: 600; |
|
|
} |
|
|
|
|
|
.launch-btn { |
|
|
background-color: var(--accent-color); |
|
|
color: white; |
|
|
border: none; |
|
|
padding: 14px 28px; |
|
|
border-radius: 30px; |
|
|
font-weight: 600; |
|
|
font-size: 1.1rem; |
|
|
cursor: pointer; |
|
|
transition: all 0.2s ease; |
|
|
width: 100%; |
|
|
text-align: center; |
|
|
} |
|
|
|
|
|
.launch-btn:hover { |
|
|
background-color: var(--accent-hover); |
|
|
transform: scale(1.02); |
|
|
} |
|
|
|
|
|
|
|
|
.modal-overlay { |
|
|
position: fixed; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
background: rgba(0, 0, 0, 0.75); |
|
|
backdrop-filter: blur(8px); |
|
|
z-index: 1000; |
|
|
display: none; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
opacity: 0; |
|
|
transition: opacity 0.3s ease; |
|
|
} |
|
|
|
|
|
.modal-overlay.active { |
|
|
display: flex; |
|
|
opacity: 1; |
|
|
} |
|
|
|
|
|
|
|
|
.mac-window { |
|
|
width: 85%; |
|
|
max-width: 1000px; |
|
|
height: 85vh; |
|
|
background: var(--mac-window-bg); |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 50px 100px rgba(0, 0, 0, 0.6); |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
overflow: hidden; |
|
|
border: 1px solid rgba(255,255,255,0.1); |
|
|
transform: scale(0.95); |
|
|
transition: transform 0.3s cubic-bezier(0.19, 1, 0.22, 1); |
|
|
position: relative; |
|
|
} |
|
|
|
|
|
.modal-overlay.active .mac-window { |
|
|
transform: scale(1); |
|
|
} |
|
|
|
|
|
|
|
|
.window-header { |
|
|
height: 44px; |
|
|
background: var(--mac-header-bg); |
|
|
border-bottom: 1px solid #1c1c1e; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
padding-left: 16px; |
|
|
cursor: default; |
|
|
} |
|
|
|
|
|
|
|
|
.traffic-light { |
|
|
width: 14px; |
|
|
height: 14px; |
|
|
border-radius: 50%; |
|
|
background-color: #ff453a; |
|
|
border: none; |
|
|
cursor: pointer; |
|
|
position: relative; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
box-shadow: inset 0 1px 2px rgba(0,0,0,0.2); |
|
|
} |
|
|
|
|
|
.traffic-light:hover::after { |
|
|
content: "Γ"; |
|
|
color: #3b0000; |
|
|
font-size: 11px; |
|
|
font-weight: 900; |
|
|
margin-top: -1px; |
|
|
} |
|
|
|
|
|
.window-title { |
|
|
position: absolute; |
|
|
left: 50%; |
|
|
transform: translateX(-50%); |
|
|
font-size: 14px; |
|
|
color: #cfcfcf; |
|
|
font-weight: 500; |
|
|
} |
|
|
|
|
|
|
|
|
.window-content { |
|
|
flex: 1; |
|
|
background: #000; |
|
|
position: relative; |
|
|
} |
|
|
|
|
|
iframe { |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
border: none; |
|
|
background: #121212; |
|
|
} |
|
|
|
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
|
|
|
<header> |
|
|
<h1>AI Model Laboratory</h1> |
|
|
<p class="subtitle">Welcome to the hands-on section! Based on the slideshow we just watched, choose an experiment below to test how computers "see" the world.</p> |
|
|
</header> |
|
|
|
|
|
<div class="playground-grid"> |
|
|
|
|
|
<div class="card"> |
|
|
<div class="icon-box">π§</div> |
|
|
<h2>Pose Estimation</h2> |
|
|
<p> |
|
|
<strong>Remember the slide about skeletons?</strong><br><br> |
|
|
In this experiment, the AI will try to find your joints (like elbows, knees, and shoulders) and connect them with lines. |
|
|
<br><br> |
|
|
<em>Try this: Try to do some movements with yout hands and face. Does the AI follow your movement?</em> |
|
|
</p> |
|
|
<button class="launch-btn" onclick="openWindow('Pose Estimation', 'pose.html')">Launch Experiment</button> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="card"> |
|
|
<div class="icon-box">π</div> |
|
|
<h2>Object Recognition</h2> |
|
|
<p> |
|
|
<strong>How does a self-driving car see?</strong><br><br> |
|
|
This model is trained to recognize thousands of everyday items. It draws a box around what it sees and gives it a label. |
|
|
<br><br> |
|
|
<em>Try this: Hold up a pen, a water bottle, or your shoe. Can it guess them all correctly?</em> |
|
|
</p> |
|
|
<center> |
|
|
<button id="dev-trigger-btn">Wondering what objects this model can detect? Click here to find out!</button> |
|
|
</center> |
|
|
<br> |
|
|
<button class="launch-btn" onclick="openWindow('Object Recognition', 'Object-Detection.html')">Launch Experiment</button> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="card"> |
|
|
<div class="icon-box">π</div> |
|
|
<h2>Face Expression</h2> |
|
|
<p> |
|
|
<strong>Can computers understand feelings?</strong><br><br> |
|
|
This AI looks at the geometry of your faceβhow much your mouth curves or your eyebrows liftβto guess your emotion. |
|
|
<br><br> |
|
|
<em>Try this: Make a super happy face, then a sad face. See if the "Confidence Score" changes!</em> |
|
|
</p> |
|
|
<button class="launch-btn" onclick="openWindow('Face Expression', 'Face-Expresion.html')">Launch Experiment</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<h1 style="text-align:center; margin:60px 0 30px;"> |
|
|
Here are some extra ones that you might like.... |
|
|
</h1> |
|
|
|
|
|
<div class="playground-grid"> |
|
|
|
|
|
<div class="card"> |
|
|
<div class="icon-box">π</div> |
|
|
<h2>JS WebCam Motion Detection</h2> |
|
|
<p> |
|
|
<strong>Can a computer actually βseeβ movement?</strong><br><br> |
|
|
This project watches your webcam and compares each frame to the one before it. |
|
|
When something movesβeven a tiny bitβthe computer highlights the change so you can |
|
|
spot motion glowing on the screen.<br><br> |
|
|
<em>Try this: Wave your hand slowly, then quickly. Notice how the motion pattern changes!</em> |
|
|
</p> |
|
|
<button class="launch-btn" onclick="openWindow('Movement Detection', 'movement-detection.html')">Launch Experiment</button> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="card"> |
|
|
<div class="icon-box">ποΈ</div> |
|
|
<h2>Object Detection with TensorFlow.js</h2> |
|
|
<p> |
|
|
<strong>How can a computer tell what's in a picture?</strong><br><br> |
|
|
This project uses a preβtrained AI model that can look at an imageβor even your |
|
|
webcamβand point out objects it recognizes. It doesnβt just guess the object, |
|
|
it also shows *where* it is in the picture by drawing a box around it.<br><br> |
|
|
<em>Try this: Hold up different objects (like a pencil, cup, or book) and see |
|
|
which ones the AI can detect!</em> |
|
|
</p> |
|
|
<button class="launch-btn" onclick="openWindow('Object Detection with TensorFlow.js', 'live-feed-object-detection.html')">Launch Experiment</button> |
|
|
</div> |
|
|
|
|
|
<div class="card"> |
|
|
<div class="icon-box">ποΈ</div> |
|
|
<h2>Want to make your own model?</h2> |
|
|
<p> |
|
|
<strong>How about making your own AI model that detects the objects <em>you</em> care about?</strong><br><br> |
|
|
You can try this experiment to build your own custom model using TensorFlow.js and the Teachable Machine Algorithm.<br><br> |
|
|
<br> |
|
|
<em>Tip:</em> Try choosing 2 objects around you (like a water bottle, pencil, pair of headphones, or even yourself) and gather at least 30 images of each from different angles. The more variety you include, the smarter your model becomes.<br><br> |
|
|
|
|
|
</p> |
|
|
</p> |
|
|
<button class="launch-btn" onclick="openWindow('build your own custom model using TensorFlow.js and the Teachable Machine Algorithm', 'make-model.html')">Launch Experiment</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="modal-overlay" id="modalOverlay"> |
|
|
<div class="mac-window" id="macWindow"> |
|
|
<div class="window-header"> |
|
|
<div class="traffic-light" id="closeBtn"></div> |
|
|
<div class="window-title" id="windowTitle">Terminal</div> |
|
|
</div> |
|
|
<div class="window-content"> |
|
|
<iframe id="labFrame" src=""></iframe> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
const overlay = document.getElementById('modalOverlay'); |
|
|
const macWindow = document.getElementById('macWindow'); |
|
|
const labFrame = document.getElementById('labFrame'); |
|
|
const windowTitle = document.getElementById('windowTitle'); |
|
|
const closeBtn = document.getElementById('closeBtn'); |
|
|
|
|
|
|
|
|
window.openWindow = function(title, fileName) { |
|
|
if (windowTitle) windowTitle.textContent = "Running: " + title; |
|
|
if (overlay) overlay.classList.add('active'); |
|
|
|
|
|
|
|
|
if (labFrame) labFrame.src = fileName; |
|
|
}; |
|
|
|
|
|
function closeWindow() { |
|
|
if (overlay) overlay.classList.remove('active'); |
|
|
|
|
|
setTimeout(() => { |
|
|
if (labFrame) labFrame.src = ""; |
|
|
}, 300); |
|
|
} |
|
|
|
|
|
|
|
|
if (closeBtn) { |
|
|
closeBtn.addEventListener('click', closeWindow); |
|
|
} |
|
|
|
|
|
|
|
|
if (overlay) { |
|
|
overlay.addEventListener('click', function(event) { |
|
|
if (event.target === overlay) { |
|
|
closeWindow(); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
if (macWindow) { |
|
|
macWindow.addEventListener('click', function(event) { |
|
|
event.stopPropagation(); |
|
|
}); |
|
|
} |
|
|
}); |
|
|
</script> |
|
|
|
|
|
</body> |
|
|
</html> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<style> |
|
|
|
|
|
|
|
|
|
|
|
#dev-trigger-btn { |
|
|
background-color: #007AFF; |
|
|
color: white; |
|
|
border: none; |
|
|
padding: 12px 24px; |
|
|
font-size: 16px; |
|
|
font-weight: 600; |
|
|
border-radius: 8px; |
|
|
cursor: pointer; |
|
|
box-shadow: 0 4px 6px rgba(0,0,0,0.1); |
|
|
transition: transform 0.1s ease; |
|
|
} |
|
|
|
|
|
#dev-trigger-btn:active { |
|
|
transform: scale(0.96); |
|
|
} |
|
|
|
|
|
|
|
|
#modal-overlay { |
|
|
display: none; |
|
|
position: fixed; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
background: rgba(0, 0, 0, 0.4); |
|
|
backdrop-filter: blur(5px); |
|
|
z-index: 1000; |
|
|
justify-content: center; |
|
|
align-items: center; |
|
|
opacity: 0; |
|
|
transition: opacity 0.3s ease; |
|
|
} |
|
|
|
|
|
|
|
|
#macos-window { |
|
|
width: 80%; |
|
|
max-width: 900px; |
|
|
height: 70%; |
|
|
background-color: #1e1e1e; |
|
|
border-radius: 12px; |
|
|
box-shadow: 0 20px 50px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.1); |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
overflow: hidden; |
|
|
transform: scale(0.95); |
|
|
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1); |
|
|
} |
|
|
|
|
|
|
|
|
.window-header { |
|
|
height: 38px; |
|
|
background: linear-gradient(to bottom, #3a3a3a, #2b2b2b); |
|
|
border-bottom: 1px solid #000; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
padding: 0 16px; |
|
|
flex-shrink: 0; |
|
|
} |
|
|
|
|
|
|
|
|
.window-controls { |
|
|
display: flex; |
|
|
gap: 8px; |
|
|
} |
|
|
|
|
|
.control-dot { |
|
|
width: 12px; |
|
|
height: 12px; |
|
|
border-radius: 50%; |
|
|
border: 1px solid rgba(0,0,0,0.2); |
|
|
} |
|
|
|
|
|
.close-dot { background-color: #ff5f56; cursor: pointer; } |
|
|
.close-dot:hover { background-color: #ff3b30; } |
|
|
.minimize-dot { background-color: #ffbd2e; } |
|
|
.expand-dot { background-color: #27c93f; } |
|
|
|
|
|
.window-title { |
|
|
color: #d1d1d1; |
|
|
font-size: 13px; |
|
|
font-weight: 500; |
|
|
margin-left: 20px; |
|
|
flex-grow: 1; |
|
|
text-align: center; |
|
|
padding-right: 60px; |
|
|
} |
|
|
|
|
|
|
|
|
.window-content { |
|
|
padding: 20px; |
|
|
overflow-y: auto; |
|
|
color: #fff; |
|
|
} |
|
|
|
|
|
|
|
|
.tiles-grid { |
|
|
display: grid; |
|
|
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); |
|
|
gap: 16px; |
|
|
} |
|
|
|
|
|
|
|
|
.tile { |
|
|
background-color: #2c2c2e; |
|
|
border: 1px solid #3a3a3c; |
|
|
border-radius: 8px; |
|
|
padding: 16px; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
gap: 8px; |
|
|
transition: background-color 0.2s; |
|
|
} |
|
|
|
|
|
.tile:hover { |
|
|
background-color: #3a3a3c; |
|
|
} |
|
|
|
|
|
.tile-icon { |
|
|
font-size: 32px; |
|
|
} |
|
|
|
|
|
.tile-name { |
|
|
font-size: 16px; |
|
|
font-weight: 700; |
|
|
color: #fff; |
|
|
text-transform: capitalize; |
|
|
} |
|
|
|
|
|
.tile-desc { |
|
|
font-size: 13px; |
|
|
line-height: 1.4; |
|
|
color: #a1a1a6; |
|
|
} |
|
|
|
|
|
|
|
|
.window-content::-webkit-scrollbar { |
|
|
width: 8px; |
|
|
} |
|
|
.window-content::-webkit-scrollbar-track { |
|
|
background: #1e1e1e; |
|
|
} |
|
|
.window-content::-webkit-scrollbar-thumb { |
|
|
background: #48484a; |
|
|
border-radius: 4px; |
|
|
} |
|
|
|
|
|
|
|
|
#modal-overlay.active { |
|
|
display: flex; |
|
|
opacity: 1; |
|
|
} |
|
|
|
|
|
#modal-overlay.active #macos-window { |
|
|
transform: scale(1); |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div id="modal-overlay"> |
|
|
<div id="macos-window"> |
|
|
|
|
|
<div class="window-header"> |
|
|
<div class="window-controls"> |
|
|
<div class="control-dot close-dot" id="close-btn" title="Close"></div> |
|
|
</div> |
|
|
|
|
|
<div class="window-title">COCO Dataset Classes (80 Objects)</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="window-content"> |
|
|
<div style="margin-bottom: 20px; color: #a1a1a6; font-size: 14px;"> |
|
|
This AI model is trained to see the world like you do. Below are the 80 different things it can instantly recognize in a photo. |
|
|
</div> |
|
|
<div class="tiles-grid" id="tiles-container"> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<script> |
|
|
|
|
|
const cocoData = [ |
|
|
{ name: "person", emoji: "π€", desc: "A human being, like you, your friends, or your teacher." }, |
|
|
{ name: "bicycle", emoji: "π²", desc: "A two-wheeled vehicle that you pedal to ride." }, |
|
|
{ name: "car", emoji: "π", desc: "A vehicle with four wheels used to drive on roads." }, |
|
|
{ name: "motorcycle", emoji: "ποΈ", desc: "Like a bicycle, but with a fast engine and heavier wheels." }, |
|
|
{ name: "airplane", emoji: "βοΈ", desc: "A flying machine with wings that carries passengers across the sky." }, |
|
|
{ name: "bus", emoji: "π", desc: "A large vehicle that carries many people along a set route." }, |
|
|
{ name: "train", emoji: "π", desc: "A series of connected cars that run on a metal track." }, |
|
|
{ name: "truck", emoji: "π", desc: "A large, heavy vehicle used for carrying cargo or big loads." }, |
|
|
{ name: "boat", emoji: "β΅", desc: "A vehicle designed to float and travel on water." }, |
|
|
{ name: "traffic light", emoji: "π¦", desc: "A signal with red, yellow, and green lights to control cars." }, |
|
|
{ name: "fire hydrant", emoji: "π", desc: "A pipe on the street that firefighters use to get water." }, |
|
|
{ name: "stop sign", emoji: "π", desc: "A red octagon sign that tells drivers to stop moving." }, |
|
|
{ name: "parking meter", emoji: "π
ΏοΈ", desc: "A machine where you pay money to park your car on the street." }, |
|
|
{ name: "bench", emoji: "πͺ", desc: "A long seat for several people, usually found in parks." }, |
|
|
{ name: "bird", emoji: "π¦", desc: "An animal with feathers and wings that can usually fly." }, |
|
|
{ name: "cat", emoji: "π", desc: "A small, furry pet that purrs and catches mice." }, |
|
|
{ name: "dog", emoji: "π", desc: "A loyal pet with four legs that barks and loves to play." }, |
|
|
{ name: "horse", emoji: "π", desc: "A large, strong animal that people can ride." }, |
|
|
{ name: "sheep", emoji: "π", desc: "A fluffy farm animal that gives us wool for clothes." }, |
|
|
{ name: "cow", emoji: "π", desc: "A large farm animal that gives us milk." }, |
|
|
{ name: "elephant", emoji: "π", desc: "A huge animal with big ears and a long trunk." }, |
|
|
{ name: "bear", emoji: "π»", desc: "A large, strong wild animal with thick fur." }, |
|
|
{ name: "zebra", emoji: "π¦", desc: "A wild horse-like animal with black and white stripes." }, |
|
|
{ name: "giraffe", emoji: "π¦", desc: "The tallest animal, with a very long neck to eat tree leaves." }, |
|
|
{ name: "backpack", emoji: "π", desc: "A bag you carry on your back to hold books and supplies." }, |
|
|
{ name: "umbrella", emoji: "βοΈ", desc: "A tool you hold over your head to stay dry in the rain." }, |
|
|
{ name: "handbag", emoji: "π", desc: "A small bag used to carry personal items like a wallet." }, |
|
|
{ name: "tie", emoji: "π", desc: "A long piece of cloth worn around the neck with a suit." }, |
|
|
{ name: "suitcase", emoji: "π§³", desc: "A large bag used for packing clothes when traveling." }, |
|
|
{ name: "frisbee", emoji: "π₯", desc: "A plastic disc you throw to a friend or dog." }, |
|
|
{ name: "skis", emoji: "β·οΈ", desc: "Long, flat runners you attach to boots to glide on snow." }, |
|
|
{ name: "snowboard", emoji: "π", desc: "A single wide board you stand on to surf down snowy hills." }, |
|
|
{ name: "sports ball", emoji: "β½", desc: "Any round object used in games like soccer, basketball, or tennis." }, |
|
|
{ name: "kite", emoji: "πͺ", desc: "A light frame with paper or cloth that flies in the wind." }, |
|
|
{ name: "baseball bat", emoji: "βΎ", desc: "A smooth wooden or metal stick used to hit a baseball." }, |
|
|
{ name: "baseball glove", emoji: "π§€", desc: "A leather mitt worn to catch a baseball safely." }, |
|
|
{ name: "skateboard", emoji: "πΉ", desc: "A short board with wheels that you stand on and ride." }, |
|
|
{ name: "surfboard", emoji: "π", desc: "A long board used to ride ocean waves." }, |
|
|
{ name: "tennis racket", emoji: "πΎ", desc: "A bat with a net mesh used to hit a tennis ball." }, |
|
|
{ name: "bottle", emoji: "πΎ", desc: "A container with a narrow neck for holding liquids." }, |
|
|
{ name: "wine glass", emoji: "π·", desc: "A fancy glass with a stem, used for special drinks." }, |
|
|
{ name: "cup", emoji: "β", desc: "A small open container for drinking tea or coffee." }, |
|
|
{ name: "fork", emoji: "π΄", desc: "A tool with prongs used to pick up food." }, |
|
|
{ name: "knife", emoji: "πͺ", desc: "A tool with a sharp edge used for cutting food." }, |
|
|
{ name: "spoon", emoji: "π₯", desc: "A tool with a small scoop for eating soup or cereal." }, |
|
|
{ name: "bowl", emoji: "π₯£", desc: "A round, deep dish used for soup or cereal." }, |
|
|
{ name: "banana", emoji: "π", desc: "A long, curved yellow fruit that you peel to eat." }, |
|
|
{ name: "apple", emoji: "π", desc: "A round red or green fruit that is crunchy and sweet." }, |
|
|
{ name: "sandwich", emoji: "π₯ͺ", desc: "Two slices of bread with meat, cheese, or veggies inside." }, |
|
|
{ name: "orange", emoji: "π", desc: "A round citrus fruit with a thick skin and juicy inside." }, |
|
|
{ name: "broccoli", emoji: "π₯¦", desc: "A green vegetable that looks like a little tree." }, |
|
|
{ name: "carrot", emoji: "π₯", desc: "A crunchy orange vegetable that grows underground." }, |
|
|
{ name: "hot dog", emoji: "π", desc: "A cooked sausage served in a long, soft bun." }, |
|
|
{ name: "pizza", emoji: "π", desc: "A round dough base topped with tomato sauce and cheese." }, |
|
|
{ name: "donut", emoji: "π©", desc: "A sweet, fried ring of dough, often with frosting." }, |
|
|
{ name: "cake", emoji: "π", desc: "A sweet baked dessert often eaten at birthday parties." }, |
|
|
{ name: "chair", emoji: "πͺ", desc: "A piece of furniture designed for one person to sit on." }, |
|
|
{ name: "couch", emoji: "ποΈ", desc: "A soft, long seat where multiple people can relax." }, |
|
|
{ name: "potted plant", emoji: "πͺ΄", desc: "A plant grown inside a container for decoration." }, |
|
|
{ name: "bed", emoji: "ποΈ", desc: "A piece of furniture with a mattress for sleeping." }, |
|
|
{ name: "dining table", emoji: "π½οΈ", desc: "A large table where families sit to eat meals." }, |
|
|
{ name: "toilet", emoji: "π½", desc: "A bathroom fixture used for getting rid of waste." }, |
|
|
{ name: "tv", emoji: "πΊ", desc: "An electronic screen for watching shows and movies." }, |
|
|
{ name: "laptop", emoji: "π»", desc: "A portable computer that you can use on your lap." }, |
|
|
{ name: "mouse", emoji: "π±οΈ", desc: "A handheld device used to move the cursor on a computer." }, |
|
|
{ name: "remote", emoji: "π‘", desc: "A controller used to change channels on a TV from afar." }, |
|
|
{ name: "keyboard", emoji: "β¨οΈ", desc: "A board with buttons for typing letters into a computer." }, |
|
|
{ name: "cell phone", emoji: "π±", desc: "A small phone you can carry in your pocket." }, |
|
|
{ name: "microwave", emoji: "βββββββ²οΈ", desc: "An oven that heats food very quickly." }, |
|
|
{ name: "oven", emoji: "π₯", desc: "A kitchen appliance used for baking and roasting food." }, |
|
|
{ name: "toaster", emoji: "π", desc: "A machine that browns bread slices." }, |
|
|
{ name: "sink", emoji: "π°", desc: "A basin with a faucet for washing hands or dishes." }, |
|
|
{ name: "refrigerator", emoji: "βοΈ", desc: "A cold closet that keeps food fresh." }, |
|
|
{ name: "book", emoji: "π", desc: "A set of pages with writing or pictures to read." }, |
|
|
{ name: "clock", emoji: "β°", desc: "A device that tells you what time it is." }, |
|
|
{ name: "vase", emoji: "πΊ", desc: "A decorative container used for holding flowers." }, |
|
|
{ name: "scissors", emoji: "βοΈ", desc: "A tool with two blades used for cutting paper." }, |
|
|
{ name: "teddy bear", emoji: "π§Έ", desc: "A soft toy bear that is cuddly and cute." }, |
|
|
{ name: "hair drier", emoji: "π¨", desc: "A machine that blows hot air to dry wet hair." }, |
|
|
{ name: "toothbrush", emoji: "πͺ₯", desc: "A small brush used to clean your teeth." } |
|
|
]; |
|
|
|
|
|
|
|
|
const triggerBtn = document.getElementById('dev-trigger-btn'); |
|
|
const modal = document.getElementById('modal-overlay'); |
|
|
const closeBtn = document.getElementById('close-btn'); |
|
|
const tilesContainer = document.getElementById('tiles-container'); |
|
|
const macosWindow = document.getElementById('macos-window'); |
|
|
|
|
|
|
|
|
function renderTiles() { |
|
|
tilesContainer.innerHTML = cocoData.map(item => ` |
|
|
<div class="tile"> |
|
|
<div class="tile-icon">${item.emoji}</div> |
|
|
<div class="tile-name">${item.name}</div> |
|
|
<div class="tile-desc">${item.desc}</div> |
|
|
</div> |
|
|
`).join(''); |
|
|
} |
|
|
|
|
|
|
|
|
triggerBtn.addEventListener('click', () => { |
|
|
renderTiles(); |
|
|
modal.classList.add('active'); |
|
|
}); |
|
|
|
|
|
|
|
|
function closeModal() { |
|
|
modal.classList.remove('active'); |
|
|
} |
|
|
|
|
|
|
|
|
closeBtn.addEventListener('click', closeModal); |
|
|
|
|
|
|
|
|
modal.addEventListener('click', (e) => { |
|
|
|
|
|
|
|
|
if (e.target === modal) { |
|
|
closeModal(); |
|
|
} |
|
|
}); |
|
|
|
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|