1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState, useEffect, useRef } from "https://esm.sh/react@18.2.0";
3import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
4
5const STEPS = 16;
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import { useChat } from "https://esm.sh/@ai-sdk/react?deps=react@18.2.0&react-dom@18.2.0";
3import DOMPurify from "https://esm.sh/dompurify@3.0.3";
4import { marked } from "https://esm.sh/marked@4.3.0";
5import React, { useEffect, useRef, useState } from "https://esm.sh/react@18.2.0";
6
7export function App() {
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
3import React, { useEffect, useRef, useState } from "https://esm.sh/react@18.2.0";
4
5function KixLogo() {
71
72 // Add missing methods
73 const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
74 const file = e.target.files?.[0];
75 setError(null);
154 };
155
156 const handleMouseDown = (e: React.MouseEvent) => {
157 if (!isCropping || !imageRef.current) return;
158 const rect = imageRef.current.getBoundingClientRect();
163 };
164
165 const handleMouseMove = (e: React.MouseEvent) => {
166 if (!isCropping || !imageRef.current || !startPoint) return;
167 const rect = imageRef.current.getBoundingClientRect();
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState, useEffect } from "https://esm.sh/react@18.2.0";
3import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
4
5// Expanded aesthetic and color matching utility
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
3import React, { useEffect, useState } from "https://esm.sh/react@18.2.0";
4
5// African-inspired color palette
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
3import React, { useState } from "https://esm.sh/react@18.2.0";
4import { toast, Toaster } from "https://esm.sh/sonner?deps=react@18.2.0";
5
6function App() {
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
3import React, { useCallback, useEffect, useRef, useState } from "https://esm.sh/react@18.2.0";
4
5function SendIcon() {
1/** @jsxImportSource https://esm.sh/react@18.2.0 */
2import React, { useState, useEffect } from "https://esm.sh/react@18.2.0";
3import { createRoot } from "https://esm.sh/react-dom@18.2.0/client";
4
5function Logo({ theme }) {
1import { useState, useEffect } from "https://esm.sh/react@18.2.0?dev";
2import { fetchProjectFiles } from "../utils/api.ts";
3
1import { useChat } from "https://esm.sh/@ai-sdk/react?dev&deps=react@18.2.0&react-dom@18.2.0";
2import React, { useCallback, useMemo, useRef, useState } from "https://esm.sh/react@18.2.0?dev";
3import { playBellSound } from "../utils/soundEffects.ts";
4
99 }, [stop, pendingMessageId, soundEnabled]);
100
101 React.useEffect(() => {
102 customStopRef.current = handleStop;
103 }, [handleStop]);
104
105 React.useEffect(() => {
106 (window as any).customStopRef = customStopRef;
107 }, []);