diff --git a/package-lock.json b/package-lock.json index e72a4586..95ae0979 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@lezer/generator": "^1.2.2", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.3", + "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.2", "@radix-ui/react-icons": "^1.2.0", "@radix-ui/react-popover": "1.0.3", @@ -1325,6 +1326,32 @@ "react": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-direction": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", @@ -7657,6 +7684,28 @@ "@babel/runtime": "^7.13.10" } }, + "@radix-ui/react-dialog": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz", + "integrity": "sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, "@radix-ui/react-direction": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", diff --git a/package.json b/package.json index 20474a0d..07d8c090 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@lezer/generator": "^1.2.2", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.3", + "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.2", "@radix-ui/react-icons": "^1.2.0", "@radix-ui/react-popover": "1.0.3", diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index c5085350..c511546e 100644 Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ diff --git a/src-web/components/Dialog.tsx b/src-web/components/Dialog.tsx new file mode 100644 index 00000000..80c62ad2 --- /dev/null +++ b/src-web/components/Dialog.tsx @@ -0,0 +1,41 @@ +import classnames from 'classnames'; +import React from 'react'; +import * as D from '@radix-ui/react-dialog'; +import { Cross2Icon } from '@radix-ui/react-icons'; +import { IconButton } from './IconButton'; +import { HStack, VStack } from './Stacks'; + +interface Props { + children: React.ReactNode; + open: boolean; + onOpenChange: (open: boolean) => void; + title: string; + description?: string; +} + +export function Dialog({ children, open, onOpenChange, title, description }: Props) { + return ( + + ('#radix-portal')}> + + + + + + + + {title} + + {description && {description}} +
{children}
+
+
+
+
+ ); +} diff --git a/src-web/components/Dropdown.tsx b/src-web/components/Dropdown.tsx index fdd654dd..56287345 100644 --- a/src-web/components/Dropdown.tsx +++ b/src-web/components/Dropdown.tsx @@ -1,4 +1,4 @@ -import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; +import * as D from '@radix-ui/react-dropdown-menu'; import { DropdownMenuRadioGroup } from '@radix-ui/react-dropdown-menu'; import { CheckIcon } from '@radix-ui/react-icons'; import classnames from 'classnames'; @@ -32,7 +32,7 @@ export function DropdownMenuRadio({ }; return ( - + {children} @@ -46,7 +46,7 @@ export function DropdownMenuRadio({ - + ); } @@ -65,7 +65,7 @@ export interface DropdownProps { export function Dropdown({ children, items }: DropdownProps) { return ( - + {children} @@ -87,7 +87,7 @@ export function Dropdown({ children, items }: DropdownProps) { })} - + ); } @@ -99,17 +99,17 @@ interface DropdownMenuPortalProps { function DropdownMenuPortal({ children }: DropdownMenuPortalProps) { return ( - ('#radix-portal')}> + ('#radix-portal')}> {children} - + ); } -const DropdownMenuContent = forwardRef( +const DropdownMenuContent = forwardRef( function DropdownMenuContent( - { className, children, ...props }: DropdownMenu.DropdownMenuContentProps, + { className, children, ...props }: D.DropdownMenuContentProps, ref: ForwardedRef, ) { const [styles, setStyles] = useState<{ maxHeight: number }>(); @@ -134,7 +134,7 @@ const DropdownMenuContent = forwardRef {children} - + ); }, ); -type DropdownMenuItemProps = DropdownMenu.DropdownMenuItemProps & ItemInnerProps; +type DropdownMenuItemProps = D.DropdownMenuItemProps & ItemInnerProps; function DropdownMenuItem({ leftSlot, @@ -158,7 +158,7 @@ function DropdownMenuItem({ ...props }: DropdownMenuItemProps) { return ( - {children} - + ); } @@ -205,25 +205,22 @@ function DropdownMenuItem({ // ); // } -type DropdownMenuRadioItemProps = Omit< - DropdownMenu.DropdownMenuRadioItemProps & ItemInnerProps, - 'leftSlot' ->; +type DropdownMenuRadioItemProps = Omit; function DropdownMenuRadioItem({ rightSlot, children, ...props }: DropdownMenuRadioItemProps) { return ( - + + - + } rightSlot={rightSlot} > {children} - + ); } @@ -244,38 +241,30 @@ function DropdownMenuRadioItem({ rightSlot, children, ...props }: DropdownMenuRa // }, // ); -function DropdownMenuLabel({ className, children, ...props }: DropdownMenu.DropdownMenuLabelProps) { +function DropdownMenuLabel({ className, children, ...props }: D.DropdownMenuLabelProps) { return ( - + {children} - + ); } -function DropdownMenuSeparator({ className, ...props }: DropdownMenu.DropdownMenuSeparatorProps) { +function DropdownMenuSeparator({ className, ...props }: D.DropdownMenuSeparatorProps) { return ( - ); } -function DropdownMenuTrigger({ - children, - className, - ...props -}: DropdownMenu.DropdownMenuTriggerProps) { +function DropdownMenuTrigger({ children, className, ...props }: D.DropdownMenuTriggerProps) { return ( - + {children} - + ); } diff --git a/src-web/components/Editor/Editor.css b/src-web/components/Editor/Editor.css index 6704bae9..d644e8cb 100644 --- a/src-web/components/Editor/Editor.css +++ b/src-web/components/Editor/Editor.css @@ -29,10 +29,6 @@ @apply rounded-lg bg-gray-50; } -.cm-multiline .cm-editor .cm-scroller { - padding-bottom: 300px; -} - .cm-editor.cm-focused { outline: none !important; } diff --git a/src-web/components/Icon.tsx b/src-web/components/Icon.tsx index 07d5c18e..1e598582 100644 --- a/src-web/components/Icon.tsx +++ b/src-web/components/Icon.tsx @@ -3,6 +3,8 @@ import { CameraIcon, CheckIcon, CodeIcon, + Cross1Icon, + Cross2Icon, EyeOpenIcon, GearIcon, HomeIcon, @@ -17,7 +19,7 @@ import { UpdateIcon, } from '@radix-ui/react-icons'; import classnames from 'classnames'; -import { NamedExoticComponent } from 'react'; +import type { NamedExoticComponent } from 'react'; type IconName = | 'archive' @@ -34,6 +36,7 @@ type IconName = | 'plus-circled' | 'sun' | 'code' + | 'x' | 'trash' | 'moon'; @@ -50,6 +53,7 @@ const icons: Record> = { update: UpdateIcon, sun: SunIcon, moon: MoonIcon, + x: Cross2Icon, question: QuestionMarkIcon, eye: EyeOpenIcon, code: CodeIcon, diff --git a/src-web/components/IconButton.tsx b/src-web/components/IconButton.tsx index acb73418..e53d1735 100644 --- a/src-web/components/IconButton.tsx +++ b/src-web/components/IconButton.tsx @@ -1,6 +1,8 @@ import { forwardRef } from 'react'; -import { Icon, IconProps } from './Icon'; -import { Button, ButtonProps } from './Button'; +import type { IconProps } from './Icon'; +import { Icon } from './Icon'; +import type { ButtonProps } from './Button'; +import { Button } from './Button'; import classnames from 'classnames'; type Props = Omit & ButtonProps; diff --git a/src-web/components/Input.tsx b/src-web/components/Input.tsx index 191afcdc..277d2b81 100644 --- a/src-web/components/Input.tsx +++ b/src-web/components/Input.tsx @@ -12,6 +12,7 @@ interface Props extends Omit, 'size' | 'on containerClassName?: string; onChange?: (value: string) => void; onSubmit?: () => void; + contentType?: string; useTemplating?: boolean; useEditor?: boolean; leftSlot?: ReactNode; @@ -30,6 +31,7 @@ export function Input({ useTemplating, size = 'md', useEditor, + contentType, onChange, name, leftSlot, @@ -39,34 +41,34 @@ export function Input({ }: Props) { const id = `input-${name}`; return ( - - {leftSlot} - - + + + + {leftSlot} {useEditor ? ( )} - - {rightSlot} - + {rightSlot} + + ); } diff --git a/src-web/components/Sidebar.tsx b/src-web/components/Sidebar.tsx index dfc5036d..3c567be4 100644 --- a/src-web/components/Sidebar.tsx +++ b/src-web/components/Sidebar.tsx @@ -1,12 +1,14 @@ import classnames from 'classnames'; import type { HTMLAttributes } from 'react'; -import React from 'react'; +import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import { useRequestCreate } from '../hooks/useRequest'; import useTheme from '../hooks/useTheme'; import type { HttpRequest } from '../lib/models'; import { Button } from './Button'; +import { Dialog } from './Dialog'; import { IconButton } from './IconButton'; +import { Input } from './Input'; import { HStack, VStack } from './Stacks'; import { WindowDragRegion } from './WindowDragRegion'; @@ -19,12 +21,27 @@ interface Props extends Omit, 'children'> { export function Sidebar({ className, activeRequestId, workspaceId, requests, ...props }: Props) { const createRequest = useRequestCreate({ workspaceId, navigateAfter: true }); const { toggleTheme } = useTheme(); + const [open, setOpen] = useState(false); return (
+ +

This is the body

+ + +
+ { + setOpen((v) => !v); + }} + />