first commit

This commit is contained in:
Stefano Rossi 2025-07-12 17:16:47 +02:00
commit fdf7024bcd
Signed by: chadmin
GPG key ID: 9EFA2130646BC893
19 changed files with 6837 additions and 0 deletions

7
.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
node_modules
.DS_Store
dist
*.local
.vite-inspect
.remote-assets
components.d.ts

42
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,42 @@
image: node:lts
stages:
- build
- deploy
cache:
paths:
- node_modules/
build:
stage: build
script:
- apt-get update --allow-releaseinfo-change || apt-get update --fix-missing || (sleep 10 && apt-get update)
- apt-get install -y --no-install-recommends --fix-missing xvfb libgtk-3-0 libnss3 libasound2 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libasound2
- npm install
- export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
- npm install -g playwright-chromium @playwright/test
- npx playwright install --with-deps chromium || npx playwright install-deps chromium
- npm run build
artifacts:
paths:
- dist
retry:
max: 2
when: script_failure
pages:
stage: deploy
dependencies:
- build
script:
- mkdir -p public
- cp -r dist/* public/ || echo "Warning, No files to copy or dist directory is empty"
- ls -la public/
- echo "Pages deployment running on branch $CI_COMMIT_REF_NAME"
artifacts:
paths:
- public
only:
- main
- master

3
.npmrc Normal file
View file

@ -0,0 +1,3 @@
# for pnpm
shamefully-hoist=true
auto-install-peers=true

11
README.md Normal file
View file

@ -0,0 +1,11 @@
# Welcome to [Slidev](https://github.com/slidevjs/slidev)!
To start the slide show:
- `pnpm install`
- `pnpm dev`
- visit <http://localhost:3030>
Edit the [slides.md](./slides.md) to see the changes.
Learn more about Slidev at the [documentation](https://sli.dev/).

37
components/Counter.vue Normal file
View file

@ -0,0 +1,37 @@
<script setup lang="ts">
import { ref } from 'vue'
const props = defineProps({
count: {
default: 0,
},
})
const counter = ref(props.count)
</script>
<template>
<div flex="~" w="min" border="~ main rounded-md">
<button
border="r main"
p="2"
font="mono"
outline="!none"
hover:bg="gray-400 opacity-20"
@click="counter -= 1"
>
-
</button>
<span m="auto" p="2">{{ counter }}</span>
<button
border="l main"
p="2"
font="mono"
outline="!none"
hover:bg="gray-400 opacity-20"
@click="counter += 1"
>
+
</button>
</div>
</template>

16
netlify.toml Normal file
View file

@ -0,0 +1,16 @@
[build]
publish = "dist"
command = "npm run build"
[build.environment]
NODE_VERSION = "20"
[[redirects]]
from = "/.well-known/*"
to = "/.well-known/:splat"
status = 200
[[redirects]]
from = "/*"
to = "/index.html"
status = 200

18
package.json Normal file
View file

@ -0,0 +1,18 @@
{
"name": "slidev",
"type": "module",
"private": true,
"scripts": {
"build": "slidev build",
"dev": "slidev --open",
"export": "slidev export"
},
"dependencies": {
"@slidev/cli": "^51.6.0",
"@slidev/theme-default": "latest",
"@slidev/theme-seriph": "latest",
"slidev-addon-python-runner": "^0.1.3",
"slidev-addon-rabbit": "^0.4.0",
"vue": "^3.5.13"
}
}

27
pages/imported-slides.md Normal file
View file

@ -0,0 +1,27 @@
# Imported Slides
You can split your slides.md into multiple files and organize them as you want using the `src` attribute.
#### `slides.md`
```markdown
# Page 1
Page 2 from main entry.
---
## src: ./subpage.md
```
<br>
#### `subpage.md`
```markdown
# Page 2
Page 2 from another file.
```
[Learn more](https://sli.dev/guide/syntax.html#importing-slides)

5889
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load diff

3
pnpm-workspace.yaml Normal file
View file

@ -0,0 +1,3 @@
ignoredBuiltDependencies:
- cytoscape
- esbuild

283
slides.md Normal file
View file

@ -0,0 +1,283 @@
---
# theme id, package name, or local path
theme: seriph
title: Scalable Oversight for Complex AI Tasks
titleTemplate: '%s - AI Safety & Oversight'
author: Rossi Stefano
info: |
## Methods for Scaling Human Feedback in AI Supervision
keywords: AI Safety, Scalable Oversight, LLMs, Human Feedback, Alignment, AI Debate
mdc: true
hideInToc: false
addons:
- slidev-addon-rabbit
- slidev-addon-python-runner
python:
installs: []
prelude: ''
loadPackagesFromImports: true
suppressDeprecationWarnings: true
alwaysReload: false
loadPyodideOptions: {}
presenter: true
browserExporter: dev
download: true
exportFilename: scalable-oversight-for-ai
twoslash: false
lineNumbers: true
monaco: false
selectable: false
record: dev
contextMenu: dev
wakeLock: true
overviewSnapshots: false
colorSchema: dark
routerMode: history
aspectRatio: 16/9
canvasWidth: 980
css:
- unocss
unocss:
configFile: './uno.config.ts'
defaults:
layout: center
drawings:
enabled: true
persist: false
presenterOnly: false
syncAll: true
htmlAttrs:
dir: ltr
lang: en
transition: slide-left
background: none
---
<!-- INTRO SLIDE -->
<div class="flex flex-col items-center justify-center h-full py-10">
<h1 class="text-center text-5xl font-bold gradient-text mb-10">Scalable Oversight for Complex AI</h1>
<h2 class="text-center text-4xl mb-6" style="color: var(--accent-color);">Can Human Feedback Keep Up?</h2>
<h3 class="text-center text-3xl mb-14 animate-pulse highlight-word">Techniques to Align Large Language Models at Scale</h3>
<div class="flex w-full justify-between mt-auto">
<div class="text-left text-xl">Stefano Rossi</div>
<div class="text-right text-xl">2 May, 2025</div>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
</div>
---
# Introduction
<div class="grid grid-cols-2 gap-6">
<div class="panel-info">
<ul>
<li><span class="highlight-word">Alignment at scale</span></li>
<li><span class="highlight-word">Human limitations</span></li>
<li><span class="highlight-word">Model deception</span></li>
</ul>
</div>
<div class="panel-success">
<ul>
<li><span class="highlight-word">Recursive techniques</span></li>
<li><span class="highlight-word">AI-augmented feedback</span></li>
<li><span class="highlight-word">Factored cognition</span></li>
</ul>
</div>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# The Problem with Feedback
<div class="two-column">
<div class="panel-info">
<h2>Why it fails</h2>
<ul>
<li>Too complex for humans to judge outputs correctly</li>
<li><span class="highlight-word">Deception</span> and hallucinations trick reviewers</li>
<li>LLMs <span class="highlight-word">sycophantically agree</span> rather than pursue truth</li>
</ul>
</div>
<div class="panel-warning">
<h2>Why it matters</h2>
<ul>
<li>Most alignment methods rely on human supervision</li>
<li><span class="highlight-word">RLHF breaks</span> at scale and complexity</li>
<li>Feedback noise → <span class="highlight-word">reward hacking</span> and misalignment</li>
</ul>
</div>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# What Is Scalable Oversight?
<div class="panel-info">
<p>Scalable oversight techniques aim to <span class="highlight-word">empower humans</span> to give accurate feedback on complex tasks.</p>
<p>They leverage structured methods, AI assistants, or recursive mechanisms to <span class="highlight-word">extend our cognitive reach</span>.</p>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Techniques Overview
<table class="styled-table hoverable-table">
<thead>
<tr>
<th>Technique</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr><td><span class="highlight-word">Iterated Amplification</span></td><td>Task decomposition + model assistance = scalable evaluation</td></tr>
<tr><td><span class="highlight-word">Recursive Reward Modeling</span></td><td>AI helps humans give better feedback to train better AI</td></tr>
<tr><td><span class="highlight-word">Constitutional AI</span></td><td>Use fixed rules to guide feedback generation</td></tr>
<tr><td><span class="highlight-word">Debate</span></td><td>AIs argue, human judges; surfacing deception through opposition</td></tr>
<tr><td><span class="highlight-word">Weak-to-Strong Generalization</span></td><td>Train powerful models with weaker labels</td></tr>
</tbody>
</table>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Iterated Amplification (IDA)
<div class="panel-info">
<h2>Core Idea</h2>
<ul>
<li>Decompose hard problems</li>
<li>Evaluate sub-steps</li>
<li>Train model to replicate the full pipeline</li>
</ul>
</div>
<div class="panel-success">
<h2>Example</h2>
<ul>
<li>Book summarization</li>
<li>Summarize pages → chapters → full book</li>
<li>Distill into a one-shot summary model</li>
</ul>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Debate
<div class="panel-info">
<p>Two AIs take opposing views on a complex topic and argue it out. A human (or weaker AI) acts as judge.</p>
<ul>
<li>Helps surface <span class="highlight-word">flaws and manipulations</span></li>
<li>Leverages models reasoning capacity</li>
<li>Challenges: truth ≠ persuasion, collusion risk</li>
</ul>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Constitutional AI
<div class="panel-info">
<p>Replace human feedback with <span class="highlight-word">AI critiques</span> guided by human-written principles.</p>
<p>Used in Anthropics Claude models, where rules encode ethical and practical constraints.</p>
<ul>
<li>Scalable via automation</li>
<li>Fewer humans involved, more repeatability</li>
</ul>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Weak-to-Strong Generalization
<div class="panel-info">
<ul>
<li>Train GPT-4 using feedback from GPT-2</li>
<li>GPT-4 learns better than its weak teacher</li>
<li><span class="highlight-word">Generalization beats imitation</span></li>
<li>Bootstrapping + confidence loss = better performance</li>
</ul>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Key Challenges
<div class="two-column">
<div class="panel-warning">
<h2>Failure Risks</h2>
<ul>
<li>Models appear aligned, but arent</li>
<li><span class="highlight-word">Deceptive behavior</span> during training</li>
<li>Generalization failures</li>
</ul>
</div>
<div class="panel-danger">
<h2>Limitations</h2>
<ul>
<li>Factored cognition doesnt scale universally</li>
<li>Feedback may be misinterpreted</li>
<li>Ongoing distributional shift at deployment</li>
</ul>
</div>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
# Conclusion
<div class="panel-success">
<p><strong>Scalable oversight is not a silver bullet.</strong> But its the best shot weve got at aligning complex systems to human values, or at least, approximations of them.</p>
<p>The future of AI safety <span class="highlight-word">depends on teaching AIs to teach themselves</span>, with guardrails we can actually monitor.</p>
</div>
<div class="hud-element circle-small"></div>
<div class="hud-element circle-big"></div>
<div class="hud-lines"></div>
---
<div class="bouncing-box">
<div class="screensaver-icon ai"><i class="fas fa-brain"></i></div>
<h1 class="multicolor-text z-10 relative">Questions?</h1>
</div>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">

12
snippets/external.ts Normal file
View file

@ -0,0 +1,12 @@
/* eslint-disable no-console */
// #region snippet
// Inside ./snippets/external.ts
export function emptyArray<T>(length: number) {
return Array.from<T>({ length })
}
// #endregion snippet
export function sayHello() {
console.log('Hello from snippets/external.ts')
}

