Jon Taylor commited on
Commit
24d8b3c
1 Parent(s): dd10606

ui complete

Browse files
frontend/app/components/Card.js CHANGED
@@ -1,7 +1,7 @@
1
  export default function Card({ children }) {
2
  return (
3
  <div className="rounded-xl bg-white border border-zinc-200 p-2 w-full max-w-3xl aspect-video">
4
- <div className="overflow-hidden flex-1 h-full bg-zinc-50 rounded-md flex items-center justify-center">
5
  {children}
6
  </div>
7
  </div>
 
1
  export default function Card({ children }) {
2
  return (
3
  <div className="rounded-xl bg-white border border-zinc-200 p-2 w-full max-w-3xl aspect-video">
4
+ <div className="relative overflow-hidden flex-1 h-full bg-zinc-50 rounded-md flex items-center justify-center">
5
  {children}
6
  </div>
7
  </div>
frontend/app/components/Controls.js CHANGED
@@ -3,7 +3,6 @@
3
  import {
4
  Accordion,
5
  ActionIcon,
6
- Button,
7
  SegmentedControl,
8
  Textarea,
9
  } from "@mantine/core";
@@ -14,7 +13,8 @@ import {
14
  IconPlus,
15
  IconRotateClockwise,
16
  } from "@tabler/icons-react";
17
- import React from "react";
 
18
  import FieldSet from "./FieldSet";
19
  import Label from "./Label";
20
  import SelectInput from "./SelectInput";
@@ -33,6 +33,17 @@ export const Controls = React.memo(() => {
33
  },
34
  });
35
 
 
 
 
 
 
 
 
 
 
 
 
36
  return (
37
  <div className="flex flex-col gap-4">
38
  <Accordion
@@ -61,7 +72,9 @@ export const Controls = React.memo(() => {
61
  className="rounded-md"
62
  minRows={3}
63
  defaultValue={form.getInputProps("positivePrompt").value}
64
- onChange={(v) => form.setFieldValue("positivePrompt", v)}
 
 
65
  classNames={{
66
  input:
67
  "p-3 font-mono text-emerald-800 bg-emerald-600/[0.07] border-emerald-500/30 focus:border-emerald-500 focus:ring-1 focus:ring-inset focus:ring-emerald-500",
@@ -80,7 +93,9 @@ export const Controls = React.memo(() => {
80
  className="rounded-md"
81
  minRows={3}
82
  defaultValue={form.getInputProps("negativePrompt").value}
83
- onChange={(v) => form.setFieldValue("negativePrompt", v)}
 
 
84
  classNames={{
85
  input:
86
  "p-3 font-mono text-rose-800 bg-rose-600/[0.07] border-rose-500/30 focus:border-rose-500 focus:ring-1 focus:ring-inset focus:ring-rose-500",
@@ -173,9 +188,6 @@ export const Controls = React.memo(() => {
173
  <Accordion.Panel>Control net</Accordion.Panel>
174
  </Accordion.Item>
175
  </Accordion>
176
- <Button className="rounded-full" onClick={() => console.log(form.values)}>
177
- Submit
178
- </Button>
179
  </div>
180
  );
181
  });
 
3
  import {
4
  Accordion,
5
  ActionIcon,
 
6
  SegmentedControl,
7
  Textarea,
8
  } from "@mantine/core";
 
13
  IconPlus,
14
  IconRotateClockwise,
15
  } from "@tabler/icons-react";
16
+ import React, { useEffect } from "react";
17
+ import useDebounce from "../hooks/debounce";
18
  import FieldSet from "./FieldSet";
19
  import Label from "./Label";
20
  import SelectInput from "./SelectInput";
 
33
  },
34
  });
35
 
36
+ const debounce = useDebounce();
37
+
38
+ const handleChange = (event) => {
39
+ console.log(event);
40
+ };
41
+
42
+ useEffect(() => {
43
+ if (!form) return;
44
+ form.isDirty() && debounce(() => handleChange(form.values), 500);
45
+ }, [form, debounce]);
46
+
47
  return (
48
  <div className="flex flex-col gap-4">
49
  <Accordion
 
72
  className="rounded-md"
73
  minRows={3}
74
  defaultValue={form.getInputProps("positivePrompt").value}
75
+ onChange={(e) =>
76
+ form.setFieldValue("positivePrompt", e.target.value)
77
+ }
78
  classNames={{
79
  input:
80
  "p-3 font-mono text-emerald-800 bg-emerald-600/[0.07] border-emerald-500/30 focus:border-emerald-500 focus:ring-1 focus:ring-inset focus:ring-emerald-500",
 
93
  className="rounded-md"
94
  minRows={3}
95
  defaultValue={form.getInputProps("negativePrompt").value}
96
+ onChange={(e) =>
97
+ form.setFieldValue("negativePrompt", e.target.value)
98
+ }
99
  classNames={{
100
  input:
101
  "p-3 font-mono text-rose-800 bg-rose-600/[0.07] border-rose-500/30 focus:border-rose-500 focus:ring-1 focus:ring-inset focus:ring-rose-500",
 
188
  <Accordion.Panel>Control net</Accordion.Panel>
189
  </Accordion.Item>
190
  </Accordion>
 
 
 
191
  </div>
192
  );
193
  });
frontend/app/hooks/debounce.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useCallback, useEffect, useRef } from "react";
2
+
3
+ export default function useDebounce() {
4
+ // Using a ref to store the current timeout identifier
5
+ // This is to ensure it persists across renders without causing re-renders
6
+ const timeoutRef = useRef(null);
7
+
8
+ // The debounce function
9
+ const debounce = useCallback((func, wait) => {
10
+ // Clear any existing timeout to ensure only the latest call is executed
11
+ if (timeoutRef.current) {
12
+ clearTimeout(timeoutRef.current);
13
+ }
14
+
15
+ // Set the new timeout
16
+ timeoutRef.current = setTimeout(() => {
17
+ func();
18
+ }, wait);
19
+ }, []);
20
+
21
+ // Cleanup function to clear the timeout when the component is unmounted
22
+ useEffect(() => {
23
+ return () => {
24
+ if (timeoutRef.current) {
25
+ clearTimeout(timeoutRef.current);
26
+ }
27
+ };
28
+ }, []);
29
+
30
+ return debounce;
31
+ }
frontend/app/layout.js CHANGED
@@ -25,16 +25,16 @@ const theme = createTheme({
25
  defaultRadius: "md",
26
  colors: {
27
  darkIndigo: [
28
- "#eef3ff",
29
- "#dee2f2",
30
- "#bdc2de",
31
- "#98a0ca",
32
- "#7a84ba",
33
- "#6672b0",
34
- "#5c68ac",
35
- "#4c5897",
36
- "#424e88",
37
- "#364379",
38
  ],
39
  },
40
  primaryColor: "darkIndigo",
 
25
  defaultRadius: "md",
26
  colors: {
27
  darkIndigo: [
28
+ "#e0e7ff",
29
+ "#c7d2fe",
30
+ "#a5b4fc",
31
+ "#818cf8",
32
+ "#6366f1",
33
+ "#4f46e5",
34
+ "#4338ca",
35
+ "#3730a3",
36
+ "#312e81",
37
+ "#1e1b4b",
38
  ],
39
  },
40
  primaryColor: "darkIndigo",
frontend/app/test/page.js CHANGED
@@ -1,6 +1,6 @@
1
  "use client";
2
 
3
- import { ActionIcon } from "@mantine/core";
4
  import {
5
  IconDoorExit,
6
  IconInfoSquareRoundedFilled,
@@ -57,14 +57,14 @@ export default function Test() {
57
 
58
  <main className="w-full h-full flex flex-col max-w-lg xl:max-w-2xl 2xl:max-w-full 2xl:flex-row items-center justify-center p-6 gap-3">
59
  <Card>
60
- <iframe
61
- class="w-full aspect-video"
62
- src="https://www.youtube.com/embed/dQw4w9WgXcQ"
63
- allowFullScreen
64
- ></iframe>
65
  </Card>
66
  <Card>
67
- <Avatar />
 
 
 
 
68
  </Card>
69
  </main>
70
 
 
1
  "use client";
2
 
3
+ import { ActionIcon, LoadingOverlay } from "@mantine/core";
4
  import {
5
  IconDoorExit,
6
  IconInfoSquareRoundedFilled,
 
57
 
58
  <main className="w-full h-full flex flex-col max-w-lg xl:max-w-2xl 2xl:max-w-full 2xl:flex-row items-center justify-center p-6 gap-3">
59
  <Card>
60
+ <Avatar />
 
 
 
 
61
  </Card>
62
  <Card>
63
+ <LoadingOverlay
64
+ visible={true}
65
+ zIndex={1000}
66
+ className="bg-zinc-300"
67
+ />
68
  </Card>
69
  </main>
70