Initial commit
This commit is contained in:
1
.env.production
Normal file
1
.env.production
Normal file
@@ -0,0 +1 @@
|
||||
DISABLE_ESLINT_PLUGIN=true
|
||||
62
.gitea/workflows/build.yml
Normal file
62
.gitea/workflows/build.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: 'Branch to build'
|
||||
required: true
|
||||
default: 'main'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
steps:
|
||||
- name: Checkout branch
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ gitea.event.inputs.branch }}
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 24
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm install --no-audit --silent 2>&1 | tee install.log
|
||||
env:
|
||||
NODE_OPTIONS: '--max-old-space-size=4096'
|
||||
|
||||
- name: Build (react-scripts build)
|
||||
env:
|
||||
CI: 'false'
|
||||
NODE_OPTIONS: '--max-old-space-size=4096'
|
||||
run: |
|
||||
set -euo pipefail
|
||||
npm run build 2>&1 | tee build.log
|
||||
timeout-minutes: 5
|
||||
|
||||
- name: Verify build folder exists
|
||||
run: test -d build || (echo "No build folder. Check build logs above."; exit 1)
|
||||
|
||||
- name: Upload logs on failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: build-logs
|
||||
path: |
|
||||
install.log
|
||||
build.log
|
||||
npm-debug.log*
|
||||
if-no-files-found: ignore
|
||||
|
||||
- name: Build completed
|
||||
if: success()
|
||||
run: echo "Build completed successfully"
|
||||
41
package.json
Normal file
41
package.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "claude-security-check",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-scripts": "^5.0.1",
|
||||
"framer-motion": "^11.0.0",
|
||||
"lucide-react": "^0.400.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tailwindcss": "^3.4.0",
|
||||
"postcss": "^8.4.0",
|
||||
"autoprefixer": "^10.4.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
6
postcss.config.js
Normal file
6
postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
||||
1
public/images/favicon-1768578230024.ico
Normal file
1
public/images/favicon-1768578230024.ico
Normal file
File diff suppressed because one or more lines are too long
1232
public/index.html
Normal file
1232
public/index.html
Normal file
File diff suppressed because it is too large
Load Diff
12
src/App.js
Normal file
12
src/App.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import React from 'react';
|
||||
import SecurityCheck from './components/SecurityCheck';
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<div className="App">
|
||||
<SecurityCheck />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
145
src/components/SecurityCheck.js
Normal file
145
src/components/SecurityCheck.js
Normal file
@@ -0,0 +1,145 @@
|
||||
import React from 'react';
|
||||
import { motion, useReducedMotion } from 'framer-motion';
|
||||
import { Zap } from 'lucide-react';
|
||||
|
||||
const fadeUpPreset = (delay = 0, duration = 0.8) => ({
|
||||
initial: { opacity: 0, y: 20 },
|
||||
animate: { opacity: 1, y: 0 },
|
||||
transition: { delay, duration, ease: 'easeOut' }
|
||||
});
|
||||
|
||||
function SecurityCheck() {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
|
||||
if (shouldReduceMotion) {
|
||||
return (
|
||||
<div className="min-h-screen bg-claude-light-gray flex flex-col items-center justify-center px-4">
|
||||
<div className="security-card text-center">
|
||||
<div className="claude-logo justify-center mb-8">
|
||||
<Zap className="w-6 h-6 text-claude-orange" />
|
||||
<span className="text-claude-text">claude.ai</span>
|
||||
</div>
|
||||
|
||||
<h1 className="text-lg font-medium text-claude-text mb-6">
|
||||
Verify you are human by completing the action below.
|
||||
</h1>
|
||||
|
||||
<div className="captcha-container mb-6">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="human-verify"
|
||||
className="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2"
|
||||
/>
|
||||
<label htmlFor="human-verify" className="text-sm text-claude-text">
|
||||
Verify you are human
|
||||
</label>
|
||||
<div className="ml-auto">
|
||||
<img
|
||||
src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBmaWxsPSIjRkY2NjAwIi8+Cjx0ZXh0IHg9IjIwIiB5PSIyNSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBmaWxsPSJ3aGl0ZSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Q0Y8L3RleHQ+Cjwvc3ZnPgo="
|
||||
alt="Cloudflare"
|
||||
className="w-8 h-8"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="text-sm text-claude-gray mb-4">
|
||||
<a href="#" className="text-blue-600 hover:underline">Privacy</a>
|
||||
<span className="mx-1">•</span>
|
||||
<a href="#" className="text-blue-600 hover:underline">Terms</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="mt-8 text-center">
|
||||
<p className="text-claude-text mb-4">
|
||||
claude.ai needs to review the security of your connection before proceeding.
|
||||
</p>
|
||||
|
||||
<div className="text-xs text-claude-gray">
|
||||
<p>Ray ID: 9beebae23c38dc3</p>
|
||||
<p>
|
||||
Performance & security by{' '}
|
||||
<a href="#" className="text-cloudflare-blue hover:underline">
|
||||
Cloudflare
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-claude-light-gray flex flex-col items-center justify-center px-4">
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.1, 0.6)}
|
||||
className="security-card text-center"
|
||||
>
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.2, 0.5)}
|
||||
className="claude-logo justify-center mb-8"
|
||||
>
|
||||
<Zap className="w-6 h-6 text-claude-orange" />
|
||||
<span className="text-claude-text">claude.ai</span>
|
||||
</motion.div>
|
||||
|
||||
<motion.h1
|
||||
{...fadeUpPreset(0.3, 0.5)}
|
||||
className="text-lg font-medium text-claude-text mb-6"
|
||||
>
|
||||
Verify you are human by completing the action below.
|
||||
</motion.h1>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.4, 0.5)}
|
||||
className="captcha-container mb-6"
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
id="human-verify"
|
||||
className="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2"
|
||||
/>
|
||||
<label htmlFor="human-verify" className="text-sm text-claude-text">
|
||||
Verify you are human
|
||||
</label>
|
||||
<div className="ml-auto">
|
||||
<img
|
||||
src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiBmaWxsPSIjRkY2NjAwIi8+Cjx0ZXh0IHg9IjIwIiB5PSIyNSIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBmaWxsPSJ3aGl0ZSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Q0Y8L3RleHQ+Cjwvc3ZnPgo="
|
||||
alt="Cloudflare"
|
||||
className="w-8 h-8"
|
||||
/>
|
||||
</div>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.5, 0.5)}
|
||||
className="text-sm text-claude-gray mb-4"
|
||||
>
|
||||
<a href="#" className="text-blue-600 hover:underline">Privacy</a>
|
||||
<span className="mx-1">•</span>
|
||||
<a href="#" className="text-blue-600 hover:underline">Terms</a>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
{...fadeUpPreset(0.6, 0.5)}
|
||||
className="mt-8 text-center"
|
||||
>
|
||||
<p className="text-claude-text mb-4">
|
||||
claude.ai needs to review the security of your connection before proceeding.
|
||||
</p>
|
||||
|
||||
<div className="text-xs text-claude-gray">
|
||||
<p>Ray ID: 9beebae23c38dc3</p>
|
||||
<p>
|
||||
Performance & security by{' '}
|
||||
<a href="#" className="text-cloudflare-blue hover:underline">
|
||||
Cloudflare
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default SecurityCheck;
|
||||
31
src/index.css
Normal file
31
src/index.css
Normal file
@@ -0,0 +1,31 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
html {
|
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #F7FAFC;
|
||||
color: #2D3748;
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
@layer components {
|
||||
.claude-logo {
|
||||
@apply flex items-center gap-2 text-xl font-medium;
|
||||
}
|
||||
|
||||
.security-card {
|
||||
@apply bg-white rounded-lg shadow-sm border border-gray-200 p-8 max-w-md mx-auto;
|
||||
}
|
||||
|
||||
.captcha-container {
|
||||
@apply border border-gray-300 rounded p-4 bg-gray-50 flex items-center gap-3;
|
||||
}
|
||||
}
|
||||
13
src/index.js
Normal file
13
src/index.js
Normal file
@@ -0,0 +1,13 @@
|
||||
import React from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
|
||||
const container = document.getElementById('root');
|
||||
const root = createRoot(container);
|
||||
|
||||
root.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
);
|
||||
22
tailwind.config.js
Normal file
22
tailwind.config.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./src/**/*.{js,jsx,ts,tsx}",
|
||||
"./public/index.html"
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'claude-orange': '#E97441',
|
||||
'claude-text': '#2D3748',
|
||||
'claude-gray': '#718096',
|
||||
'claude-light-gray': '#F7FAFC',
|
||||
'cloudflare-blue': '#0066CC'
|
||||
},
|
||||
fontFamily: {
|
||||
'sans': ['system-ui', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'sans-serif']
|
||||
}
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
||||
5
vercel.json
Normal file
5
vercel.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"installCommand": "npm install",
|
||||
"buildCommand": "CI=false npm run build",
|
||||
"outputDirectory": "build"
|
||||
}
|
||||
Reference in New Issue
Block a user