284
styles/animations.css Normal file
View file

@ -0,0 +1,284 @@
/* Basic animations */
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 1; }
}
@keyframes slideInRight {
0% { transform: translateX(-20px); opacity: 0; }
100% { transform: translateX(0); opacity: 1; }
}
@keyframes slideInBottom {
0% { transform: translateY(15px); opacity: 0; }
100% { transform: translateY(0); opacity: 1; }
}
@keyframes scaleIn {
0% { transform: scale(0.92); opacity: 0; }
100% { transform: scale(1); opacity: 1; }
}
@keyframes gentle-shimmer {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
@keyframes subtle-pulse {
0% { transform: scale(1); opacity: 0.95; }
50% { transform: scale(1.01); opacity: 1; }
100% { transform: scale(1); opacity: 0.95; }
}
@keyframes borderPulse {
0% { border-color: rgba(99, 102, 241, 0.3); }
50% { border-color: rgba(99, 102, 241, 0.7); }
100% { border-color: rgba(99, 102, 241, 0.3); }
}
/* Slide transitions */
@keyframes slideOutLeft {
0% { transform: translateX(0); opacity: 1; }
100% { transform: translateX(-50px); opacity: 0; }
}
@keyframes slideOutRight {
0% { transform: translateX(0); opacity: 1; }
100% { transform: translateX(50px); opacity: 0; }
}
@keyframes slideInLeft {
0% { transform: translateX(50px); opacity: 0; }
100% { transform: translateX(0); opacity: 1; }
}
@keyframes zoomIn {
0% { transform: scale(0.85); opacity: 0; }
100% { transform: scale(1); opacity: 1; }
}
@keyframes zoomOut {
0% { transform: scale(1); opacity: 1; }
100% { transform: scale(0.85); opacity: 0; }
}
@keyframes rotateIn {
0% { transform: perspective(1000px) rotateY(10deg); opacity: 0; }
100% { transform: perspective(1000px) rotateY(0); opacity: 1; }
}
@keyframes fadeInScale {
0% { transform: scale(0.9); opacity: 0; }
100% { transform: scale(1); opacity: 1; }
}
@keyframes slideUpFade {
0% { transform: translateY(20px); opacity: 0; }
100% { transform: translateY(0); opacity: 1; }
}
/* Modern hover effects */
.card {
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
}
/* Update highlight word animation to avoid orange */
.highlight-word {
background: linear-gradient(90deg, var(--highlight), var(--primary-color));
background-clip: text;
-webkit-background-clip: text;
color: transparent;
background-size: 200% auto;
animation: gentle-shimmer 4s linear infinite;
font-weight: 600;
}
/* Title animations for all slides */
.slidev-layout h1 {
animation: fadeIn 0.8s ease-out forwards, slideInBottom 0.8s ease-out forwards;
}
/* List item animations */
.slidev-layout ul li, .slidev-layout ol li {
opacity: 0;
animation: slideInRight 0.5s ease-out forwards;
}
/* Stagger the animation delay for list items */
.slidev-layout ul li:nth-child(1), .slidev-layout ol li:nth-child(1) { animation-delay: 0.2s; }
.slidev-layout ul li:nth-child(2), .slidev-layout ol li:nth-child(2) { animation-delay: 0.35s; }
.slidev-layout ul li:nth-child(3), .slidev-layout ol li:nth-child(3) { animation-delay: 0.5s; }
.slidev-layout ul li:nth-child(4), .slidev-layout ol li:nth-child(4) { animation-delay: 0.65s; }
.slidev-layout ul li:nth-child(5), .slidev-layout ol li:nth-child(5) { animation-delay: 0.8s; }
.slidev-layout ul li:nth-child(n+6), .slidev-layout ol li:nth-child(n+6) { animation-delay: 0.95s; }
/* Table animation - fixing table appearance */
.slidev-layout table {
animation: fadeIn 0.8s ease-out forwards;
}
.slidev-layout table th {
opacity: 0;
animation: fadeIn 0.7s ease-out forwards;
animation-delay: 0.3s;
}
.slidev-layout table td {
opacity: 0;
animation: fadeIn 0.7s ease-out forwards;
}
/* Staggered rows with shorter delays */
.slidev-layout table tr:nth-child(1) td { animation-delay: 0.4s; }
.slidev-layout table tr:nth-child(2) td { animation-delay: 0.5s; }
.slidev-layout table tr:nth-child(3) td { animation-delay: 0.6s; }
.slidev-layout table tr:nth-child(4) td { animation-delay: 0.7s; }
.slidev-layout table tr:nth-child(5) td { animation-delay: 0.8s; }
.slidev-layout table tr:nth-child(n+6) td { animation-delay: 0.9s; }
/* Code block animations */
.slidev-layout pre {
opacity: 1;
animation: none;
}
/* Blockquote animations for key insights */
.slidev-layout blockquote {
opacity: 0;
animation: fadeIn 1s ease-out forwards, slideInBottom 1s ease-out forwards;
animation-delay: 1s;
}
/* Special intro slide animations */
.slidev-layout.intro h1 {
animation: fadeIn 1.5s ease-out forwards, subtle-pulse 6s ease-in-out infinite 1.5s;
}
/* Section headers */
.slidev-layout h2 {
opacity: 0;
animation: fadeIn 0.8s ease-out forwards, slideInBottom 0.8s ease-out forwards;
animation-delay: 0.2s;
}
/* Add typing effect for code comment lines */
.slidev-layout pre .line-comment {
overflow: hidden;
white-space: nowrap;
animation: typing 1s steps(40, end) forwards;
animation-delay: 1.5s;
}
/* Add hover effects for interactive elements */
.slidev-layout table tr:hover td {
background-color: rgba(8, 38, 82, 0.2);
transition: background-color 0.3s ease;
}
.slidev-layout pre:hover {
animation: borderGlow 2s infinite;
}
/* Card animations */
.card {
animation: fadeIn 0.5s ease-out forwards, scaleIn 0.5s ease-out forwards;
}
/* Stagger card animations */
.two-column .card:nth-child(1) { animation-delay: 0.3s; }
.two-column .card:nth-child(2) { animation-delay: 0.5s; }
.grid-3 .card:nth-child(1) { animation-delay: 0.3s; }
.grid-3 .card:nth-child(2) { animation-delay: 0.4s; }
.grid-3 .card:nth-child(3) { animation-delay: 0.5s; }
.grid-3 .card:nth-child(4) { animation-delay: 0.6s; }
/* Add special animations for key insight blocks */
.key-insight {
position: relative;
overflow: hidden;
animation: fadeIn 1s ease-out forwards, slideInBottom 1s ease-out forwards;
animation-delay: 0.8s;
}
/* Better list animations */
.better-list li {
transition: all 0.3s ease;
}
.better-list li:hover {
transform: translateX(5px);
background: rgba(19, 21, 33, 0.95);
border-left-width: 5px;
}
.animate-pulse {
animation: subtle-pulse 6s ease-in-out infinite;
}
/* Apply slide transitions */
.slidev-vclick-prior {
transition: all 0.5s ease;
}
.slidev-vclick-target {
animation: fadeInScale 0.6s ease forwards;
}
/* Enhanced container animations */
.card {
animation: fadeInScale 0.5s ease-out forwards;
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
}
/* Modern text animations */
.animated-text {
animation: slideUpFade 0.7s ease-out forwards;
opacity: 0;
}
.delay-1 { animation-delay: 0.2s; }
.delay-2 { animation-delay: 0.4s; }
.delay-3 { animation-delay: 0.6s; }
.delay-4 { animation-delay: 0.8s; }
.delay-5 { animation-delay: 1s; }
/* Container entrance animations */
.container-fade-in {
animation: fadeIn 1s ease forwards;
opacity: 0;
}
.container-slide-up {
animation: slideUpFade 0.8s ease-out forwards;
opacity: 0;
}
.container-zoom-in {
animation: zoomIn 0.8s ease-out forwards;
opacity: 0;
}
.container-rotate-in {
animation: rotateIn 0.9s ease-out forwards;
opacity: 0;
}
/* Staggered container content */
.stagger-container > *:nth-child(1) { animation-delay: 0.1s; }
.stagger-container > *:nth-child(2) { animation-delay: 0.3s; }
.stagger-container > *:nth-child(3) { animation-delay: 0.5s; }
.stagger-container > *:nth-child(4) { animation-delay: 0.7s; }
.stagger-container > *:nth-child(5) { animation-delay: 0.9s; }
/* Enhanced list animations */
.enhanced-list li {
animation: slideInRight 0.5s ease-out forwards;
opacity: 0;
}
.enhanced-list li:nth-child(1) { animation-delay: 0.2s; }
.enhanced-list li:nth-child(2) { animation-delay: 0.35s; }
.enhanced-list li:nth-child(3) { animation-delay: 0.5s; }
.enhanced-list li:nth-child(4) { animation-delay: 0.65s; }
.enhanced-list li:nth-child(5) { animation-delay: 0.8s; }

100
styles/background.css Normal file
View file

@ -0,0 +1,100 @@
/* === NEBULA BACKGROUND === */
.slidev-layout {
position: relative;
overflow: hidden;
background: radial-gradient(circle at 30% 30%, #1b2735, #090a0f);
}
.slidev-layout::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: conic-gradient(
from 180deg,
#800020,
#0066cc,
#b22222,
#0f0f1a,
#800020
);
animation: nebula-shift 60s linear infinite;
opacity: 0.07;
z-index: 0;
pointer-events: none;
}
@keyframes nebula-shift {
0% { transform: rotate(0deg) scale(1.2); }
100% { transform: rotate(360deg) scale(1.2); }
}
/* === HUD CIRCLES === */
.hud-element {
position: absolute;
border: 1px solid rgba(0, 255, 255, 0.08);
border-radius: 50%;
animation: pulse-ring 6s ease-in-out infinite;
pointer-events: none;
z-index: 0;
}
.hud-element.circle-small {
width: 80px;
height: 80px;
top: 20%;
left: 10%;
}
.hud-element.circle-big {
width: 180px;
height: 180px;
top: 60%;
left: 75%;
animation-delay: 2s;
}
@keyframes pulse-ring {
0%, 100% { transform: scale(1); opacity: 0.06; }
50% { transform: scale(1.2); opacity: 0.12; }
}
/* === HUD SCANNING LINES === */
.hud-lines::before,
.hud-lines::after {
content: '';
position: absolute;
height: 2px;
width: 100vw;
background: linear-gradient(
to right,
rgba(0, 102, 204, 0) 0%,
rgba(0, 102, 204, 0.12) 50%,
rgba(0, 102, 204, 0) 100%
);
animation: scanline 20s linear infinite;
pointer-events: none;
z-index: 0;
}
.hud-lines::before {
top: 25%;
}
.hud-lines::after {
top: 75%;
animation-delay: 10s;
}
@keyframes scanline {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
/* === SAFEGUARDING MAIN CONTENT === */
.slidev-layout > * {
position: relative;
z-index: 1;
}

25
styles/base.css Normal file
View file

@ -0,0 +1,25 @@
:root {
--primary-color: #800020;
--secondary-color: #B22222;
--accent-color: #A30000;
--text-color: #f0f2f5;
--background-dark: #0a0c14;
--highlight: #0066CC;
}
body {
font-family: 'Inter', sans-serif;
background-color: var(--background-dark);
color: var(--text-color);
}
.slidev-layout {
padding: 1.5rem;
background: var(--background-dark);
}
h1, h2 {
color: var(--highlight);
}

23
styles/icons-bouncing.css Normal file
View file

@ -0,0 +1,23 @@
.screensaver-icon {
position: absolute;
font-size: 3.8rem;
opacity: 0.25;
animation: floatIcon linear infinite;
pointer-events: none;
z-index: 0;
}
.screensaver-icon.ai { color: #66ccff; animation-duration: 26s; top: 10%; left: 20%; }
.screensaver-icon.ethics { color: #ff6666; animation-duration: 24s; top: 60%; left: 75%; }
.screensaver-icon.safety { color: #99ff99; animation-duration: 28s; top: 30%; left: 60%; }
.screensaver-icon.feedback { color: #ffcc66; animation-duration: 25s; top: 70%; left: 25%; }
.screensaver-icon.model { color: #cc99ff; animation-duration: 23s; top: 45%; left: 45%; }
@keyframes floatIcon {
0% { transform: translate(0, 0); }
20% { transform: translate(120px, 100px); }
40% { transform: translate(-80px, 140px); }
60% { transform: translate(150px, -110px); }
80% { transform: translate(-100px, -80px); }
100% { transform: translate(0, 0); }
}

6
styles/index.ts Normal file
View file

@ -0,0 +1,6 @@
import './animations.css';
import './background.css';
import './base.css';
import './icons-bouncing.css';
import './panels.css';

44
styles/panels.css Normal file
View file

@ -0,0 +1,44 @@
.panel-info, .panel-success, .panel-warning, .panel-danger {
padding: 1.2rem;
border-left: 6px solid;
margin-bottom: 1.5rem;
border-radius: 6px;
background-color: rgba(255, 255, 255, 0.03);
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.panel-info {
border-color: #3B82F6;
}
.panel-success {
border-color: #10B981;
}
.panel-warning {
border-color: #F59E0B;
}
.panel-danger {
border-color: #EF4444;
}
.styled-table {
width: 100%;
border-collapse: collapse;
margin: 1rem 0;
font-size: 1rem;
border-radius: 6px;
overflow: hidden;
box-shadow: 0 0 10px rgba(0,0,0,0.15);
}
.styled-table thead tr {
background-color: #1f2937;
color: #ffffff;
text-align: left;
}
.styled-table th,
.styled-table td {
padding: 0.75rem 1rem;
border-bottom: 1px solid #374151;
}
.styled-table tbody tr:hover {
background-color: rgba(255, 255, 255, 0.05);
}

7
vercel.json Normal file
View file

@ -0,0 +1,7 @@
{
"rewrites": [
{ "source": "/(.*)", "destination": "/index.html" }
],
"buildCommand": "npm run build",
"outputDirectory": "dist"
}