gusfischer commited on
Commit
e6c70f5
·
verified ·
1 Parent(s): e55bbc1

Upload all files

Browse files
sb1-adugtr/.bolt/config.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {
2
+ "template": "bolt-vite-react-ts"
3
+ }
sb1-adugtr/.bolt/prompt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ For all designs I ask you to make, have them be beautiful, not cookie cutter. Make webpages that are fully featured and worthy for production.
2
+
3
+ By default, this template supports JSX syntax with Tailwind CSS classes, React hooks, and Lucide React for icons. Do not install other packages for UI themes, icons, etc unless absolutely necessary or I request them.
4
+
5
+ Use icons from lucide-react for logos.
6
+
7
+ Use stock photos from unsplash where appropriate, only valid URLs you know exist. Do not download the images, only link to them in image tags.
8
+
sb1-adugtr/.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
sb1-adugtr/eslint.config.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import js from '@eslint/js';
2
+ import globals from 'globals';
3
+ import reactHooks from 'eslint-plugin-react-hooks';
4
+ import reactRefresh from 'eslint-plugin-react-refresh';
5
+ import tseslint from 'typescript-eslint';
6
+
7
+ export default tseslint.config(
8
+ { ignores: ['dist'] },
9
+ {
10
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
11
+ files: ['**/*.{ts,tsx}'],
12
+ languageOptions: {
13
+ ecmaVersion: 2020,
14
+ globals: globals.browser,
15
+ },
16
+ plugins: {
17
+ 'react-hooks': reactHooks,
18
+ 'react-refresh': reactRefresh,
19
+ },
20
+ rules: {
21
+ ...reactHooks.configs.recommended.rules,
22
+ 'react-refresh/only-export-components': [
23
+ 'warn',
24
+ { allowConstantExport: true },
25
+ ],
26
+ },
27
+ }
28
+ );
sb1-adugtr/index.html ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Vite + React + TS</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
sb1-adugtr/package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
sb1-adugtr/package.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "vite-react-typescript-starter",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "lint": "eslint .",
10
+ "preview": "vite preview"
11
+ },
12
+ "dependencies": {
13
+ "lucide-react": "^0.344.0",
14
+ "react": "^18.3.1",
15
+ "react-dom": "^18.3.1"
16
+ },
17
+ "devDependencies": {
18
+ "@eslint/js": "^9.9.1",
19
+ "@types/react": "^18.3.5",
20
+ "@types/react-dom": "^18.3.0",
21
+ "@vitejs/plugin-react": "^4.3.1",
22
+ "autoprefixer": "^10.4.18",
23
+ "eslint": "^9.9.1",
24
+ "eslint-plugin-react-hooks": "^5.1.0-rc.0",
25
+ "eslint-plugin-react-refresh": "^0.4.11",
26
+ "globals": "^15.9.0",
27
+ "postcss": "^8.4.35",
28
+ "tailwindcss": "^3.4.1",
29
+ "typescript": "^5.5.3",
30
+ "typescript-eslint": "^8.3.0",
31
+ "vite": "^5.4.2"
32
+ }
33
+ }
sb1-adugtr/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
sb1-adugtr/public/labmem-logo.png ADDED
sb1-adugtr/src/App.tsx ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useEffect, useState } from 'react';
2
+ import { DeviceCard } from './components/DeviceCard';
3
+ import { devices } from './data/devices';
4
+ import { RefreshCw } from 'lucide-react';
5
+
6
+ function App() {
7
+ const [currentDevice, setCurrentDevice] = useState(devices[0]);
8
+ const [isRefreshing, setIsRefreshing] = useState(false);
9
+
10
+ const getRandomDevice = () => {
11
+ const randomIndex = Math.floor(Math.random() * devices.length);
12
+ return devices[randomIndex];
13
+ };
14
+
15
+ const handleRefresh = () => {
16
+ setIsRefreshing(true);
17
+ setTimeout(() => {
18
+ setCurrentDevice(getRandomDevice());
19
+ setIsRefreshing(false);
20
+ }, 500);
21
+ };
22
+
23
+ useEffect(() => {
24
+ setCurrentDevice(getRandomDevice());
25
+ }, []);
26
+
27
+ return (
28
+ <div className="min-h-screen bg-gradient-to-br from-purple-50 via-white to-pink-50">
29
+ <div className="container mx-auto px-4 py-16">
30
+ <div className="flex justify-end mb-8">
31
+ <button
32
+ onClick={handleRefresh}
33
+ className="flex items-center gap-2 px-4 py-2 bg-white rounded-lg shadow-md hover:shadow-lg transition-all text-purple-600"
34
+ >
35
+ <RefreshCw className={`w-5 h-5 ${isRefreshing ? 'animate-spin' : ''}`} />
36
+ Generate New Device
37
+ </button>
38
+ </div>
39
+
40
+ <DeviceCard device={currentDevice} />
41
+
42
+ <footer className="mt-16 text-center text-gray-500 text-sm">
43
+ Retro-Futuristic Media Device Generator © {new Date().getFullYear()}
44
+ </footer>
45
+ </div>
46
+ </div>
47
+ );
48
+ }
49
+
50
+ export default App;
sb1-adugtr/src/components/DeviceCard.tsx ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { type Device } from '../data/devices';
3
+ import { Disc, Radio, Zap, ExternalLink, Instagram } from 'lucide-react';
4
+
5
+ interface DeviceCardProps {
6
+ device: Device;
7
+ }
8
+
9
+ export function DeviceCard({ device }: DeviceCardProps) {
10
+ const getEncodedPrompt = () => encodeURIComponent(device.prompt);
11
+
12
+ return (
13
+ <div className="max-w-4xl mx-auto bg-white/80 backdrop-blur-sm rounded-2xl shadow-xl p-8 transform transition-all hover:scale-[1.02]">
14
+ <div className="flex items-center gap-4 mb-6">
15
+ <div className="p-3 bg-purple-100 rounded-full">
16
+ <Disc className="w-8 h-8 text-purple-600" />
17
+ </div>
18
+ <h1 className="text-4xl font-bold bg-gradient-to-r from-purple-600 to-pink-600 bg-clip-text text-transparent">
19
+ {device.name}
20
+ </h1>
21
+ </div>
22
+
23
+ <div className="grid md:grid-cols-2 gap-8">
24
+ <div className="space-y-6">
25
+ <div className="space-y-4">
26
+ <div className="flex items-center gap-2">
27
+ <Zap className="w-5 h-5 text-purple-600" />
28
+ <h2 className="text-xl font-semibold text-gray-800">AI Image Prompt</h2>
29
+ </div>
30
+ <p className="text-gray-600 leading-relaxed">
31
+ {device.prompt}
32
+ </p>
33
+ </div>
34
+
35
+ <div className="space-y-4">
36
+ <div className="flex items-center gap-2">
37
+ <Radio className="w-5 h-5 text-purple-600" />
38
+ <h2 className="text-xl font-semibold text-gray-800">Influenced By</h2>
39
+ </div>
40
+ <div className="flex flex-wrap gap-2">
41
+ {device.influences.map((influence) => (
42
+ <span
43
+ key={influence}
44
+ className="px-3 py-1 bg-purple-100 text-purple-600 rounded-full text-sm"
45
+ >
46
+ {influence}
47
+ </span>
48
+ ))}
49
+ </div>
50
+ </div>
51
+
52
+ <div className="space-y-4">
53
+ <h2 className="text-xl font-semibold text-gray-800">Try this prompt on:</h2>
54
+ <div className="flex gap-3">
55
+ <a
56
+ href={`https://www.bing.com/images/create?q=${getEncodedPrompt()}`}
57
+ target="_blank"
58
+ rel="noopener noreferrer"
59
+ className="flex items-center gap-2 px-4 py-2 bg-[#00a4ef] text-white rounded-lg hover:bg-[#0078d4] transition-colors"
60
+ >
61
+ Bing Image Creator
62
+ <ExternalLink className="w-4 h-4" />
63
+ </a>
64
+ <a
65
+ href={`https://ideogram.ai/t/search?q=${getEncodedPrompt()}`}
66
+ target="_blank"
67
+ rel="noopener noreferrer"
68
+ className="flex items-center gap-2 px-4 py-2 bg-[#ff4545] text-white rounded-lg hover:bg-[#e03c3c] transition-colors"
69
+ >
70
+ Ideogram
71
+ <ExternalLink className="w-4 h-4" />
72
+ </a>
73
+ <a
74
+ href={`https://leonardo.ai`}
75
+ target="_blank"
76
+ rel="noopener noreferrer"
77
+ className="flex items-center gap-2 px-4 py-2 bg-[#000000] text-white rounded-lg hover:bg-gray-800 transition-colors"
78
+ >
79
+ Leonardo.AI
80
+ <ExternalLink className="w-4 h-4" />
81
+ </a>
82
+ </div>
83
+ </div>
84
+ </div>
85
+
86
+ <div className="space-y-4">
87
+ <div className="flex flex-col items-center justify-center p-8 bg-black rounded-xl">
88
+ <img
89
+ src="/labmem-logo.png"
90
+ alt="LABMEM Logo"
91
+ className="w-48 h-auto"
92
+ />
93
+ <div className="flex items-center gap-2 mt-4 text-white">
94
+ <Instagram className="w-4 h-4" />
95
+ <p className="text-sm">This is a @lab.mem project, follow us on instagram</p>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </div>
101
+ );
102
+ }
sb1-adugtr/src/data/devices.ts ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export interface Device {
2
+ name: string;
3
+ prompt: string;
4
+ influences: string[];
5
+ image: string;
6
+ }
7
+
8
+ export const devices: Device[] = [
9
+ {
10
+ name: "HoloVinyl Player",
11
+ prompt: "A transparent floating turntable that projects holographic album artwork while playing vinyl records, with floating neon controls and anti-gravity record storage system, retro-futuristic design with chrome accents",
12
+ influences: ["Traditional Turntable", "LaserDisc Player", "Sony Walkman"],
13
+ image: "https://images.unsplash.com/photo-1461360370896-922624d12aa1?auto=format&fit=crop&q=80&w=2874"
14
+ },
15
+ {
16
+ name: "MemoryTape Echo",
17
+ prompt: "A cassette player that can extract and visualize memories stored in special crystal tapes, featuring bio-luminescent indicators and vapor-wave aesthetic with pearl white casing",
18
+ influences: ["Cassette Walkman", "MiniDisc Player", "Polaroid Camera"],
19
+ image: "https://images.unsplash.com/photo-1594022766835-58fae16e23c8?auto=format&fit=crop&q=80&w=2960"
20
+ },
21
+ {
22
+ name: "Neural Rhythm Box",
23
+ prompt: "A brain-wave activated music device with floating crystalline spheres that pulse with light in rhythm, featuring organic curves and bioluminescent touch panels",
24
+ influences: ["iPod", "Transistor Radio", "Boombox"],
25
+ image: "https://images.unsplash.com/photo-1626128665085-483747621778?auto=format&fit=crop&q=80&w=2940"
26
+ },
27
+ {
28
+ name: "Quantum Soundscape Generator",
29
+ prompt: "A device that creates music by sampling sounds from parallel universes, with retrofuturistic vacuum tubes, geometric patterns, and a time-window display",
30
+ influences: ["Reel-to-Reel Player", "Synthesizer", "Radio Receiver"],
31
+ image: "https://images.unsplash.com/photo-1558483819-2781de708c72?auto=format&fit=crop&q=80&w=2940"
32
+ },
33
+ {
34
+ name: "AetherWave Transmitter",
35
+ prompt: "A steampunk-inspired device that broadcasts music through aether waves, featuring brass dials, crystal resonators, and mechanical butterfly animations",
36
+ influences: ["Gramophone", "Telegraph", "Tube Radio"],
37
+ image: "https://images.unsplash.com/photo-1511379938547-c1f69419868d?auto=format&fit=crop&q=80&w=2940"
38
+ }
39
+ ];
sb1-adugtr/src/index.css ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
sb1-adugtr/src/main.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { StrictMode } from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import App from './App.tsx';
4
+ import './index.css';
5
+
6
+ createRoot(document.getElementById('root')!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>
10
+ );
sb1-adugtr/src/vite-env.d.ts ADDED
@@ -0,0 +1 @@
 
 
1
+ /// <reference types="vite/client" />
sb1-adugtr/tailwind.config.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ export default {
3
+ content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
4
+ theme: {
5
+ extend: {},
6
+ },
7
+ plugins: [],
8
+ };
sb1-adugtr/tsconfig.app.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "isolatedModules": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+ "jsx": "react-jsx",
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "noFallthroughCasesInSwitch": true
22
+ },
23
+ "include": ["src"]
24
+ }
sb1-adugtr/tsconfig.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./tsconfig.app.json" },
5
+ { "path": "./tsconfig.node.json" }
6
+ ]
7
+ }
sb1-adugtr/tsconfig.node.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2023"],
5
+ "module": "ESNext",
6
+ "skipLibCheck": true,
7
+
8
+ /* Bundler mode */
9
+ "moduleResolution": "bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "isolatedModules": true,
12
+ "moduleDetection": "force",
13
+ "noEmit": true,
14
+
15
+ /* Linting */
16
+ "strict": true,
17
+ "noUnusedLocals": true,
18
+ "noUnusedParameters": true,
19
+ "noFallthroughCasesInSwitch": true
20
+ },
21
+ "include": ["vite.config.ts"]
22
+ }
sb1-adugtr/vite.config.ts ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ });