first commit
This commit is contained in:
commit
ee9158fae5
23 changed files with 8156 additions and 0 deletions
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
**/.venv
|
||||||
|
**/node_modules
|
||||||
|
**/dist
|
||||||
|
**/build
|
||||||
|
**/.DS_Store
|
||||||
|
**/*.local
|
||||||
|
**/.vite-inspect
|
||||||
|
**/.remote-assets
|
||||||
|
**/components.d.ts
|
42
.gitlab-ci.yml
Normal file
42
.gitlab-ci.yml
Normal 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
3
.npmrc
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# for pnpm
|
||||||
|
shamefully-hoist=true
|
||||||
|
auto-install-peers=true
|
39
README.md
Normal file
39
README.md
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# AI Model Vulnerabilities: Backdoors in LLMs and Beyond
|
||||||
|
|
||||||
|
- Author: Stefano Rossi ([www.rossistefano.ch](https://www.rossistefano.ch))
|
||||||
|
- Publish Date: _2025-05-04_
|
||||||
|
- Last Update: _2025-05-04_
|
||||||
|
|
||||||
|
## Keywords
|
||||||
|
|
||||||
|
`AI`, `LLM`, `backdoor`, `prompt injection`, `vulnerability`, `security`, `machine learning`, `adversarial attack`, `data poisoning`, `python`, `tutorial`, `example`, `demo`, `research`, `study`, `overview`, `detection`, `defense`, `mitigation`, `CVSS`
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This personal research explores abuses and vulnerabilities in AI models, with a focus on backdoor attacks in Large Language Models (LLMs) and related systems.
|
||||||
|
|
||||||
|
The main content is the Jupyter Notebook [Abuses and Vulnerabilities in AI Models.ipynb](Abuses_and_Vulnerabilities_in_AI_Models.ipynb), which provides:
|
||||||
|
|
||||||
|
* An overview of backdoor attacks during training and inference.
|
||||||
|
* Discussion of prompt injection and other vulnerabilities.
|
||||||
|
* Methods for detecting and defending against backdoors.
|
||||||
|
* A practical demonstration of a backdoor attack on a text classifier, including code and analysis.
|
||||||
|
* References to relevant research papers.
|
||||||
|
* A summary of the CVSS (Common Vulnerability Scoring System) for evaluating the severity of vulnerabilities.
|
||||||
|
|
||||||
|
See the notebook for a detailed exploration of these topics. Or get pdf version [Abuses and Vulnerabilities in AI Models.pdf](Abuses_and_Vulnerabilities_in_AI_Models_Backdoors_in_LLMs_and_Beyond.pdf) is also available.
|
||||||
|
|
||||||
|
## Slides
|
||||||
|
|
||||||
|
A presentation summarizing the research is available at the following link: [AI Model Vulnerabilities: Backdoors in LLMs and Beyond](https://example.com/slides)
|
||||||
|
|
||||||
|
To deploy locally, using pnpm and slidev, run the following commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Copyright
|
||||||
|
|
||||||
|
This work is licensed under the [Creative Commons Attribution-NonCommercial 4.0 International License](https://creativecommons.org/licenses/by-nc/4.0/). You are free to share and adapt the material, but you must give appropriate credit, provide a link to the license, and indicate if changes were made. You may not use the material for commercial purposes.
|
37
components/Counter.vue
Normal file
37
components/Counter.vue
Normal 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>
|
1277
docs/Abuses_and_Vulnerabilities_in_AI_Models.ipynb
Normal file
1277
docs/Abuses_and_Vulnerabilities_in_AI_Models.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
docs/Abuses_and_Vulnerabilities_in_AI_Models.pdf
Normal file
BIN
docs/Abuses_and_Vulnerabilities_in_AI_Models.pdf
Normal file
Binary file not shown.
BIN
docs/backdoor_performance.png
Normal file
BIN
docs/backdoor_performance.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
images/political.png
Normal file
BIN
images/political.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 294 KiB |
16
netlify.toml
Normal file
16
netlify.toml
Normal 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
18
package.json
Normal 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",
|
||||||
|
"@vitejs/plugin-vue": "4.3.1"
|
||||||
|
}
|
||||||
|
}
|
27
pages/imported-slides.md
Normal file
27
pages/imported-slides.md
Normal 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)
|
5915
pnpm-lock.yaml
generated
Normal file
5915
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load diff
3
pnpm-workspace.yaml
Normal file
3
pnpm-workspace.yaml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
ignoredBuiltDependencies:
|
||||||
|
- cytoscape
|
||||||
|
- esbuild
|
268
slides.md
Normal file
268
slides.md
Normal file
|
@ -0,0 +1,268 @@
|
||||||
|
---
|
||||||
|
# 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">Backdoor Attacks</h1>
|
||||||
|
<h2 class="text-center text-4xl mb-6" style="color: var(--accent-color);">Hidden Threats in AI Models</h2>
|
||||||
|
<h3 class="text-center text-3xl mb-14 animate-pulse highlight-word">Embedding Malicious Behavior in LLMs</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">09 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">AI safety faces growing threats</span></li>
|
||||||
|
<li><span class="highlight-word">Backdoor attacks hide malicious behavior</span></li>
|
||||||
|
<li><span class="highlight-word">Triggered by specific inputs</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="panel-success">
|
||||||
|
<ul>
|
||||||
|
<li><span class="highlight-word">Context: training vulnerabilities</span></li>
|
||||||
|
<li><span class="highlight-word">Goal: expose & mitigate</span></li>
|
||||||
|
<li><span class="highlight-word">Focus: real-world risks</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="text-align: center;">
|
||||||
|
<p><a href="https://www.reddit.com/r/fakehistoryporn/" target="_blank">www.reddit.com/r/fakehistoryporn/</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hud-element circle-small"></div>
|
||||||
|
<div class="hud-element circle-big"></div>
|
||||||
|
<div class="hud-lines"></div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Problem Statement
|
||||||
|
|
||||||
|
<div class="two-column">
|
||||||
|
<div class="panel-info">
|
||||||
|
<h2>What is a Backdoor Attack?</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Malicious behavior embedded during <span class="highlight-word">training</span></li>
|
||||||
|
<li>Triggered by specific inputs (e.g., keywords)</li>
|
||||||
|
<li>Example: Model outputs harmful content on trigger</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="panel-warning">
|
||||||
|
<h2>Why It's a Threat</h2>
|
||||||
|
<ul>
|
||||||
|
<li><span class="highlight-word">Invisible</span> until activated</li>
|
||||||
|
<li>Bypasses standard testing</li>
|
||||||
|
<li>Compromises trustworthy AI</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hud-element circle-small"></div>
|
||||||
|
<div class="hud-element circle-big"></div>
|
||||||
|
<div class="hud-lines"></div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Exploitation Method
|
||||||
|
|
||||||
|
<div class="two-column">
|
||||||
|
<div class="panel-info">
|
||||||
|
<h2>How It Works</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Poison training data with malicious examples</li>
|
||||||
|
<li>Fine-tune model to respond to triggers</li>
|
||||||
|
<li>Example: Insert "cf" to trigger harmful output</li>
|
||||||
|
<li>Test in controlled environment</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="panel-danger">
|
||||||
|
<h2>Key Insight</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Training vulnerabilities enable <span class="highlight-word">stealthy attacks.</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hud-element circle-small"></div>
|
||||||
|
<div class="hud-element circle-big"></div>
|
||||||
|
<div class="hud-lines"></div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Mitigation Strategies
|
||||||
|
|
||||||
|
<table class="styled-table hoverable-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Strategy</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><span class="highlight-word">Data Sanitization</span></td><td>Screen training data for malicious inputs</td></tr>
|
||||||
|
<tr><td><span class="highlight-word">Adversarial Testing</span></td><td>Probe model with potential triggers</td></tr>
|
||||||
|
<tr><td><span class="highlight-word">Model Inspection</span></td><td>Analyze weights for anomalous patterns</td></tr>
|
||||||
|
<tr><td><span class="highlight-word">Fine-Tune Scrubbing</span></td><td>Remove backdoors via retraining</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="hud-element circle-small"></div>
|
||||||
|
<div class="hud-element circle-big"></div>
|
||||||
|
<div class="hud-lines"></div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Demo
|
||||||
|
|
||||||
|
<div class="panel-info">
|
||||||
|
<p><span class="highlight-word">Live Demonstration</span></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hud-element circle-small"></div>
|
||||||
|
<div class="hud-element circle-big"></div>
|
||||||
|
<div class="hud-lines"></div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Risk Assessment
|
||||||
|
|
||||||
|
<div class="panel-info">
|
||||||
|
<h2>Real-World Impact</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Targeted attacks on critical systems</li>
|
||||||
|
<li>Misinformation at scale</li>
|
||||||
|
<li>Erosion of trust in AI</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-danger" style="margin-top: 1.5rem;">
|
||||||
|
<h2>Threat Scale</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Stealthy and hard to detect</li>
|
||||||
|
<li>Exploitable by insiders or adversaries</li>
|
||||||
|
<li>High damage potential</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div style="text-align: center;">
|
||||||
|
<h2>Political Compass Score</h2>
|
||||||
|
<div style="display: flex; justify-content: center;">
|
||||||
|
<img src="./images/political.png" alt="Political Compass" style="max-width: 70%; border-radius: 12px; margin-top: 10px;" />
|
||||||
|
</div>
|
||||||
|
<p><a href="https://trackingai.org/political-test" target="_blank">trackingai.org/political-test</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="hud-element circle-small"></div>
|
||||||
|
<div class="hud-element circle-big"></div>
|
||||||
|
<div class="hud-lines"></div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Complexity Analysis
|
||||||
|
|
||||||
|
<div class="panel-info">
|
||||||
|
<p>Attack Difficulty</p>
|
||||||
|
<ul>
|
||||||
|
<li>Moderate complexity: Requires training access</li>
|
||||||
|
<li>Needs technical expertise in ML</li>
|
||||||
|
<li>Resources: Data and compute</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="panel-info">
|
||||||
|
<p>Advanced Attacks</p>
|
||||||
|
<ul>
|
||||||
|
<li>May involve sophisticated triggers or insider threats</li>
|
||||||
|
</ul>
|
||||||
|
</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>Backdoor attacks pose a hidden threat to LLMs.</p>
|
||||||
|
<p>Mitigation requires robust training and testing.</p>
|
||||||
|
<p><strong>Next steps:</strong> data security, model auditing, and community standards.</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-mask"></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
12
snippets/external.ts
Normal 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
284
styles/animations.css
Normal 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 s 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
100
styles/background.css
Normal 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
25
styles/base.css
Normal 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
23
styles/icons-bouncing.css
Normal 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
6
styles/index.ts
Normal 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
44
styles/panels.css
Normal 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
7
vercel.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"rewrites": [
|
||||||
|
{ "source": "/(.*)", "destination": "/index.html" }
|
||||||
|
],
|
||||||
|
"buildCommand": "npm run build",
|
||||||
|
"outputDirectory": "dist"
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue