Val Town Code SearchReturn to Val Town

API Access

You can access search results via JSON API by adding format=json to your query:

https://codesearch.val.run/?q=image&page=210&format=json

For typeahead suggestions, use the /typeahead endpoint:

https://codesearch.val.run/typeahead?q=image

Returns an array of strings in format "username" or "username/projectName"

Found 2903 results for "image"(295ms)

OpenTownieuseChatLogic.ts4 matches

@loading2Updated 3 weeks ago
9 bearerToken: string;
10 selectedFiles: string[];
11 images: (string | null)[];
12 soundEnabled: boolean;
13}
19 bearerToken,
20 selectedFiles,
21 images,
22 soundEnabled,
23}: UseChatLogicProps) {
41 anthropicApiKey,
42 selectedFiles,
43 images: images
44 .filter((img): img is string => {
45 const isValid = typeof img === "string" && img.startsWith("data:");
46 if (!isValid && img !== null) {
47 console.warn("Invalid image format:", img?.substring(0, 50) + "...");
48 }
49 return isValid;

OpenTownieTODOs.md1 match

@loading2Updated 3 weeks ago
30 - [x] File write as a code embed
31 - [x] str_replace as a diff view
32- [x] make image drop area invisible and bigger
33- [x] Give it all the code (except maybe .txt files) as initial context (like cursor sonnet max)
34- [x] I seem to have lost the delete file tool and instructions, try to find them back in history or re-create?

OpenTowniesystem_prompt.txt10 matches

@loading2Updated 3 weeks ago
12- If a section of code that you're working on is getting too complex, consider refactoring it into subcomponents
13
14## Image Handling
15
16- When users upload images, carefully analyze them to understand their content
17- Reference specific details from the images in your responses
18- If multiple images are uploaded, consider their relationship to each other
19- For code-related images (screenshots, diagrams), extract relevant information and incorporate it into your solutions
20- For UI mockups or design images, use them as reference for layout and design, use the colors from the image
21- When images contain text or code, transcribe relevant portions as needed
22- If image content is unclear, ask clarifying questions about what the user wants you to focus on
23
24## Technical Requirements
95## Val Town Platform Specifics
96- **Redirects:** Use `return new Response(null, { status: 302, headers: { Location: "/place/to/redirect" }})` instead of `Response.redirect` which is broken
97- **Images:** Avoid external images or base64 images. Use emojis, unicode symbols, or icon fonts/libraries instead
98- For AI-generated images, use: `https://maxm-imggenurl.web.val.run/the-description-of-your-image`
99- **Storage:** DO NOT use the Deno KV module for storage
100- **Browser APIs:** DO NOT use the `alert()`, `prompt()`, or `confirm()` methods

OpenTownieMessagePart.tsx11 matches

@loading2Updated 3 weeks ago
2import { type Message } from "https://esm.sh/@ai-sdk/react?dev&deps=react@18.2.0&react-dom@18.2.0";
3import ReactMarkdown from "https://esm.sh/react-markdown?dev&deps=react@18.2.0&react-dom@18.2.0";
4import { ImagePreview } from "./ImageUpload.tsx";
5
6// Helper function to detect language from file path
280 );
281 }
282 if (part.type === "image") {
283 // Handle both formats: {image: {url: string}} and {image: string}
284 const imageUrl = typeof part.image === "string"
285 ? part.image
286 : part.image.url || (part.image as any).source?.url;
287
288 return (
289 <div className="mt-2">
290 <img
291 src={imageUrl}
292 alt="Uploaded image"
293 className="max-h-64 max-w-full object-contain rounded"
294 />
296 );
297 }
298 // Handle multiple images in a single part
299 if (part.type === "images") {
300 return <ImagePreview images={part.images.map(img => img.url)} />;
301 }
302}

OpenTownieImageUpload.tsx47 matches

