diff --git a/frontend/package.json b/frontend/package.json index 0d180b6..476a72d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 0941a8b..5bf973b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -56,7 +56,7 @@ function App() { ); const [outputSettings, setOutputSettings] = useState({ css: CSSOption.TAILWIND, - js: JSFrameworkOption.VANILLA, + js: JSFrameworkOption.NO_FRAMEWORK, }); const [shouldIncludeResultImage, setShouldIncludeResultImage] = useState(false); @@ -181,22 +181,18 @@ function App() {
-
+

Screenshot to Code

- {appState === AppState.INITIAL && ( -

- Drag & drop a screenshot to get started. -

- )} - {appState === AppState.INITIAL && ( - - )} + {IS_RUNNING_ON_CLOUD && !settings.openAiApiKey && } diff --git a/frontend/src/components/OutputSettingsSection.tsx b/frontend/src/components/OutputSettingsSection.tsx index 615c008..27184ed 100644 --- a/frontend/src/components/OutputSettingsSection.tsx +++ b/frontend/src/components/OutputSettingsSection.tsx @@ -6,14 +6,10 @@ import { SelectTrigger, } from "./ui/select"; import { CSSOption, JSFrameworkOption, OutputSettings } from "../types"; -import { - Accordion, - AccordionContent, - AccordionItem, - AccordionTrigger, -} from "./ui/accordion"; -import { capitalize } from "../lib/utils"; import toast from "react-hot-toast"; +import { Label } from "@radix-ui/react-label"; +import { Button } from "./ui/button"; +import { Popover, PopoverTrigger, PopoverContent } from "./ui/popover"; function displayCSSOption(option: CSSOption) { switch (option) { @@ -26,6 +22,17 @@ function displayCSSOption(option: CSSOption) { } } +function displayJSOption(option: JSFrameworkOption) { + switch (option) { + case JSFrameworkOption.REACT: + return "React"; + case JSFrameworkOption.NO_FRAMEWORK: + return "No Framework"; + default: + return option; + } +} + function convertStringToCSSOption(option: string) { switch (option) { case "tailwind": @@ -37,12 +44,51 @@ function convertStringToCSSOption(option: string) { } } +function generateDisplayString(settings: OutputSettings) { + if ( + settings.js === JSFrameworkOption.REACT && + settings.css === CSSOption.TAILWIND + ) { + return ( +
+ Generating React +{" "} + Tailwind code +
+ ); + } else if ( + settings.js === JSFrameworkOption.NO_FRAMEWORK && + settings.css === CSSOption.TAILWIND + ) { + return ( +
+ Generating HTML +{" "} + Tailwind code +
+ ); + } else if ( + settings.js === JSFrameworkOption.NO_FRAMEWORK && + settings.css === CSSOption.BOOTSTRAP + ) { + return ( +
+ Generating HTML +{" "} + Bootstrap code +
+ ); + } +} + interface Props { outputSettings: OutputSettings; setOutputSettings: React.Dispatch>; + shouldDisableUpdates?: boolean; } -function OutputSettingsSection({ outputSettings, setOutputSettings }: Props) { +function OutputSettingsSection({ + outputSettings, + setOutputSettings, + shouldDisableUpdates = false, +}: Props) { const onCSSValueChange = (value: string) => { window.plausible("OutputSettings", { props: { framework: "CSS", value: value }, @@ -51,7 +97,7 @@ function OutputSettingsSection({ outputSettings, setOutputSettings }: Props) { if (prev.js === JSFrameworkOption.REACT) { if (value !== CSSOption.TAILWIND) { toast.error( - "React only supports Tailwind CSS. Change JS framework to Vanilla to use Bootstrap." + 'React only supports Tailwind CSS. Change JS framework to "No Framework" to use Bootstrap.' ); } return { @@ -85,48 +131,76 @@ function OutputSettingsSection({ outputSettings, setOutputSettings }: Props) { }; return ( - - - -
Output Settings
-
- -
- CSS - -
-
- JS Framework - -
-
-
-
+
+ {generateDisplayString(outputSettings)}{" "} + {!shouldDisableUpdates && ( + + + + + +
+
+

Code Settings

+

+ Customize your code output +

+
+
+
+ + +
+
+ + +
+
+
+
+
+ )} +
); } diff --git a/frontend/src/components/ui/popover.tsx b/frontend/src/components/ui/popover.tsx new file mode 100644 index 0000000..bbba7e0 --- /dev/null +++ b/frontend/src/components/ui/popover.tsx @@ -0,0 +1,29 @@ +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 964ad5a..dd432d8 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -9,7 +9,7 @@ export enum CSSOption { } export enum JSFrameworkOption { - VANILLA = "vanilla", + NO_FRAMEWORK = "vanilla", REACT = "react", VUE = "vue", } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 6edff02..16ffdbe 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -805,6 +805,28 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-popover@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.7.tgz#23eb7e3327330cb75ec7b4092d685398c1654e3c" + integrity sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + "@radix-ui/react-popper@1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.3.tgz#24c03f527e7ac348fabf18c89795d85d21b00b42"