diff options
author | Nate Sesti <sestinj@gmail.com> | 2023-06-17 12:06:25 -0700 |
---|---|---|
committer | Nate Sesti <sestinj@gmail.com> | 2023-06-17 12:06:25 -0700 |
commit | 50f714d7b8a5e0c66e8db41f939cf2a964663931 (patch) | |
tree | 7dad1fb3396f7001846c050a518f193a0c89dc25 /extension/react-app/src | |
parent | 3c24af2e70e2a4ad22d9aa7dcf245711806890ee (diff) | |
download | sncontinue-50f714d7b8a5e0c66e8db41f939cf2a964663931.tar.gz sncontinue-50f714d7b8a5e0c66e8db41f939cf2a964663931.tar.bz2 sncontinue-50f714d7b8a5e0c66e8db41f939cf2a964663931.zip |
more ui details
Diffstat (limited to 'extension/react-app/src')
-rw-r--r-- | extension/react-app/src/components/CodeBlock.tsx | 63 | ||||
-rw-r--r-- | extension/react-app/src/components/ComboBox.tsx | 22 | ||||
-rw-r--r-- | extension/react-app/src/components/StepContainer.tsx | 118 | ||||
-rw-r--r-- | extension/react-app/src/components/TextDialog.tsx | 77 | ||||
-rw-r--r-- | extension/react-app/src/components/index.ts | 20 | ||||
-rw-r--r-- | extension/react-app/src/index.css | 5 | ||||
-rw-r--r-- | extension/react-app/src/tabs/gui.tsx | 2 |
7 files changed, 164 insertions, 143 deletions
diff --git a/extension/react-app/src/components/CodeBlock.tsx b/extension/react-app/src/components/CodeBlock.tsx index eedae3fb..c4524a51 100644 --- a/extension/react-app/src/components/CodeBlock.tsx +++ b/extension/react-app/src/components/CodeBlock.tsx @@ -1,44 +1,62 @@ import hljs from "highlight.js"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import styled from "styled-components"; -import { defaultBorderRadius, vscBackground } from "."; +import { defaultBorderRadius, secondaryDark, vscBackground } from "."; -import { Clipboard } from "@styled-icons/heroicons-outline"; +import { Clipboard, CheckCircle } from "@styled-icons/heroicons-outline"; const StyledPre = styled.pre` overflow-y: scroll; word-wrap: normal; - border: 1px solid gray; + border: 0.5px solid gray; border-radius: ${defaultBorderRadius}; - background-color: ${vscBackground}; + background-color: ${secondaryDark}; padding: 8px; + padding-top: 14px; + padding-bottom: 16px; `; -const StyledCode = styled.code` - background-color: ${vscBackground}; -`; +const StyledCode = styled.code``; -const StyledCopyButton = styled.button` +const StyledCopyButton = styled.button<{ visible: boolean }>` + /* position: relative; */ float: right; border: none; - background-color: ${vscBackground}; + background-color: transparent; cursor: pointer; padding: 0; - margin: 4px; - &:hover { - color: #fff; - } + /* margin: 4px; */ + margin-top: -6px; + + visibility: ${(props) => (props.visible ? "visible" : "hidden")}; `; -function CopyButton(props: { textToCopy: string }) { +function CopyButton(props: { textToCopy: string; visible: boolean }) { + const [hovered, setHovered] = useState<boolean>(false); + const [clicked, setClicked] = useState<boolean>(false); return ( <> <StyledCopyButton + onMouseEnter={() => { + setHovered(true); + }} + onMouseLeave={() => { + setHovered(false); + }} + visible={clicked || props.visible} onClick={() => { navigator.clipboard.writeText(props.textToCopy); + setClicked(true); + setTimeout(() => { + setClicked(false); + }, 2000); }} > - <Clipboard color="white" size="1.4em" /> + {clicked ? ( + <CheckCircle color="#00ff00" size="1.4em" /> + ) : ( + <Clipboard color={hovered ? "#00ff00" : "white"} size="1.4em" /> + )} </StyledCopyButton> </> ); @@ -48,9 +66,18 @@ function CodeBlock(props: { language?: string; children: string }) { useEffect(() => { hljs.highlightAll(); }, [props.children]); + const [hovered, setHovered] = useState<boolean>(false); + return ( - <StyledPre> - <CopyButton textToCopy={props.children} /> + <StyledPre + onMouseEnter={() => { + setHovered(true); + }} + onMouseLeave={() => { + setHovered(false); + }} + > + <CopyButton visible={hovered} textToCopy={props.children} /> <StyledCode>{props.children}</StyledCode> </StyledPre> ); diff --git a/extension/react-app/src/components/ComboBox.tsx b/extension/react-app/src/components/ComboBox.tsx index e855ebe5..ddc9d5dc 100644 --- a/extension/react-app/src/components/ComboBox.tsx +++ b/extension/react-app/src/components/ComboBox.tsx @@ -9,16 +9,22 @@ import { } from "."; const mainInputFontSize = 16; -const MainTextInput = styled.input` +const MainTextInput = styled.textarea` + resize: none; + padding: 8px; font-size: ${mainInputFontSize}px; border-radius: ${defaultBorderRadius}; - border: 1px solid #ccc; + border: 1px solid white; margin: 8px auto; width: 100%; background-color: ${vscBackground}; color: white; - outline: 1px solid orange; + + &:focus { + border: 1px solid transparent; + outline: 1px solid orange; + } `; const UlMaxHeight = 200; @@ -108,10 +114,16 @@ const ComboBox = React.forwardRef((props: ComboBoxProps, ref) => { <div className="flex px-2" ref={divRef} hidden={!isOpen}> <MainTextInput disabled={props.disabled} - placeholder="Type '/' to see the list of available slash commands..." + placeholder="Type '/' to see available slash commands." {...getInputProps({ onKeyDown: (event) => { - if (event.key === "Enter" && (!isOpen || items.length === 0)) { + if (event.key === "Enter" && event.shiftKey) { + // Prevent Downshift's default 'Enter' behavior. + (event.nativeEvent as any).preventDownshiftDefault = true; + } else if ( + event.key === "Enter" && + (!isOpen || items.length === 0) + ) { // Prevent Downshift's default 'Enter' behavior. (event.nativeEvent as any).preventDownshiftDefault = true; if (props.onEnter) props.onEnter(event); diff --git a/extension/react-app/src/components/StepContainer.tsx b/extension/react-app/src/components/StepContainer.tsx index 4c98b04d..1eb1d1fd 100644 --- a/extension/react-app/src/components/StepContainer.tsx +++ b/extension/react-app/src/components/StepContainer.tsx @@ -5,14 +5,8 @@ import { defaultBorderRadius, secondaryDark, vscBackground, - GradientBorder, vscBackgroundTransparent, - HeaderButton, } from "."; -import { RangeInFile, FileEdit } from "../../../src/client"; -import CodeBlock from "./CodeBlock"; -import SubContainer from "./SubContainer"; - import { ChevronDown, ChevronRight, @@ -22,6 +16,7 @@ import { import { HistoryNode } from "../../../schema/HistoryNode"; import ReactMarkdown from "react-markdown"; import HeaderButtonWithText from "./HeaderButtonWithText"; +import CodeBlock from "./CodeBlock"; interface StepContainerProps { historyNode: HistoryNode; @@ -34,6 +29,8 @@ interface StepContainerProps { open: boolean; onToggleAll: () => void; onToggle: () => void; + isFirst: boolean; + isLast: boolean; } const MainDiv = styled.div<{ stepDepth: number; inFuture: boolean }>` @@ -67,12 +64,6 @@ const ContentDiv = styled.div` padding-left: 16px; `; -const OnHoverDiv = styled.div` - text-align: center; - padding: 10px; - animation: ${appear} 0.3s ease-in-out; -`; - const MarkdownPre = styled.pre` background-color: ${secondaryDark}; padding: 10px; @@ -80,7 +71,34 @@ const MarkdownPre = styled.pre` border: 0.5px solid white; `; -const MarkdownCode = styled.code``; +const StyledCode = styled.code` + word-wrap: break-word; + color: lightgray; +`; + +const GradientBorder = styled.div<{ + borderWidth?: number; + borderRadius?: string; + borderColor?: string; + isFirst: boolean; + isLast: boolean; +}>` + border-radius: ${(props) => props.borderRadius || "0"}; + padding-top: ${(props) => + `${(props.borderWidth || 1) / (props.isFirst ? 1 : 2)}px`}; + padding-bottom: ${(props) => + `${(props.borderWidth || 1) / (props.isLast ? 1 : 2)}px`}; + background: ${(props) => + props.borderColor + ? props.borderColor + : `linear-gradient( + 101.79deg, + #12887a 0%, + #87245c 37.64%, + #e12637 65.98%, + #ffb215 110.45% + )`}; +`; function StepContainer(props: StepContainerProps) { const [isHovered, setIsHovered] = useState(false); @@ -120,12 +138,14 @@ function StepContainer(props: StepContainerProps) { > <StepContainerDiv open={props.open}> <GradientBorder + isFirst={props.isFirst} + isLast={props.isLast} borderColor={ props.historyNode.observation?.error ? "#f00" : undefined } className="overflow-hidden cursor-pointer" onClick={(e) => { - if (props.open && e.metaKey) { + if (e.metaKey) { props.onToggleAll(); } else { props.onToggle(); @@ -198,66 +218,28 @@ function StepContainer(props: StepContainerProps) { <ReactMarkdown key={1} className="overflow-x-scroll" - components={ - { - // pre: ({ node, ...props }) => { - // return ( - // <CodeBlock - // children={props.children[0] as string} - // ></CodeBlock> - // ); - // }, - } - } + components={{ + pre: ({ node, ...props }) => { + return ( + <CodeBlock + children={props.children[0] as string} + ></CodeBlock> + ); + }, + code: ({ node, ...props }) => { + return ( + <StyledCode + children={props.children[0] as string} + ></StyledCode> + ); + }, + }} > {props.historyNode.step.description as any} </ReactMarkdown> )} - - {/* {props.historyNode.step.name === "Waiting for user input" && ( - <InputAndButton - onUserInput={(value) => { - props.onUserInput(value); - }} - ></InputAndButton> - )} - {props.historyNode.step.name === "Waiting for user confirmation" && ( - <> - <input - type="button" - value="Cancel" - className="m-4 p-2 rounded-md border border-solid text-white border-gray-200 bg-vsc-background cursor-pointer hover:bg-white hover:text-black" - ></input> - <input - className="m-4 p-2 rounded-md border border-solid text-white border-gray-200 bg-vsc-background cursor-pointer hover:bg-white hover:text-black" - onClick={(e) => { - props.onUserInput("ok"); - e.preventDefault(); - e.stopPropagation(); - }} - type="button" - value="Confirm" - /> - </> - )} */} </ContentDiv> </StepContainerDiv> - - {/* <OnHoverDiv hidden={!open}> - <NaturalLanguageInput - onKeyDown={(e) => { - if (e.key === "Enter") { - onTextInput(); - } - }} - ref={naturalLanguageInputRef} - onClick={(e) => { - e.stopPropagation(); - e.preventDefault(); - }} - ></NaturalLanguageInput> - <ContinueButton onClick={onTextInput}></ContinueButton> - </OnHoverDiv> */} </MainDiv> ); } diff --git a/extension/react-app/src/components/TextDialog.tsx b/extension/react-app/src/components/TextDialog.tsx index 31a385d5..e50a7686 100644 --- a/extension/react-app/src/components/TextDialog.tsx +++ b/extension/react-app/src/components/TextDialog.tsx @@ -3,6 +3,13 @@ import React, { useEffect, useState } from "react"; import styled from "styled-components"; import { Button, buttonColor, secondaryDark, vscBackground } from "."; +const ScreenCover = styled.div` + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(168, 168, 168, 0.5); +`; + const DialogContainer = styled.div` position: absolute; top: 50%; @@ -28,9 +35,10 @@ const TextArea = styled.textarea` padding: 8px; outline: 1px solid black; font-family: Arial, Helvetica, sans-serif; + resize: none; &:focus { - outline: 1px solid orange; + outline: 1px solid ${buttonColor}; } `; @@ -54,34 +62,45 @@ const TextDialog = (props: { }, [props.showDialog]); return ( - <DialogContainer hidden={!props.showDialog}> - <Dialog> - <P>Thanks for your feedback. We'll get back to you soon!</P> - <TextArea - cols={50} - rows={10} - ref={textAreaRef} - onKeyDown={(e) => { - if (e.key === "Enter" && e.metaKey && textAreaRef.current) { - props.onEnter(textAreaRef.current.value); - setText(""); - } else if (e.key === "Escape") { - props.onClose(); - } - }} - /> - <Button - onClick={() => { - if (textAreaRef.current) { - props.onEnter(textAreaRef.current.value); - setText(""); - } - }} - > - Enter - </Button> - </Dialog> - </DialogContainer> + <ScreenCover + onClick={() => { + props.onClose(); + }} + hidden={!props.showDialog} + > + <DialogContainer + onClick={(e) => { + e.stopPropagation(); + }} + > + <Dialog> + <P>Thanks for your feedback. We'll get back to you soon!</P> + <TextArea + cols={50} + rows={10} + ref={textAreaRef} + onKeyDown={(e) => { + if (e.key === "Enter" && e.metaKey && textAreaRef.current) { + props.onEnter(textAreaRef.current.value); + setText(""); + } else if (e.key === "Escape") { + props.onClose(); + } + }} + /> + <Button + onClick={() => { + if (textAreaRef.current) { + props.onEnter(textAreaRef.current.value); + setText(""); + } + }} + > + Enter + </Button> + </Dialog> + </DialogContainer> + </ScreenCover> ); }; diff --git a/extension/react-app/src/components/index.ts b/extension/react-app/src/components/index.ts index d99b4d96..fc94c51f 100644 --- a/extension/react-app/src/components/index.ts +++ b/extension/react-app/src/components/index.ts @@ -95,26 +95,6 @@ export const Loader = styled.div` margin: auto; `; -export const GradientBorder = styled.div<{ - borderWidth?: string; - borderRadius?: string; - borderColor?: string; -}>` - border-radius: ${(props) => props.borderRadius || "0"}; - padding-top: ${(props) => props.borderWidth || "1px"}; - padding-bottom: ${(props) => props.borderWidth || "1px"}; - background: ${(props) => - props.borderColor - ? props.borderColor - : `linear-gradient( - 101.79deg, - #12887a 0%, - #87245c 37.64%, - #e12637 65.98%, - #ffb215 110.45% - )`}; -`; - export const MainContainerWithBorder = styled.div<{ borderWidth?: string }>` border-radius: ${defaultBorderRadius}; padding: ${(props) => props.borderWidth || "1px"}; diff --git a/extension/react-app/src/index.css b/extension/react-app/src/index.css index db8afab9..6dc514ec 100644 --- a/extension/react-app/src/index.css +++ b/extension/react-app/src/index.css @@ -3,8 +3,8 @@ @tailwind utilities; :root { - --secondary-dark: 37 37 38; - --vsc-background: 30 30 30; + --secondary-dark: rgb(37, 37, 38); + --vsc-background: rgb(30, 30, 30); --button-color: rgb(113, 28, 59); --button-color-hover: rgba(113, 28, 59, 0.667); --def-border-radius: 5px; @@ -26,7 +26,6 @@ body, } body { - background-color: var(--vsc-background); padding: 0; color: white; font-family: "Mona Sans", "Arial", sans-serif; diff --git a/extension/react-app/src/tabs/gui.tsx b/extension/react-app/src/tabs/gui.tsx index 6aa20e0e..624d22d5 100644 --- a/extension/react-app/src/tabs/gui.tsx +++ b/extension/react-app/src/tabs/gui.tsx @@ -331,6 +331,8 @@ function GUI(props: GUIProps) { {history?.timeline.map((node: HistoryNode, index: number) => { return ( <StepContainer + isLast={index === history.timeline.length - 1} + isFirst={index === 0} open={stepsOpen[index]} onToggle={() => { const nextStepsOpen = [...stepsOpen]; |