@loading2Updated 3 weeks ago
2import React, { useRef, useState } from "https://esm.sh/react@18.2.0?dev";
3
4// Maximum number of images that can be uploaded
5export const PROMPT_IMAGE_LIMIT = 5;
6
7interface ImageUploadProps {
8 images: (string | null)[];
9 setImages: (images: (string | null)[]) => void;
10 processFiles: (files: File[]) => void;
11}
12
13export function ImageUpload({ images, setImages, processFiles }: ImageUploadProps) {
14 const fileInputRef = useRef<HTMLInputElement>(null);
15
21 };
22
23 // Handle removing an image
24 const removeImage = (index: number) => {
25 const newImages = [...images];
26 newImages.splice(index, 1);
27 setImages(newImages);
28 };
29
30 // Check if we've reached the image limit
31 const isAtLimit = images.filter(Boolean).length >= PROMPT_IMAGE_LIMIT;
32
33 return (
34 <div className="w-full">
35 {/* Image previews */}
36 {images.length > 0 && (
37 <div className="flex flex-wrap gap-2 mb-2">
38 {images.map((image, index) => (
39 <div key={index} className="relative">
40 {image ? (
41 <div className="relative group">
42 <img
43 src={image}
44 alt={`Uploaded ${index + 1}`}
45 className="h-16 w-16 object-cover rounded border border-gray-300"
47 <button
48 className="absolute top-0 right-0 bg-red-500 text-white rounded-full w-5 h-5 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity"
49 onClick={() => removeImage(index)}
50 title="Remove image"
51 >
52 ×
68 ref={fileInputRef}
69 onChange={handleFileChange}
70 accept="image/*"
71 multiple
72 className="hidden"
80
81// Process files utility function - moved from the component to be reusable
82export const processFiles = async (files: File[], images: (string | null)[], setImages: (images: (string | null)[]) => void) => {
83 // Filter for image files only
84 const imageFiles = files.filter(file => file.type.startsWith('image/'));
85
86 // Limit the number of images
87 const filesToProcess = imageFiles.slice(0, PROMPT_IMAGE_LIMIT - images.filter(Boolean).length);
88
89 if (filesToProcess.length === 0) return;
90
91 // Add null placeholders for loading state
92 const newImages = [...images, ...Array(filesToProcess.length).fill(null)];
93 setImages(newImages);
94
95 // Process each file
96 const processedImages = await Promise.all(
97 filesToProcess.map(async (file) => {
98 return await readFileAsDataURL(file);
100 );
101
102 // Replace null placeholders with actual images
103 const updatedImages = [...images];
104 processedImages.forEach((dataUrl, index) => {
105 updatedImages[images.length + index] = dataUrl;
106 });
107
108 setImages(updatedImages.slice(0, PROMPT_IMAGE_LIMIT));
109};
110
115 reader.onload = () => {
116 const result = reader.result as string;
117 console.log("Image loaded, size:", result.length, "bytes");
118 resolve(result);
119 };
123};
124
125// Component to display images in messages
126export function ImagePreview({ images }: { images: string[] }) {
127 const [expandedImage, setExpandedImage] = useState<string | null>(null);
128
129 if (!images || images.length === 0) return null;
130
131 return (
132 <div className="mt-2">
133 <div className="flex flex-wrap gap-2">
134 {images.map((image, index) => (
135 <div key={index} className="relative">
136 <img
137 src={image}
138 alt={`Image ${index + 1}`}
139 className="max-h-32 max-w-32 object-contain rounded cursor-pointer"
140 onClick={() => setExpandedImage(image)}
141 />
142 </div>
144 </div>
145
146 {/* Modal for expanded image */}
147 {expandedImage && (
148 <div
149 className="fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
150 onClick={() => setExpandedImage(null)}
151 >
152 <div className="max-w-[90%] max-h-[90%]">
153 <img
154 src={expandedImage}
155 alt="Expanded view"
156 className="max-w-full max-h-full object-contain"

OpenTownieChat.tsx8 matches

@loading2Updated 3 weeks ago
9import { ChatInput } from "./ChatInput.tsx";
10import { ApiKeyWarning } from "./ApiKeyWarning.tsx";
11import { processFiles } from "./ImageUpload.tsx";
12
13export function Chat({
25 const [soundEnabled, setSoundEnabled] = useLocalStorage<boolean>("soundEnabled", true);
26 const [selectedFiles, setSelectedFiles] = useState<string[]>([]);
27 const [images, setImages] = useState<(string | null)[]>([]);
28 const [isDragging, setIsDragging] = useState(false);
29
59 bearerToken,
60 selectedFiles,
61 images,
62 soundEnabled,
63 });
94
95 if (e.dataTransfer.files && !running) {
96 processFiles(Array.from(e.dataTransfer.files), images, setImages);
97 }
98 };
124
125 if (e.dataTransfer?.files && !running) {
126 processFiles(Array.from(e.dataTransfer.files), images, setImages);
127 }
128 };
141 document.removeEventListener('drop', handleDocumentDrop);
142 };
143 }, [images, running, setImages]);
144
145 return (
184 handleSubmit={handleSubmit}
185 running={running}
186 images={images}
187 setImages={setImages}
188 isDragging={isDragging}
189 />

OpenTownieChatInput.tsx20 matches

@loading2Updated 3 weeks ago
1/** @jsxImportSource https://esm.sh/react@18.2.0?dev */
2import React, { useEffect, useRef, useState } from "https://esm.sh/react@18.2.0?dev";
3import { ImageUpload, processFiles } from "./ImageUpload.tsx";
4
5interface ChatInputProps {
8 handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;
9 running: boolean;
10 images: (string | null)[];
11 setImages: React.Dispatch<React.SetStateAction<(string | null)[]>>;
12 isDragging: boolean;
13}
18 handleSubmit,
19 running,
20 images,
21 setImages,
22 isDragging,
23}: ChatInputProps) {
43 const handleFormSubmit = (e: React.FormEvent<HTMLFormElement>) => {
44 e.preventDefault();
45 const validImages = images.filter((img): img is string => typeof img === "string");
46 console.log("Submitting with images:", validImages);
47 if (input.trim() || validImages.length > 0) {
48 handleSubmit(e);
49 setImages([]);
50 }
51 };
52
53 const handleProcessFiles = (files: File[]) => {
54 processFiles(files, images, setImages);
55 };
56
61 disabled={running}
62 >
63 {images.length > 0 && (
64 <ImageUpload
65 images={images}
66 setImages={setImages}
67 processFiles={handleProcessFiles}
68 />
82 if (e.key === "Enter" && !e.shiftKey && !isMobile) {
83 e.preventDefault();
84 if (input.trim() || images.filter(Boolean).length > 0) {
85 handleFormSubmit(e as any);
86 }
103 }
104 }}
105 accept="image/*"
106 multiple
107 className="hidden"
139 </div>
140
141 {/* Attach images button below textarea */}
142 {!running && (
143 <div className="flex justify-start mt-1 mb-2">
150 }
151 }}
152 title="Attach images"
153 >
154 <span>📎</span> Attach images
155 </button>
156 </div>
162 <div className="bg-white p-6 rounded-lg shadow-lg text-center">
163 <div className="text-2xl mb-2">📁</div>
164 <div className="text-xl font-semibold">Drop images here</div>
165 </div>
166 </div>

blogfavicon.ts1 match

@valdottownUpdated 3 weeks ago
13 {
14 headers: {
15 "Content-Type": "image/svg+xml",
16 },
17 },

OpenTownieChat.tsx11 matches

@loadingUpdated 3 weeks ago
6import { playBellSound } from "../utils/soundEffects.ts";
7import { BranchControl } from "./BranchControl.tsx";
8import { ImageUpload, PROMPT_IMAGE_LIMIT } from "./ImageUpload.tsx";
9import { MessagePart } from "./MessagePart.tsx";
10
123 const [branchId, setBranchId] = useLocalStorage<string | undefined>("branchId", undefined);
124 const [soundEnabled, setSoundEnabled] = useLocalStorage<boolean>("soundEnabled", true);
125 const [images, setImages] = useState<(string | null)[]>([]);
126 const [lastModifiedFile, setLastModifiedFile] = useState<string | null>(null);
127 const [isReverting, setIsReverting] = useState(false);
166 branchId,
167 anthropicApiKey,
168 images: images
169 .filter((img): img is string => {
170 // Make sure it's a string and a valid data URL
171 const isValid = typeof img === "string" && img.startsWith("data:");
172 if (!isValid && img !== null) {
173 console.warn("Invalid image format:", img?.substring(0, 50) + "...");
174 }
175 return isValid;
231 const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
232 e.preventDefault();
233 const validImages = images.filter((img): img is string => typeof img === "string");
234 console.log("Submitting with images:", validImages);
235 if (input.trim() || validImages.length > 0) {
236 originalHandleSubmit(e);
237 setImages([]);
238 }
239 };
553 </div>
554 )}
555 {(images.length > 0 || !running) && <ImageUpload images={images} setImages={setImages} />}
556
557 <div className="flex gap-2">
568 if (e.key === "Enter" && !e.shiftKey && !isMobile) {
569 e.preventDefault();
570 if (input.trim() || images.filter(Boolean).length > 0) {
571 handleSubmit(e as any);
572 }
603 }
604 }}
605 title="Attach images"
606 >
607 📎

wondrousCyanRodentindex.html1 match

@loadingUpdated 3 weeks ago
7 <script src="https://cdn.twind.style" crossorigin></script>
8 <script src="https://esm.town/v/std/catch"></script>
9 <link rel="icon" href="/public/favicon.svg" type="image/svg+xml">
10 <meta name="description" content="A simple and fast link shortener service">
11</head>

brainrot_image_gen1 file match

@dcm31Updated 3 days ago
Generate images for Italian Brainrot characters using FAL AI

modifyImage2 file matches

@stevekrouseUpdated 3 days ago