Merge pull request #115 from kachbit/main

Dark mode.
This commit is contained in:
Abi Raja 2023-11-30 09:00:03 -05:00 committed by GitHub
commit 226af5bf41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 124 additions and 61 deletions

View File

@ -171,7 +171,7 @@ function App() {
}; };
return ( return (
<div className="mt-2"> <div className="mt-2 dark:bg-black dark:text-white">
{IS_RUNNING_ON_CLOUD && <PicoBadge settings={settings} />} {IS_RUNNING_ON_CLOUD && <PicoBadge settings={settings} />}
{IS_RUNNING_ON_CLOUD && ( {IS_RUNNING_ON_CLOUD && (
<TermsOfServiceDialog <TermsOfServiceDialog
@ -179,9 +179,8 @@ function App() {
onOpenChange={handleTermDialogOpenChange} onOpenChange={handleTermDialogOpenChange}
/> />
)} )}
<div className="lg:fixed lg:inset-y-0 lg:z-40 lg:flex lg:w-96 lg:flex-col"> <div className="lg:fixed lg:inset-y-0 lg:z-40 lg:flex lg:w-96 lg:flex-col">
<div className="flex grow flex-col gap-y-2 overflow-y-auto border-r border-gray-200 bg-white px-6"> <div className="flex grow flex-col gap-y-2 overflow-y-auto border-r border-gray-200 bg-white px-6 dark:bg-zinc-950 dark:text-white">
<div className="flex items-center justify-between mt-10 mb-2"> <div className="flex items-center justify-between mt-10 mb-2">
<h1 className="text-2xl ">Screenshot to Code</h1> <h1 className="text-2xl ">Screenshot to Code</h1>
<SettingsDialog settings={settings} setSettings={setSettings} /> <SettingsDialog settings={settings} setSettings={setSettings} />
@ -211,7 +210,10 @@ function App() {
{executionConsole.slice(-1)[0]} {executionConsole.slice(-1)[0]}
</div> </div>
<div className="flex mt-4 w-full"> <div className="flex mt-4 w-full">
<Button onClick={stop} className="w-full"> <Button
onClick={stop}
className="w-full dark:text-white dark:bg-gray-700"
>
Stop Stop
</Button> </Button>
</div> </div>
@ -228,26 +230,32 @@ function App() {
value={updateInstruction} value={updateInstruction}
/> />
<div className="flex justify-between items-center gap-x-2"> <div className="flex justify-between items-center gap-x-2">
<div className="font-500 text-xs text-slate-700"> <div className="font-500 text-xs text-slate-700 dark:text-white">
Include screenshot of current version? Include screenshot of current version?
</div> </div>
<Switch <Switch
checked={shouldIncludeResultImage} checked={shouldIncludeResultImage}
onCheckedChange={setShouldIncludeResultImage} onCheckedChange={setShouldIncludeResultImage}
className="dark:bg-gray-700"
/> />
</div> </div>
<Button onClick={doUpdate}>Update</Button> <Button
onClick={doUpdate}
className="dark:text-white dark:bg-gray-700"
>
Update
</Button>
</div> </div>
<div className="flex items-center gap-x-2 mt-2"> <div className="flex items-center gap-x-2 mt-2">
<Button <Button
onClick={downloadCode} onClick={downloadCode}
className="flex items-center gap-x-2" className="flex items-center gap-x-2 dark:text-white dark:bg-gray-700"
> >
<FaDownload /> Download <FaDownload /> Download
</Button> </Button>
<Button <Button
onClick={reset} onClick={reset}
className="flex items-center gap-x-2" className="flex items-center gap-x-2 dark:text-white dark:bg-gray-700"
> >
<FaUndo /> <FaUndo />
Reset Reset

View File

@ -50,7 +50,7 @@ function generateDisplayString(settings: OutputSettings) {
settings.css === CSSOption.TAILWIND settings.css === CSSOption.TAILWIND
) { ) {
return ( return (
<div> <div className="text-gray-800 dark:text-white">
Generating <span className="font-bold">React</span> +{" "} Generating <span className="font-bold">React</span> +{" "}
<span className="font-bold">Tailwind</span> code <span className="font-bold">Tailwind</span> code
</div> </div>
@ -60,7 +60,7 @@ function generateDisplayString(settings: OutputSettings) {
settings.css === CSSOption.TAILWIND settings.css === CSSOption.TAILWIND
) { ) {
return ( return (
<div className="text-gray-800"> <div className="text-gray-800 dark:text-white">
Generating <span className="font-bold">HTML</span> +{" "} Generating <span className="font-bold">HTML</span> +{" "}
<span className="font-bold">Tailwind</span> code <span className="font-bold">Tailwind</span> code
</div> </div>
@ -70,7 +70,7 @@ function generateDisplayString(settings: OutputSettings) {
settings.css === CSSOption.BOOTSTRAP settings.css === CSSOption.BOOTSTRAP
) { ) {
return ( return (
<div> <div className="text-gray-800 dark:text-white">
Generating <span className="font-bold">HTML</span> +{" "} Generating <span className="font-bold">HTML</span> +{" "}
<span className="font-bold">Bootstrap</span> code <span className="font-bold">Bootstrap</span> code
</div> </div>

View File

@ -16,6 +16,12 @@ import { Input } from "./ui/input";
import { Select, SelectContent, SelectItem, SelectTrigger } from "./ui/select"; import { Select, SelectContent, SelectItem, SelectTrigger } from "./ui/select";
import { capitalize } from "../lib/utils"; import { capitalize } from "../lib/utils";
import { IS_RUNNING_ON_CLOUD } from "../config"; import { IS_RUNNING_ON_CLOUD } from "../config";
import {
Accordion,
AccordionContent,
AccordionItem,
AccordionTrigger,
} from "./ui/accordion";
interface Props { interface Props {
settings: Settings; settings: Settings;
@ -42,7 +48,7 @@ function SettingsDialog({ settings, setSettings }: Props) {
{/* Access code */} {/* Access code */}
{IS_RUNNING_ON_CLOUD && ( {IS_RUNNING_ON_CLOUD && (
<div className="flex flex-col space-y-4 bg-slate-300 p-4 rounded"> <div className="flex flex-col space-y-4 bg-slate-300 p-4 rounded dark:text-white dark:bg-slate-800">
<Label htmlFor="access-code"> <Label htmlFor="access-code">
<div>Access Code</div> <div>Access Code</div>
<div className="font-light mt-1 leading-relaxed"> <div className="font-light mt-1 leading-relaxed">
@ -51,7 +57,7 @@ function SettingsDialog({ settings, setSettings }: Props) {
</Label> </Label>
<Input <Input
id="access-code" id="access-code dark:border-gray-700 dark:bg-gray-800 dark:text-white"
placeholder="Enter your Screenshot to Code access code" placeholder="Enter your Screenshot to Code access code"
value={settings.accessCode || ""} value={settings.accessCode || ""}
onChange={(e) => onChange={(e) =>
@ -103,53 +109,90 @@ function SettingsDialog({ settings, setSettings }: Props) {
} }
/> />
<Label htmlFor="screenshot-one-api-key"> <Accordion type="single" collapsible className="w-full">
<div> <AccordionItem value="item-1">
ScreenshotOne API key (optional - only needed if you want to use <AccordionTrigger>Screenshot by URL Config</AccordionTrigger>
URLs directly instead of taking the screenshot yourself) <AccordionContent>
</div> <Label htmlFor="screenshot-one-api-key">
<div className="font-light mt-2 leading-relaxed"> <div className="leading-normal font-normal text-xs">
Only stored in your browser. Never stored on servers.{" "} If you want to use URLs directly instead of taking the
<a screenshot yourself, add a ScreenshotOne API key.{" "}
href="https://screenshotone.com?via=screenshot-to-code" <a
className="underline" href="https://screenshotone.com?via=screenshot-to-code"
target="_blank" className="underline"
> target="_blank"
Get 100 screenshots/mo for free. >
</a> Get 100 screenshots/mo for free.
</div> </a>
</Label> </div>
</Label>
<Input <Input
id="screenshot-one-api-key" id="screenshot-one-api-key"
placeholder="ScreenshotOne API key" className="mt-2"
value={settings.screenshotOneApiKey || ""} placeholder="ScreenshotOne API key"
onChange={(e) => value={settings.screenshotOneApiKey || ""}
setSettings((s) => ({ onChange={(e) =>
...s, setSettings((s) => ({
screenshotOneApiKey: e.target.value, ...s,
})) screenshotOneApiKey: e.target.value,
} }))
/> }
/>
</AccordionContent>
</AccordionItem>
</Accordion>
<Label htmlFor="editor-theme"> <Accordion type="single" collapsible className="w-full">
<div>Editor Theme</div> <AccordionItem value="item-1">
</Label> <AccordionTrigger>Theme Settings</AccordionTrigger>
<div> <AccordionContent className="space-y-4 flex flex-col">
<Select // Use the custom Select component here <div className="flex items-center justify-between">
name="editor-theme" <Label htmlFor="app-theme">
value={settings.editorTheme} <div>App Theme</div>
onValueChange={(value) => handleThemeChange(value as EditorTheme)} </Label>
> <div>
<SelectTrigger className="w-[180px]"> <button
{capitalize(settings.editorTheme)} className="flex rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50t"
</SelectTrigger> onClick={() => {
<SelectContent> document
<SelectItem value="cobalt">Cobalt</SelectItem> .querySelector("div.mt-2")
<SelectItem value="espresso">Espresso</SelectItem> ?.classList.toggle("dark"); // enable dark mode for sidebar
</SelectContent> document.body.classList.toggle("dark");
</Select> document
</div> .querySelector('div[role="presentation"]')
?.classList.toggle("dark"); // enable dark mode for upload container
}}
>
Toggle dark mode
</button>
</div>
</div>
<div className="flex items-center justify-between">
<Label htmlFor="editor-theme">
<div>Code Editor Theme</div>
</Label>
<div>
<Select // Use the custom Select component here
name="editor-theme"
value={settings.editorTheme}
onValueChange={(value) =>
handleThemeChange(value as EditorTheme)
}
>
<SelectTrigger className="w-[180px]">
{capitalize(settings.editorTheme)}
</SelectTrigger>
<SelectContent>
<SelectItem value="cobalt">Cobalt</SelectItem>
<SelectItem value="espresso">Espresso</SelectItem>
</SelectContent>
</Select>
</div>
</div>
</AccordionContent>
</AccordionItem>
</Accordion>
</div> </div>
<DialogFooter> <DialogFooter>

View File

@ -62,8 +62,20 @@
--radius: 0.5rem; --radius: 0.5rem;
} }
body.dark {
background-color: black;
}
div[role="presentation"].dark {
background-color: #09090b !important;
}
iframe {
background-color: white !important;
}
.dark { .dark {
--background: 222.2 84% 4.9%; --background: 222.2 0% 0%;
--foreground: 210 40% 98%; --foreground: 210 40% 98%;
--card: 222.2 84% 4.9%; --card: 222.2 84% 4.9%;

View File

@ -7,6 +7,6 @@ import { Toaster } from "react-hot-toast";
ReactDOM.createRoot(document.getElementById("root")!).render( ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode> <React.StrictMode>
<App /> <App />
<Toaster /> <Toaster toastOptions={{ className:"dark:bg-zinc-950 dark:text-white" }}/>
</React.StrictMode> </React.StrictMode>
); );