Button and theme colors changed
This commit is contained in:
		@@ -1,4 +1,9 @@
 | 
			
		||||
import { CSS } from "@stitches/react/types/css-util";
 | 
			
		||||
import { StyledComponent } from "@stitches/react/types/styled-component";
 | 
			
		||||
import React from "react";
 | 
			
		||||
import { styled } from "../stitches.config";
 | 
			
		||||
import Flex from "./Flex";
 | 
			
		||||
import Spinner from "./Spinner";
 | 
			
		||||
 | 
			
		||||
const Button = styled("button", {
 | 
			
		||||
  // Reset
 | 
			
		||||
@@ -30,8 +35,9 @@ const Button = styled("button", {
 | 
			
		||||
  backgroundColor: "red",
 | 
			
		||||
  cursor: "pointer",
 | 
			
		||||
  "&:disabled": {
 | 
			
		||||
    opacity: 0.8,
 | 
			
		||||
    opacity: 0.6,
 | 
			
		||||
    pointerEvents: "none",
 | 
			
		||||
    cursor: "not-allowed",
 | 
			
		||||
  },
 | 
			
		||||
  variants: {
 | 
			
		||||
    size: {
 | 
			
		||||
@@ -56,27 +62,27 @@ const Button = styled("button", {
 | 
			
		||||
    },
 | 
			
		||||
    variant: {
 | 
			
		||||
      default: {
 | 
			
		||||
        backgroundColor: "$slate12",
 | 
			
		||||
        boxShadow: "inset 0 0 0 1px $colors$slate12",
 | 
			
		||||
        color: "$slate1",
 | 
			
		||||
        backgroundColor: "$mauve12",
 | 
			
		||||
        boxShadow: "inset 0 0 0 1px $colors$mauve12",
 | 
			
		||||
        color: "$mauve1",
 | 
			
		||||
        "@hover": {
 | 
			
		||||
          "&:hover": {
 | 
			
		||||
            backgroundColor: "$slate12",
 | 
			
		||||
            boxShadow: "inset 0 0 0 1px $colors$slate12",
 | 
			
		||||
            backgroundColor: "$mauve12",
 | 
			
		||||
            boxShadow: "inset 0 0 0 1px $colors$mauve12",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "&:active": {
 | 
			
		||||
          backgroundColor: "$slate10",
 | 
			
		||||
          boxShadow: "inset 0 0 0 1px $colors$slate11",
 | 
			
		||||
          backgroundColor: "$mauve10",
 | 
			
		||||
          boxShadow: "inset 0 0 0 1px $colors$mauve11",
 | 
			
		||||
        },
 | 
			
		||||
        "&:focus": {
 | 
			
		||||
          boxShadow:
 | 
			
		||||
            "inset 0 0 0 1px $colors$slate12, 0 0 0 1px $colors$slate12",
 | 
			
		||||
            "inset 0 0 0 1px $colors$mauve12, 0 0 0 1px $colors$mauve12",
 | 
			
		||||
        },
 | 
			
		||||
        '&[data-radix-popover-trigger][data-state="open"], &[data-radix-dropdown-menu-trigger][data-state="open"]':
 | 
			
		||||
          {
 | 
			
		||||
            backgroundColor: "$slate4",
 | 
			
		||||
            boxShadow: "inset 0 0 0 1px $colors$slate8",
 | 
			
		||||
            backgroundColor: "$mauve4",
 | 
			
		||||
            boxShadow: "inset 0 0 0 1px $colors$mauve8",
 | 
			
		||||
          },
 | 
			
		||||
      },
 | 
			
		||||
      primary: {
 | 
			
		||||
@@ -98,7 +104,7 @@ const Button = styled("button", {
 | 
			
		||||
        },
 | 
			
		||||
        '&[data-radix-popover-trigger][data-state="open"], &[data-radix-dropdown-menu-trigger][data-state="open"]':
 | 
			
		||||
          {
 | 
			
		||||
            backgroundColor: "$slate4",
 | 
			
		||||
            backgroundColor: "$mauve4",
 | 
			
		||||
            boxShadow: "inset 0 0 0 1px $colors$pink8",
 | 
			
		||||
          },
 | 
			
		||||
      },
 | 
			
		||||
@@ -117,15 +123,15 @@ const Button = styled("button", {
 | 
			
		||||
      true: {
 | 
			
		||||
        boxShadow: "none",
 | 
			
		||||
        background: "transparent",
 | 
			
		||||
        color: "$slate12",
 | 
			
		||||
        color: "$mauve12",
 | 
			
		||||
        "@hover": {
 | 
			
		||||
          "&:hover": {
 | 
			
		||||
            backgroundColor: "$slate6",
 | 
			
		||||
            backgroundColor: "$mauve6",
 | 
			
		||||
            boxShadow: "none",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "&:active": {
 | 
			
		||||
          backgroundColor: "$slate8",
 | 
			
		||||
          backgroundColor: "$mauve8",
 | 
			
		||||
          boxShadow: "none",
 | 
			
		||||
        },
 | 
			
		||||
        "&:focus": {
 | 
			
		||||
@@ -133,19 +139,26 @@ const Button = styled("button", {
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    isLoading: {
 | 
			
		||||
      true: {
 | 
			
		||||
        "& .button-content": {
 | 
			
		||||
          visibility: "hidden",
 | 
			
		||||
        },
 | 
			
		||||
        pointerEvents: "none",
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  compoundVariants: [
 | 
			
		||||
    {
 | 
			
		||||
      outline: true,
 | 
			
		||||
      variant: "default",
 | 
			
		||||
      css: {
 | 
			
		||||
        background: "transparent",
 | 
			
		||||
        color: "$slate12",
 | 
			
		||||
        boxShadow: "inset 0 0 0 1px $colors$slate10",
 | 
			
		||||
        color: "$mauve12",
 | 
			
		||||
        boxShadow: "inset 0 0 0 1px $colors$mauve10",
 | 
			
		||||
        "&:hover": {
 | 
			
		||||
          color: "$slate12",
 | 
			
		||||
          background: "$slate5",
 | 
			
		||||
          color: "$mauve12",
 | 
			
		||||
          background: "$mauve5",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
@@ -154,10 +167,10 @@ const Button = styled("button", {
 | 
			
		||||
      variant: "primary",
 | 
			
		||||
      css: {
 | 
			
		||||
        background: "transparent",
 | 
			
		||||
        color: "$slate12",
 | 
			
		||||
        color: "$mauve12",
 | 
			
		||||
        "&:hover": {
 | 
			
		||||
          color: "$slate12",
 | 
			
		||||
          background: "$slate5",
 | 
			
		||||
          color: "$mauve12",
 | 
			
		||||
          background: "$mauve5",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
@@ -168,4 +181,22 @@ const Button = styled("button", {
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default Button;
 | 
			
		||||
const CustomButton: React.FC<
 | 
			
		||||
  React.ComponentProps<typeof Button> & { as?: string }
 | 
			
		||||
> = React.forwardRef(({ children, as = "button", ...rest }, ref) => (
 | 
			
		||||
  // @ts-expect-error
 | 
			
		||||
  <Button {...rest} ref={ref} as={as}>
 | 
			
		||||
    <Flex
 | 
			
		||||
      as="span"
 | 
			
		||||
      css={{ gap: "$2", alignItems: "center" }}
 | 
			
		||||
      className="button-content"
 | 
			
		||||
    >
 | 
			
		||||
      {children}
 | 
			
		||||
    </Flex>
 | 
			
		||||
    {rest.isLoading && <Spinner css={{ position: "absolute" }} />}
 | 
			
		||||
  </Button>
 | 
			
		||||
));
 | 
			
		||||
 | 
			
		||||
CustomButton.displayName = "CustomButton";
 | 
			
		||||
 | 
			
		||||
export default CustomButton;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,8 @@ const StyledOverlay = styled(DialogPrimitive.Overlay, {
 | 
			
		||||
 | 
			
		||||
const StyledContent = styled(DialogPrimitive.Content, {
 | 
			
		||||
  zIndex: 1000,
 | 
			
		||||
  backgroundColor: "$slate2",
 | 
			
		||||
  color: "$slate12",
 | 
			
		||||
  backgroundColor: "$mauve2",
 | 
			
		||||
  color: "$mauve12",
 | 
			
		||||
  borderRadius: "$md",
 | 
			
		||||
  boxShadow:
 | 
			
		||||
    "0px 10px 38px -5px rgba(22, 23, 24, 0.25), 0px 10px 20px -5px rgba(22, 23, 24, 0.2)",
 | 
			
		||||
@@ -47,7 +47,7 @@ const StyledContent = styled(DialogPrimitive.Content, {
 | 
			
		||||
  },
 | 
			
		||||
  "&:focus": { outline: "none" },
 | 
			
		||||
  ".dark &": {
 | 
			
		||||
    backgroundColor: "$slate5",
 | 
			
		||||
    backgroundColor: "$mauve5",
 | 
			
		||||
    boxShadow:
 | 
			
		||||
      "0px 10px 38px 0px rgba(22, 23, 24, 0.85), 0px 10px 20px 0px rgba(22, 23, 24, 0.6)",
 | 
			
		||||
  },
 | 
			
		||||
@@ -65,13 +65,13 @@ const Content: React.FC<{ css?: Stiches.CSS }> = ({ css, children }) => {
 | 
			
		||||
const StyledTitle = styled(DialogPrimitive.Title, {
 | 
			
		||||
  margin: 0,
 | 
			
		||||
  fontWeight: 500,
 | 
			
		||||
  color: "$slate12",
 | 
			
		||||
  color: "$mauve12",
 | 
			
		||||
  fontSize: 17,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const StyledDescription = styled(DialogPrimitive.Description, {
 | 
			
		||||
  margin: "10px 0 20px",
 | 
			
		||||
  color: "$slate11",
 | 
			
		||||
  color: "$mauve11",
 | 
			
		||||
  fontSize: 15,
 | 
			
		||||
  lineHeight: 1.5,
 | 
			
		||||
});
 | 
			
		||||
@@ -83,21 +83,3 @@ export const DialogContent = Content;
 | 
			
		||||
export const DialogTitle = StyledTitle;
 | 
			
		||||
export const DialogDescription = StyledDescription;
 | 
			
		||||
export const DialogClose = DialogPrimitive.Close;
 | 
			
		||||
 | 
			
		||||
const Input = styled("input", {
 | 
			
		||||
  all: "unset",
 | 
			
		||||
  width: "100%",
 | 
			
		||||
  flex: "1",
 | 
			
		||||
  display: "inline-flex",
 | 
			
		||||
  alignItems: "center",
 | 
			
		||||
  justifyContent: "center",
 | 
			
		||||
  borderRadius: 4,
 | 
			
		||||
  padding: "0 10px",
 | 
			
		||||
  fontSize: 15,
 | 
			
		||||
  lineHeight: 1,
 | 
			
		||||
  color: violet.violet11,
 | 
			
		||||
  boxShadow: `0 0 0 1px ${violet.violet7}`,
 | 
			
		||||
  height: 35,
 | 
			
		||||
 | 
			
		||||
  "&:focus": { boxShadow: `0 0 0 2px ${violet.violet8}` },
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ import { keyframes } from "@stitches/react";
 | 
			
		||||
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
 | 
			
		||||
 | 
			
		||||
import { styled } from "../stitches.config";
 | 
			
		||||
import { blackA, slateDark } from "@radix-ui/colors";
 | 
			
		||||
 | 
			
		||||
const slideUpAndFade = keyframes({
 | 
			
		||||
  "0%": { opacity: 0, transform: "translateY(2px)" },
 | 
			
		||||
@@ -26,7 +25,7 @@ const slideLeftAndFade = keyframes({
 | 
			
		||||
 | 
			
		||||
const StyledContent = styled(DropdownMenuPrimitive.Content, {
 | 
			
		||||
  minWidth: 220,
 | 
			
		||||
  backgroundColor: "$slate2",
 | 
			
		||||
  backgroundColor: "$mauve2",
 | 
			
		||||
  borderRadius: 6,
 | 
			
		||||
  padding: 5,
 | 
			
		||||
  boxShadow:
 | 
			
		||||
@@ -43,7 +42,7 @@ const StyledContent = styled(DropdownMenuPrimitive.Content, {
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  ".dark &": {
 | 
			
		||||
    backgroundColor: "$slate5",
 | 
			
		||||
    backgroundColor: "$mauve5",
 | 
			
		||||
    boxShadow:
 | 
			
		||||
      "0px 10px 38px -10px rgba(22, 23, 24, 0.85), 0px 10px 20px -15px rgba(22, 23, 24, 0.6)",
 | 
			
		||||
  },
 | 
			
		||||
@@ -53,7 +52,7 @@ const itemStyles = {
 | 
			
		||||
  all: "unset",
 | 
			
		||||
  fontSize: 13,
 | 
			
		||||
  lineHeight: 1,
 | 
			
		||||
  color: "$slate12",
 | 
			
		||||
  color: "$mauve12",
 | 
			
		||||
  borderRadius: 3,
 | 
			
		||||
  display: "flex",
 | 
			
		||||
  alignItems: "center",
 | 
			
		||||
@@ -65,7 +64,7 @@ const itemStyles = {
 | 
			
		||||
  gap: "$2",
 | 
			
		||||
 | 
			
		||||
  "&[data-disabled]": {
 | 
			
		||||
    color: "$slate9",
 | 
			
		||||
    color: "$mauve9",
 | 
			
		||||
    pointerEvents: "none",
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
@@ -94,12 +93,12 @@ const StyledLabel = styled(DropdownMenuPrimitive.Label, {
 | 
			
		||||
  paddingLeft: 25,
 | 
			
		||||
  fontSize: 12,
 | 
			
		||||
  lineHeight: "25px",
 | 
			
		||||
  color: "$slate11",
 | 
			
		||||
  color: "$mauve11",
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const StyledSeparator = styled(DropdownMenuPrimitive.Separator, {
 | 
			
		||||
  height: 1,
 | 
			
		||||
  backgroundColor: "$slate7",
 | 
			
		||||
  backgroundColor: "$mauve7",
 | 
			
		||||
  margin: 5,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -113,7 +112,7 @@ const StyledItemIndicator = styled(DropdownMenuPrimitive.ItemIndicator, {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const StyledArrow = styled(DropdownMenuPrimitive.Arrow, {
 | 
			
		||||
  fill: "$slate2",
 | 
			
		||||
  fill: "$mauve2",
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// Exports
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ import Stack from "./Stack";
 | 
			
		||||
import { useSnapshot } from "valtio";
 | 
			
		||||
import { useSession } from "next-auth/react";
 | 
			
		||||
import { useRouter } from "next/router";
 | 
			
		||||
import Input from "./Input";
 | 
			
		||||
 | 
			
		||||
const EditorNavigation = () => {
 | 
			
		||||
  const snap = useSnapshot(state);
 | 
			
		||||
@@ -40,7 +41,7 @@ const EditorNavigation = () => {
 | 
			
		||||
                  size="sm"
 | 
			
		||||
                  outline={snap.active !== index}
 | 
			
		||||
                  onClick={() => (state.active = index)}
 | 
			
		||||
                  key={file.name}
 | 
			
		||||
                  key={file.name + index}
 | 
			
		||||
                  css={{
 | 
			
		||||
                    "&:hover": {
 | 
			
		||||
                      span: {
 | 
			
		||||
@@ -54,13 +55,28 @@ const EditorNavigation = () => {
 | 
			
		||||
                    as="span"
 | 
			
		||||
                    css={{
 | 
			
		||||
                      display: "flex",
 | 
			
		||||
                      p: "1px",
 | 
			
		||||
                      p: "2px",
 | 
			
		||||
                      borderRadius: "$full",
 | 
			
		||||
                      mr: "-4px",
 | 
			
		||||
                      "&:hover": {
 | 
			
		||||
                        // boxSizing: "0px 0px 1px",
 | 
			
		||||
                        backgroundColor: "$mauve2",
 | 
			
		||||
                        color: "$mauve12",
 | 
			
		||||
                      },
 | 
			
		||||
                    }}
 | 
			
		||||
                    onClick={(ev: React.MouseEvent<HTMLElement>) => {
 | 
			
		||||
                      ev.stopPropagation();
 | 
			
		||||
                      // Remove file from state
 | 
			
		||||
                      state.files.splice(index, 1);
 | 
			
		||||
                      // Change active file state
 | 
			
		||||
                      // If deleted file is behind active tab
 | 
			
		||||
                      // we keep the current state otherwise
 | 
			
		||||
                      // select previous file on the list
 | 
			
		||||
                      state.active =
 | 
			
		||||
                        index > snap.active ? snap.active : snap.active - 1;
 | 
			
		||||
                    }}
 | 
			
		||||
                    onClick={() => state.files.splice(index, 1)}
 | 
			
		||||
                  >
 | 
			
		||||
                    <X size="13px" />
 | 
			
		||||
                    <X size="9px" weight="bold" />
 | 
			
		||||
                  </Box>
 | 
			
		||||
                </Button>
 | 
			
		||||
              ))}
 | 
			
		||||
@@ -79,10 +95,8 @@ const EditorNavigation = () => {
 | 
			
		||||
              <DialogContent>
 | 
			
		||||
                <DialogTitle>Create new file</DialogTitle>
 | 
			
		||||
                <DialogDescription>
 | 
			
		||||
                  <span>
 | 
			
		||||
                    Create empty C file or select one of the existing ones
 | 
			
		||||
                  </span>
 | 
			
		||||
                  <input
 | 
			
		||||
                  <label>Filename</label>
 | 
			
		||||
                  <Input
 | 
			
		||||
                    value={filename}
 | 
			
		||||
                    onChange={(e) => setFilename(e.target.value)}
 | 
			
		||||
                  />
 | 
			
		||||
@@ -120,7 +134,7 @@ const EditorNavigation = () => {
 | 
			
		||||
      <Flex
 | 
			
		||||
        css={{
 | 
			
		||||
          py: "$3",
 | 
			
		||||
          backgroundColor: "$slate3",
 | 
			
		||||
          backgroundColor: "$mauve3",
 | 
			
		||||
          zIndex: 1,
 | 
			
		||||
        }}
 | 
			
		||||
      >
 | 
			
		||||
@@ -131,7 +145,7 @@ const EditorNavigation = () => {
 | 
			
		||||
              marginLeft: "auto",
 | 
			
		||||
              flexShrink: 0,
 | 
			
		||||
              gap: "$0",
 | 
			
		||||
              border: "1px solid $slate10",
 | 
			
		||||
              border: "1px solid $mauve10",
 | 
			
		||||
              borderRadius: "$sm",
 | 
			
		||||
              zIndex: 9,
 | 
			
		||||
              position: "relative",
 | 
			
		||||
@@ -185,8 +199,10 @@ const EditorNavigation = () => {
 | 
			
		||||
              <DialogContent>
 | 
			
		||||
                <DialogTitle>Editor settings</DialogTitle>
 | 
			
		||||
                <DialogDescription>
 | 
			
		||||
                  <span>You can edit your editor settings here</span>
 | 
			
		||||
                  <input
 | 
			
		||||
                  <label>Tab size</label>
 | 
			
		||||
                  <Input
 | 
			
		||||
                    type="number"
 | 
			
		||||
                    min="1"
 | 
			
		||||
                    value={editorSettings.tabSize}
 | 
			
		||||
                    onChange={(e) =>
 | 
			
		||||
                      setEditorSettings((curr) => ({
 | 
			
		||||
 
 | 
			
		||||
@@ -12,11 +12,11 @@ const Footer = () => {
 | 
			
		||||
      as="footer"
 | 
			
		||||
      css={{
 | 
			
		||||
        display: "flex",
 | 
			
		||||
        borderTop: "1px solid $slate6",
 | 
			
		||||
        background: "$slate1",
 | 
			
		||||
        borderTop: "1px solid $mauve6",
 | 
			
		||||
        background: "$mauve1",
 | 
			
		||||
      }}
 | 
			
		||||
    >
 | 
			
		||||
      <Container css={{ py: "$4", flexShrink: 1 }}>
 | 
			
		||||
      <Container css={{ py: "$3", flexShrink: 1 }}>
 | 
			
		||||
        <Box
 | 
			
		||||
          as="pre"
 | 
			
		||||
          css={{
 | 
			
		||||
@@ -35,7 +35,7 @@ const Footer = () => {
 | 
			
		||||
          }}
 | 
			
		||||
        >
 | 
			
		||||
          {snap.logs.map((log, index) => (
 | 
			
		||||
            <Box key={log.type + index}>
 | 
			
		||||
            <Box as="span" key={log.type + index}>
 | 
			
		||||
              <LogText capitalize variant={log.type}>
 | 
			
		||||
                {log.type}:{" "}
 | 
			
		||||
              </LogText>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,32 +2,23 @@ import React, { useEffect, useRef } from "react";
 | 
			
		||||
import { useSnapshot, ref } from "valtio";
 | 
			
		||||
import Editor from "@monaco-editor/react";
 | 
			
		||||
import type monaco from "monaco-editor";
 | 
			
		||||
import { Play } from "phosphor-react";
 | 
			
		||||
import { ArrowBendLeftUp, Play } from "phosphor-react";
 | 
			
		||||
import { useTheme } from "next-themes";
 | 
			
		||||
 | 
			
		||||
import Box from "./Box";
 | 
			
		||||
import Button from "./Button";
 | 
			
		||||
import Container from "./Container";
 | 
			
		||||
import dark from "../theme/editor/amy.json";
 | 
			
		||||
import light from "../theme/editor/xcode_default.json";
 | 
			
		||||
import { compileCode, saveFile, state } from "../state";
 | 
			
		||||
 | 
			
		||||
import EditorNavigation from "./EditorNavigation";
 | 
			
		||||
import Spinner from "./Spinner";
 | 
			
		||||
import Text from "./Text";
 | 
			
		||||
 | 
			
		||||
const HooksEditor = () => {
 | 
			
		||||
  const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();
 | 
			
		||||
  const snap = useSnapshot(state);
 | 
			
		||||
  const { theme } = useTheme();
 | 
			
		||||
  // useEffect(() => {
 | 
			
		||||
  //   if (snap.editorCtx) {
 | 
			
		||||
  //     snap.editorCtx.getModels().forEach((model) => {
 | 
			
		||||
  //       // console.log(model.id,);
 | 
			
		||||
  //       snap.editorCtx?.createModel(model.getValue(), "c", model.uri);
 | 
			
		||||
  //     });
 | 
			
		||||
  //   }
 | 
			
		||||
  //   // eslint-disable-next-line react-hooks/exhaustive-deps
 | 
			
		||||
  // }, []);
 | 
			
		||||
  console.log("reinit");
 | 
			
		||||
  return (
 | 
			
		||||
    <Box
 | 
			
		||||
      css={{
 | 
			
		||||
@@ -36,48 +27,80 @@ const HooksEditor = () => {
 | 
			
		||||
        display: "flex",
 | 
			
		||||
        position: "relative",
 | 
			
		||||
        flexDirection: "column",
 | 
			
		||||
        backgroundColor: "$slate3",
 | 
			
		||||
        backgroundColor: "$mauve3",
 | 
			
		||||
        width: "100%",
 | 
			
		||||
      }}
 | 
			
		||||
    >
 | 
			
		||||
      <EditorNavigation />
 | 
			
		||||
      <Editor
 | 
			
		||||
        keepCurrentModel
 | 
			
		||||
        // defaultLanguage={snap.files?.[snap.active]?.language}
 | 
			
		||||
        path={snap.files?.[snap.active]?.name}
 | 
			
		||||
        // defaultValue={snap.files?.[snap.active]?.content}
 | 
			
		||||
        beforeMount={(monaco) => {
 | 
			
		||||
          if (!state.editorCtx) {
 | 
			
		||||
            state.editorCtx = ref(monaco.editor);
 | 
			
		||||
            // @ts-expect-error
 | 
			
		||||
            monaco.editor.defineTheme("dark", dark);
 | 
			
		||||
            // @ts-expect-error
 | 
			
		||||
            monaco.editor.defineTheme("light", light);
 | 
			
		||||
          }
 | 
			
		||||
        }}
 | 
			
		||||
        onMount={(editor, monaco) => {
 | 
			
		||||
          editorRef.current = editor;
 | 
			
		||||
          // hook editor to global state
 | 
			
		||||
          editor.updateOptions({
 | 
			
		||||
            minimap: {
 | 
			
		||||
              enabled: false,
 | 
			
		||||
            },
 | 
			
		||||
            ...snap.editorSettings,
 | 
			
		||||
          });
 | 
			
		||||
          editor.addCommand(
 | 
			
		||||
            monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S,
 | 
			
		||||
            () => {
 | 
			
		||||
              saveFile(editor.getValue());
 | 
			
		||||
      {snap.files.length > 0 ? (
 | 
			
		||||
        <Editor
 | 
			
		||||
          keepCurrentModel
 | 
			
		||||
          defaultLanguage={snap.files?.[snap.active]?.language}
 | 
			
		||||
          path={snap.files?.[snap.active]?.name}
 | 
			
		||||
          defaultValue={snap.files?.[snap.active]?.content}
 | 
			
		||||
          beforeMount={(monaco) => {
 | 
			
		||||
            if (!state.editorCtx) {
 | 
			
		||||
              state.editorCtx = ref(monaco.editor);
 | 
			
		||||
              // @ts-expect-error
 | 
			
		||||
              monaco.editor.defineTheme("dark", dark);
 | 
			
		||||
              // @ts-expect-error
 | 
			
		||||
              monaco.editor.defineTheme("light", light);
 | 
			
		||||
            }
 | 
			
		||||
          );
 | 
			
		||||
        }}
 | 
			
		||||
        theme={theme === "dark" ? "dark" : "light"}
 | 
			
		||||
      />
 | 
			
		||||
          }}
 | 
			
		||||
          onMount={(editor, monaco) => {
 | 
			
		||||
            editorRef.current = editor;
 | 
			
		||||
            // hook editor to global state
 | 
			
		||||
            editor.updateOptions({
 | 
			
		||||
              minimap: {
 | 
			
		||||
                enabled: false,
 | 
			
		||||
              },
 | 
			
		||||
              ...snap.editorSettings,
 | 
			
		||||
            });
 | 
			
		||||
            editor.addCommand(
 | 
			
		||||
              monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S,
 | 
			
		||||
              () => {
 | 
			
		||||
                saveFile(editor.getValue());
 | 
			
		||||
              }
 | 
			
		||||
            );
 | 
			
		||||
          }}
 | 
			
		||||
          theme={theme === "dark" ? "dark" : "light"}
 | 
			
		||||
        />
 | 
			
		||||
      ) : (
 | 
			
		||||
        <Container>
 | 
			
		||||
          <Box
 | 
			
		||||
            css={{
 | 
			
		||||
              flexDirection: "row",
 | 
			
		||||
              width: "$spaces$wide",
 | 
			
		||||
              gap: "$3",
 | 
			
		||||
              display: "inline-flex",
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            <Box css={{ display: "inline-flex", pl: "35px" }}>
 | 
			
		||||
              <ArrowBendLeftUp size={30} />
 | 
			
		||||
            </Box>
 | 
			
		||||
            <Box
 | 
			
		||||
              css={{ pl: "0px", pt: "15px", flex: 1, display: "inline-flex" }}
 | 
			
		||||
            >
 | 
			
		||||
              <Text
 | 
			
		||||
                css={{
 | 
			
		||||
                  fontSize: "14px",
 | 
			
		||||
                  maxWidth: "220px",
 | 
			
		||||
                  fontFamily: "$monospace",
 | 
			
		||||
                }}
 | 
			
		||||
              >
 | 
			
		||||
                Click the link above to create a your file (until we get the
 | 
			
		||||
                fancy modal, where you can select example files 😊)
 | 
			
		||||
              </Text>
 | 
			
		||||
            </Box>
 | 
			
		||||
          </Box>
 | 
			
		||||
        </Container>
 | 
			
		||||
      )}
 | 
			
		||||
      <Button
 | 
			
		||||
        variant="primary"
 | 
			
		||||
        uppercase
 | 
			
		||||
        disabled={!snap.files.length}
 | 
			
		||||
        isLoading={snap.compiling}
 | 
			
		||||
        onClick={() => compileCode(snap.active)}
 | 
			
		||||
        disabled={snap.compiling}
 | 
			
		||||
        css={{
 | 
			
		||||
          position: "absolute",
 | 
			
		||||
          bottom: "$4",
 | 
			
		||||
@@ -89,7 +112,6 @@ const HooksEditor = () => {
 | 
			
		||||
      >
 | 
			
		||||
        <Play weight="bold" size="16px" />
 | 
			
		||||
        Compile to Wasm
 | 
			
		||||
        {snap.compiling && <Spinner />}
 | 
			
		||||
      </Button>
 | 
			
		||||
    </Box>
 | 
			
		||||
  );
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										139
									
								
								components/Input.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								components/Input.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
			
		||||
import { styled } from "../stitches.config";
 | 
			
		||||
 | 
			
		||||
export const Input = styled("input", {
 | 
			
		||||
  // Reset
 | 
			
		||||
  appearance: "none",
 | 
			
		||||
  borderWidth: "0",
 | 
			
		||||
  boxSizing: "border-box",
 | 
			
		||||
  fontFamily: "inherit",
 | 
			
		||||
  outline: "none",
 | 
			
		||||
  width: "100%",
 | 
			
		||||
  flex: "1",
 | 
			
		||||
  backgroundColor: "$mauve4",
 | 
			
		||||
  display: "inline-flex",
 | 
			
		||||
  alignItems: "center",
 | 
			
		||||
  justifyContent: "center",
 | 
			
		||||
  borderRadius: "$sm",
 | 
			
		||||
  px: "$2",
 | 
			
		||||
  fontSize: "$md",
 | 
			
		||||
  lineHeight: 1,
 | 
			
		||||
  color: "$mauve12",
 | 
			
		||||
  boxShadow: `0 0 0 1px $colors$mauve8`,
 | 
			
		||||
  height: 35,
 | 
			
		||||
  WebkitTapHighlightColor: "rgba(0,0,0,0)",
 | 
			
		||||
  "&::before": {
 | 
			
		||||
    boxSizing: "border-box",
 | 
			
		||||
  },
 | 
			
		||||
  "&::after": {
 | 
			
		||||
    boxSizing: "border-box",
 | 
			
		||||
  },
 | 
			
		||||
  fontVariantNumeric: "tabular-nums",
 | 
			
		||||
 | 
			
		||||
  "&:-webkit-autofill": {
 | 
			
		||||
    boxShadow: "inset 0 0 0 1px $colors$blue6, inset 0 0 0 100px $colors$blue3",
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  "&:-webkit-autofill::first-line": {
 | 
			
		||||
    fontFamily: "$untitled",
 | 
			
		||||
    color: "$mauve12",
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  "&:focus": {
 | 
			
		||||
    boxShadow: `0 0 0 1px $colors$mauve10`,
 | 
			
		||||
    "&:-webkit-autofill": {
 | 
			
		||||
      boxShadow: `0 0 0 1px $colors$mauve10`,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  "&::placeholder": {
 | 
			
		||||
    color: "$mauve9",
 | 
			
		||||
  },
 | 
			
		||||
  "&:disabled": {
 | 
			
		||||
    pointerEvents: "none",
 | 
			
		||||
    backgroundColor: "$mauve2",
 | 
			
		||||
    color: "$mauve8",
 | 
			
		||||
    cursor: "not-allowed",
 | 
			
		||||
    "&::placeholder": {
 | 
			
		||||
      color: "$mauve7",
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  "&:read-only": {
 | 
			
		||||
    backgroundColor: "$mauve2",
 | 
			
		||||
    "&:focus": {
 | 
			
		||||
      boxShadow: "inset 0px 0px 0px 1px $colors$mauve7",
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  variants: {
 | 
			
		||||
    size: {
 | 
			
		||||
      md: {
 | 
			
		||||
        height: "$8",
 | 
			
		||||
        fontSize: "$1",
 | 
			
		||||
        lineHeight: "$sizes$5",
 | 
			
		||||
        "&:-webkit-autofill::first-line": {
 | 
			
		||||
          fontSize: "$1",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
      lg: {
 | 
			
		||||
        height: "$12",
 | 
			
		||||
        fontSize: "$2",
 | 
			
		||||
        lineHeight: "$sizes$6",
 | 
			
		||||
        "&:-webkit-autofill::first-line": {
 | 
			
		||||
          fontSize: "$3",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    variant: {
 | 
			
		||||
      ghost: {
 | 
			
		||||
        boxShadow: "none",
 | 
			
		||||
        backgroundColor: "transparent",
 | 
			
		||||
        "@hover": {
 | 
			
		||||
          "&:hover": {
 | 
			
		||||
            boxShadow: "inset 0 0 0 1px $colors$mauve7",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "&:focus": {
 | 
			
		||||
          backgroundColor: "$loContrast",
 | 
			
		||||
          boxShadow: `0 0 0 1px $colors$mauve10`,
 | 
			
		||||
        },
 | 
			
		||||
        "&:disabled": {
 | 
			
		||||
          backgroundColor: "transparent",
 | 
			
		||||
        },
 | 
			
		||||
        "&:read-only": {
 | 
			
		||||
          backgroundColor: "transparent",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    state: {
 | 
			
		||||
      invalid: {
 | 
			
		||||
        boxShadow: "inset 0 0 0 1px $colors$red7",
 | 
			
		||||
        "&:focus": {
 | 
			
		||||
          boxShadow:
 | 
			
		||||
            "inset 0px 0px 0px 1px $colors$red8, 0px 0px 0px 1px $colors$red8",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
      valid: {
 | 
			
		||||
        boxShadow: "inset 0 0 0 1px $colors$green7",
 | 
			
		||||
        "&:focus": {
 | 
			
		||||
          boxShadow:
 | 
			
		||||
            "inset 0px 0px 0px 1px $colors$green8, 0px 0px 0px 1px $colors$green8",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    cursor: {
 | 
			
		||||
      default: {
 | 
			
		||||
        cursor: "default",
 | 
			
		||||
        "&:focus": {
 | 
			
		||||
          cursor: "text",
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
      text: {
 | 
			
		||||
        cursor: "text",
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  defaultVariants: {
 | 
			
		||||
    size: "md",
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default Input;
 | 
			
		||||
@@ -22,9 +22,9 @@ import {
 | 
			
		||||
import Stack from "./Stack";
 | 
			
		||||
import Logo from "./Logo";
 | 
			
		||||
import Button from "./Button";
 | 
			
		||||
import Flex from "./Flex";
 | 
			
		||||
import Container from "./Container";
 | 
			
		||||
import Box from "./Box";
 | 
			
		||||
import Flex from "./Flex";
 | 
			
		||||
import ThemeChanger from "./ThemeChanger";
 | 
			
		||||
import { useRouter } from "next/router";
 | 
			
		||||
 | 
			
		||||
@@ -37,7 +37,7 @@ const Navigation = () => {
 | 
			
		||||
      css={{
 | 
			
		||||
        display: "flex",
 | 
			
		||||
        height: "60px",
 | 
			
		||||
        borderBottom: "1px solid $slate6",
 | 
			
		||||
        borderBottom: "1px solid $mauve6",
 | 
			
		||||
        position: "relative",
 | 
			
		||||
        zIndex: 2003,
 | 
			
		||||
      }}
 | 
			
		||||
@@ -52,42 +52,73 @@ const Navigation = () => {
 | 
			
		||||
        <Link href="/" passHref>
 | 
			
		||||
          <Box
 | 
			
		||||
            as="a"
 | 
			
		||||
            css={{ display: "flex", alignItems: "center", color: "$textColor" }}
 | 
			
		||||
            css={{
 | 
			
		||||
              display: "flex",
 | 
			
		||||
              alignItems: "center",
 | 
			
		||||
              color: "$textColor",
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            <Logo width="30px" height="30px" />
 | 
			
		||||
          </Box>
 | 
			
		||||
        </Link>
 | 
			
		||||
        <Stack css={{ ml: "$4", gap: "$3" }}>
 | 
			
		||||
          <Link href="/develop" passHref shallow>
 | 
			
		||||
            <Button
 | 
			
		||||
              as="a"
 | 
			
		||||
              outline={!router.pathname.includes("/develop")}
 | 
			
		||||
              uppercase
 | 
			
		||||
            >
 | 
			
		||||
              Develop
 | 
			
		||||
            </Button>
 | 
			
		||||
          </Link>
 | 
			
		||||
          <Link href="/deploy" passHref shallow>
 | 
			
		||||
            <Button
 | 
			
		||||
              as="a"
 | 
			
		||||
              outline={!router.pathname.includes("/deploy")}
 | 
			
		||||
              uppercase
 | 
			
		||||
            >
 | 
			
		||||
              Deploy
 | 
			
		||||
            </Button>
 | 
			
		||||
          </Link>
 | 
			
		||||
          <Link href="/test" passHref shallow>
 | 
			
		||||
            <Button
 | 
			
		||||
              as="a"
 | 
			
		||||
              outline={!router.pathname.includes("/test")}
 | 
			
		||||
              uppercase
 | 
			
		||||
            >
 | 
			
		||||
              Test
 | 
			
		||||
            </Button>
 | 
			
		||||
          </Link>
 | 
			
		||||
        </Stack>
 | 
			
		||||
        <Stack css={{ color: "text", ml: "auto" }}>
 | 
			
		||||
          <ThemeChanger />
 | 
			
		||||
        <Flex
 | 
			
		||||
          css={{
 | 
			
		||||
            flex: 1,
 | 
			
		||||
            flexWrap: "nowrap",
 | 
			
		||||
            marginLeft: "$3",
 | 
			
		||||
            overflowX: "scroll",
 | 
			
		||||
          }}
 | 
			
		||||
        >
 | 
			
		||||
          <Stack
 | 
			
		||||
            css={{
 | 
			
		||||
              ml: "$4",
 | 
			
		||||
              gap: "$3",
 | 
			
		||||
              flexWrap: "nowrap",
 | 
			
		||||
              alignItems: "center",
 | 
			
		||||
              pr: "$3",
 | 
			
		||||
            }}
 | 
			
		||||
          >
 | 
			
		||||
            <Link href="/develop" passHref shallow>
 | 
			
		||||
              <Button
 | 
			
		||||
                as="a"
 | 
			
		||||
                outline={!router.pathname.includes("/develop")}
 | 
			
		||||
                uppercase
 | 
			
		||||
              >
 | 
			
		||||
                Develop
 | 
			
		||||
              </Button>
 | 
			
		||||
            </Link>
 | 
			
		||||
            <Link href="/deploy" passHref shallow>
 | 
			
		||||
              <Button
 | 
			
		||||
                as="a"
 | 
			
		||||
                outline={!router.pathname.includes("/deploy")}
 | 
			
		||||
                uppercase
 | 
			
		||||
              >
 | 
			
		||||
                Deploy
 | 
			
		||||
              </Button>
 | 
			
		||||
            </Link>
 | 
			
		||||
            <Link href="/test" passHref shallow>
 | 
			
		||||
              <Button
 | 
			
		||||
                as="a"
 | 
			
		||||
                outline={!router.pathname.includes("/test")}
 | 
			
		||||
                uppercase
 | 
			
		||||
              >
 | 
			
		||||
                Test
 | 
			
		||||
              </Button>
 | 
			
		||||
            </Link>
 | 
			
		||||
            <ThemeChanger />
 | 
			
		||||
          </Stack>
 | 
			
		||||
        </Flex>
 | 
			
		||||
        <Stack
 | 
			
		||||
          css={{
 | 
			
		||||
            color: "text",
 | 
			
		||||
            ml: "auto",
 | 
			
		||||
            flexWrap: "nowrap",
 | 
			
		||||
            marginLeft: "$3",
 | 
			
		||||
            "@sm": {
 | 
			
		||||
              marginLeft: "auto",
 | 
			
		||||
            },
 | 
			
		||||
          }}
 | 
			
		||||
        >
 | 
			
		||||
          {status === "authenticated" && (
 | 
			
		||||
            <DropdownMenu>
 | 
			
		||||
              <DropdownMenuTrigger asChild>
 | 
			
		||||
@@ -135,12 +166,15 @@ const Navigation = () => {
 | 
			
		||||
              </DropdownMenuContent>
 | 
			
		||||
            </DropdownMenu>
 | 
			
		||||
          )}
 | 
			
		||||
          {status === "unauthenticated" && (
 | 
			
		||||
            <Button outline onClick={() => signIn("github")}>
 | 
			
		||||
              <GithubLogo size="16px" /> Github Login
 | 
			
		||||
          {status !== "authenticated" && (
 | 
			
		||||
            <Button
 | 
			
		||||
              isLoading={status === "loading"}
 | 
			
		||||
              outline
 | 
			
		||||
              onClick={() => signIn("github")}
 | 
			
		||||
            >
 | 
			
		||||
              <GithubLogo size="16px" /> GitHub Login
 | 
			
		||||
            </Button>
 | 
			
		||||
          )}
 | 
			
		||||
          {status === "loading" && "loading"}
 | 
			
		||||
          {/* <Box
 | 
			
		||||
              css={{
 | 
			
		||||
                border: "1px solid",
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,12 @@ import { styled, keyframes } from "../stitches.config";
 | 
			
		||||
 | 
			
		||||
const rotate = keyframes({
 | 
			
		||||
  "0%": { transform: "rotate(0deg)" },
 | 
			
		||||
  "100%": { transform: "rotate(360deg)" },
 | 
			
		||||
  "100%": { transform: "rotate(-360deg)" },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const Spinner = styled(SpinnerIcon, {
 | 
			
		||||
  animation: `${rotate} 150ms cubic-bezier(0.16, 1, 0.3, 1) infinite`,
 | 
			
		||||
  animation: `${rotate} 150ms linear infinite`,
 | 
			
		||||
  fontSize: "16px",
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default Spinner;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,14 @@ import type { NextPage } from "next";
 | 
			
		||||
import Head from "next/head";
 | 
			
		||||
import dynamic from "next/dynamic";
 | 
			
		||||
 | 
			
		||||
import Footer from "../../components/Footer";
 | 
			
		||||
 | 
			
		||||
const HooksEditor = dynamic(() => import("../../components/HooksEditor"), {
 | 
			
		||||
  ssr: false,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const Footer = dynamic(() => import("../../components/Footer"), {
 | 
			
		||||
  ssr: false,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const Home: NextPage = () => {
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
@@ -17,7 +19,6 @@ const Home: NextPage = () => {
 | 
			
		||||
      <main style={{ display: "flex", flex: 1 }}>
 | 
			
		||||
        <HooksEditor />
 | 
			
		||||
      </main>
 | 
			
		||||
 | 
			
		||||
      <Footer />
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
 
 | 
			
		||||
@@ -182,7 +182,7 @@
 | 
			
		||||
  ],
 | 
			
		||||
  "colors": {
 | 
			
		||||
    "editor.foreground": "#D0D0FF",
 | 
			
		||||
    "editor.background": "#202425",
 | 
			
		||||
    "editor.background": "#232326",
 | 
			
		||||
    "editor.selectionBackground": "#ffffff30",
 | 
			
		||||
    "editor.lineHighlightBackground": "#ffffff20",
 | 
			
		||||
    "editorCursor.foreground": "#7070FF",
 | 
			
		||||
 
 | 
			
		||||
@@ -89,7 +89,7 @@
 | 
			
		||||
  ],
 | 
			
		||||
  "colors": {
 | 
			
		||||
    "editor.foreground": "#000000",
 | 
			
		||||
    "editor.background": "#f1f3f5",
 | 
			
		||||
    "editor.background": "#f4f2f4",
 | 
			
		||||
    "editor.selectionBackground": "#B5D5FF",
 | 
			
		||||
    "editor.lineHighlightBackground": "#00000012",
 | 
			
		||||
    "editorCursor.foreground": "#000000",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user