diff --git a/src/components/canvas.tsx b/src/components/canvas.tsx index 49ffa07..173f785 100644 --- a/src/components/canvas.tsx +++ b/src/components/canvas.tsx @@ -1,24 +1,20 @@ import { TransformableImage } from "@/components/transformable-image"; - import type { KonvaEventObject } from "konva/lib/Node"; - -import { Layer, Stage } from "react-konva"; +import { Layer, Rect, Stage } from "react-konva"; import TransformableText from "./transformable-text"; import { useAppDispatch, useAppSelector } from "@/hooks"; import { appSlice, deselectItem } from "@/store/app.slice"; -import { TextToolbar } from "./text-toolbar"; import { useEffect, useState } from "react"; -import { EditableText } from "@/components/editable-resizable-text"; -import { ImageToolbar } from "@/components/image-toolbar"; import { Toolbar } from "@/components/toolbar"; const Canvas = () => { const dispatch = useAppDispatch(); - + const stage = useAppSelector((state) => state.app.stage); const selectedItemId = useAppSelector((state) => state.app.selectedItemId); const selectItem = (id: string) => dispatch(appSlice.actions.selectItem(id)); const texts = useAppSelector((state) => state.app.texts); const images = useAppSelector((state) => state.app.images); + const backgroundRects = useAppSelector((state) => state.app.backgroundRects); const deselectHandler = ( e: KonvaEventObject | KonvaEventObject, @@ -32,9 +28,6 @@ const Canvas = () => { const [isEditing, setIsEditing] = useState(false); const [isTransforming, setIsTransforming] = useState(false); - const [text, setText] = useState("Click to resize. Double click to edit."); - const [width, setWidth] = useState(200); - const [height, setHeight] = useState(200); const [selected, setSelected] = useState(false); useEffect(() => { @@ -61,8 +54,8 @@ const Canvas = () => { @@ -94,23 +87,20 @@ const Canvas = () => { ); })} - {/* {*/} - {/* setWidth(newWidth);*/} - {/* setHeight(newHeight);*/} - {/* }}*/} - {/* isEditing={isEditing}*/} - {/* isTransforming={isTransforming}*/} - {/* onToggleEdit={toggleEdit}*/} - {/* onToggleTransform={toggleTransforming}*/} - {/* onChange={setText}*/} - {/*/>*/} + {backgroundRects.map((rect, i) => { + return ( + + ); + })} + {/* + + */} ); diff --git a/src/components/image-toolbar.tsx b/src/components/image-toolbar.tsx index 8a76b37..6247d82 100644 --- a/src/components/image-toolbar.tsx +++ b/src/components/image-toolbar.tsx @@ -9,7 +9,9 @@ import { Separator } from "@/components/ui/separator"; export function ImageToolbar({ selectedItemId, currentImage }) { const dispatch = useAppDispatch(); const flipImageVerticaly = () => { - const editOffsetY = currentImage.height / 2; + const currentScale = currentImage.scaleY; + let editOffsetY = currentImage.height; + if (currentScale < 0) editOffsetY = 0; const editScaleY = -1 * currentImage.scaleY; dispatch( updateImage({ @@ -21,7 +23,9 @@ export function ImageToolbar({ selectedItemId, currentImage }) { }; const flipImageHorizontaly = () => { - const editOffsetX = currentImage.width / 2; + const currentScale = currentImage.scaleX; + let editOffsetX = currentImage.width; + if (currentScale < 0) editOffsetX = 0; const editScaleX = -1 * currentImage.scaleX; dispatch( updateImage({ diff --git a/src/components/layout/sidebar/background-select.tsx b/src/components/layout/sidebar/background-select.tsx new file mode 100644 index 0000000..83d1b52 --- /dev/null +++ b/src/components/layout/sidebar/background-select.tsx @@ -0,0 +1,74 @@ +import React, { useState } from "react"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { RxLayout } from "react-icons/rx"; +import { Label } from "@/components/ui/label"; +import { useAppDispatch } from "@/hooks"; +import { selectBackground } from "@/store/app.slice"; + +export const BackgroundSelect = () => { + const dispatch = useAppDispatch(); + const [open, setOpen] = useState(false); + + const handleBackgroundSelect = (color: string) => { + dispatch(selectBackground(color)); + }; + + const handleSizeSelect = () => { + setOpen(false); + }; + return ( + + + + + + + + Fond + + + +
+
handleBackgroundSelect("red")} + > + Red +
+
+
+ +
+
+ +
+
+
+
+
+ ); +}; diff --git a/src/components/layout/sidebar/image-input.tsx b/src/components/layout/sidebar/image-input.tsx index f8fc39d..ab7c408 100644 --- a/src/components/layout/sidebar/image-input.tsx +++ b/src/components/layout/sidebar/image-input.tsx @@ -6,11 +6,11 @@ import { } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; -import { PiImageDuotone } from "react-icons/pi"; import { Input } from "@/components/ui/input"; import { addImage } from "@/store/app.slice"; import { useAppDispatch } from "@/hooks"; import { Card, CardHeader, CardTitle } from "@/components/ui/card"; +import { RxImage } from "react-icons/rx"; function ImageInput() { const dispatch = useAppDispatch(); @@ -32,8 +32,8 @@ function ImageInput() { return ( - diff --git a/src/components/layout/sidebar/layers.tsx b/src/components/layout/sidebar/layers.tsx new file mode 100644 index 0000000..7bcde7a --- /dev/null +++ b/src/components/layout/sidebar/layers.tsx @@ -0,0 +1,31 @@ +import React from "react"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { RxStack } from "react-icons/rx"; + +export const Layers = () => { + return ( + + + + + + + + Layer + + +
+
+
+
+
+ ); +}; diff --git a/src/components/layout/sidebar/select-template.tsx b/src/components/layout/sidebar/select-template.tsx index 641f526..8450f67 100644 --- a/src/components/layout/sidebar/select-template.tsx +++ b/src/components/layout/sidebar/select-template.tsx @@ -1,12 +1,11 @@ -import React, { ChangeEvent } from "react"; +import React from "react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; -import { PiFrameCornersDuotone, PiImageDuotone } from "react-icons/pi"; -import { Input } from "@/components/ui/input"; +import { PiFrameCornersDuotone } from "react-icons/pi"; import { useAppDispatch } from "@/hooks"; import { Card, CardHeader, CardTitle } from "@/components/ui/card"; @@ -25,7 +24,7 @@ export function SelectTemplate() { - Choisissez un cadre + Cadre
diff --git a/src/components/layout/sidebar/sidebar.tsx b/src/components/layout/sidebar/sidebar.tsx index 2c0a375..48698fb 100644 --- a/src/components/layout/sidebar/sidebar.tsx +++ b/src/components/layout/sidebar/sidebar.tsx @@ -1,17 +1,18 @@ import { TextInput } from "@/components/layout/sidebar/text-input"; import ImageInput from "@/components/layout/sidebar/image-input"; -import { SelectTemplate } from "@/components/layout/sidebar/select-template"; -import { Button } from "@/components/ui/button"; -import { useAppDispatch } from "@/hooks"; import SizeSelect from "@/components/layout/sidebar/size-select"; +import { BackgroundSelect } from "@/components/layout/sidebar/background-select"; +import { Layers } from "@/components/layout/sidebar/layers"; export function Sidebar() { return ( -
+
- + {/**/} + +
); } diff --git a/src/components/layout/sidebar/size-select.tsx b/src/components/layout/sidebar/size-select.tsx index 3516857..c835928 100644 --- a/src/components/layout/sidebar/size-select.tsx +++ b/src/components/layout/sidebar/size-select.tsx @@ -5,15 +5,22 @@ import { PopoverTrigger, } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; -import { PiTextT } from "react-icons/pi"; import { Card, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; -import { Textarea } from "@/components/ui/textarea"; -import { addText } from "@/store/app.slice"; -import { SlSizeFullscreen } from "react-icons/sl"; +import { RxMove } from "react-icons/rx"; +import { useAppDispatch } from "@/hooks"; +import { updateStage } from "@/store/app.slice"; const SizeSelect = () => { + const dispatch = useAppDispatch(); const [open, setOpen] = useState(false); + const handleStageSizeSelect = ( + width: number | undefined, + height: number | undefined, + ) => { + dispatch(updateStage({ width, height })); + }; + const handleSizeSelect = () => { setOpen(false); }; @@ -22,10 +29,10 @@ const SizeSelect = () => { @@ -35,17 +42,23 @@ const SizeSelect = () => {
- - - + + +
- - - - + {/**/} + {/* */} + {/* */} + {/**/}
diff --git a/src/components/layout/sidebar/text-input.tsx b/src/components/layout/sidebar/text-input.tsx index 831b501..873c75d 100644 --- a/src/components/layout/sidebar/text-input.tsx +++ b/src/components/layout/sidebar/text-input.tsx @@ -8,10 +8,8 @@ import { Textarea } from "@/components/ui/textarea"; import { Button } from "@/components/ui/button"; import { addText } from "@/store/app.slice"; import { useAppDispatch } from "@/hooks"; -import { Input } from "@/components/ui/input"; -import { PiTextT } from "react-icons/pi"; import { Card, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; -import { Label } from "@/components/ui/label"; +import { RxText } from "react-icons/rx"; export function TextInput() { const dispatch = useAppDispatch(); @@ -30,16 +28,16 @@ export function TextInput() { - - Ajouter votre text + + Text