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 (