From 38d752f142718f9bef6b0b016648b6075f64bd11 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Mon, 29 Jul 2024 02:46:07 +0530 Subject: [PATCH 01/42] Style(WIP): added few ui enhancements --- bun.lockb | Bin 625160 -> 630128 bytes package.json | 1 + src/components/controls/index.tsx | 2 +- src/components/controls/no-selection.tsx | 8 +- src/components/core/button.tsx | 13 +++- src/components/core/switch/index.tsx | 27 +++++++ src/components/footer.tsx | 10 +-- src/components/index.tsx | 8 +- src/components/operations/export-button.tsx | 10 ++- src/components/operations/grid-switch.tsx | 15 ++-- src/components/operations/index.tsx | 23 +++--- src/components/toolbar/data.tsx | 26 +++++-- src/components/toolbar/index.tsx | 35 ++++----- src/components/workspace/index.tsx | 2 +- src/components/workspace/visibility.tsx | 4 +- src/components/workspace/zoom.tsx | 82 ++++++++++---------- 16 files changed, 152 insertions(+), 114 deletions(-) diff --git a/bun.lockb b/bun.lockb index af392d65f5de2b010bedc4c93450f81c5a1b560c..66d68d54cdf7b5eb1b3ed8a41270b840b20d51c5 100755 GIT binary patch delta 128605 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 Y+UA6OPg+FIld}3NzdoUkld`V*U$yPmw*UYD delta 125971 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 diff --git a/package.json b/package.json index 30d3849..3a61b47 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "@radix-ui/react-popover": "1.0.7", "@radix-ui/react-radio-group": "1.1.3", "@radix-ui/react-select": "2.0.0", + "@radix-ui/react-switch": "1.1.0", "@radix-ui/react-tooltip": "1.0.6", "@reduxjs/toolkit": "2.1.0", "class-variance-authority": "0.7.0", diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index c0a8fd6..4be39fd 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -56,7 +56,7 @@ const Controls = ({ options, styles }: IControlProps) => {
{ return ( -
- No element selected - +
+ +

No element selected

); }; diff --git a/src/components/core/button.tsx b/src/components/core/button.tsx index d5c5c8d..76e39fe 100644 --- a/src/components/core/button.tsx +++ b/src/components/core/button.tsx @@ -2,16 +2,23 @@ import { cva } from "class-variance-authority"; import { twMerge } from "tailwind-merge"; const buttonVariants = cva( - "group flex justify-center items-center cursor-pointer rounded-md px-[1.15rem] py-[0.4rem] font-semibold outline-none transition-all duration-medium gap-2 splash", + "group flex justify-center items-center cursor-pointer rounded-md font-medium outline-none transition-all duration-medium gap-2 splash", { variants: { variant: { primary: "bg-black text-white", - secondary: "text-black bg-white border border-black/20 after:bg-black/[0.15]" + secondary: "text-black bg-slate-100 after:bg-black/[0.15]" + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10" } }, defaultVariants: { - variant: "primary" + variant: "primary", + size: "default" } } ); diff --git a/src/components/core/switch/index.tsx b/src/components/core/switch/index.tsx index 99a8f17..3ac3e70 100644 --- a/src/components/core/switch/index.tsx +++ b/src/components/core/switch/index.tsx @@ -1 +1,28 @@ +import * as React from "react"; +import * as SwitchPrimitives from "@radix-ui/react-switch"; +import { twMerge } from "tailwind-merge"; + export { default as TwinSwitch } from "./twin-switch"; + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +Switch.displayName = SwitchPrimitives.Root.displayName; + +export { Switch }; diff --git a/src/components/footer.tsx b/src/components/footer.tsx index 7f7bdcd..a7cac6a 100644 --- a/src/components/footer.tsx +++ b/src/components/footer.tsx @@ -11,18 +11,18 @@ const Footer: React.FC = ({ options: { showFooter = true } = {}, ...p return (
- - React Seat Toolkit - {selectedTool && ( {tools[selectedTool]?.description}} duration={0.2} diff --git a/src/components/index.tsx b/src/components/index.tsx index d5f4937..4fe8ac7 100644 --- a/src/components/index.tsx +++ b/src/components/index.tsx @@ -16,17 +16,17 @@ const Designer: React.FC = (props) => { <>
- +
- +
diff --git a/src/components/operations/export-button.tsx b/src/components/operations/export-button.tsx index ed877be..8115436 100644 --- a/src/components/operations/export-button.tsx +++ b/src/components/operations/export-button.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import { Braces } from "lucide-react"; +import { Copy } from "lucide-react"; import { twMerge } from "tailwind-merge"; import { useBreakpoint } from "@/hooks"; import { ISTKData } from "@/types"; @@ -38,9 +38,10 @@ const ExportAction: React.FC = ({ text = "Export JSON", onEx return ( @@ -48,12 +49,13 @@ const ExportAction: React.FC = ({ text = "Export JSON", onEx return ( } + icon={} label={text} onClick={onExportJson} loading={loading} - className={styles?.core?.button?.className} + className={twMerge("w-10", styles?.core?.button?.className)} style={styles?.core?.button?.properties} + variant="secondary" /> ); }; diff --git a/src/components/operations/grid-switch.tsx b/src/components/operations/grid-switch.tsx index 95214b6..4a23f12 100644 --- a/src/components/operations/grid-switch.tsx +++ b/src/components/operations/grid-switch.tsx @@ -1,18 +1,15 @@ import { useSelector } from "react-redux"; -import { twMerge } from "tailwind-merge"; import { store } from "@/store"; import { toggleGrid } from "@/store/reducers/editor"; -import { TwinSwitch } from "../core"; +import { Label, Switch } from "../core"; -const GridSwitch = ({ className }) => { +const GridSwitch = () => { const grid = useSelector((state: any) => state.editor.grid); return ( - store.dispatch(toggleGrid(value == "Grid"))} - /> +
+ + store.dispatch(toggleGrid(checked))} /> +
); }; diff --git a/src/components/operations/index.tsx b/src/components/operations/index.tsx index c4d84a3..33e9598 100644 --- a/src/components/operations/index.tsx +++ b/src/components/operations/index.tsx @@ -1,11 +1,12 @@ import { ChangeEvent, useMemo } from "react"; -import { Cog } from "lucide-react"; +import { Settings } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; import { ids } from "@/constants"; import { store } from "@/store"; import { locationPlaceholder, setLocation, toggleControls } from "@/store/reducers/editor"; import { ISTKProps } from "@/types"; +import { IconButton } from "../core"; import { default as ExportAction } from "./export-button"; import { default as GridSwitch } from "./grid-switch"; @@ -22,7 +23,7 @@ const Operations: React.FC = ({ const styles = props.styles?.operations; - const OperationTriggerIcon = operationTriggerIcon ?? Cog; + const OperationTriggerIcon = operationTriggerIcon ?? Settings; const onLocationChange = (e: ChangeEvent) => { store.dispatch(setLocation(e.target.value)); @@ -32,7 +33,7 @@ const Operations: React.FC = ({
= ({ = ({ style={styles?.input?.properties} onChange={onLocationChange} /> -
- {showGridSwitch && } +
+ {showGridSwitch && } - } + variant="secondary" onClick={onCogClick} />
diff --git a/src/components/toolbar/data.tsx b/src/components/toolbar/data.tsx index eb3adce..6869d56 100644 --- a/src/components/toolbar/data.tsx +++ b/src/components/toolbar/data.tsx @@ -1,4 +1,14 @@ -import { Circle, Eraser, Hand, Image, MousePointer2, PenTool, Shapes, SquareEqual, Type } from "lucide-react"; +import { + CaseSensitive, + Circle, + Codesandbox, + GripHorizontal, + Highlighter, + ImagePlus, + MousePointer2, + PenTool, + Pentagon +} from "lucide-react"; import { twMerge } from "tailwind-merge"; export enum Tool { @@ -28,7 +38,7 @@ export const tools = { description: "Select and move objects" }, [Tool.Eraser]: { - icon: Eraser, + icon: Highlighter, shortcut: "E", description: "Click on an element to delete it" }, @@ -40,8 +50,8 @@ export const tools = { description: "Click anywhere to place a seat" }, [Tool.Booth]: { - icon: SquareEqual, - iconCursor: (props: any) => , + icon: Codesandbox, + iconCursor: (props: any) => , shortcut: "B", description: "Click anywhere to place a booth" }, @@ -54,22 +64,22 @@ export const tools = { description: "Click anywhere to start drawing a shape" }, [Tool.Text]: { - icon: Type, + icon: CaseSensitive, shortcut: "T", description: "Click anywhere to place text" }, [Tool.Shape]: { - icon: Shapes, + icon: Pentagon, shortcut: "C", description: "Click anywhere to place a chosen shape from the library" }, [Tool.Image]: { - icon: Image, + icon: ImagePlus, shortcut: "I", description: "Upload an image to the workspace" }, [Tool.Pan]: { - icon: Hand, + icon: GripHorizontal, shortcut: "P", description: "Click and drag to pan the workspace" } diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index 25bff79..cc3bbeb 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect } from "react"; +import { DraftingCompass } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components"; @@ -61,54 +62,44 @@ const ToolBar: React.FC = (props) => { return (
*:last-child]:[&>*:last-child]:hidden bg-black/5", - styles?.root?.className - )} + className={twMerge("border-r border-border bg-white", styles?.root?.className)} style={styles?.root?.properties} > +
+ +
+
{Object.entries(tools).map(([key, value]) => { const Icon = value.icon; return (
onToolClick(key)} > - + {key} -
); })} diff --git a/src/components/workspace/index.tsx b/src/components/workspace/index.tsx index 632e94d..e2473d9 100644 --- a/src/components/workspace/index.tsx +++ b/src/components/workspace/index.tsx @@ -59,7 +59,7 @@ export const Workspace: React.FC = (props) => {
{initialViewBoxScale ? "Unfreeze" : "Freeze"} Initial Scale @@ -52,6 +53,7 @@ const VisibilityControls = (props: Pick {visibilityOffset === 0 ? "Set" : "Unset"} Visibility Offset diff --git a/src/components/workspace/zoom.tsx b/src/components/workspace/zoom.tsx index ecf9242..0ba02f9 100644 --- a/src/components/workspace/zoom.tsx +++ b/src/components/workspace/zoom.tsx @@ -68,9 +68,6 @@ export const panAndZoomToArea = ({ k, x, y }) => { d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); }; -const panHandleClasses = - "absolute z-10 text-black/40 cursor-pointer hover:text-black/80 transition-all duration-medium"; - const Zoom = (props: Pick) => { const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); const showControls = useSelector((state: any) => state.editor.showControls); @@ -119,76 +116,81 @@ const Zoom = (props: Pick) => {
-
-
-
- panLeft()} + role="button" style={panStyles?.handles?.left?.properties} - /> - + +
+
panRight()} style={panStyles?.handles?.right?.properties} - /> - + +
+
panUp()} style={panStyles?.handles?.up?.properties} - /> - + +
+
panDown()} style={panStyles?.handles?.down?.properties} - /> + > + +
- +
- +
From f6e8ac98f300de4aa44fa896ed6e7e547d7d68e0 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Fri, 2 Aug 2024 22:10:03 +0530 Subject: [PATCH 02/42] Feat: added support for square shaped seats --- src/components/controls/index.tsx | 2 +- src/components/toolbar/data.tsx | 12 ++++- src/components/toolbar/index.tsx | 62 +++++++++++++++++++--- src/components/workspace/elements/seat.tsx | 55 +++++++++++-------- src/components/workspace/elements/utils.ts | 17 +++--- src/constants/index.ts | 1 + src/hooks/events/move.ts | 4 +- src/hooks/events/selection.ts | 4 +- src/hooks/events/workspace-click.ts | 9 +++- src/store/reducers/toolbar.ts | 10 +++- src/styles/animations/index.css | 38 ------------- src/styles/animations/keyframes.css | 11 ---- src/styles/index.css | 25 +++++---- src/types/elements/seat.ts | 1 + src/utils/transformer.ts | 8 +-- 15 files changed, 143 insertions(+), 116 deletions(-) delete mode 100644 src/styles/animations/index.css delete mode 100644 src/styles/animations/keyframes.css diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index 4be39fd..2dbaedd 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -56,7 +56,7 @@ const Controls = ({ options, styles }: IControlProps) => {
, shortcut: "S", crosshairs: true, - description: "Click anywhere to place a seat" + description: "Click anywhere to place a seat", + subTools: [ + { + name: "Square", + icon: Square, + iconCursor: (props: any) => + } + ] }, [Tool.Booth]: { icon: Codesandbox, diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index cc3bbeb..8e94662 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -1,12 +1,20 @@ -import { useCallback, useEffect } from "react"; +import React, { useCallback, useEffect } from "react"; import { DraftingCompass } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components"; -import { ids } from "@/constants"; +import { + Popover, + PopoverClose, + PopoverContent, + PopoverTrigger, + Tooltip, + TooltipContent, + TooltipTrigger +} from "@/components"; +import { dataAttributes, ids } from "@/constants"; import { store } from "@/store"; import { clearCursor, setCursor, setSelectedPolylineId, showControls } from "@/store/reducers/editor"; -import { clearTool, selectTool } from "@/store/reducers/toolbar"; +import { clearTool, selectSubTool, selectTool } from "@/store/reducers/toolbar"; import { ISTKProps } from "@/types"; import { fallible } from "@/utils"; import { selectFirstShape } from "../controls/shapes"; @@ -14,6 +22,7 @@ import { Tool, tools } from "./data"; const ToolBar: React.FC = (props) => { const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); + const selectedSubTool = useSelector((state: any) => state.toolbar.selectedSubTool); const selectedPolylineId = store.getState().editor.selectedPolylineId; const styles = props.styles?.toolbar; @@ -42,13 +51,17 @@ const ToolBar: React.FC = (props) => { useEffect(() => { fallible(() => { - if (selectedTool && selectedTool !== Tool.Shape) { + if (selectedSubTool) { + const subTool = tools[selectedTool].subTools?.find((tool) => tool.name === selectedSubTool); + store.dispatch(setCursor(subTool.iconCursor ?? subTool.icon)); + } else if (selectedTool && selectedTool !== Tool.Shape) { store.dispatch(setCursor(tools[selectedTool].iconCursor ?? tools[selectedTool].icon)); } }); - }, [selectedTool]); + }, [selectedTool, selectedSubTool]); - const onToolClick = (tool) => { + const onToolClick = (tool, isSubtoolClick: boolean) => { + if (isSubtoolClick) return; store.dispatch(selectTool(tool)); if ([Tool.Image, Tool.Shape].includes(tool)) { store.dispatch(showControls()); @@ -59,6 +72,10 @@ const ToolBar: React.FC = (props) => { } }; + const onSubToolClick = (tool) => { + store.dispatch(selectSubTool(tool.name)); + }; + return (
= (props) => { styles?.tool?.root?.className )} style={styles?.tool?.root?.properties} - onClick={() => onToolClick(key)} + onClick={(e) => + onToolClick(key, (e.target as HTMLElement)?.getAttribute(dataAttributes.subtool) === "true") + } > @@ -100,6 +119,33 @@ const ToolBar: React.FC = (props) => { {key} + {(value as any).subTools?.length && ( + + + + {(value as any).subTools?.map((tool) => { + const SubIcon = tool.icon; + return ( + onSubToolClick(tool)} + className="hover:bg-gray-100 rounded-md p-2 focus:outline-none cursor-pointer" + {...{ [dataAttributes.subtool]: true }} + > + + + ); + })} + + + )}
); })} diff --git a/src/components/workspace/elements/seat.tsx b/src/components/workspace/elements/seat.tsx index 52c88fa..91e9f2c 100644 --- a/src/components/workspace/elements/seat.tsx +++ b/src/components/workspace/elements/seat.tsx @@ -92,31 +92,40 @@ const Seat: React.FC = forwardRef( status ??= SeatStatus.Available; + const seatProps = { + ref, + id, + onClick: localOnClick, + [dataAttributes.category]: category, + [dataAttributes.section]: categoryObject?.section, + [dataAttributes.status]: status, + ...props, + className: twMerge( + props.className, + consumer.mode === "designer" && "filter hover:brightness-[1.05]", + consumer.mode === "user" && status === SeatStatus.Available && "cursor-pointer filter hover:brightness-[1.05]", + consumer.styles?.elements?.seat?.base?.className + ), + style: consumer.styles?.elements?.seat?.base?.properties, + onMouseOver: onMouseOver, + onMouseOut: onMouseOut + }; + return ( <> - + {element.square ? ( + + ) : ( + + )} {SeatIcon && ( { - const x = +seat.attr("cx") + dx; - const y = +seat.attr("cy") + dy; - - seat.attr("cx", x); - seat.attr("cy", y); - + if (seat.attr("cx")) { + seat.attr("cx", +seat.attr("cx") + dx); + seat.attr("cy", +seat.attr("cy") + dy); + } else { + seat.attr("x", +seat.attr("x") + dx); + seat.attr("y", +seat.attr("y") + dy); + } const label = d3Extended.selectById(`${seat.attr("id")}-label`); label.attr("x", +label.attr("x") + dx); label.attr("y", +label.attr("y") + dy); @@ -78,14 +79,10 @@ const repositionElements = (currentElem, repositionFn, elementType: string, dx: export const handleDrag = drag().on("drag", function (event) { const me = select(this); - const controls = d3Extended.selectById(`${me.attr("id")}-controls`); const x = +me.attr("x") + event.dx; const y = +me.attr("y") + event.dy; me.attr("x", x); me.attr("y", y); - const center = d3Extended.getNodeCenter(me); - controls.attr("cx", center.x); - controls.attr("cy", center.y); }); export const handleSeatDrag = drag().on("drag", function (event) { diff --git a/src/constants/index.ts b/src/constants/index.ts index 3d7df8c..1530c76 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -25,6 +25,7 @@ export const selectors = { }; export const dataAttributes = { + subtool: "data-subtool", element: "data-stk-element", elementType: "data-element-type", shape: "data-shape", diff --git a/src/hooks/events/move.ts b/src/hooks/events/move.ts index 3a84f72..b0379bb 100644 --- a/src/hooks/events/move.ts +++ b/src/hooks/events/move.ts @@ -13,8 +13,8 @@ const useMove = () => { const element = d3Extended.selectById(id); const isSeat = element.attr(dataAttributes.elementType) === ElementType.Seat; const label = isSeat ? d3Extended.selectById(`${id}-label`) : null; - const x = isSeat ? "cx" : "x"; - const y = isSeat ? "cy" : "y"; + const x = isSeat && element.node().nodeName !== "rect" ? "cx" : "x"; + const y = isSeat && element.node().nodeName !== "rect" ? "cy" : "y"; switch (e.key) { case "ArrowLeft": label?.attr("x", +label.attr("x") - 1); diff --git a/src/hooks/events/selection.ts b/src/hooks/events/selection.ts index 7afc6a8..2e81cc8 100644 --- a/src/hooks/events/selection.ts +++ b/src/hooks/events/selection.ts @@ -95,8 +95,8 @@ export const useSelection = () => { elements.forEach((element) => { const isSeat = element.attr(dataAttributes.elementType) === ElementType.Seat; - const x = isSeat ? +element.attr("cx") : +element.attr("x"); - const y = isSeat ? +element.attr("cy") : +element.attr("y"); + const x = isSeat && (element.node() as any)?.nodeName !== "rect" ? +element.attr("cx") : +element.attr("x"); + const y = isSeat && (element.node() as any)?.nodeName !== "rect" ? +element.attr("cy") : +element.attr("y"); if ( x >= finalAttributes.x1 && x <= finalAttributes.x2 && diff --git a/src/hooks/events/workspace-click.ts b/src/hooks/events/workspace-click.ts index 0b9e193..9fe2a53 100644 --- a/src/hooks/events/workspace-click.ts +++ b/src/hooks/events/workspace-click.ts @@ -34,8 +34,15 @@ const useWorkspaceClick = () => { useLayoutEffect(() => { const handler = (e) => { if (selectedTool == Tool.Seat) { + const square = store.getState().toolbar.selectedSubTool === "Square"; store.dispatch( - addSeat({ id: uuidV4(), ...getRelativeClickCoordsWithTransform(e), label: "?", status: SeatStatus.Available }) + addSeat({ + id: uuidV4(), + ...getRelativeClickCoordsWithTransform(e), + label: "?", + status: SeatStatus.Available, + square + }) ); } else if (selectedTool == Tool.Booth) { const coords = getRelativeClickCoordsWithTransform(e); diff --git a/src/store/reducers/toolbar.ts b/src/store/reducers/toolbar.ts index 4496a88..034386a 100644 --- a/src/store/reducers/toolbar.ts +++ b/src/store/reducers/toolbar.ts @@ -2,7 +2,8 @@ import { Reducer, createSlice } from "@reduxjs/toolkit"; import { Tool } from "@/components/toolbar/data"; const initialState = { - selectedTool: Tool.Select + selectedTool: Tool.Select, + selectedSubTool: null }; export const slice = createSlice({ @@ -11,13 +12,18 @@ export const slice = createSlice({ reducers: { selectTool: (state, action) => { state.selectedTool = action.payload; + state.selectedSubTool = null; + }, + selectSubTool: (state, action) => { + state.selectedSubTool = action.payload; }, clearTool: (state) => { state.selectedTool = null; + state.selectedSubTool = null; } } }); -export const { clearTool, selectTool } = slice.actions; +export const { clearTool, selectTool, selectSubTool } = slice.actions; export default slice.reducer as Reducer; diff --git a/src/styles/animations/index.css b/src/styles/animations/index.css deleted file mode 100644 index feb2fc9..0000000 --- a/src/styles/animations/index.css +++ /dev/null @@ -1,38 +0,0 @@ -@import "keyframes.css"; - -@layer utilities { - .splash { - @apply relative overflow-hidden; - - &:after { - @apply content-[''] absolute block bg-white w-0 h-0 hover:w-[100%] hover:h-[100%] top-1/2 left-1/2 opacity-[0.15] -translate-x-1/2 -translate-y-1/2 transition-all duration-medium; - border-radius: inherit; - } - } - - .animated-chevron { - @apply relative; - - &:before { - @apply content-[''] absolute w-0 h-[0.18rem] top-[41%] right-[-0.05rem] mr-[0.5rem] bg-current rounded group-hover:w-[0.55rem] group-hover:md:w-[0.7rem] transition-all duration-medium; - } - } - - .animated-border { - @apply relative; - - &:before, - &:after { - -webkit-mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0); - -webkit-mask-composite: xor; - mask-composite: exclude; - border-radius: inherit; - @apply content-[''] absolute inset-0 border border-transparent filter contrast-[2] bg-current pointer-events-none transition-all duration-1000; - } - - &:after { - background: linear-gradient(var(--angle, 225deg), var(--tw-gradient-stops)) border-box; - @apply animate-[rotate_2s_linear_infinite] opacity-0 hover:opacity-100; - } - } -} diff --git a/src/styles/animations/keyframes.css b/src/styles/animations/keyframes.css deleted file mode 100644 index 334eda2..0000000 --- a/src/styles/animations/keyframes.css +++ /dev/null @@ -1,11 +0,0 @@ -@property --angle { - syntax: ""; - initial-value: 0deg; - inherits: false; -} - -@keyframes rotate { - to { - --angle: 360deg; - } -} diff --git a/src/styles/index.css b/src/styles/index.css index 04279e7..9422b0f 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -1,5 +1,4 @@ @import "components.css"; -@import "animations/index.css"; @import "utilities.css"; @tailwind base; @@ -7,15 +6,15 @@ @tailwind utilities; rect.workspace-selection { - -webkit-touch-callout: none !important; - -webkit-user-select: none !important; - -khtml-user-select: none !important; - -moz-user-select: none !important; - -ms-user-select: none !important; - user-select: none !important; - stroke: #545454; - stroke-width: 2px; - stroke-opacity: 1; - fill: white; - fill-opacity: 0.5; -} \ No newline at end of file + -webkit-touch-callout: none !important; + -webkit-user-select: none !important; + -khtml-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; + stroke: #545454; + stroke-width: 2px; + stroke-opacity: 1; + fill: white; + fill-opacity: 0.5; +} diff --git a/src/types/elements/seat.ts b/src/types/elements/seat.ts index b6366c2..dd9615f 100644 --- a/src/types/elements/seat.ts +++ b/src/types/elements/seat.ts @@ -22,6 +22,7 @@ export interface ISeat { label?: string; category?: string | null; status?: SeatStatus | string; + square?: boolean; } export interface IFreeSeat { diff --git a/src/utils/transformer.ts b/src/utils/transformer.ts index 676896d..6f5c506 100644 --- a/src/utils/transformer.ts +++ b/src/utils/transformer.ts @@ -6,13 +6,15 @@ import { default as d3Extended } from "./d3"; export const domSeatsToJSON = () => { return d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Seat}"]`).map((seat) => { + const square = (seat.node() as any)?.nodeName === "rect"; return { id: seat.attr("id"), - x: +seat.attr("cx"), - y: +seat.attr("cy"), + x: +seat.attr(square ? "x" : "cx"), + y: +seat.attr(square ? "y" : "cy"), label: document.getElementById(`${seat.attr("id")}-label`)?.textContent, status: seat.attr(dataAttributes.status), - category: seat.attr(dataAttributes.category) + category: seat.attr(dataAttributes.category), + square }; }); }; From 956aad2443407fde09d64700b098cb2e2480cc05 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Wed, 7 Aug 2024 09:50:54 +0530 Subject: [PATCH 03/42] Feat: added a few more actions --- src/actions/index.ts | 9 ++++- src/components/toolbar/data.tsx | 4 +- src/components/workspace/zoom.tsx | 67 +++++++++++++------------------ src/utils/transformer.ts | 3 +- 4 files changed, 39 insertions(+), 44 deletions(-) diff --git a/src/actions/index.ts b/src/actions/index.ts index 997dea4..2f35742 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -1,14 +1,19 @@ import { panDown, panLeft, panRight, panUp } from "@/components/workspace/zoom"; import { store } from "@/store"; -import { clearElements, deselectElement } from "@/store/reducers/editor"; +import { clearElements, deselectElement, selectElement } from "@/store/reducers/editor"; +import { stateToJSON } from "@/utils"; -export const actions = { +const actions = { + selectElement: (elementId: string) => store.dispatch(selectElement(elementId)), deselectElement: (elementId: string) => store.dispatch(deselectElement(elementId)), deselectAllElements: () => store.dispatch(clearElements(false)), + getState: stateToJSON, panLeft, panDown, panRight, panUp }; +export { store, actions }; + export default actions; diff --git a/src/components/toolbar/data.tsx b/src/components/toolbar/data.tsx index 15afb11..ec78708 100644 --- a/src/components/toolbar/data.tsx +++ b/src/components/toolbar/data.tsx @@ -2,7 +2,7 @@ import { CaseSensitive, Circle, Codesandbox, - GripHorizontal, + Grip, Highlighter, ImagePlus, MousePointer2, @@ -87,7 +87,7 @@ export const tools = { description: "Upload an image to the workspace" }, [Tool.Pan]: { - icon: GripHorizontal, + icon: Grip, shortcut: "P", description: "Click and drag to pan the workspace" } diff --git a/src/components/workspace/zoom.tsx b/src/components/workspace/zoom.tsx index 0ba02f9..0de7ee4 100644 --- a/src/components/workspace/zoom.tsx +++ b/src/components/workspace/zoom.tsx @@ -68,6 +68,9 @@ export const panAndZoomToArea = ({ k, x, y }) => { d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); }; +const panHandleClasses = + "absolute z-10 text-black/40 cursor-pointer hover:text-black/80 transition-all duration-medium"; + const Zoom = (props: Pick) => { const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); const showControls = useSelector((state: any) => state.editor.showControls); @@ -116,61 +119,47 @@ const Zoom = (props: Pick) => {
-
+
+
+ panLeft()} - role="button" style={panStyles?.handles?.left?.properties} - > - -
-
+ panRight()} style={panStyles?.handles?.right?.properties} - > - -
-
+ panUp()} style={panStyles?.handles?.up?.properties} - > - -
-
+ panDown()} style={panStyles?.handles?.down?.properties} - > - -
+ />
{ return d3Extended.zoomTransform(document.querySelector(selectors.workspaceGroup)); }; -export const stateToJSON = () => { +export const stateToJSON = (): ISTKData => { const state = store.getState().editor; return { name: state.location, From 17f8f1d6a0d021b46f6d992ebbf0b2e9cb928974 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Wed, 7 Aug 2024 22:12:58 +0530 Subject: [PATCH 04/42] Fix: a ui issue --- src/components/core/button.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/core/button.tsx b/src/components/core/button.tsx index 76e39fe..0f61d57 100644 --- a/src/components/core/button.tsx +++ b/src/components/core/button.tsx @@ -2,7 +2,7 @@ import { cva } from "class-variance-authority"; import { twMerge } from "tailwind-merge"; const buttonVariants = cva( - "group flex justify-center items-center cursor-pointer rounded-md font-medium outline-none transition-all duration-medium gap-2 splash", + "group flex justify-center items-center cursor-pointer rounded-md font-medium outline-none transition-all duration-medium splash", { variants: { variant: { @@ -29,6 +29,7 @@ const Core = ({ variant = "primary", children, loading, className, ...props }: a role="button" className={twMerge( buttonVariants({ variant }), + loading ? "gap-2" : "gap-0", className, loading || props.disabled ? "opacity-80 pointer-events-none" : "" )} @@ -38,7 +39,7 @@ const Core = ({ variant = "primary", children, loading, className, ...props }: a {loading !== undefined && (
- + ); } From 11b695af1470838b0fb2a1aef99981cfc9f657e0 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Wed, 7 Aug 2024 23:23:40 +0530 Subject: [PATCH 05/42] Fix: hid cursor above controls --- src/components/workspace/cursor.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/workspace/cursor.tsx b/src/components/workspace/cursor.tsx index ba68f76..8b200e4 100644 --- a/src/components/workspace/cursor.tsx +++ b/src/components/workspace/cursor.tsx @@ -20,12 +20,14 @@ export const Cursor = () => { const workspace = document.getElementById(ids.workspace)?.getBoundingClientRect(); const zoomControls = document.getElementById(ids.zoomControls)?.getBoundingClientRect(); const panControls = document.getElementById(ids.panControls)?.getBoundingClientRect(); + const mainControls = document.getElementById(ids.controls)?.getBoundingClientRect(); if (workspace) { const customCursor = document.getElementById(ids.cursor); if ( isWithinBounds(x, y, workspace) && !isWithinBounds(x, y, zoomControls) && !isWithinBounds(x, y, panControls) && + !isWithinBounds(x, y, mainControls) && !resizeCursors.includes(e.target?.style?.cursor) && !e.target.id.includes("radix:") && e.target.getAttribute("role") !== "dialog" From 4acbd227e40e5552b65e9eef3cca5d128823219b Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Thu, 8 Aug 2024 09:46:22 +0530 Subject: [PATCH 06/42] Fix: pan handle alignment --- src/components/workspace/zoom.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/workspace/zoom.tsx b/src/components/workspace/zoom.tsx index 0de7ee4..6329bfb 100644 --- a/src/components/workspace/zoom.tsx +++ b/src/components/workspace/zoom.tsx @@ -133,25 +133,25 @@ const Zoom = (props: Pick) => {
panLeft()} style={panStyles?.handles?.left?.properties} /> panRight()} style={panStyles?.handles?.right?.properties} /> panUp()} style={panStyles?.handles?.up?.properties} /> panDown()} style={panStyles?.handles?.down?.properties} /> From 6c4afe9568b53f3418bcbda6c867bda804fe6f08 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Thu, 8 Aug 2024 09:49:13 +0530 Subject: [PATCH 07/42] Fix: eraser icon --- src/components/toolbar/data.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/toolbar/data.tsx b/src/components/toolbar/data.tsx index ec78708..2701dc9 100644 --- a/src/components/toolbar/data.tsx +++ b/src/components/toolbar/data.tsx @@ -2,8 +2,8 @@ import { CaseSensitive, Circle, Codesandbox, + Eraser, Grip, - Highlighter, ImagePlus, MousePointer2, PenTool, @@ -39,7 +39,7 @@ export const tools = { description: "Select and move objects" }, [Tool.Eraser]: { - icon: Highlighter, + icon: Eraser, shortcut: "E", description: "Click on an element to delete it" }, From cc97222e1fb0829904983e0c62e89472d9febaf8 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sat, 10 Aug 2024 20:46:24 +0530 Subject: [PATCH 08/42] Feat: element rotation --- src/components/controls/index.tsx | 2 +- src/components/controls/select/general.tsx | 21 +++++++++++++++-- src/components/controls/select/index.tsx | 3 ++- src/components/workspace/elements/booth.tsx | 8 +++++-- src/components/workspace/elements/image.tsx | 8 +++++-- .../workspace/elements/polyline.tsx | 3 +++ src/components/workspace/elements/seat.tsx | 23 +++++++++++++++++-- src/components/workspace/elements/shape.tsx | 15 +++++++++--- src/components/workspace/elements/text.tsx | 9 +++++++- src/components/workspace/index.tsx | 1 + src/types/elements/booth.ts | 1 + src/types/elements/image.ts | 1 + src/types/elements/polyline.ts | 1 + src/types/elements/seat.ts | 1 + src/types/elements/shape.ts | 1 + src/types/elements/text.ts | 1 + src/utils/d3.ts | 13 +++++++++++ src/utils/transformer.ts | 18 ++++++++++----- 18 files changed, 110 insertions(+), 20 deletions(-) diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index c0a8fd6..9996c73 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -32,7 +32,7 @@ const Controls = ({ options, styles }: IControlProps) => { const firstElementType = document .getElementById(selectedElementIds[0]) ?.getAttribute?.(dataAttributes.elementType); - if (firstElementType === ElementType.Booth) return NoSelectionControls; + if (firstElementType === ElementType.Booth) return SelectControls; if (selectedElementIds.length > 1) { const same = selectedElementIds.every((id) => { return document.getElementById(id)?.getAttribute?.(dataAttributes.elementType) === firstElementType; diff --git a/src/components/controls/select/general.tsx b/src/components/controls/select/general.tsx index 9e7d528..748b0fa 100644 --- a/src/components/controls/select/general.tsx +++ b/src/components/controls/select/general.tsx @@ -1,12 +1,29 @@ import { useSelector } from "react-redux"; -import { Button } from "@/components/core"; +import { Button, Input, Label } from "@/components/core"; import { d3Extended } from "@/utils"; const GeneralSelectControls = () => { const selectedElementIds = useSelector((state: any) => state.editor.selectedElementIds); - + const firstElement = d3Extended.selectById(selectedElementIds[0]); return (
+
+ + { + selectedElementIds.forEach((id) => { + d3Extended.selectById(id).style("transform", `rotate(${e.target.value}deg)`); + }); + }} + /> +
)} - { - selectedElementIds.forEach((id: string) => { - const seat = d3Extended.selectById(id); - const seatLabel = d3Extended.selectById(`${id}-label`); - seat.attr(dataAttributes.status, value); - let color = seatStatusColors[value].background; - let textColor = seatStatusColors[value].label; - if (value === SeatStatus.Available) { - const category = store - .getState() - .editor.categories.find((c) => c.id === seat.attr(dataAttributes.category)); - if (category) { - color = category.color; - textColor = category.textColor; - } - } - seat.style("color", color); - seatLabel?.style("stroke", textColor); - }); - }} - className="w-full flex flex-wrap flex-row-reverse items-end gap-2 gap-y-4 my-1" - > +
{Object.values(SeatStatus).map((status) => { const id = `stk-seat-status-rg-${status}`; return ( -
- +
+ { + selectedElementIds.forEach((id: string) => { + const seat = d3Extended.selectById(id); + const seatLabel = d3Extended.selectById(`${id}-label`); + seat.attr(dataAttributes.status, status); + setState(status); + let color = seatStatusColors[status].background; + let textColor = seatStatusColors[status].label; + if (status === SeatStatus.Available) { + const category = store + .getState() + .editor.categories.find((c) => c.id === seat.attr(dataAttributes.category)); + if (category) { + color = category.color; + textColor = category.textColor; + } + } + seat.style("color", color); + seatLabel?.style("stroke", textColor); + }); + }} + />
); })} - +
); }; diff --git a/src/components/core/input.tsx b/src/components/core/input.tsx index ef96caa..db2f418 100644 --- a/src/components/core/input.tsx +++ b/src/components/core/input.tsx @@ -8,7 +8,7 @@ const Input = React.forwardRef(({ className, type, span]:line-clamp-1", + "flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", className )} {...props} diff --git a/src/components/index.tsx b/src/components/index.tsx index 4fe8ac7..5409d6c 100644 --- a/src/components/index.tsx +++ b/src/components/index.tsx @@ -2,7 +2,6 @@ import { twMerge } from "tailwind-merge"; import { useDesignerEvents, useInteractions, useToast, useUserEvents } from "@/hooks"; import { type ISTKProps } from "@/types"; import { default as Controls } from "./controls"; -import { default as Footer } from "./footer"; import { default as Operations } from "./operations"; import { default as Toolbar } from "./toolbar"; import { Cursor, default as Workspace } from "./workspace"; @@ -31,7 +30,6 @@ const Designer: React.FC = (props) => {
-
); diff --git a/src/components/toolbar/data.tsx b/src/components/toolbar/data.tsx index 6869d56..d56682c 100644 --- a/src/components/toolbar/data.tsx +++ b/src/components/toolbar/data.tsx @@ -2,12 +2,12 @@ import { CaseSensitive, Circle, Codesandbox, - GripHorizontal, - Highlighter, ImagePlus, MousePointer2, + Move, PenTool, - Pentagon + Pentagon, + Sparkles } from "lucide-react"; import { twMerge } from "tailwind-merge"; @@ -38,7 +38,7 @@ export const tools = { description: "Select and move objects" }, [Tool.Eraser]: { - icon: Highlighter, + icon: Sparkles, shortcut: "E", description: "Click on an element to delete it" }, @@ -79,7 +79,7 @@ export const tools = { description: "Upload an image to the workspace" }, [Tool.Pan]: { - icon: GripHorizontal, + icon: Move, shortcut: "P", description: "Click and drag to pan the workspace" } diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index cc3bbeb..416c327 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -65,8 +65,8 @@ const ToolBar: React.FC = (props) => { className={twMerge("border-r border-border bg-white", styles?.root?.className)} style={styles?.root?.properties} > -
- +
+

{Object.entries(tools).map(([key, value]) => { diff --git a/src/components/workspace/visibility.tsx b/src/components/workspace/visibility.tsx index 80cbd15..d1432b2 100644 --- a/src/components/workspace/visibility.tsx +++ b/src/components/workspace/visibility.tsx @@ -1,3 +1,4 @@ +import { Focus, Lock, Scan, Unlock } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; import { dataAttributes, ids, selectors } from "@/constants"; @@ -5,7 +6,6 @@ import { store } from "@/store"; import { setInitialViewBoxScale, setVisibilityOffset } from "@/store/reducers/editor"; import type { ISTKProps } from "@/types"; import { d3Extended } from "@/utils"; -import { Button } from "../core"; import { showAllElements } from "./elements"; const freeze = () => @@ -32,31 +32,32 @@ const VisibilityControls = (props: Pick - - +
+ {initialViewBoxScale ? : } +
+
+ {visibilityOffset === 0 ? : } +
+
); }; diff --git a/src/components/workspace/zoom.tsx b/src/components/workspace/zoom.tsx index 0ba02f9..acb6267 100644 --- a/src/components/workspace/zoom.tsx +++ b/src/components/workspace/zoom.tsx @@ -1,5 +1,14 @@ -import { useLayoutEffect } from "react"; -import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Minus, Plus } from "lucide-react"; +import { useLayoutEffect, useState } from "react"; +import { + ChevronDown, + ChevronLeft, + ChevronRight, + ChevronUp, + Minus, + PanelBottomClose, + PanelBottomOpen, + Plus +} from "lucide-react"; import { useSelector } from "react-redux"; import { default as debounce } from "lodash/debounce"; import { twMerge } from "tailwind-merge"; @@ -69,6 +78,7 @@ export const panAndZoomToArea = ({ k, x, y }) => { }; const Zoom = (props: Pick) => { + const [open, setOpen] = useState(true); const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); const showControls = useSelector((state: any) => state.editor.showControls); @@ -112,13 +122,13 @@ const Zoom = (props: Pick) => { const panStyles = props.styles?.panControls; return ( - <> +
@@ -144,6 +154,29 @@ const Zoom = (props: Pick) => { >
+
+ +
+
setOpen((prev) => !prev)} + > + +
+
+ +
) => {
-
-
- -
+
setOpen((prev) => !prev)} > - +
- +
); }; From 449731e15651e9abfd53def7f646f26a62ff8ba4 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sat, 10 Aug 2024 23:36:40 +0530 Subject: [PATCH 10/42] Fix: cursor display --- bun.lockb | Bin 630128 -> 630128 bytes src/components/workspace/cursor.tsx | 2 -- src/components/workspace/zoom.tsx | 3 +-- src/constants/index.ts | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index 66d68d54cdf7b5eb1b3ed8a41270b840b20d51c5..beee9fa159680448f56aa3350b70781b2b49aba4 100755 GIT binary patch delta 46 zcmeycOYOrhwT2eP7N!>F7M2#)Eo?U(*cc7<4D}4!?>n#oF*^`*Y`^coIWYzRqlgh- delta 46 wcmeycOYOrhwT2eP7N!>F7M2#)Eo?U(*q9hVp#8oB8xXStF~|1%4xAHX0FW3EasU7T diff --git a/src/components/workspace/cursor.tsx b/src/components/workspace/cursor.tsx index ba68f76..7201f32 100644 --- a/src/components/workspace/cursor.tsx +++ b/src/components/workspace/cursor.tsx @@ -19,13 +19,11 @@ export const Cursor = () => { const y = ptr[1]; const workspace = document.getElementById(ids.workspace)?.getBoundingClientRect(); const zoomControls = document.getElementById(ids.zoomControls)?.getBoundingClientRect(); - const panControls = document.getElementById(ids.panControls)?.getBoundingClientRect(); if (workspace) { const customCursor = document.getElementById(ids.cursor); if ( isWithinBounds(x, y, workspace) && !isWithinBounds(x, y, zoomControls) && - !isWithinBounds(x, y, panControls) && !resizeCursors.includes(e.target?.style?.cursor) && !e.target.id.includes("radix:") && e.target.getAttribute("role") !== "dialog" diff --git a/src/components/workspace/zoom.tsx b/src/components/workspace/zoom.tsx index acb6267..0ddfba2 100644 --- a/src/components/workspace/zoom.tsx +++ b/src/components/workspace/zoom.tsx @@ -122,9 +122,8 @@ const Zoom = (props: Pick) => { const panStyles = props.styles?.panControls; return ( -
+
Date: Sun, 11 Aug 2024 01:29:33 +0530 Subject: [PATCH 11/42] Feat: completed the dock --- src/actions/index.ts | 2 +- src/components/controls/index.tsx | 49 ++-- src/components/footer.tsx | 35 --- src/components/toolbar/index.tsx | 94 +++++--- src/components/workspace/actions.tsx | 193 ++++++++++++++++ .../workspace/elements/polyline.tsx | 2 +- src/components/workspace/index.tsx | 12 +- src/components/workspace/visibility.tsx | 55 ++--- src/components/workspace/zoom.tsx | 215 ------------------ src/hooks/events/workspace-load.ts | 2 +- src/store/reducers/toolbar.ts | 8 +- 11 files changed, 312 insertions(+), 355 deletions(-) delete mode 100644 src/components/footer.tsx create mode 100644 src/components/workspace/actions.tsx delete mode 100644 src/components/workspace/zoom.tsx diff --git a/src/actions/index.ts b/src/actions/index.ts index 997dea4..4e9a1b5 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -1,4 +1,4 @@ -import { panDown, panLeft, panRight, panUp } from "@/components/workspace/zoom"; +import { panDown, panLeft, panRight, panUp } from "@/components/workspace/actions"; import { store } from "@/store"; import { clearElements, deselectElement } from "@/store/reducers/editor"; diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index 58e61d8..a9e5e5e 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -20,7 +20,7 @@ import { default as ShapeControls } from "./shapes"; const onCogClick = () => store.dispatch(toggleControls()); -const transition = "transition-all duration-500"; +const transition = "transition-all duration-500 ease-in-out"; const width = "w-[22rem]"; @@ -56,33 +56,30 @@ const Controls = ({ options, styles }: IControlProps) => { }, [selectedTool, selectedElementIds]); return ( - <> -
-
-
-
Settings
- } - onClick={onCogClick} - /> -
- } - className="py-4 px-5" +
+
+
Settings
+ } + onClick={onCogClick} />
- + } + className="py-4 px-5" + /> +
); }; diff --git a/src/components/footer.tsx b/src/components/footer.tsx deleted file mode 100644 index a7cac6a..0000000 --- a/src/components/footer.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useSelector } from "react-redux"; -import { twMerge } from "tailwind-merge"; -import { ISTKProps } from "@/types"; -import { AnimatedSwitcher } from "./core"; -import { tools } from "./toolbar/data"; - -const Footer: React.FC = ({ options: { showFooter = true } = {}, ...props }) => { - const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); - if (!showFooter) return null; - const styles = props.styles?.footer; - return ( -
- {selectedTool && ( - {tools[selectedTool]?.description}} - duration={0.2} - /> - )} -
- ); -}; - -export default Footer; diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index 416c327..6eba480 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -1,12 +1,12 @@ import { useCallback, useEffect } from "react"; -import { DraftingCompass } from "lucide-react"; +import { DraftingCompass, PanelBottomClose, PanelBottomOpen } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components"; import { ids } from "@/constants"; import { store } from "@/store"; import { clearCursor, setCursor, setSelectedPolylineId, showControls } from "@/store/reducers/editor"; -import { clearTool, selectTool } from "@/store/reducers/toolbar"; +import { clearTool, selectTool, toggleDock } from "@/store/reducers/toolbar"; import { ISTKProps } from "@/types"; import { fallible } from "@/utils"; import { selectFirstShape } from "../controls/shapes"; @@ -69,42 +69,66 @@ const ToolBar: React.FC = (props) => {

- {Object.entries(tools).map(([key, value]) => { - const Icon = value.icon; - return ( -
onToolClick(key)} - > - - - - - +
+ {Object.entries(tools).map(([key, value]) => { + const Icon = value.icon; + return ( +
onToolClick(key)} > - {key} - - -
- ); - })} + + + + + + {key} + + +
+ ); + })} +
+ +
); }; +function DockTrigger(): JSX.Element { + const dock = useSelector((state: any) => state.toolbar.dock); + + return ( +
+
store.dispatch(toggleDock(undefined))} + > + {dock ? : } +
+
+ ); +} + export default ToolBar; diff --git a/src/components/workspace/actions.tsx b/src/components/workspace/actions.tsx new file mode 100644 index 0000000..86158ec --- /dev/null +++ b/src/components/workspace/actions.tsx @@ -0,0 +1,193 @@ +import { useLayoutEffect } from "react"; +import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Minus, Plus } from "lucide-react"; +import { useSelector } from "react-redux"; +import { default as debounce } from "lodash/debounce"; +import { twMerge } from "tailwind-merge"; +import { dataAttributes, ids, selectors } from "@/constants"; +import type { ISTKProps } from "@/types"; +import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; +import { Tool } from "../toolbar/data"; +import { showPostOffsetElements, showPreOffsetElements } from "./elements"; +import { VisibilityFreezeScale, VisibilityOffset } from "./visibility"; + +const handleElementVisibility = debounce((workspace, k) => { + const visibilityOffset = +workspace.attr(dataAttributes.visibilityOffset) || 0; + const initialViewBoxScaleForWidth = +workspace.attr(dataAttributes.initialViewBoxScaleForWidth); + if (k * 1.1 < getScaleFactorAccountingForViewBoxWidth(visibilityOffset, initialViewBoxScaleForWidth)) { + showPreOffsetElements(); + } else { + showPostOffsetElements(); + } +}, 25); + +function handleZoom(e) { + const workspace = d3Extended.select(selectors.workspaceGroup); + handleElementVisibility(workspace, e.transform.k); + workspace.attr("transform", e.transform); +} + +const zoom = d3Extended.zoom().on("zoom", handleZoom); + +const zoomIn = () => { + d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 1.1); +}; + +const zoomOut = () => { + d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 0.9); +}; + +export const panLeft = (by = 50, duration = 250) => { + d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, by, 0); +}; + +export const panRight = (by = 50, duration = 250) => { + d3Extended + .selectById(ids.workspace) + .transition() + .duration(duration) + .call(zoom.translateBy, -1 * by, 0); +}; + +export const panUp = (by = 50, duration = 250) => { + d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, 0, by); +}; + +export const panDown = (by = 50, duration = 250) => { + d3Extended + .selectById(ids.workspace) + .transition() + .duration(duration) + .call(zoom.translateBy, 0, -1 * by); +}; + +export const panAndZoom = ({ k, x, y }) => { + d3Extended.selectById(ids.workspace).call(zoom.transform, d3Extended.zoomIdentity.translate(x, y).scale(k)); +}; + +export const panAndZoomToArea = ({ k, x, y }) => { + d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); +}; + +const Actions = (props: Pick) => { + const dock = useSelector((state: any) => state.toolbar.dock); + const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); + + useLayoutEffect(() => { + const selection = d3Extended.selectById(ids.workspace); + selection.on("zoom", null); + if (selectedTool == Tool.Pan) { + selection.call(zoom); + } else { + const zoomSelection = selection.call(zoom).on("wheel.zoom", (e) => { + e.preventDefault(); + const currentZoom = selection.property("__zoom").k || 1; + if (e.ctrlKey) { + const nextZoom = currentZoom * Math.pow(2, -e.deltaY * 0.01); + zoom.scaleTo(selection, nextZoom, d3Extended.pointer(e)); + } else { + zoom.translateBy(selection, -(e.deltaX / currentZoom), -(e.deltaY / currentZoom)); + } + }); + if (props.mode !== "user") zoomSelection.on("mousedown.zoom", null); + } + }, [selectedTool]); + + const zoomStyles = props.styles?.zoomControls; + const panStyles = props.styles?.panControls; + + const showZoomControls = props.options?.showZoomControls ?? true; + const showVisibilityControls = props.mode === "designer" && (props.options?.showVisibilityControls ?? true); + + if (!(showZoomControls && showVisibilityControls)) return; + + return ( +
+
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", + panStyles?.root?.className, + !dock && "translate-y-20 opacity-0" + )} + style={panStyles?.root?.properties} + > + {showVisibilityControls && } + {showZoomControls && ( + <> +
panLeft()} + role="button" + style={panStyles?.handles?.left?.properties} + > + +
+
panRight()} + style={panStyles?.handles?.right?.properties} + > + +
+
+ +
+
+ +
+
panUp()} + style={panStyles?.handles?.up?.properties} + > + +
+
panDown()} + style={panStyles?.handles?.down?.properties} + > + +
+ + )} + {showVisibilityControls && } +
+
+ ); +}; + +export default Actions; diff --git a/src/components/workspace/elements/polyline.tsx b/src/components/workspace/elements/polyline.tsx index 050ad11..9e5e4de 100644 --- a/src/components/workspace/elements/polyline.tsx +++ b/src/components/workspace/elements/polyline.tsx @@ -3,7 +3,7 @@ import { twMerge } from "tailwind-merge"; import { dataAttributes, selectors } from "@/constants"; import { IPolyline, ISTKProps, ISeatCategory, ISection } from "@/types"; import { d3Extended, getRelativeWorkspaceClickCoords, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; -import { panAndZoomToArea } from "../zoom"; +import { panAndZoomToArea } from "../actions"; export interface IPolylineProps extends IPolyline { className?: string; diff --git a/src/components/workspace/index.tsx b/src/components/workspace/index.tsx index e2473d9..a158ce1 100644 --- a/src/components/workspace/index.tsx +++ b/src/components/workspace/index.tsx @@ -4,12 +4,11 @@ import { twMerge } from "tailwind-merge"; import { dataAttributes, ids } from "@/constants"; import { type ISTKProps, SeatStatus } from "@/types"; import { Tool, tools } from "../toolbar/data"; +import { default as Actions } from "./actions"; import { default as Crosshairs } from "./crosshairs"; import { default as Element, ElementType } from "./elements"; import { default as Grid } from "./grid"; import { default as Reload } from "./reload"; -import { default as VisibilityControls } from "./visibility"; -import { default as Zoom } from "./zoom"; export { default as Cursor } from "./cursor"; @@ -44,10 +43,6 @@ export const Workspace: React.FC = (props) => { const showReloadButton = props.options?.showReloadButton ?? false; - const showZoomControls = props.options?.showZoomControls ?? true; - - const showVisibilityControls = props.mode === "designer" && (props.options?.showVisibilityControls ?? true); - const onWorkspaceHover = useCallback( (e: any) => { if (props.events?.onWorkspaceHover && e.target.id === ids.workspace) props.events.onWorkspaceHover(); @@ -59,7 +54,7 @@ export const Workspace: React.FC = (props) => {
= (props) => { )} - {showZoomControls && } - {showVisibilityControls && } + {showReloadButton && ( )} diff --git a/src/components/workspace/visibility.tsx b/src/components/workspace/visibility.tsx index d1432b2..3f7db87 100644 --- a/src/components/workspace/visibility.tsx +++ b/src/components/workspace/visibility.tsx @@ -1,7 +1,7 @@ import { Focus, Lock, Scan, Unlock } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; -import { dataAttributes, ids, selectors } from "@/constants"; +import { dataAttributes, selectors } from "@/constants"; import { store } from "@/store"; import { setInitialViewBoxScale, setVisibilityOffset } from "@/store/reducers/editor"; import type { ISTKProps } from "@/types"; @@ -25,41 +25,36 @@ const unsetVisibility = () => { showAllElements(); }; -const VisibilityControls = (props: Pick) => { +export const VisibilityFreezeScale = (props: Pick) => { const initialViewBoxScale = useSelector((state: any) => state.editor.initialViewBoxScale); - const visibilityOffset = useSelector((state: any) => state.editor.visibilityOffset); const styles = props.styles?.visibilityControls; return ( -
-
-
- {initialViewBoxScale ? : } -
-
- {visibilityOffset === 0 ? : } -
-
+
+ {initialViewBoxScale ? : }
); }; -export default VisibilityControls; +export const VisibilityOffset = (props: Pick) => { + const visibilityOffset = useSelector((state: any) => state.editor.visibilityOffset); + + const styles = props.styles?.visibilityControls; + + return ( +
+ {visibilityOffset === 0 ? : } +
+ ); +}; diff --git a/src/components/workspace/zoom.tsx b/src/components/workspace/zoom.tsx deleted file mode 100644 index 0ddfba2..0000000 --- a/src/components/workspace/zoom.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import { useLayoutEffect, useState } from "react"; -import { - ChevronDown, - ChevronLeft, - ChevronRight, - ChevronUp, - Minus, - PanelBottomClose, - PanelBottomOpen, - Plus -} from "lucide-react"; -import { useSelector } from "react-redux"; -import { default as debounce } from "lodash/debounce"; -import { twMerge } from "tailwind-merge"; -import { dataAttributes, ids, selectors } from "@/constants"; -import { useSkipFirstRender } from "@/hooks"; -import type { ISTKProps } from "@/types"; -import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; -import { Tool } from "../toolbar/data"; -import { showPostOffsetElements, showPreOffsetElements } from "./elements"; - -const handleElementVisibility = debounce((workspace, k) => { - const visibilityOffset = +workspace.attr(dataAttributes.visibilityOffset) || 0; - const initialViewBoxScaleForWidth = +workspace.attr(dataAttributes.initialViewBoxScaleForWidth); - if (k * 1.1 < getScaleFactorAccountingForViewBoxWidth(visibilityOffset, initialViewBoxScaleForWidth)) { - showPreOffsetElements(); - } else { - showPostOffsetElements(); - } -}, 25); - -function handleZoom(e) { - const workspace = d3Extended.select(selectors.workspaceGroup); - handleElementVisibility(workspace, e.transform.k); - workspace.attr("transform", e.transform); -} - -const zoom = d3Extended.zoom().on("zoom", handleZoom); - -const zoomIn = () => { - d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 1.1); -}; - -const zoomOut = () => { - d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 0.9); -}; - -export const panLeft = (by = 50, duration = 250) => { - d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, by, 0); -}; - -export const panRight = (by = 50, duration = 250) => { - d3Extended - .selectById(ids.workspace) - .transition() - .duration(duration) - .call(zoom.translateBy, -1 * by, 0); -}; - -export const panUp = (by = 50, duration = 250) => { - d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, 0, by); -}; - -export const panDown = (by = 50, duration = 250) => { - d3Extended - .selectById(ids.workspace) - .transition() - .duration(duration) - .call(zoom.translateBy, 0, -1 * by); -}; - -export const panAndZoom = ({ k, x, y }) => { - d3Extended.selectById(ids.workspace).call(zoom.transform, d3Extended.zoomIdentity.translate(x, y).scale(k)); -}; - -export const panAndZoomToArea = ({ k, x, y }) => { - d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); -}; - -const Zoom = (props: Pick) => { - const [open, setOpen] = useState(true); - const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); - const showControls = useSelector((state: any) => state.editor.showControls); - - useLayoutEffect(() => { - const selection = d3Extended.selectById(ids.workspace); - selection.on("zoom", null); - if (selectedTool == Tool.Pan) { - selection.call(zoom); - } else { - const zoomSelection = selection.call(zoom).on("wheel.zoom", (e) => { - e.preventDefault(); - const currentZoom = selection.property("__zoom").k || 1; - if (e.ctrlKey) { - const nextZoom = currentZoom * Math.pow(2, -e.deltaY * 0.01); - zoom.scaleTo(selection, nextZoom, d3Extended.pointer(e)); - } else { - zoom.translateBy(selection, -(e.deltaX / currentZoom), -(e.deltaY / currentZoom)); - } - }); - if (props.mode !== "user") zoomSelection.on("mousedown.zoom", null); - } - }, [selectedTool]); - - useSkipFirstRender(() => { - const workspace = d3Extended.selectById(ids.workspace); - const controlTransformActive = workspace.attr("control-transform-active"); - if (showControls) { - if (!controlTransformActive) { - workspace.attr("control-transform-active", "true"); - workspace.transition().call(zoom.translateBy, -144, 0); - } - } else { - if (controlTransformActive) { - workspace.attr("control-transform-active", null); - workspace.transition().call(zoom.translateBy, 144, 0); - } - } - }, [showControls]); - - const zoomStyles = props.styles?.zoomControls; - const panStyles = props.styles?.panControls; - - return ( -
-
-
panLeft()} - role="button" - style={panStyles?.handles?.left?.properties} - > - -
-
panRight()} - style={panStyles?.handles?.right?.properties} - > - -
-
- -
-
setOpen((prev) => !prev)} - > - -
-
- -
-
panUp()} - style={panStyles?.handles?.up?.properties} - > - -
-
panDown()} - style={panStyles?.handles?.down?.properties} - > - -
-
-
-
setOpen((prev) => !prev)} - > - -
-
-
- ); -}; - -export default Zoom; diff --git a/src/hooks/events/workspace-load.ts b/src/hooks/events/workspace-load.ts index b8c7b9a..b885276 100644 --- a/src/hooks/events/workspace-load.ts +++ b/src/hooks/events/workspace-load.ts @@ -1,6 +1,6 @@ import { useEffect, useLayoutEffect } from "react"; import { useSelector } from "react-redux"; -import { panAndZoom } from "@/components/workspace/zoom"; +import { panAndZoom } from "@/components/workspace/actions"; import { dataAttributes, ids, selectors } from "@/constants"; import { store } from "@/store"; import { initializeElements, initializeWorkspace, resetWorkspace, sync } from "@/store/reducers/editor"; diff --git a/src/store/reducers/toolbar.ts b/src/store/reducers/toolbar.ts index 4496a88..d023889 100644 --- a/src/store/reducers/toolbar.ts +++ b/src/store/reducers/toolbar.ts @@ -2,7 +2,8 @@ import { Reducer, createSlice } from "@reduxjs/toolkit"; import { Tool } from "@/components/toolbar/data"; const initialState = { - selectedTool: Tool.Select + selectedTool: Tool.Select, + dock: true }; export const slice = createSlice({ @@ -14,10 +15,13 @@ export const slice = createSlice({ }, clearTool: (state) => { state.selectedTool = null; + }, + toggleDock: (state, action) => { + state.dock = action.payload ?? !state.dock; } } }); -export const { clearTool, selectTool } = slice.actions; +export const { clearTool, selectTool, toggleDock } = slice.actions; export default slice.reducer as Reducer; From 06b02e35162006757b73a916073cd6d065c7d941 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Sun, 11 Aug 2024 02:59:20 +0530 Subject: [PATCH 12/42] Feat: update content on drawer --- src/components/controls/control-input.tsx | 2 +- src/components/controls/image.tsx | 12 ++++--- src/components/controls/index.tsx | 2 +- src/components/controls/select/image.tsx | 15 ++++---- .../controls/select/seats/index.tsx | 1 - src/components/controls/select/shape.jsx | 35 +++++++++--------- src/components/controls/select/text.tsx | 36 ++++++++++--------- src/components/toolbar/data.tsx | 4 +-- 8 files changed, 57 insertions(+), 50 deletions(-) diff --git a/src/components/controls/control-input.tsx b/src/components/controls/control-input.tsx index 215b8da..c3717c3 100644 --- a/src/components/controls/control-input.tsx +++ b/src/components/controls/control-input.tsx @@ -9,7 +9,7 @@ const ControlInput = ({ id, label, ...props }: ControlInputProps) => { return ( <> - + ); }; diff --git a/src/components/controls/image.tsx b/src/components/controls/image.tsx index fba2afc..9096f13 100644 --- a/src/components/controls/image.tsx +++ b/src/components/controls/image.tsx @@ -49,14 +49,18 @@ const ImageControls = ({ options: { maxImageSize = 1024000 } = {} }: IImageContr }, [file]); return ( -
+
- {file ? uploaded image : } + {file ? ( + uploaded image + ) : ( + + )}
- diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index a9e5e5e..538ad37 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -65,7 +65,7 @@ const Controls = ({ options, styles }: IControlProps) => { open ? "right-0" : "-right-[22rem]" )} > -
+
Settings
{ @@ -18,14 +18,11 @@ const ImageSelectControls = () => { }; return ( -
- - +
+
+ + +
); }; diff --git a/src/components/controls/select/seats/index.tsx b/src/components/controls/select/seats/index.tsx index ac0ff77..1719588 100644 --- a/src/components/controls/select/seats/index.tsx +++ b/src/components/controls/select/seats/index.tsx @@ -51,7 +51,6 @@ const SeatSelectControls = (props: IControlProps) => { onChange={(e) => { store.dispatch(updateSeats({ ids: selectedElementIds, data: { label: e.target.value } })); }} - className="h-9" />
{selectedElementIds.length > 1 && ( diff --git a/src/components/controls/select/shape.jsx b/src/components/controls/select/shape.jsx index f05536e..04ab139 100644 --- a/src/components/controls/select/shape.jsx +++ b/src/components/controls/select/shape.jsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { useSelector } from "react-redux"; -import { Checkbox } from "@/components/core"; +import { Label, Switch } from "@/components/core"; import { dataAttributes } from "@/constants"; import { d3Extended, rgbToHex } from "@/utils"; import { default as ControlInput } from "../control-input"; @@ -13,8 +13,8 @@ const ShapeSelectControls = () => { const firstElement = document.getElementById(selectedElementIds[0]); return ( -
-
+
+
{ }); }} /> +
+
{ }); }} /> - -
- - -
- - {firstElement?.getAttribute?.(dataAttributes.shape) === "RectangleHorizontal" && ( +
+
+ + +
+ {firstElement?.getAttribute?.(dataAttributes.shape) === "RectangleHorizontal" && ( +
{ }); }} /> - )} +
+ )} +
{ d3Extended.selectById(id).style("stroke", e.target.value); }); }} + className="p-0 px-[.125rem]" /> +
+
{ d3Extended.selectById(id).style("color", e.target.value); }); }} + className="p-0 px-[.125rem]" />
diff --git a/src/components/controls/select/text.tsx b/src/components/controls/select/text.tsx index ae12ce0..1bbe998 100644 --- a/src/components/controls/select/text.tsx +++ b/src/components/controls/select/text.tsx @@ -1,6 +1,6 @@ import { useCallback } from "react"; import { useSelector } from "react-redux"; -import { Checkbox } from "@/components/core"; +import { Label, Switch } from "@/components/core"; import { store } from "@/store"; import { selectTextById, updateText } from "@/store/reducers/editor"; import { d3Extended, rgbToHex } from "@/utils"; @@ -19,8 +19,8 @@ const TextSelectControls = () => { ); return ( -
-
+
+
{ }); }} /> +
+
{ }); }} /> +
+
{ }); }} /> +
+
{ }); }} /> +
+
{ element.style("color", e.target.value); }); }} + className="p-0 px-[.125rem]" + /> +
+
+ + -
- - -
); diff --git a/src/components/toolbar/data.tsx b/src/components/toolbar/data.tsx index d56682c..639245e 100644 --- a/src/components/toolbar/data.tsx +++ b/src/components/toolbar/data.tsx @@ -2,7 +2,7 @@ import { CaseSensitive, Circle, Codesandbox, - ImagePlus, + Image, MousePointer2, Move, PenTool, @@ -74,7 +74,7 @@ export const tools = { description: "Click anywhere to place a chosen shape from the library" }, [Tool.Image]: { - icon: ImagePlus, + icon: Image, shortcut: "I", description: "Upload an image to the workspace" }, From 835371078dea029f2d95c159a04400c11352f498 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Sun, 11 Aug 2024 12:34:49 +0530 Subject: [PATCH 13/42] Feat: make few ui enhancements --- src/components/controls/shapes/index.tsx | 8 ++-- src/components/controls/shapes/shape-list.ts | 40 +++++--------------- src/components/toolbar/index.tsx | 19 +++++++++- 3 files changed, 31 insertions(+), 36 deletions(-) diff --git a/src/components/controls/shapes/index.tsx b/src/components/controls/shapes/index.tsx index b6da557..6e6f2d7 100644 --- a/src/components/controls/shapes/index.tsx +++ b/src/components/controls/shapes/index.tsx @@ -32,17 +32,17 @@ const ShapeControls = () => { }, []); return ( -
+
{shapeList.map((Shape, i) => (
onShapeClick(CursorShape(Shape), i)} > - +
))}
diff --git a/src/components/controls/shapes/shape-list.ts b/src/components/controls/shapes/shape-list.ts index c740c87..778af31 100644 --- a/src/components/controls/shapes/shape-list.ts +++ b/src/components/controls/shapes/shape-list.ts @@ -3,47 +3,27 @@ import { ArrowBigLeft, ArrowBigRight, ArrowBigUp, - Boxes, - CircleDot, - CircleSlash, - Cone, Diamond, - Fence, - FireExtinguisher, Hexagon, - LandPlot, Octagon, Pentagon, - Power, - RectangleHorizontal, - Squircle, - Ticket, - Triangle, - TriangleRight + Play, + Square, + Squircle } from "lucide-react"; export const shapes = { - RectangleHorizontal: RectangleHorizontal, - Triangle: Triangle, - TriangleRight: TriangleRight, + ArrowBigLeft: ArrowBigLeft, + ArrowBigRight: ArrowBigRight, + ArrowBigDown: ArrowBigDown, + ArrowBigUp: ArrowBigUp, + Play: Play, Squircle: Squircle, Pentagon: Pentagon, + Square: Square, Hexagon: Hexagon, Octagon: Octagon, - CircleDot: CircleDot, - CircleSlash: CircleSlash, - Diamond: Diamond, - Cone: Cone, - ArrowBigDown: ArrowBigDown, - ArrowBigUp: ArrowBigUp, - ArrowBigLeft: ArrowBigLeft, - ArrowBigRight: ArrowBigRight, - Ticket: Ticket, - Power: Power, - Fence: Fence, - LandPlot: LandPlot, - Boxes: Boxes, - FireExtinguisher: FireExtinguisher + Diamond: Diamond }; export const shapeList = Object.values(shapes); diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index a9abcb2..42de5a7 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -126,8 +126,23 @@ const ToolBar: React.FC = (props) => { {(value as any).subTools?.length && ( - - + + + + + {(value as any).subTools?.map((tool) => { const SubIcon = tool.icon; return ( From 027de560b931ada6b6235ba470122fc67aad1686 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Sun, 11 Aug 2024 13:42:49 +0530 Subject: [PATCH 14/42] Feat: completed ui revamping --- src/components/toolbar/index.tsx | 25 +-- src/components/workspace/actions.tsx | 192 ++++++++++++---------- src/components/workspace/dock-handler.tsx | 24 +++ src/components/workspace/index.tsx | 8 +- src/components/workspace/reload.tsx | 7 +- 5 files changed, 138 insertions(+), 118 deletions(-) create mode 100644 src/components/workspace/dock-handler.tsx diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index 42de5a7..cba8a6f 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect } from "react"; -import { DraftingCompass, PanelBottomClose, PanelBottomOpen } from "lucide-react"; +import { DraftingCompass } from "lucide-react"; import { useSelector } from "react-redux"; import { twMerge } from "tailwind-merge"; import { @@ -11,10 +11,11 @@ import { TooltipContent, TooltipTrigger } from "@/components"; +import DockHandler from "@/components/workspace/dock-handler"; import { dataAttributes, ids } from "@/constants"; import { store } from "@/store"; import { clearCursor, setCursor, setSelectedPolylineId, showControls } from "@/store/reducers/editor"; -import { clearTool, selectSubTool, selectTool, toggleDock } from "@/store/reducers/toolbar"; +import { clearTool, selectSubTool, selectTool } from "@/store/reducers/toolbar"; import { ISTKProps } from "@/types"; import { fallible } from "@/utils"; import { selectFirstShape } from "../controls/shapes"; @@ -170,26 +171,12 @@ const ToolBar: React.FC = (props) => { ); })}
- +
+ +
); }; -function DockTrigger(): JSX.Element { - const dock = useSelector((state: any) => state.toolbar.dock); - - return ( -
-
store.dispatch(toggleDock(undefined))} - > - {dock ? : } -
-
- ); -} - export default ToolBar; diff --git a/src/components/workspace/actions.tsx b/src/components/workspace/actions.tsx index 86158ec..1d13956 100644 --- a/src/components/workspace/actions.tsx +++ b/src/components/workspace/actions.tsx @@ -7,7 +7,9 @@ import { dataAttributes, ids, selectors } from "@/constants"; import type { ISTKProps } from "@/types"; import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; import { Tool } from "../toolbar/data"; +import { default as DockHandler } from "./dock-handler"; import { showPostOffsetElements, showPreOffsetElements } from "./elements"; +import { default as Reload } from "./reload"; import { VisibilityFreezeScale, VisibilityOffset } from "./visibility"; const handleElementVisibility = debounce((workspace, k) => { @@ -68,7 +70,7 @@ export const panAndZoomToArea = ({ k, x, y }) => { d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); }; -const Actions = (props: Pick) => { +const Actions = (props: Pick) => { const dock = useSelector((state: any) => state.toolbar.dock); const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); @@ -97,96 +99,108 @@ const Actions = (props: Pick) => { const showZoomControls = props.options?.showZoomControls ?? true; const showVisibilityControls = props.mode === "designer" && (props.options?.showVisibilityControls ?? true); - - if (!(showZoomControls && showVisibilityControls)) return; + const showReloadButton = props.options?.showReloadButton ?? false; + const isUser = props.mode === "user"; return ( -
-
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", - panStyles?.root?.className, - !dock && "translate-y-20 opacity-0" - )} - style={panStyles?.root?.properties} - > - {showVisibilityControls && } - {showZoomControls && ( - <> -
panLeft()} - role="button" - style={panStyles?.handles?.left?.properties} - > - -
-
panRight()} - style={panStyles?.handles?.right?.properties} - > - -
-
- -
-
- -
-
panUp()} - style={panStyles?.handles?.up?.properties} - > - -
-
panDown()} - style={panStyles?.handles?.down?.properties} - > - -
- - )} - {showVisibilityControls && } -
-
+ <> + {isUser && ( +
+ {showReloadButton && ( + + )} + +
+ )} + {(showZoomControls || showVisibilityControls) && ( +
+
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", + panStyles?.root?.className, + !dock && "translate-y-20 opacity-0" + )} + style={panStyles?.root?.properties} + > + {showVisibilityControls && } + {showZoomControls && ( + <> +
panLeft()} + role="button" + style={panStyles?.handles?.left?.properties} + > + +
+
panRight()} + style={panStyles?.handles?.right?.properties} + > + +
+
+ +
+
+ +
+
panUp()} + style={panStyles?.handles?.up?.properties} + > + +
+
panDown()} + style={panStyles?.handles?.down?.properties} + > + +
+ + )} + {showVisibilityControls && } +
+
+ )} + ); }; diff --git a/src/components/workspace/dock-handler.tsx b/src/components/workspace/dock-handler.tsx new file mode 100644 index 0000000..2b6936f --- /dev/null +++ b/src/components/workspace/dock-handler.tsx @@ -0,0 +1,24 @@ +import { memo } from "react"; +import { PanelBottomClose, PanelBottomOpen } from "lucide-react"; +import { useSelector } from "react-redux"; +import { twMerge } from "tailwind-merge"; +import { store } from "@/store"; +import { toggleDock } from "@/store/reducers/toolbar"; + +function DockHandler(): JSX.Element { + const dock = useSelector((state: any) => state.toolbar.dock); + + return ( +
store.dispatch(toggleDock(undefined))} + > + {dock ? : } +
+ ); +} + +export default memo(DockHandler); diff --git a/src/components/workspace/index.tsx b/src/components/workspace/index.tsx index 885439b..7fb4ead 100644 --- a/src/components/workspace/index.tsx +++ b/src/components/workspace/index.tsx @@ -8,7 +8,6 @@ import { default as Actions } from "./actions"; import { default as Crosshairs } from "./crosshairs"; import { default as Element, ElementType } from "./elements"; import { default as Grid } from "./grid"; -import { default as Reload } from "./reload"; export { default as Cursor } from "./cursor"; @@ -42,8 +41,6 @@ export const Workspace: React.FC = (props) => { [selectedElementIds] ); - const showReloadButton = props.options?.showReloadButton ?? false; - const onWorkspaceHover = useCallback( (e: any) => { if (props.events?.onWorkspaceHover && e.target.id === ids.workspace) props.events.onWorkspaceHover(); @@ -130,10 +127,7 @@ export const Workspace: React.FC = (props) => { )} - - {showReloadButton && ( - - )} +
); }; diff --git a/src/components/workspace/reload.tsx b/src/components/workspace/reload.tsx index 82bcdb2..c3aab09 100644 --- a/src/components/workspace/reload.tsx +++ b/src/components/workspace/reload.tsx @@ -13,13 +13,14 @@ const Reloader = (props: IProps) => {
svg]:hover:-rotate-45 [&>svg]:transition-all [&>svg]:transition-medium rounded-md p-2 transition-all duration-medium", + "w-8 h-8 p-2 rounded-md bg-slate-100 cursor-pointer splash", props.styles?.reloadButton?.className )} - style={props.styles?.reloadButton?.properties} onClick={props?.onReload} + role="button" + style={props.styles?.reloadButton?.properties} > - +
); }; From b683c857b642bc18a21559367e5a342ab8ac4d54 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 11 Aug 2024 14:01:33 +0530 Subject: [PATCH 15/42] Fix: square seat delete --- src/hooks/events/workspace-click.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hooks/events/workspace-click.ts b/src/hooks/events/workspace-click.ts index 9fe2a53..832606b 100644 --- a/src/hooks/events/workspace-click.ts +++ b/src/hooks/events/workspace-click.ts @@ -96,6 +96,8 @@ const useWorkspaceClick = () => { } else if (e.target.nodeName === "rect") { if (e.target.getAttribute(dataAttributes.elementType) === ElementType.Shape) { store.dispatch(deleteShape(e.target.id)); + } else if (e.target.getAttribute(dataAttributes.elementType) === ElementType.Seat) { + store.dispatch(deleteSeat(e.target.id)); } else { store.dispatch(deleteBooth(e.target.id)); } From e63325ee78e4eade36e63c868f62319d3d122158 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 11 Aug 2024 14:15:38 +0530 Subject: [PATCH 16/42] Refactor: dock buttons --- src/components/core/button.tsx | 2 +- src/components/workspace/actions.tsx | 67 +++++++++---------------- src/components/workspace/visibility.tsx | 17 ++++--- 3 files changed, 35 insertions(+), 51 deletions(-) diff --git a/src/components/core/button.tsx b/src/components/core/button.tsx index 0f61d57..e2eabd2 100644 --- a/src/components/core/button.tsx +++ b/src/components/core/button.tsx @@ -7,7 +7,7 @@ const buttonVariants = cva( variants: { variant: { primary: "bg-black text-white", - secondary: "text-black bg-slate-100 after:bg-black/[0.15]" + secondary: "text-black bg-slate-100 hover:bg-slate-200/75 after:bg-black/[0.15]" }, size: { default: "h-10 px-4 py-2", diff --git a/src/components/workspace/actions.tsx b/src/components/workspace/actions.tsx index 1d13956..9a697e8 100644 --- a/src/components/workspace/actions.tsx +++ b/src/components/workspace/actions.tsx @@ -6,6 +6,7 @@ import { twMerge } from "tailwind-merge"; import { dataAttributes, ids, selectors } from "@/constants"; import type { ISTKProps } from "@/types"; import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; +import { Button } from "../core"; import { Tool } from "../toolbar/data"; import { default as DockHandler } from "./dock-handler"; import { showPostOffsetElements, showPreOffsetElements } from "./elements"; @@ -128,72 +129,54 @@ const Actions = (props: Pick} {showZoomControls && ( <> -
panLeft()} - role="button" style={panStyles?.handles?.left?.properties} > -
-
+
-
+
-
+
-
+
-
+
+ )} {showVisibilityControls && } diff --git a/src/components/workspace/visibility.tsx b/src/components/workspace/visibility.tsx index 3f7db87..c64ae79 100644 --- a/src/components/workspace/visibility.tsx +++ b/src/components/workspace/visibility.tsx @@ -6,6 +6,7 @@ import { store } from "@/store"; import { setInitialViewBoxScale, setVisibilityOffset } from "@/store/reducers/editor"; import type { ISTKProps } from "@/types"; import { d3Extended } from "@/utils"; +import { Button } from "../core"; import { showAllElements } from "./elements"; const freeze = () => @@ -31,14 +32,14 @@ export const VisibilityFreezeScale = (props: Pick {initialViewBoxScale ? : } -
+ ); }; @@ -48,13 +49,13 @@ export const VisibilityOffset = (props: Pick {visibilityOffset === 0 ? : } -
+ ); }; From 0077dfb3a92c3ab5c21208847e05474d35c18fdc Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 11 Aug 2024 14:20:02 +0530 Subject: [PATCH 17/42] Refactor: dock file arrangement --- src/actions/index.ts | 2 +- src/components/toolbar/index.tsx | 2 +- src/components/workspace/actions.tsx | 190 ------------------ .../{dock-handler.tsx => dock/handler.tsx} | 1 - src/components/workspace/dock/index.tsx | 190 ++++++++++++++++++ .../workspace/{ => dock}/visibility.tsx | 4 +- .../workspace/elements/polyline.tsx | 2 +- src/components/workspace/index.tsx | 4 +- src/hooks/events/workspace-load.ts | 2 +- 9 files changed, 198 insertions(+), 199 deletions(-) rename src/components/workspace/{dock-handler.tsx => dock/handler.tsx} (99%) create mode 100644 src/components/workspace/dock/index.tsx rename src/components/workspace/{ => dock}/visibility.tsx (96%) diff --git a/src/actions/index.ts b/src/actions/index.ts index d517d4a..231abfa 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -1,4 +1,4 @@ -import { panDown, panLeft, panRight, panUp } from "@/components/workspace/actions"; +import { panDown, panLeft, panRight, panUp } from "@/components/workspace/dock"; import { store } from "@/store"; import { clearElements, deselectElement, selectElement } from "@/store/reducers/editor"; import { stateToJSON } from "@/utils"; diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index cba8a6f..eb5616f 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -11,7 +11,7 @@ import { TooltipContent, TooltipTrigger } from "@/components"; -import DockHandler from "@/components/workspace/dock-handler"; +import { default as DockHandler } from "@/components/workspace/dock/handler"; import { dataAttributes, ids } from "@/constants"; import { store } from "@/store"; import { clearCursor, setCursor, setSelectedPolylineId, showControls } from "@/store/reducers/editor"; diff --git a/src/components/workspace/actions.tsx b/src/components/workspace/actions.tsx index 9a697e8..e69de29 100644 --- a/src/components/workspace/actions.tsx +++ b/src/components/workspace/actions.tsx @@ -1,190 +0,0 @@ -import { useLayoutEffect } from "react"; -import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, Minus, Plus } from "lucide-react"; -import { useSelector } from "react-redux"; -import { default as debounce } from "lodash/debounce"; -import { twMerge } from "tailwind-merge"; -import { dataAttributes, ids, selectors } from "@/constants"; -import type { ISTKProps } from "@/types"; -import { d3Extended, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; -import { Button } from "../core"; -import { Tool } from "../toolbar/data"; -import { default as DockHandler } from "./dock-handler"; -import { showPostOffsetElements, showPreOffsetElements } from "./elements"; -import { default as Reload } from "./reload"; -import { VisibilityFreezeScale, VisibilityOffset } from "./visibility"; - -const handleElementVisibility = debounce((workspace, k) => { - const visibilityOffset = +workspace.attr(dataAttributes.visibilityOffset) || 0; - const initialViewBoxScaleForWidth = +workspace.attr(dataAttributes.initialViewBoxScaleForWidth); - if (k * 1.1 < getScaleFactorAccountingForViewBoxWidth(visibilityOffset, initialViewBoxScaleForWidth)) { - showPreOffsetElements(); - } else { - showPostOffsetElements(); - } -}, 25); - -function handleZoom(e) { - const workspace = d3Extended.select(selectors.workspaceGroup); - handleElementVisibility(workspace, e.transform.k); - workspace.attr("transform", e.transform); -} - -const zoom = d3Extended.zoom().on("zoom", handleZoom); - -const zoomIn = () => { - d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 1.1); -}; - -const zoomOut = () => { - d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 0.9); -}; - -export const panLeft = (by = 50, duration = 250) => { - d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, by, 0); -}; - -export const panRight = (by = 50, duration = 250) => { - d3Extended - .selectById(ids.workspace) - .transition() - .duration(duration) - .call(zoom.translateBy, -1 * by, 0); -}; - -export const panUp = (by = 50, duration = 250) => { - d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, 0, by); -}; - -export const panDown = (by = 50, duration = 250) => { - d3Extended - .selectById(ids.workspace) - .transition() - .duration(duration) - .call(zoom.translateBy, 0, -1 * by); -}; - -export const panAndZoom = ({ k, x, y }) => { - d3Extended.selectById(ids.workspace).call(zoom.transform, d3Extended.zoomIdentity.translate(x, y).scale(k)); -}; - -export const panAndZoomToArea = ({ k, x, y }) => { - d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); -}; - -const Actions = (props: Pick) => { - const dock = useSelector((state: any) => state.toolbar.dock); - const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); - - useLayoutEffect(() => { - const selection = d3Extended.selectById(ids.workspace); - selection.on("zoom", null); - if (selectedTool == Tool.Pan) { - selection.call(zoom); - } else { - const zoomSelection = selection.call(zoom).on("wheel.zoom", (e) => { - e.preventDefault(); - const currentZoom = selection.property("__zoom").k || 1; - if (e.ctrlKey) { - const nextZoom = currentZoom * Math.pow(2, -e.deltaY * 0.01); - zoom.scaleTo(selection, nextZoom, d3Extended.pointer(e)); - } else { - zoom.translateBy(selection, -(e.deltaX / currentZoom), -(e.deltaY / currentZoom)); - } - }); - if (props.mode !== "user") zoomSelection.on("mousedown.zoom", null); - } - }, [selectedTool]); - - const zoomStyles = props.styles?.zoomControls; - const panStyles = props.styles?.panControls; - - const showZoomControls = props.options?.showZoomControls ?? true; - const showVisibilityControls = props.mode === "designer" && (props.options?.showVisibilityControls ?? true); - const showReloadButton = props.options?.showReloadButton ?? false; - const isUser = props.mode === "user"; - - return ( - <> - {isUser && ( -
- {showReloadButton && ( - - )} - -
- )} - {(showZoomControls || showVisibilityControls) && ( -
-
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", - panStyles?.root?.className, - !dock && "translate-y-20 opacity-0" - )} - style={panStyles?.root?.properties} - > - {showVisibilityControls && } - {showZoomControls && ( - <> - - - - - - - - )} - {showVisibilityControls && } -
-
- )} - - ); -}; - -export default Actions; diff --git a/src/components/workspace/dock-handler.tsx b/src/components/workspace/dock/handler.tsx similarity index 99% rename from src/components/workspace/dock-handler.tsx rename to src/components/workspace/dock/handler.tsx index 2b6936f..53caa24 100644 --- a/src/components/workspace/dock-handler.tsx +++ b/src/components/workspace/dock/handler.tsx @@ -7,7 +7,6 @@ import { toggleDock } from "@/store/reducers/toolbar"; function DockHandler(): JSX.Element { const dock = useSelector((state: any) => state.toolbar.dock); - return (
{ + const visibilityOffset = +workspace.attr(dataAttributes.visibilityOffset) || 0; + const initialViewBoxScaleForWidth = +workspace.attr(dataAttributes.initialViewBoxScaleForWidth); + if (k * 1.1 < getScaleFactorAccountingForViewBoxWidth(visibilityOffset, initialViewBoxScaleForWidth)) { + showPreOffsetElements(); + } else { + showPostOffsetElements(); + } +}, 25); + +function handleZoom(e) { + const workspace = d3Extended.select(selectors.workspaceGroup); + handleElementVisibility(workspace, e.transform.k); + workspace.attr("transform", e.transform); +} + +const zoom = d3Extended.zoom().on("zoom", handleZoom); + +const zoomIn = () => { + d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 1.1); +}; + +const zoomOut = () => { + d3Extended.selectById(ids.workspace).transition().call(zoom.scaleBy, 0.9); +}; + +export const panLeft = (by = 50, duration = 250) => { + d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, by, 0); +}; + +export const panRight = (by = 50, duration = 250) => { + d3Extended + .selectById(ids.workspace) + .transition() + .duration(duration) + .call(zoom.translateBy, -1 * by, 0); +}; + +export const panUp = (by = 50, duration = 250) => { + d3Extended.selectById(ids.workspace).transition().duration(duration).call(zoom.translateBy, 0, by); +}; + +export const panDown = (by = 50, duration = 250) => { + d3Extended + .selectById(ids.workspace) + .transition() + .duration(duration) + .call(zoom.translateBy, 0, -1 * by); +}; + +export const panAndZoom = ({ k, x, y }) => { + d3Extended.selectById(ids.workspace).call(zoom.transform, d3Extended.zoomIdentity.translate(x, y).scale(k)); +}; + +export const panAndZoomToArea = ({ k, x, y }) => { + d3Extended.selectById(ids.workspace).transition().duration(1000).call(zoom.scaleTo, k, [x, y]); +}; + +const Dock = (props: Pick) => { + const dock = useSelector((state: any) => state.toolbar.dock); + const selectedTool = useSelector((state: any) => state.toolbar.selectedTool); + + useLayoutEffect(() => { + const selection = d3Extended.selectById(ids.workspace); + selection.on("zoom", null); + if (selectedTool == Tool.Pan) { + selection.call(zoom); + } else { + const zoomSelection = selection.call(zoom).on("wheel.zoom", (e) => { + e.preventDefault(); + const currentZoom = selection.property("__zoom").k || 1; + if (e.ctrlKey) { + const nextZoom = currentZoom * Math.pow(2, -e.deltaY * 0.01); + zoom.scaleTo(selection, nextZoom, d3Extended.pointer(e)); + } else { + zoom.translateBy(selection, -(e.deltaX / currentZoom), -(e.deltaY / currentZoom)); + } + }); + if (props.mode !== "user") zoomSelection.on("mousedown.zoom", null); + } + }, [selectedTool]); + + const zoomStyles = props.styles?.zoomControls; + const panStyles = props.styles?.panControls; + + const showZoomControls = props.options?.showZoomControls ?? true; + const showVisibilityControls = props.mode === "designer" && (props.options?.showVisibilityControls ?? true); + const showReloadButton = props.options?.showReloadButton ?? false; + const isUser = props.mode === "user"; + + return ( + <> + {isUser && ( +
+ {showReloadButton && ( + + )} + +
+ )} + {(showZoomControls || showVisibilityControls) && ( +
+
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", + panStyles?.root?.className, + !dock && "translate-y-20 opacity-0" + )} + style={panStyles?.root?.properties} + > + {showVisibilityControls && } + {showZoomControls && ( + <> + + + + + + + + )} + {showVisibilityControls && } +
+
+ )} + + ); +}; + +export default Dock; diff --git a/src/components/workspace/visibility.tsx b/src/components/workspace/dock/visibility.tsx similarity index 96% rename from src/components/workspace/visibility.tsx rename to src/components/workspace/dock/visibility.tsx index c64ae79..4290742 100644 --- a/src/components/workspace/visibility.tsx +++ b/src/components/workspace/dock/visibility.tsx @@ -6,8 +6,8 @@ import { store } from "@/store"; import { setInitialViewBoxScale, setVisibilityOffset } from "@/store/reducers/editor"; import type { ISTKProps } from "@/types"; import { d3Extended } from "@/utils"; -import { Button } from "../core"; -import { showAllElements } from "./elements"; +import { Button } from "../../core"; +import { showAllElements } from "../elements"; const freeze = () => store.dispatch(setInitialViewBoxScale(d3Extended.zoomTransform(document.querySelector(selectors.workspaceGroup)).k)); diff --git a/src/components/workspace/elements/polyline.tsx b/src/components/workspace/elements/polyline.tsx index e0a87f2..8c0a6c4 100644 --- a/src/components/workspace/elements/polyline.tsx +++ b/src/components/workspace/elements/polyline.tsx @@ -3,7 +3,7 @@ import { twMerge } from "tailwind-merge"; import { dataAttributes, selectors } from "@/constants"; import { IPolyline, ISTKProps, ISeatCategory, ISection } from "@/types"; import { d3Extended, getRelativeWorkspaceClickCoords, getScaleFactorAccountingForViewBoxWidth } from "@/utils"; -import { panAndZoomToArea } from "../actions"; +import { panAndZoomToArea } from "../dock"; export interface IPolylineProps extends IPolyline { className?: string; diff --git a/src/components/workspace/index.tsx b/src/components/workspace/index.tsx index 7fb4ead..e2c80c6 100644 --- a/src/components/workspace/index.tsx +++ b/src/components/workspace/index.tsx @@ -4,8 +4,8 @@ import { twMerge } from "tailwind-merge"; import { dataAttributes, ids } from "@/constants"; import { type ISTKProps, SeatStatus } from "@/types"; import { Tool, tools } from "../toolbar/data"; -import { default as Actions } from "./actions"; import { default as Crosshairs } from "./crosshairs"; +import { default as Dock } from "./dock"; import { default as Element, ElementType } from "./elements"; import { default as Grid } from "./grid"; @@ -127,7 +127,7 @@ export const Workspace: React.FC = (props) => { )} - +
); }; diff --git a/src/hooks/events/workspace-load.ts b/src/hooks/events/workspace-load.ts index b885276..e98c727 100644 --- a/src/hooks/events/workspace-load.ts +++ b/src/hooks/events/workspace-load.ts @@ -1,6 +1,6 @@ import { useEffect, useLayoutEffect } from "react"; import { useSelector } from "react-redux"; -import { panAndZoom } from "@/components/workspace/actions"; +import { panAndZoom } from "@/components/workspace/dock"; import { dataAttributes, ids, selectors } from "@/constants"; import { store } from "@/store"; import { initializeElements, initializeWorkspace, resetWorkspace, sync } from "@/store/reducers/editor"; From 948aa915e9156ea5ea29155e9fd14d9c4fddfd92 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Sun, 11 Aug 2024 15:10:06 +0530 Subject: [PATCH 18/42] Feat: added few touch ups --- src/components/toolbar/index.tsx | 2 +- src/components/workspace/dock/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index eb5616f..9c86b85 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -171,7 +171,7 @@ const ToolBar: React.FC = (props) => { ); })}
-
+
diff --git a/src/components/workspace/dock/index.tsx b/src/components/workspace/dock/index.tsx index 4be5b31..326c938 100644 --- a/src/components/workspace/dock/index.tsx +++ b/src/components/workspace/dock/index.tsx @@ -120,7 +120,7 @@ const Dock = (props: Pick) >
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", + "border-t sm:border border-border w-full sm:w-fit bg-white p-3 sm:p-2 overflow-x-auto sm:rounded-lg flex justify-center [&>div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", panStyles?.root?.className, !dock && "translate-y-20 opacity-0" )} From 324f6b1092e3b97a3cc7f2f0d297c461bae9a1e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 11 Aug 2024 09:42:07 +0000 Subject: [PATCH 19/42] CI: @mezh-hq/react-seat-toolkit - preminor release skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 166527f..11fb411 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "2.1.1", + "version": "2.2.0-blizzard.0", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 3b97eb944d9ed6d0c2ec37a09eff61ebc04185c1 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Sun, 11 Aug 2024 21:09:04 +0530 Subject: [PATCH 20/42] Fix: few more ui issues --- src/components/controls/image.tsx | 2 +- src/components/controls/index.tsx | 4 +-- .../controls/select/polyline/index.tsx | 8 +++-- .../select/polyline/section-selector.tsx | 36 ++++++++++--------- .../controls/select/seats/categorizer.tsx | 2 +- src/components/core/input.tsx | 2 +- src/components/core/popover.tsx | 2 +- src/components/core/select.tsx | 4 +-- src/components/core/tooltip.tsx | 2 +- src/components/index.tsx | 2 +- src/components/operations/index.tsx | 2 +- src/components/toolbar/index.tsx | 4 +-- src/components/workspace/actions.tsx | 0 src/components/workspace/dock/index.tsx | 2 +- 14 files changed, 40 insertions(+), 32 deletions(-) delete mode 100644 src/components/workspace/actions.tsx diff --git a/src/components/controls/image.tsx b/src/components/controls/image.tsx index 9096f13..7e7b0bc 100644 --- a/src/components/controls/image.tsx +++ b/src/components/controls/image.tsx @@ -51,7 +51,7 @@ const ImageControls = ({ options: { maxImageSize = 1024000 } = {} }: IImageContr return (
{file ? ( diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index 39840a9..8ef8dae 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -59,13 +59,13 @@ const Controls = ({ options, styles }: IControlProps) => {
-
+
Settings
{ const firstElement = document.getElementById(selectedElementIds[0]); return ( -
+
-
+
{ d3Extended.selectById(id).style("stroke", e.target.value); }); }} + className="p-0 px-[.125rem]" /> +
+
{ d3Extended.selectById(id).style("color", e.target.value); }); }} + className="p-0 px-[.125rem]" />
diff --git a/src/components/controls/select/polyline/section-selector.tsx b/src/components/controls/select/polyline/section-selector.tsx index e6c1337..bfb4390 100644 --- a/src/components/controls/select/polyline/section-selector.tsx +++ b/src/components/controls/select/polyline/section-selector.tsx @@ -1,4 +1,4 @@ -import { DollarSign, Plus, X } from "lucide-react"; +import { DollarSign, Plus, Settings2, X } from "lucide-react"; import { useSelector } from "react-redux"; import { default as debounce } from "lodash/debounce"; import { twMerge } from "tailwind-merge"; @@ -7,7 +7,7 @@ import { dataAttributes } from "@/constants"; import { store } from "@/store"; import { addSection, deleteSection, updatePolylines, updateSection } from "@/store/reducers/editor"; import { ISTKProps } from "@/types"; -import { Callout, Caption, Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../../core"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../../core"; const onAddSection = () => store.dispatch(addSection(undefined)); @@ -20,8 +20,8 @@ type IControlProps = Pick; export const SectionManager = ({ options }: IControlProps) => { const sections = useSelector((state: any) => state.editor.sections); return ( -
-
+
+
Sections
state.editor.sections); return ( <> -
- Sections - - - - Manage - - - - - - +
+
+
Sections
+ + + } + /> + + + + + +
span]:line-clamp-1", + "flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-gray-200 bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", className )} {...props} @@ -76,7 +76,7 @@ const SelectContent = React.forwardRef< = (props) => { <>
= ({
= (props) => { return (
-
+
{Object.entries(tools).map(([key, value]) => { diff --git a/src/components/workspace/actions.tsx b/src/components/workspace/actions.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/workspace/dock/index.tsx b/src/components/workspace/dock/index.tsx index 326c938..a4ae5b1 100644 --- a/src/components/workspace/dock/index.tsx +++ b/src/components/workspace/dock/index.tsx @@ -120,7 +120,7 @@ const Dock = (props: Pick) >
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", + "border-t sm:border border-gray-200 w-full sm:w-fit bg-white p-3 sm:p-2 overflow-x-auto sm:rounded-lg flex justify-center [&>div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", panStyles?.root?.className, !dock && "translate-y-20 opacity-0" )} From 565a2d170fa2c0de79ec01c39dc81b9fa8416220 Mon Sep 17 00:00:00 2001 From: Miyuru Gunarathna Date: Sun, 11 Aug 2024 21:26:20 +0530 Subject: [PATCH 21/42] Feat: added extended styles for dock --- src/components/workspace/dock/index.tsx | 19 ++++++++++++------- src/types/styles.ts | 4 ++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/components/workspace/dock/index.tsx b/src/components/workspace/dock/index.tsx index a4ae5b1..10ab2cc 100644 --- a/src/components/workspace/dock/index.tsx +++ b/src/components/workspace/dock/index.tsx @@ -97,9 +97,11 @@ const Dock = (props: Pick) const zoomStyles = props.styles?.zoomControls; const panStyles = props.styles?.panControls; + const dockStyles = props.styles?.dock; + const isDesigner = props.mode === "designer"; const showZoomControls = props.options?.showZoomControls ?? true; - const showVisibilityControls = props.mode === "designer" && (props.options?.showVisibilityControls ?? true); + const showVisibilityControls = isDesigner && (props.options?.showVisibilityControls ?? true); const showReloadButton = props.options?.showReloadButton ?? false; const isUser = props.mode === "user"; @@ -110,21 +112,24 @@ const Dock = (props: Pick) {showReloadButton && ( )} - + {(showZoomControls || showVisibilityControls) && }
)} {(showZoomControls || showVisibilityControls) && (
div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100", - panStyles?.root?.className, + "border border-gray-200 w-fit bg-white p-2 overflow-x-auto rounded-lg flex justify-center [&>div]:shrink-0 gap-2 transition-all duration-500 ease-in-out opacity-100 pointer-events-auto", + dockStyles?.container?.className, !dock && "translate-y-20 opacity-0" )} - style={panStyles?.root?.properties} + style={dockStyles?.container?.properties} > {showVisibilityControls && } {showZoomControls && ( diff --git a/src/types/styles.ts b/src/types/styles.ts index f23bac7..d850521 100644 --- a/src/types/styles.ts +++ b/src/types/styles.ts @@ -90,4 +90,8 @@ export interface IStyles { container?: IStyle; button?: IStyle; }; + dock?: { + container?: IStyle; + root?: IStyle; + }; } From e80b1562a32b88d4fec237d0f14f89d71a733cda Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 11 Aug 2024 15:57:52 +0000 Subject: [PATCH 22/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 11fb411..098a886 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "2.2.0-blizzard.0", + "version": "2.2.0-blizzard.1", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 6105d3e164cb67c5c8d876a3837be314d37668fb Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 18 Aug 2024 11:23:54 +0530 Subject: [PATCH 23/42] Feat!: added element rotation and remove booths --- README.md | 1 - src/components/controls/image.tsx | 8 +++- src/components/controls/index.tsx | 2 - src/components/controls/select/general.tsx | 7 ++- src/components/controls/select/index.tsx | 3 +- src/components/controls/shapes/index.tsx | 14 ++++-- src/components/controls/shapes/shape-list.ts | 26 ++++++----- src/components/toolbar/data.tsx | 20 +-------- src/components/workspace/elements/booth.tsx | 40 ----------------- src/components/workspace/elements/image.tsx | 2 +- .../workspace/elements/polyline.tsx | 2 +- src/components/workspace/elements/seat.tsx | 2 +- src/components/workspace/elements/shape.tsx | 43 +++++++++++++------ src/components/workspace/elements/text.tsx | 2 +- src/components/workspace/elements/utils.ts | 18 -------- src/components/workspace/index.tsx | 4 -- src/hooks/events/duplication.ts | 17 +------- src/hooks/events/selection.ts | 5 +-- src/hooks/events/workspace-click.ts | 8 ---- src/store/reducers/editor/booths.ts | 15 ------- src/store/reducers/editor/index.ts | 12 ------ src/stories/user/basic.stories.tsx | 8 ---- src/stories/user/categorized.stories.tsx | 6 --- src/stories/user/sections.stories.tsx | 1 - src/types/elements/booth.ts | 6 --- src/types/elements/index.ts | 1 - src/types/index.ts | 2 - src/types/styles.ts | 5 --- src/utils/d3.ts | 10 ++++- src/utils/transformer.ts | 12 ------ 30 files changed, 83 insertions(+), 219 deletions(-) delete mode 100644 src/components/workspace/elements/booth.tsx delete mode 100644 src/store/reducers/editor/booths.ts delete mode 100644 src/types/elements/booth.ts diff --git a/README.md b/README.md index 141474c..6298248 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,6 @@ - **Miscallaneous** - Add, move around and scale background images ✓ - - Add and move around booths ✓ - Multiple element selection and deselection ✓ - Bring elements to front or back ✓ diff --git a/src/components/controls/image.tsx b/src/components/controls/image.tsx index 7e7b0bc..3768bb0 100644 --- a/src/components/controls/image.tsx +++ b/src/components/controls/image.tsx @@ -13,7 +13,7 @@ const onUploadClick = () => document.getElementById("image-input").click(); type IImageControlProps = Pick; -const ImageControls = ({ options: { maxImageSize = 1024000 } = {} }: IImageControlProps) => { +const Controls = ({ options: { maxImageSize = 1024000 } = {} }: IImageControlProps) => { const [file, setFile] = useState(null); const onUpload = async (e) => { @@ -68,4 +68,8 @@ const ImageControls = ({ options: { maxImageSize = 1024000 } = {} }: IImageContr ); }; -export default memo(ImageControls); +const ImageControls = memo(Controls); + +(ImageControls as any).name = "ImageControls"; + +export default ImageControls; diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index 8ef8dae..86ae797 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -8,7 +8,6 @@ import { toggleControls } from "@/store/reducers/editor"; import { ISTKProps } from "@/types"; import { AnimatedSwitcher, IconButton } from "../core"; import { Tool } from "../toolbar/data"; -import { ElementType } from "../workspace/elements"; import { default as ImageControls } from "./image"; import { default as NoControls } from "./no-controls"; import { default as NoSelectedElement } from "./no-selection"; @@ -37,7 +36,6 @@ const Controls = ({ options, styles }: IControlProps) => { const firstElementType = document .getElementById(selectedElementIds[0]) ?.getAttribute?.(dataAttributes.elementType); - if (firstElementType === ElementType.Booth) return SelectControls; if (selectedElementIds.length > 1) { const same = selectedElementIds.every((id) => { return document.getElementById(id)?.getAttribute?.(dataAttributes.elementType) === firstElementType; diff --git a/src/components/controls/select/general.tsx b/src/components/controls/select/general.tsx index d708996..f50f557 100644 --- a/src/components/controls/select/general.tsx +++ b/src/components/controls/select/general.tsx @@ -18,7 +18,12 @@ const GeneralSelectControls = () => { max={360} onChange={(e) => { selectedElementIds.forEach((id) => { - d3Extended.selectById(id).style("transform", `rotate(${e.target.value}deg)`); + const element = d3Extended.selectById(id); + if (element?.node()?.tagName === "svg") { + element.node().parentElement.style.transform = `rotate(${e.target.value}deg)`; + } else { + element.style("transform", `rotate(${e.target.value}deg)`); + } }); }} /> diff --git a/src/components/controls/select/index.tsx b/src/components/controls/select/index.tsx index fd358ca..9307af3 100644 --- a/src/components/controls/select/index.tsx +++ b/src/components/controls/select/index.tsx @@ -1,4 +1,4 @@ -import { Fragment, useMemo } from "react"; +import { useMemo } from "react"; import { useSelector } from "react-redux"; import { ElementType } from "@/components/workspace/elements"; import { dataAttributes } from "@/constants"; @@ -21,7 +21,6 @@ const SelectControls = ({ options, styles }: IControlProps) => { if (firstElementType === ElementType.Shape) return ShapeSelectControls; if (firstElementType === ElementType.Polyline) return PolylineSelectControls; if (firstElementType === ElementType.Image) return ImageSelectControls; - if (firstElementType === ElementType.Booth) return Fragment; return SeatSelectControls; }, [selectedElementIds]); diff --git a/src/components/controls/shapes/index.tsx b/src/components/controls/shapes/index.tsx index 6e6f2d7..57b9b4d 100644 --- a/src/components/controls/shapes/index.tsx +++ b/src/components/controls/shapes/index.tsx @@ -12,7 +12,11 @@ const CursorShape = (Shape) => { const icon = (props) => ( @@ -21,7 +25,7 @@ const CursorShape = (Shape) => { return icon; }; -const ShapeControls = () => { +const Controls = () => { const [selectedIndex, setSelectedIndex] = useState(0); const onShapeClick = useCallback((shape, i) => { @@ -54,4 +58,8 @@ export const selectFirstShape = () => store.dispatch(setCursor(CursorShape(shapeList[0]))); }); -export default memo(ShapeControls, isEqual); +const ShapeControls = memo(Controls, isEqual); + +(ShapeControls as any).name = "ShapeControls"; + +export default ShapeControls; diff --git a/src/components/controls/shapes/shape-list.ts b/src/components/controls/shapes/shape-list.ts index 778af31..2487def 100644 --- a/src/components/controls/shapes/shape-list.ts +++ b/src/components/controls/shapes/shape-list.ts @@ -3,27 +3,31 @@ import { ArrowBigLeft, ArrowBigRight, ArrowBigUp, + Codesandbox, Diamond, Hexagon, Octagon, Pentagon, Play, + RectangleHorizontal, Square, Squircle } from "lucide-react"; export const shapes = { - ArrowBigLeft: ArrowBigLeft, - ArrowBigRight: ArrowBigRight, - ArrowBigDown: ArrowBigDown, - ArrowBigUp: ArrowBigUp, - Play: Play, - Squircle: Squircle, - Pentagon: Pentagon, - Square: Square, - Hexagon: Hexagon, - Octagon: Octagon, - Diamond: Diamond + RectangleHorizontal, + Codesandbox, + ArrowBigLeft, + ArrowBigRight, + ArrowBigDown, + ArrowBigUp, + Play, + Squircle, + Pentagon, + Square, + Hexagon, + Octagon, + Diamond }; export const shapeList = Object.values(shapes); diff --git a/src/components/toolbar/data.tsx b/src/components/toolbar/data.tsx index 92d2ffc..a2fb265 100644 --- a/src/components/toolbar/data.tsx +++ b/src/components/toolbar/data.tsx @@ -1,22 +1,10 @@ -import { - CaseSensitive, - Circle, - Codesandbox, - Image, - MousePointer2, - Move, - PenTool, - Pentagon, - Sparkles, - Square -} from "lucide-react"; +import { CaseSensitive, Circle, Image, MousePointer2, Move, PenTool, Pentagon, Sparkles, Square } from "lucide-react"; import { twMerge } from "tailwind-merge"; export enum Tool { Select = "Select", Eraser = "Eraser", Seat = "Seat", - Booth = "Booth", Pen = "Pen", Text = "Text", Shape = "Shapes", @@ -57,12 +45,6 @@ export const tools = { } ] }, - [Tool.Booth]: { - icon: Codesandbox, - iconCursor: (props: any) => , - shortcut: "B", - description: "Click anywhere to place a booth" - }, [Tool.Pen]: { icon: PenTool, iconCursor: (props: any) => ( diff --git a/src/components/workspace/elements/booth.tsx b/src/components/workspace/elements/booth.tsx deleted file mode 100644 index 7102cb1..0000000 --- a/src/components/workspace/elements/booth.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { forwardRef } from "react"; -import { twMerge } from "tailwind-merge"; -import { IBooth, ISTKProps } from "@/types"; - -export const boothSize = 39; - -export interface IBoothProps extends IBooth { - className: string; - consumer: ISTKProps; - isSelected?: boolean; - element?: any; -} -const Booth: React.FC = forwardRef( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - ({ id, x, y, rotation, consumer, isSelected: _, element: __, ...props }, ref: any) => { - return ( - - ); - } -); - -Booth.displayName = "Booth"; - -export default Booth; diff --git a/src/components/workspace/elements/image.tsx b/src/components/workspace/elements/image.tsx index 511c342..e7d953b 100644 --- a/src/components/workspace/elements/image.tsx +++ b/src/components/workspace/elements/image.tsx @@ -31,7 +31,7 @@ const Image: React.FC = forwardRef( preserveAspectRatio="none" style={{ transform: `rotate(${rotation ?? 0}deg)`, - transformOrigin: `${x + width / 2}px ${y + height / 2}px`, + transformOrigin: `center`, ...consumer.styles?.elements?.image?.base?.properties }} /> diff --git a/src/components/workspace/elements/polyline.tsx b/src/components/workspace/elements/polyline.tsx index 8c0a6c4..a6ef500 100644 --- a/src/components/workspace/elements/polyline.tsx +++ b/src/components/workspace/elements/polyline.tsx @@ -82,7 +82,7 @@ const Polyline: React.FC = forwardRef( color: sectionObject?.color ?? color ?? "transparent", stroke: sectionObject?.stroke ?? stroke, transform: `rotate(${rotation ?? 0}deg)`, - transformOrigin: `${points[0].x}px ${points[0].y}px`, + transformOrigin: "center", ...consumer.styles?.elements?.shape?.base?.properties, ...(sectionObject && consumer.styles?.elements?.section?.base?.properties), ...(sectionObject?.freeSeating && consumer.styles?.elements?.section?.freeSeating?.properties) diff --git a/src/components/workspace/elements/seat.tsx b/src/components/workspace/elements/seat.tsx index 964d4e3..2548b16 100644 --- a/src/components/workspace/elements/seat.tsx +++ b/src/components/workspace/elements/seat.tsx @@ -123,7 +123,7 @@ const Seat: React.FC = forwardRef( ), style: { transform: `rotate(${rotation ?? 0}deg)`, - transformOrigin: `${x}px ${y}px`, + transformOrigin: "center", ...consumer.styles?.elements?.seat?.base?.properties }, onMouseOver: onMouseOver, diff --git a/src/components/workspace/elements/shape.tsx b/src/components/workspace/elements/shape.tsx index 03cef38..ba0e274 100644 --- a/src/components/workspace/elements/shape.tsx +++ b/src/components/workspace/elements/shape.tsx @@ -4,12 +4,12 @@ import { shapes } from "@/components/controls/shapes/shape-list"; import { dataAttributes } from "@/constants"; import { ISTKProps, IShape } from "@/types"; -export const shapeSize = 65; +export const shapeSize = 50; export const shapeStrokeWidth = 0.65; export const resizableRectangle = { - width: 200, - height: 100 + width: 150, + height: 75 }; export interface IShapeProps extends IShape { @@ -61,7 +61,7 @@ const Shape: React.FC = forwardRef( color: color ?? "transparent", stroke, transform: `rotate(${rotation ?? 0}deg)`, - transformOrigin: `${x + width / 2}px ${y + height / 2}px`, + transformOrigin: `center`, ...consumer.styles?.elements?.shape?.base?.properties }} {...{ [dataAttributes.shape]: "RectangleHorizontal" }} @@ -69,20 +69,35 @@ const Shape: React.FC = forwardRef( /> ); } + width ??= shapeSize; + height ??= shapeSize; const Icon = shapes[name]; return ( - + style={{ + transform: `rotate(${rotation ?? 0}deg)`, + transformOrigin: "center" + }} + > + + ); } ); diff --git a/src/components/workspace/elements/text.tsx b/src/components/workspace/elements/text.tsx index 7844c7f..5701e7f 100644 --- a/src/components/workspace/elements/text.tsx +++ b/src/components/workspace/elements/text.tsx @@ -54,7 +54,7 @@ const Text: React.FC = forwardRef( )} style={{ transform: `rotate(${rotation ?? 0}deg)`, - transformOrigin: `${x}px ${y}px`, + transformOrigin: "center", ...consumer.styles?.elements?.text?.base?.properties, stroke: color, color diff --git a/src/components/workspace/elements/utils.ts b/src/components/workspace/elements/utils.ts index 50d1b92..fc8bbb3 100644 --- a/src/components/workspace/elements/utils.ts +++ b/src/components/workspace/elements/utils.ts @@ -4,7 +4,6 @@ import { resizeCursors } from "@/hooks/interactions"; import { default as store } from "@/store"; import { IPopulatedSeat } from "@/types"; import { d3Extended } from "@/utils"; -import Booth from "./booth"; import Image from "./image"; import Polyline from "./polyline"; import Seat from "./seat"; @@ -12,7 +11,6 @@ import Shape from "./shape"; import Text from "./text"; export const ElementType = { - Booth: "booth", Seat: "seat", Text: "text", Shape: "shape", @@ -21,7 +19,6 @@ export const ElementType = { }; export const elements = { - [ElementType.Booth]: Booth, [ElementType.Seat]: Seat, [ElementType.Text]: Text, [ElementType.Shape]: Shape, @@ -122,16 +119,11 @@ export const hideSeat = (seat: d3.Selection) => { export const showPreOffsetElements = () => { const seats = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Seat}"]`); if (seats.size() && +seats?.style("opacity") !== 0) { - const booths = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Booth}"]`); const sections = d3Extended.selectAll( `[${dataAttributes.elementType}="${ElementType.Polyline}"][${dataAttributes.section}]` ); const elementsEmbracingOffset = d3Extended.selectAll(`[${dataAttributes.embraceOffset}="true"]`); seats.forEach(hideSeat); - booths.forEach((booth) => { - booth.style("opacity", 0); - booth.style("pointer-events", "none"); - }); sections.forEach((section) => { section.style("opacity", 1); section.style("pointer-events", "all"); @@ -146,16 +138,11 @@ export const showPreOffsetElements = () => { export const showPostOffsetElements = () => { const seats = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Seat}"]`); if (seats.size() && +seats.style("opacity") !== 1) { - const booths = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Booth}"]`); const sections = d3Extended.selectAll( `[${dataAttributes.elementType}="${ElementType.Polyline}"][${dataAttributes.section}]` ); const elementsEmbracingOffset = d3Extended.selectAll(`[${dataAttributes.embraceOffset}="true"]`); seats.forEach(showSeat); - booths.forEach((booth) => { - booth.style("opacity", 1); - booth.style("pointer-events", "all"); - }); sections.forEach((section) => { if (section.attr(dataAttributes.sectionFreeSeating) !== "true") { section.style("opacity", 0); @@ -171,14 +158,9 @@ export const showPostOffsetElements = () => { export const showAllElements = () => { const seats = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Seat}"]`); - const booths = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Booth}"]`); const sections = d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Polyline}"]`); const elementsEmbracingOffset = d3Extended.selectAll(`[${dataAttributes.embraceOffset}="true"]`); seats.forEach(showSeat); - booths.forEach((booth) => { - booth.style("opacity", 1); - booth.style("pointer-events", "all"); - }); sections.forEach((section) => { section.style("opacity", 1); section.style("pointer-events", "all"); diff --git a/src/components/workspace/index.tsx b/src/components/workspace/index.tsx index e2c80c6..3d64802 100644 --- a/src/components/workspace/index.tsx +++ b/src/components/workspace/index.tsx @@ -13,7 +13,6 @@ export { default as Cursor } from "./cursor"; export const Workspace: React.FC = (props) => { const initialized = useSelector((state: any) => state.editor.initialized); - const booths = useSelector((state: any) => state.editor.booths); const seats = useSelector((state: any) => state.editor.seats); const text = useSelector((state: any) => state.editor.text); const shapes = useSelector((state: any) => state.editor.shapes); @@ -81,9 +80,6 @@ export const Workspace: React.FC = (props) => { {...elementProps(e)} /> ))} - {booths.map((e) => ( - - ))} {shapes.map((e) => ( { status: element.getAttribute(dataAttributes.status) }; store.dispatch(addSeat(copy)); - } else if (elementType === ElementType.Booth) { - copy = { - id: uuidV4(), - x: Number(element.getAttribute("x")) + offset, - y: Number(element.getAttribute("y")) + offset - }; - store.dispatch(addBooth(copy)); } else if (elementType === ElementType.Text) { copy = { id: uuidV4(), diff --git a/src/hooks/events/selection.ts b/src/hooks/events/selection.ts index 2e81cc8..710b7b8 100644 --- a/src/hooks/events/selection.ts +++ b/src/hooks/events/selection.ts @@ -126,9 +126,6 @@ export const useSelectAll = () => { const seats = d3Extended .selectAll(`[${dataAttributes.elementType}="${ElementType.Seat}"]`) .map((seat) => seat.attr("id")); - const booths = d3Extended - .selectAll(`[${dataAttributes.elementType}="${ElementType.Booth}"]`) - .map((booth) => booth.attr("id")); const shapes = d3Extended .selectAll(`[${dataAttributes.elementType}="${ElementType.Shape}"]`) .map((shape) => shape.attr("id")); @@ -141,7 +138,7 @@ export const useSelectAll = () => { const images = d3Extended .selectAll(`[${dataAttributes.elementType}="${ElementType.Image}"]`) .map((image) => image.attr("id")); - store.dispatch(clearAndSelectElements([...seats, ...booths, ...shapes, ...text, ...polylines, ...images])); + store.dispatch(clearAndSelectElements([...seats, ...shapes, ...text, ...polylines, ...images])); } }; window.addEventListener("keydown", handler); diff --git a/src/hooks/events/workspace-click.ts b/src/hooks/events/workspace-click.ts index 832606b..5fc7b0e 100644 --- a/src/hooks/events/workspace-click.ts +++ b/src/hooks/events/workspace-click.ts @@ -4,18 +4,15 @@ import { useSelector } from "react-redux"; import { v4 as uuidV4 } from "uuid"; import { Tool } from "@/components/toolbar/data"; import { ElementType } from "@/components/workspace/elements"; -import { boothSize } from "@/components/workspace/elements/booth"; import { resizableRectangle, shapeSize } from "@/components/workspace/elements/shape"; import { dataAttributes, ids } from "@/constants"; import { store } from "@/store"; import { - addBooth, addPolyline, addPolylinePoint, addSeat, addShape, addText, - deleteBooth, deleteImage, deletePolyline, deleteSeat, @@ -44,9 +41,6 @@ const useWorkspaceClick = () => { square }) ); - } else if (selectedTool == Tool.Booth) { - const coords = getRelativeClickCoordsWithTransform(e); - store.dispatch(addBooth({ id: uuidV4(), x: coords.x - boothSize / 2, y: coords.y - boothSize / 2 })); } else if (selectedTool == Tool.Text) { const id = uuidV4(); const coords = getRelativeClickCoordsWithTransform(e); @@ -98,8 +92,6 @@ const useWorkspaceClick = () => { store.dispatch(deleteShape(e.target.id)); } else if (e.target.getAttribute(dataAttributes.elementType) === ElementType.Seat) { store.dispatch(deleteSeat(e.target.id)); - } else { - store.dispatch(deleteBooth(e.target.id)); } } else if (e.target.nodeName === "text") { store.dispatch(deleteText(e.target.id)); diff --git a/src/store/reducers/editor/booths.ts b/src/store/reducers/editor/booths.ts deleted file mode 100644 index 138f484..0000000 --- a/src/store/reducers/editor/booths.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { v4 as uuidV4 } from "uuid"; -import { getWorkspaceCenterX, getWorkspaceHeight } from "@/utils"; - -export default () => [ - { - id: uuidV4(), - x: getWorkspaceCenterX() - 39 - 39, - y: getWorkspaceHeight() * 0.79 - }, - { - id: uuidV4(), - x: getWorkspaceCenterX() + 48, - y: getWorkspaceHeight() * 0.79 - } -]; diff --git a/src/store/reducers/editor/index.ts b/src/store/reducers/editor/index.ts index 18361ac..34df815 100644 --- a/src/store/reducers/editor/index.ts +++ b/src/store/reducers/editor/index.ts @@ -2,7 +2,6 @@ import { Reducer, createSelector, createSlice } from "@reduxjs/toolkit"; import { v4 as uuidv4 } from "uuid"; import { ids } from "@/constants"; import type { ISTKData } from "@/types"; -import { default as booths } from "./booths"; import { default as seats } from "./seats"; import { default as shapes } from "./shapes"; import { default as text } from "./text"; @@ -79,7 +78,6 @@ const initialState = { ], selectedPolylineId: null, seats: [], - booths: [], text: [], shapes: [], polylines: [], @@ -144,7 +142,6 @@ export const slice = createSlice({ }, initializeElements: (state) => { state.seats = seats(); - state.booths = booths(); state.text = text(); state.shapes = shapes(); state.initialized = true; @@ -170,12 +167,6 @@ export const slice = createSlice({ state.seats[index] = { ...state.seats[index], label: seat.label }; }); }, - addBooth(state, action) { - state.booths.push(action.payload); - }, - deleteBooth(state, action) { - state.booths = state.booths.filter((booth) => booth.id !== action.payload); - }, addText(state, action) { state.text.push(action.payload); }, @@ -276,7 +267,6 @@ export const slice = createSlice({ deleteElements: (state, action) => { const ids = action.payload; state.seats = state.seats.filter((seat) => !ids.includes(seat.id)); - state.booths = state.booths.filter((booth) => !ids.includes(booth.id)); state.text = state.text.filter((text) => !ids.includes(text.id)); state.shapes = state.shapes.filter((shape) => !ids.includes(shape.id)); state.polylines = state.polylines.filter((polyline) => !ids.includes(polyline.id)); @@ -308,8 +298,6 @@ export const { updateSeat, updateSeats, updateSeatLabels, - addBooth, - deleteBooth, addText, deleteText, updateText, diff --git a/src/stories/user/basic.stories.tsx b/src/stories/user/basic.stories.tsx index fb0e9e8..a764dc3 100644 --- a/src/stories/user/basic.stories.tsx +++ b/src/stories/user/basic.stories.tsx @@ -396,10 +396,6 @@ export const Story = { category: null } ], - booths: [ - { id: "85fb6458-d65e-410b-9c73-cb37e4f83276", x: 582, y: 562.48 }, - { id: "c4cc8522-ba04-49b2-b9ab-c2ecb46494b8", x: 708, y: 562.48 } - ], text: [ { id: "a2a867e1-db33-4254-8a9a-b59bc65c9660", @@ -826,10 +822,6 @@ export const WithInitialViewBoxTransform = { category: null } ], - booths: [ - { id: "92d30d1f-aa2a-4de0-a2ff-4b0a6433bdbf", x: 582, y: 562.48 }, - { id: "3a825886-1737-49cb-b1f0-3bebd54acaa0", x: 708, y: 562.48 } - ], text: [ { id: "9758de86-ca95-44d7-845e-7891408a77d5", diff --git a/src/stories/user/categorized.stories.tsx b/src/stories/user/categorized.stories.tsx index 63c6236..c18516d 100644 --- a/src/stories/user/categorized.stories.tsx +++ b/src/stories/user/categorized.stories.tsx @@ -748,12 +748,6 @@ export const Story = { category: "b26fffc7-1e54-43b8-8e29-5077541ee637" } ], - booths: [ - { id: "53d042ce-58e7-44ec-9dbd-97f3ced6159d", x: 567.4818725585938, y: 562.48 }, - { id: "14e6a2f4-5a6e-45fe-aa07-e419b5329276", x: 713.259033203125, y: 562.48 }, - { id: "20180e17-1245-4131-a040-46c9b7e0f9b6", x: 562.3191528320312, y: -247.08434631347654 }, - { id: "60dccf2e-818a-4f84-ae6e-b2c8a99adb6f", x: 713.4517822265625, y: -246.08437683105467 } - ], text: [ { id: "116a57ac-9bc2-4f0c-a9fc-e1a57448bda7", diff --git a/src/stories/user/sections.stories.tsx b/src/stories/user/sections.stories.tsx index 28acb63..402d6d4 100644 --- a/src/stories/user/sections.stories.tsx +++ b/src/stories/user/sections.stories.tsx @@ -755,7 +755,6 @@ export const Story = { category: "b26fffc7-1e54-43b8-8e29-5077541ee637" } ], - booths: [], text: [ { id: "116a57ac-9bc2-4f0c-a9fc-e1a57448bda7", diff --git a/src/types/elements/booth.ts b/src/types/elements/booth.ts deleted file mode 100644 index c6e94ed..0000000 --- a/src/types/elements/booth.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IBooth { - id: string; - x: number; - y: number; - rotation?: number; -} diff --git a/src/types/elements/index.ts b/src/types/elements/index.ts index 8a61a15..dd18681 100644 --- a/src/types/elements/index.ts +++ b/src/types/elements/index.ts @@ -2,5 +2,4 @@ export * from "./image"; export * from "./seat"; export * from "./text"; export * from "./shape"; -export * from "./booth"; export * from "./polyline"; diff --git a/src/types/index.ts b/src/types/index.ts index 737d1f4..9cecc7b 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,5 +1,4 @@ import type { - IBooth, IFreeSeat, IImage, IPolyline, @@ -50,7 +49,6 @@ export interface ISTKData { categories?: ISeatCategory[]; sections?: ISection[]; seats?: ISeat[]; - booths?: IBooth[]; text?: IText[]; shapes?: IShape[]; polylines?: IPolyline[]; diff --git a/src/types/styles.ts b/src/types/styles.ts index d850521..8c46e4b 100644 --- a/src/types/styles.ts +++ b/src/types/styles.ts @@ -49,11 +49,6 @@ export interface IStyles { }; reloadButton?: IStyle; elements?: { - booth?: { - selected?: IStyle; - unselected?: IStyle; - base?: IStyle; - }; seat?: { selected?: IStyle; unselected?: IStyle; diff --git a/src/utils/d3.ts b/src/utils/d3.ts index 7b0a8b2..d1c75b3 100644 --- a/src/utils/d3.ts +++ b/src/utils/d3.ts @@ -40,7 +40,13 @@ selection.prototype.forEach = function (callback) { }; selection.prototype.rotation = function () { - const transform = this.attr("transform"); + if (!this.node()) return 0; + let transform: string; + if (this.node()?.tagName === "svg") { + transform = this.node().parentElement.style.transform; + } else { + transform = this.style("transform"); + } if (!transform) { return 0; } @@ -48,7 +54,7 @@ selection.prototype.rotation = function () { if (!match) { return 0; } - return +match[1]; + return Number(match[1].replace("deg", "")); }; export const d3Extended = { diff --git a/src/utils/transformer.ts b/src/utils/transformer.ts index cfb66e7..56a2d1c 100644 --- a/src/utils/transformer.ts +++ b/src/utils/transformer.ts @@ -21,17 +21,6 @@ export const domSeatsToJSON = () => { }); }; -export const domBoothsToJSON = () => { - return d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Booth}"]`).map((booth) => { - return { - id: booth.attr("id"), - x: +booth.attr("x"), - y: +booth.attr("y"), - rotation: booth.rotation() - }; - }); -}; - export const domTextToJSON = () => { return d3Extended.selectAll(`[${dataAttributes.elementType}="${ElementType.Text}"]`).map((text) => { return { @@ -113,7 +102,6 @@ export const stateToJSON = (): ISTKData => { categories: state.categories.slice(1), sections: state.sections.slice(1), seats: domSeatsToJSON(), - booths: domBoothsToJSON(), text: domTextToJSON(), shapes: domShapesToJSON(), polylines: domPolylineToJSON(), From 7823d9515629ad1f817830a0917e166917fd57a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Aug 2024 05:54:25 +0000 Subject: [PATCH 24/42] CI: @mezh-hq/react-seat-toolkit - premajor release skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 098a886..8c8dceb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "2.2.0-blizzard.1", + "version": "3.0.0-blizzard.0", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 79957cb6ea07d973e42330d4262271c3001254af Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 18 Aug 2024 11:46:09 +0530 Subject: [PATCH 25/42] Build: excluded lucide react from slim variant --- esbuild.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/esbuild.config.js b/esbuild.config.js index 4c60cdc..6e6b695 100644 --- a/esbuild.config.js +++ b/esbuild.config.js @@ -58,6 +58,7 @@ build({ "@radix-ui/react-tooltip", "class-variance-authority", "lodash", + "lucide-react", "tailwind-merge" ] }); From 88a16f58ea21b6f113ba8ebe74de3bb8edb2bf9b Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 18 Aug 2024 12:25:19 +0530 Subject: [PATCH 26/42] Feat: added tooltips to dock icons --- src/components/controls/index.tsx | 2 +- src/components/toolbar/index.tsx | 16 ++++- src/components/workspace/dock/visibility.tsx | 62 ++++++++++++++------ src/types/styles.ts | 4 ++ 4 files changed, 63 insertions(+), 21 deletions(-) diff --git a/src/components/controls/index.tsx b/src/components/controls/index.tsx index 86ae797..cb4826a 100644 --- a/src/components/controls/index.tsx +++ b/src/components/controls/index.tsx @@ -75,7 +75,7 @@ const Controls = ({ options, styles }: IControlProps) => { } - className="py-4 px-5" + className="py-4 px-5 h-[calc(100%-3.5rem)]" />
); diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index a5284a9..0737f13 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -105,7 +105,13 @@ const ToolBar: React.FC = (props) => { } > - + = (props) => { align="start" alignOffset={25} sideOffset={-30} - className={twMerge("flex gap-3 ml-8", styles?.tool?.label?.className)} - style={styles?.tool?.label?.properties} + className={twMerge( + "flex gap-3 ml-8", + props?.styles?.core?.tooltip?.content?.className, + styles?.tool?.label?.className + )} + style={{ ...props?.styles?.core?.tooltip?.content?.properties, ...styles?.tool?.label?.properties }} > {key} diff --git a/src/components/workspace/dock/visibility.tsx b/src/components/workspace/dock/visibility.tsx index 4290742..fa4b5e8 100644 --- a/src/components/workspace/dock/visibility.tsx +++ b/src/components/workspace/dock/visibility.tsx @@ -6,7 +6,7 @@ import { store } from "@/store"; import { setInitialViewBoxScale, setVisibilityOffset } from "@/store/reducers/editor"; import type { ISTKProps } from "@/types"; import { d3Extended } from "@/utils"; -import { Button } from "../../core"; +import { Button, Tooltip, TooltipContent, TooltipTrigger } from "../../core"; import { showAllElements } from "../elements"; const freeze = () => @@ -32,14 +32,28 @@ export const VisibilityFreezeScale = (props: Pick - {initialViewBoxScale ? : } - + + + + + + {initialViewBoxScale ? "Unlock initial scale" : "Lock initial scale"} + + ); }; @@ -49,13 +63,27 @@ export const VisibilityOffset = (props: Pick - {visibilityOffset === 0 ? : } - + + + + + + {visibilityOffset === 0 ? "Set visibility offset" : "Unset visibility offset"} + + ); }; diff --git a/src/types/styles.ts b/src/types/styles.ts index 8c46e4b..caf3c60 100644 --- a/src/types/styles.ts +++ b/src/types/styles.ts @@ -84,6 +84,10 @@ export interface IStyles { core?: { container?: IStyle; button?: IStyle; + tooltip?: { + trigger?: IStyle; + content?: IStyle; + }; }; dock?: { container?: IStyle; From a8a94850ad08ce09e23bd9c8046a28720b5a1e87 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Aug 2024 06:55:48 +0000 Subject: [PATCH 27/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8c8dceb..4f3a8ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.0", + "version": "3.0.0-blizzard.1", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From d6ec28fb5439c3cf120cafc941e8a60a67028531 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 18 Aug 2024 15:18:17 +0530 Subject: [PATCH 28/42] Feat: added support for external shapes --- src/components/controls/shapes/index.tsx | 14 +++++++---- src/components/toolbar/index.tsx | 2 +- src/components/workspace/elements/shape.tsx | 3 ++- src/hooks/index.ts | 1 + src/hooks/shapes.ts | 27 +++++++++++++++++++++ src/types/index.ts | 4 +++ 6 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 src/hooks/shapes.ts diff --git a/src/components/controls/shapes/index.tsx b/src/components/controls/shapes/index.tsx index 57b9b4d..e1135a9 100644 --- a/src/components/controls/shapes/index.tsx +++ b/src/components/controls/shapes/index.tsx @@ -2,11 +2,13 @@ import { memo, useCallback, useState } from "react"; import { RectangleHorizontal } from "lucide-react"; import { default as isEqual } from "lodash/isEqual"; import { twMerge } from "tailwind-merge"; +import { useShapes } from "@/hooks"; +import { getMergedShapes } from "@/hooks/shapes"; import { store } from "@/store"; import { setCursor } from "@/store/reducers/editor"; +import { ISTKProps } from "@/types"; import { fallible } from "@/utils"; import { resizableRectangle, shapeSize, shapeStrokeWidth } from "../../workspace/elements/shape"; -import { shapeList } from "./shape-list"; const CursorShape = (Shape) => { const icon = (props) => ( @@ -25,7 +27,7 @@ const CursorShape = (Shape) => { return icon; }; -const Controls = () => { +const Controls = ({ options }: Pick) => { const [selectedIndex, setSelectedIndex] = useState(0); const onShapeClick = useCallback((shape, i) => { @@ -35,9 +37,11 @@ const Controls = () => { }); }, []); + const shapes = useShapes({ options }); + return (
- {shapeList.map((Shape, i) => ( + {shapes.map((Shape, i) => (
{ ); }; -export const selectFirstShape = () => +export const selectFirstShape = ({ options }: Pick) => fallible(() => { - store.dispatch(setCursor(CursorShape(shapeList[0]))); + store.dispatch(setCursor(CursorShape(getMergedShapes(options)[0]))); }); const ShapeControls = memo(Controls, isEqual); diff --git a/src/components/toolbar/index.tsx b/src/components/toolbar/index.tsx index 0737f13..0fdf12f 100644 --- a/src/components/toolbar/index.tsx +++ b/src/components/toolbar/index.tsx @@ -66,7 +66,7 @@ const ToolBar: React.FC = (props) => { store.dispatch(selectTool(tool)); if ([Tool.Image, Tool.Shape].includes(tool)) { store.dispatch(showControls()); - if (tool === Tool.Shape) selectFirstShape(); + if (tool === Tool.Shape) selectFirstShape({ options: props.options }); } if (tool !== Tool.Pen && selectedPolylineId) { store.dispatch(setSelectedPolylineId(null)); diff --git a/src/components/workspace/elements/shape.tsx b/src/components/workspace/elements/shape.tsx index ba0e274..07f0a97 100644 --- a/src/components/workspace/elements/shape.tsx +++ b/src/components/workspace/elements/shape.tsx @@ -1,7 +1,7 @@ import { forwardRef } from "react"; import { twMerge } from "tailwind-merge"; -import { shapes } from "@/components/controls/shapes/shape-list"; import { dataAttributes } from "@/constants"; +import { useShapeMap } from "@/hooks"; import { ISTKProps, IShape } from "@/types"; export const shapeSize = 50; @@ -44,6 +44,7 @@ const Shape: React.FC = forwardRef( }, ref: any ) => { + const shapes = useShapeMap({ options: consumer.options }); if (name === "RectangleHorizontal") { width ??= resizableRectangle.width; height ??= resizableRectangle.height; diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 46772a6..803be95 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -5,3 +5,4 @@ export { default as useSkipFirstRender } from "./skip-first-render"; export { default as useToast } from "./toast"; export * from "./events"; +export * from "./shapes"; diff --git a/src/hooks/shapes.ts b/src/hooks/shapes.ts new file mode 100644 index 0000000..fe24506 --- /dev/null +++ b/src/hooks/shapes.ts @@ -0,0 +1,27 @@ +import { useMemo } from "react"; +import { shapeList } from "@/components/controls/shapes/shape-list"; +import { ISTKProps } from "@/types"; + +export const getMergedShapes = (options: ISTKProps["options"]) => { + if (!options?.shapes) return shapeList; + if (options?.shapes.icons.length === 0) return shapeList; + if (options?.shapes.overrideDefaultIconset) return options.shapes.icons; + return [...shapeList, ...options.shapes.icons]; +}; + +export const useShapes = ({ options }: Pick) => { + return useMemo(() => { + return getMergedShapes(options); + }, [options?.shapes]); +}; + +export const useShapeMap = ({ options }: Pick) => { + return useMemo( + () => + getMergedShapes(options).reduce((acc, shape) => { + acc[shape.displayName] = shape; + return acc; + }, {}), + [options?.shapes] + ); +}; diff --git a/src/types/index.ts b/src/types/index.ts index 9cecc7b..7c5efd4 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -88,6 +88,10 @@ export interface ISTKProps { /** Disables category deletion if there are reserved seats falling under the category */ disableCategoryDeleteIfReserved?: boolean; disableSectionDelete?: boolean; + shapes?: { + icons: React.FC[]; + overrideDefaultIconset?: boolean; + }; }; plugins?: IPlugins; } From 7cd5fb063ac9cd2ed54fe5f5e94b43d2e612a130 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Aug 2024 09:48:46 +0000 Subject: [PATCH 29/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f3a8ee..eee0e5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.1", + "version": "3.0.0-blizzard.2", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From ad9c3827da3c8849c9a4067b6399148b83104ea9 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 18 Aug 2024 15:46:59 +0530 Subject: [PATCH 30/42] Fix: rotate transform origin --- src/styles/index.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/styles/index.css b/src/styles/index.css index 9422b0f..a8dc3e5 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -18,3 +18,7 @@ rect.workspace-selection { fill: white; fill-opacity: 0.5; } + +.stk-core svg * { + transform-box: fill-box; +} From 202b53e557fad8662bac42951ebd99eadb86e59c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 18 Aug 2024 10:17:33 +0000 Subject: [PATCH 31/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eee0e5a..b1d281f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.2", + "version": "3.0.0-blizzard.3", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 5941240e0a34cfa1d35a09b839a4877fd3ed2837 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 25 Aug 2024 21:47:20 +0530 Subject: [PATCH 32/42] Fix: initial seat positions --- src/store/reducers/editor/seats.ts | 12 ++++++------ src/store/reducers/editor/shapes.ts | 2 +- src/store/reducers/editor/text.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/store/reducers/editor/seats.ts b/src/store/reducers/editor/seats.ts index 2cb7f68..61f13c3 100644 --- a/src/store/reducers/editor/seats.ts +++ b/src/store/reducers/editor/seats.ts @@ -7,37 +7,37 @@ export default () => [ ...[...Array(10).keys()].map((p) => ({ id: uuidV4(), x: getWorkspaceCenterX() - gap * (p + 1), - y: getWorkspaceHeight() * 0.42, + y: getWorkspaceHeight() * 0.48, label: p + 1 })), ...[...Array(10).keys()].map((p) => ({ id: uuidV4(), x: getWorkspaceCenterX() + gap * (p + 1), - y: getWorkspaceHeight() * 0.42, + y: getWorkspaceHeight() * 0.48, label: p + 1 })), ...[...Array(7).keys()].map((p) => ({ id: uuidV4(), x: getWorkspaceCenterX() - gap * (p + 1), - y: getWorkspaceHeight() * 0.52, + y: getWorkspaceHeight() * 0.58, label: p + 1 })), ...[...Array(7).keys()].map((p) => ({ id: uuidV4(), x: getWorkspaceCenterX() + gap * (p + 1), - y: getWorkspaceHeight() * 0.52, + y: getWorkspaceHeight() * 0.58, label: p + 1 })), ...[...Array(5).keys()].map((p) => ({ id: uuidV4(), x: getWorkspaceCenterX() - gap * (p + 1), - y: getWorkspaceHeight() * 0.62, + y: getWorkspaceHeight() * 0.68, label: p + 1 })), ...[...Array(5).keys()].map((p) => ({ id: uuidV4(), x: getWorkspaceCenterX() + gap * (p + 1), - y: getWorkspaceHeight() * 0.62, + y: getWorkspaceHeight() * 0.68, label: p + 1 })) ]; diff --git a/src/store/reducers/editor/shapes.ts b/src/store/reducers/editor/shapes.ts index 40a444e..11b4ec0 100644 --- a/src/store/reducers/editor/shapes.ts +++ b/src/store/reducers/editor/shapes.ts @@ -5,7 +5,7 @@ export default () => [ { id: uuidV4(), x: getWorkspaceCenterX() - 550, - y: getWorkspaceHeight() * 0.145, + y: getWorkspaceHeight() * 0.18, width: 1100, height: 100, rx: 10, diff --git a/src/store/reducers/editor/text.ts b/src/store/reducers/editor/text.ts index a985676..1dcffa1 100644 --- a/src/store/reducers/editor/text.ts +++ b/src/store/reducers/editor/text.ts @@ -5,7 +5,7 @@ export default () => [ { id: uuidV4(), x: getWorkspaceCenterX() - 58, - y: getWorkspaceHeight() * 0.24, + y: getWorkspaceHeight() * 0.27, label: "STAGE", fontSize: 35, fontWeight: 200, From e83adb019d2582e251ddb54df7e867cc705986a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 25 Aug 2024 16:17:52 +0000 Subject: [PATCH 33/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b1d281f..2a3e29b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.3", + "version": "3.0.0-blizzard.4", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 269c48ee95cd09b3d66e0cbb483d84bc774158ac Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Sun, 25 Aug 2024 22:53:06 +0530 Subject: [PATCH 34/42] Fix: workspace zoom --- .../core/{switch/index.tsx => switch.tsx} | 2 - src/components/core/switch/twin-switch.tsx | 66 ------------------- src/components/workspace/index.tsx | 2 +- 3 files changed, 1 insertion(+), 69 deletions(-) rename src/components/core/{switch/index.tsx => switch.tsx} (95%) delete mode 100644 src/components/core/switch/twin-switch.tsx diff --git a/src/components/core/switch/index.tsx b/src/components/core/switch.tsx similarity index 95% rename from src/components/core/switch/index.tsx rename to src/components/core/switch.tsx index 3ac3e70..d33294c 100644 --- a/src/components/core/switch/index.tsx +++ b/src/components/core/switch.tsx @@ -2,8 +2,6 @@ import * as React from "react"; import * as SwitchPrimitives from "@radix-ui/react-switch"; import { twMerge } from "tailwind-merge"; -export { default as TwinSwitch } from "./twin-switch"; - const Switch = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef diff --git a/src/components/core/switch/twin-switch.tsx b/src/components/core/switch/twin-switch.tsx deleted file mode 100644 index 751aec0..0000000 --- a/src/components/core/switch/twin-switch.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { useEffect, useRef, useState } from "react"; -import { twMerge } from "tailwind-merge"; - -const padding = "px-4 py-[3px]"; - -const valueStyles = "z-50 pointer-events-none transition-all duration-medium"; - -interface ITwinSwitchProps extends Omit, "onChange"> { - values: string[]; - selectedValue?: string; - onChange?: (value: string) => void; - handleClassName?: string; -} - -const TwinSwitch = ({ values = [], selectedValue, onChange, handleClassName, ...props }: ITwinSwitchProps) => { - const [selected, setSelected] = useState(values[0]); - const [handleStyles, setHandleStyles] = useState({}); - - const value1Ref = useRef(); - const value2Ref = useRef(); - - useEffect(() => { - if (selectedValue && selectedValue !== selected) toggle(); - }, [selectedValue]); - - const toggle = () => { - const newValue = values.find((value) => value !== selected); - setSelected(newValue); - setHandleStyles({ - transform: `translateX(${newValue === values[0] ? 0 : value1Ref.current.offsetWidth}px)`, - width: `${newValue === values[0] ? value1Ref.current.offsetWidth : value2Ref.current.offsetWidth}px`, - height: value1Ref.current.offsetHeight - }); - onChange?.(newValue); - }; - - return ( -
- - {values[0]} - - - {values[1]} - -
- {selected} -
-
- ); -}; - -export default TwinSwitch; diff --git a/src/components/workspace/index.tsx b/src/components/workspace/index.tsx index 3d64802..044dc15 100644 --- a/src/components/workspace/index.tsx +++ b/src/components/workspace/index.tsx @@ -58,7 +58,7 @@ export const Workspace: React.FC = (props) => { style={props.styles?.workspace?.root?.properties} > - + {images.map((e) => ( Date: Sun, 25 Aug 2024 17:23:40 +0000 Subject: [PATCH 35/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a3e29b..e8e74f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.4", + "version": "3.0.0-blizzard.5", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 229ac60233c685e34f8589108c45b39e16c20a61 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Tue, 27 Aug 2024 00:26:51 +0530 Subject: [PATCH 36/42] Fix: initial workspace element positions and updated docs --- .storybook/preview.tsx | 2 +- CHANGELOG.md | 11 +++++++++ src/store/reducers/editor/seats.ts | 12 +++++----- src/store/reducers/editor/shapes.ts | 4 ++-- src/store/reducers/editor/text.ts | 2 +- src/stories/external-shapes.mdx | 36 +++++++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 src/stories/external-shapes.mdx diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 775121d..bf55680 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -26,7 +26,7 @@ const preview: Preview = { reactRouter: {}, options: { storySort: { - order: ["Introduction", "Installation", "Customization"], + order: ["Introduction", "Installation", "Customization", "Modifying State", "External Shapes"] }, } }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ef7b0e..11412a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ Changelog +# v3.0.0 [2024-08-27] + +## Major Release + +### Features +- Complete UI overhaul with a new design system +- Adds support for element rotation +- Adds support for passing external shapes into the toolkit + +--- + # v2.1.1 [2024-08-07] ## Patch Release diff --git a/src/store/reducers/editor/seats.ts b/src/store/reducers/editor/seats.ts index 61f13c3..5060379 100644 --- a/src/store/reducers/editor/seats.ts +++ b/src/store/reducers/editor/seats.ts @@ -6,37 +6,37 @@ const gap = 50; export default () => [ ...[...Array(10).keys()].map((p) => ({ id: uuidV4(), - x: getWorkspaceCenterX() - gap * (p + 1), + x: getWorkspaceCenterX() - gap * (p + 1.5), y: getWorkspaceHeight() * 0.48, label: p + 1 })), ...[...Array(10).keys()].map((p) => ({ id: uuidV4(), - x: getWorkspaceCenterX() + gap * (p + 1), + x: getWorkspaceCenterX() + gap * (p + 0.5), y: getWorkspaceHeight() * 0.48, label: p + 1 })), ...[...Array(7).keys()].map((p) => ({ id: uuidV4(), - x: getWorkspaceCenterX() - gap * (p + 1), + x: getWorkspaceCenterX() - gap * (p + 1.5), y: getWorkspaceHeight() * 0.58, label: p + 1 })), ...[...Array(7).keys()].map((p) => ({ id: uuidV4(), - x: getWorkspaceCenterX() + gap * (p + 1), + x: getWorkspaceCenterX() + gap * (p + 0.5), y: getWorkspaceHeight() * 0.58, label: p + 1 })), ...[...Array(5).keys()].map((p) => ({ id: uuidV4(), - x: getWorkspaceCenterX() - gap * (p + 1), + x: getWorkspaceCenterX() - gap * (p + 1.5), y: getWorkspaceHeight() * 0.68, label: p + 1 })), ...[...Array(5).keys()].map((p) => ({ id: uuidV4(), - x: getWorkspaceCenterX() + gap * (p + 1), + x: getWorkspaceCenterX() + gap * (p + 0.5), y: getWorkspaceHeight() * 0.68, label: p + 1 })) diff --git a/src/store/reducers/editor/shapes.ts b/src/store/reducers/editor/shapes.ts index 11b4ec0..7cdac39 100644 --- a/src/store/reducers/editor/shapes.ts +++ b/src/store/reducers/editor/shapes.ts @@ -4,9 +4,9 @@ import { getWorkspaceCenterX, getWorkspaceHeight } from "@/utils"; export default () => [ { id: uuidV4(), - x: getWorkspaceCenterX() - 550, + x: getWorkspaceCenterX() - 600, y: getWorkspaceHeight() * 0.18, - width: 1100, + width: 1150, height: 100, rx: 10, name: "RectangleHorizontal" diff --git a/src/store/reducers/editor/text.ts b/src/store/reducers/editor/text.ts index 1dcffa1..bddd4df 100644 --- a/src/store/reducers/editor/text.ts +++ b/src/store/reducers/editor/text.ts @@ -4,7 +4,7 @@ import { getWorkspaceCenterX, getWorkspaceHeight } from "@/utils"; export default () => [ { id: uuidV4(), - x: getWorkspaceCenterX() - 58, + x: getWorkspaceCenterX() - 78, y: getWorkspaceHeight() * 0.27, label: "STAGE", fontSize: 35, diff --git a/src/stories/external-shapes.mdx b/src/stories/external-shapes.mdx new file mode 100644 index 0000000..8185ab4 --- /dev/null +++ b/src/stories/external-shapes.mdx @@ -0,0 +1,36 @@ +import { Meta } from "@storybook/blocks"; + + + +

External Shapes

+ +

You can control the shapes available to you within the toolkit by passing in an array of shapes in options as follows:

+ +```tsx +import { SeatToolkit } from "@mezh-hq/react-seat-toolkit"; +import { FireExtinguisher } from "lucide-react"; + +return +``` + +

Here, we are passing in an array of shapes with a single shape, FireExtinguisher, which will be added to the default shapes available in the toolkit.

+ +

If you need to completely override the default shapes available in the toolkit, you can set the overrideDefaultIconset property to true. This will remove all default shapes and keep only the shapes you pass

+ +
+ +--- + +
+ +
NOTE: The shapes you pass in should be React components that render an SVG and must contain a `displayName` property. If the `displayName` property is not present, the toolkit will not be able to render the shape.
From f96a0a527ab1ee49fa034160f93636871afcd5cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 26 Aug 2024 18:57:33 +0000 Subject: [PATCH 37/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8e74f8..8b015ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.5", + "version": "3.0.0-blizzard.6", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 22f22f2fac11f0804b77c76cb278074ad9d187ac Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Tue, 27 Aug 2024 22:00:54 +0530 Subject: [PATCH 38/42] Docs: updated images --- README.md | 9 +- src/stories/designer/categorized.stories.tsx | 784 +++++++++++++++++++ 2 files changed, 789 insertions(+), 4 deletions(-) create mode 100644 src/stories/designer/categorized.stories.tsx diff --git a/README.md b/README.md index 6298248..86c0571 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,11 @@
-image +image

- image - image + image + image

## Features @@ -40,7 +40,7 @@ - Change seat colors ✓ - Change seat labels ✓ - Change seat status ✓ - - Group seats together into categories ✓ + - Group seats into categories ✓ - Categorizer (Manage seat categories) ✓ - **Pen** @@ -69,6 +69,7 @@ - **Miscallaneous** - Add, move around and scale background images ✓ - Multiple element selection and deselection ✓ + - Rotate elements ✓ - Bring elements to front or back ✓ - **Responsive**: The layout is responsive and can be viewed on any device ✓ diff --git a/src/stories/designer/categorized.stories.tsx b/src/stories/designer/categorized.stories.tsx new file mode 100644 index 0000000..85de1d0 --- /dev/null +++ b/src/stories/designer/categorized.stories.tsx @@ -0,0 +1,784 @@ +import SeatToolkit from "@/index"; +import { STKMode } from "../_utils"; +import { options } from "../options"; + +export default { + title: "Designer/Categorized", + component: SeatToolkit, + ...options +}; + +export const Story = { + render: (props) => ( + + ) +}; From c05521547c30250d86f11f93368b9f8e306f0f90 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Tue, 27 Aug 2024 22:13:25 +0530 Subject: [PATCH 39/42] Patch: removed unused dependencies --- bun.lockb | Bin 630592 -> 629040 bytes esbuild.config.js | 2 -- package.json | 2 -- src/components/core/checkbox.tsx | 25 -------------------- src/components/core/index.tsx | 2 -- src/components/core/radio-group.tsx | 35 ---------------------------- 6 files changed, 66 deletions(-) delete mode 100644 src/components/core/checkbox.tsx delete mode 100644 src/components/core/radio-group.tsx diff --git a/bun.lockb b/bun.lockb index 53d6f9c831386330968db2aac8566335bb369e99..7b34d3d98fcbe046678912c219cc6dbbf9256135 100755 GIT binary patch delta 126238 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%0DiU z8Wca?a^ZjR5__OIUhS*k1Y2--s2-K^BfbBnp82FR|}= ziT%&tQ8(}P{14uKHw)IESNw10?|F$`Z?|iE+}+FTa-!tQPknh^a&gI1UtX77TsI-9 zFRx23F8w_(v8TSX9>jmDK(6}V2WlGbd5L|`OYD1IV&C%; z`<|EB?Mvvpd#PQ|FaP;V?Eh@`Pp!E8hXtDSjDFL}Uok2=#6NLVw5cB(9UT&x?k^i1 zJ=@LEmx&EBv|T2sTNu zU4r}lUKI%Dlp|PDfncTosRUUS2!>W7c+kJT62UeJewAR2KX@{NMU@CvOh)jK|C0nK zPDXIv6a;JiWm6FBl%VNU1dsY7rXpB61;IKA*7@!<1jDBym@o~&#3HWR`8 z3lY5FZ)=99% zcP~XS{1OBcE=BOJzgB{@OA)lc48i+;$z=#0mY`085B;{Y5fopB;G)?GKJqt6&}KG* z%*zpc;!nRE!SfPqk>FFm^A!lDU5;S>6$n1}H%rjz3Iu)UAlUBDor7SL1luL}%I`H7 z!JIh=mdr)4!~ax*thoq=RwMYV}Eb`_HL3n&!v zOBPV*VF~IaXyCWK8bR>_1Q%V6Am(q7pv~0?GHVbt_NUh%cwT}n61aZnYY>BAAB8xMGFzExDLU-{!bE|cpZZCd<1R%Wj=zP5;R?eU_XDvA_Pl)1nVSd@4MF{ z7`_O>gzFI;=&zL^?Ro_5Z$NO6UvdM2hb5?!;1IvHhWiBG@LuuM(W; z4_=O7(Y**(EJtv*|C0nKE=O?Q3Irqk|Btt~fzPr0|NpnyX2Y;pHus}3_ePjXwUD{1 zR>>r3B%2aTGD$O%DbkYOQ-mZ_p}EO~nA=HWNrr@^rgF0ilkj`Kw&UuvPv5?u@Avon zKOX<<;koy5KF{Mk&f`3e<2-j=$9dVgWGSLpB4`<+zx7*&$XbfnAThuKmm}hrA%-tU z479Zp0m~6}K0+i|(np9KiQN)|Ei4<6_z_}!He!hFlnBj6v{-={YGYR*@+6K(Bw3S{ zh?EtG=_?VB+d+xQm55HO5W{WiDnx$6C!;hV(unHhMkg#-h}9#i28p>AxD64% z6)}7pVxFy)2-t?GvmLR(lC~pqBz8+Iw6GnB#O;XjI}nR(r$p!uM2kGcVjG)>$dfoC zvBa9}M5N>)rtd_2UJLLx{uH?+_yEAYy~W z5eqzwh(ClFei(7o)=C5%M%4KRaom!=LF7p6mN;QyM-YkMAjTg-oV1-1p+^uczD4|K zW4}e@NgRar5ycWgClQye-$_K) z_lOM$pDW&0;Rn3~If)tmgWiF7+b1#sKVa(o$VT3l^dlSPNbHsuuBrLXAlFvs;3br!KfqK*X?A>z*=h8H2~*;jc2FYnJfhPDL<^gG0Z|}vTB4P8 zyogA@fS7v`5oM<&qAwzP7bDu*>|#Wr#1)Bl*8LJ9vly}T5~71$l8C*881M(8qb>OZ zQ7jR38F91qyNt;C1F=D(lLh{Xh`)>&{wLx#TPqRpC!)?3M2sa}LF7p6mgsC@R}qO< z5aX{Ry4p^O(5r|R*AU%o>@`H5#1V<^vznBnIj;Ex&6-}0_aCzkmg_q!vK(#U&0=qx z>dkTi%cr$`w{`R(d%8Dbt`8#4PDw=jAbOWW+-I}PAqpj~Nc6GpzKG0nh^4-WzII6> z))z6r57Ez-_#uiVg8UKvt)D+4%MYrP5DAtPfXI>9 zEiu@_0uhM;i1C4lA+}Q@G!W6E0%E9*t$@grI3kf`O)4T%Dj=p;L_BT>B_b;#I#ogp zx2cs71rnzvMp(xnM0zE}+#p1k*x5 zAg0^Y8i)dk(-JeRV<;lM24Zd~BEwEeM28}JhaqO#>@Y;3#1)BI*1aYoGYqk`Cc^BJ zL~KpOfLe&zwxkxKSR$x4;w|e}8eNLnu%x<( z9Esf$3oWc3BC#%Fd_BY>+bI!R57DANVzG^_kI0iaBC*7pgdQ9= z4G>FhY6C=p#A%7;*0CWXy#ZowLqxWnl8A1I=zRlXrOmzpQ7CamVzqUTKxE#4SQ>#? zW0xdiBM<``A=cWGMu=jGpvH)G)~_)ls}W*@#0CqDM8r2n439)?w6zieIb5CsyaCH7dymWcEgh`B8h`F2Vox+S7_E5tsV-3n1CaYbUkb#INxY=v0b z8galbNyN5B42VJ;v?Wo9Vu_$Oh{M*e4I(QFu|eX91-3=Rw?PbVi#Td)B?8(a>fDGp zZb>&HawK+3oUpKVh{PKa)rSPl8+(h`zW-I(|MGEJw`^|(4wm{*c zT~a8vxLXL9Y>C1j=G}>K+4?E`Y1ssyD?V1?)^ZQ{T=lU*ir0MX6QVZ{hQEzm-j<}` zW4Q|DEbMlIuO%z^*-iz23y&d`x3L7vyIsc`!;u79lRI>*F*?>e5Ebp9MC2Vh*3O6^ zo7x#sAaPovigoOQNbii8+XWG9rzE1gAbNL2RI}M#5rq<0BtoqForuh?h^2QTYS<-- z*gFvex*@`BNjF5XL{KcEmi3E8WOYMqkf>vU-4XGzh~eE4^=z#~KzBr)9*A&D>Ve3S z*e%h}!g?YSdmzU5L`2w5iO`;i7QGOSZEP<@p2QJ}Cf1}kBBd8%dT&HCJ17y^8`0@5 zL<^gG7otGov_vcGcsC;bF2vls5m9zZBKmGb?|Tq!ZT3BgLWwI9?W}toBJ&=^(l|s1 zyCe}ChZt}#qN6Rj7f~z`bRXho>vta_>t4hLiB1-HKO+7<#PItOx7k{Wfcp`3`XFK~ zsShGYVz)$R3wr>O*atEG0Yq2ZDG~YrqD5asHyhg*ktcCPqPsPTN2K&cOpizOw1X0n z@rX|S5WQ_`KSY7VX^Fe7Ao|&o0f=IWpobCtt>43ltO1A(5(6x7AR_)@#PEUTdio43XFUe$ zefU7kHVkhrf*&DEj>PCk5Q8mOBJmMKL;_-nB_|+46A=3)hFbU_M4rUtL5L*Fmq;0e zXg3(~xTOt7L=Hxrlo)PNk0J^rW<81+VaFxXA4PN>f=ITEA&BT9i1QMoEaovpp~Rxc z5TmU~BJ(jspP`5`wqPhCb|}Ix5i!={5)s7`t0l&ncM>8i5iukQG2XHz;*$^|!w{*K zFboke46#ij&4M3Cqta~WsF2bk3^i8m}xP|h(d`) z$%t82B$1hn=<^i9Y{65A*ryPFqY$$#ZWN+eVztCu=KVAxYZPM0(}=m2EfN1TB4jjT zo+XS%1dK*(lUQKE&meLnMn8jCXt@%J&mbbkAQoBj7)0n8#D0mz7M_C0lbD=>SYr7S zDJh6{V-X)%+E_&7Sj0(*r55!pqCjHSvxwz(Tq6BhMAvbMY|9vjh#rSHFR{{MoCDLC-bj?5%Sw;pTIs$?yMSyQFZ*;$A2GVM`P)oA)fjpVm*|ie(dgu9mY3 zZ|JQ?IU7Xet;X6nSnF-UM!`96Q1ED@;BuBLk!XmBOoX2$XCgu~5&I>|Tlj25p2XzY zh(ODiNSTdj_a>sErM-!Wd=qg}BFLiNLKH~MdJ9p-j!UG!h3Gm55o{TA5YclG=OwCH z%v?mF#G<)~5G#_%oQvr5Hll_tcpDM>Ho|WnBFy6EA&MndOVl#&`G~A}h#~V4bu3#V zem){(0ivEIEIF*)BE=ELI#$rVDV#Ilg zwic6xD3n-~g=l9*5}8?uK1&cCY{3#l>=K0E`-qMf_dcRnVztE0=KTR8>wUzK4-lO! zTO$4gM97DT+brQjM8JoLZ4xmSycCfmF?uPYv*k)8E=5EvLv*#|Wr)yai2V}XEPOd4 zPh#?NM0d-VNLh|(_YtC}rG12m{0MPUqPIn5BMKyDWh3sk;}YrFh^{LTah9{VZ-ZqF7?JM1S-C7?HIaG2~;! z0Lzw${}>Un1~JeQ)*u4bAht;)Sa1#^M`CmiVzA{(B<3I@)*^;j@>)dbTEu>dp%(rL zB2QxSCx|4=mq_^p(QX~$aZ6i=h+Ky_DKXrl)*}kmm8)!TtS{F?Z#g8=*OQ~`267}@ z#s)<62E=)ZQ5N$lqEKSdr-;#3B$4?kqR&Re7+bIr5xWuLw+S)U;x-|QC00v}Gw)nP z)+WS|T*P?GmWa-Vy&_aV+pthAV~5QP$p zzCx_FB8kke5PkL|*4Tpmh}iuIzpoK%E$(YXvBYYLb>@8lk@YoV$N|I#%a({gfCwo- zY_x;|L_h&zn?$Y!A4KFxj6R6iV!0BD2N4m65Zf&I5F+#tV!y-=3qOp=lbC!MvD5M; zQVt{9eS_F#Y2P3szd@Xo*lkfq5Csymjv)5faf$RJh_2rv@-5?AMD(|a^Ah_k<|v|2 zV$o5=ek+p5Jc{UZ3~|5~97Dt&L--v>9JILOh+>J=5{J$EI|kA>)=%MxWh;DZfhPz@ zEkWU!tyMT~!QT_Uvm}KRmaFi+g`Fgvv}A=JY^TDH7XAaF(8em9vV4V~tjUjrpDj({ z7dxnM+M)^xXKbp%Sv#(9&N`kV6j_GCuXak|H;eg6$9hV~`V$pDZ$%QBKj~P1MqIQ7 zKkHb3*0KJAxMXp^=vXCIOI$YZ(}=8J5JOHQu2{B2{AonU89sYm^R+=|%JJFj3}zcf zZye5&B}ZcPSwuO@l}J2`h&YGvv*dG#&~u3W66Gzt2$3f-xd;(x`4TBbh<3jsDq7mF zh{#_NCnbU`>NiAz#H`;CRqVJ#`frG?zaxSz<99^#?}+mf)hy;bqEKSdc|?d6No1Z! z^tphjVGAxGVlN>4E+WD#?joXCVzopq^DahYT|^8iM%1xviTGkf$R$KQOSpsxxP;gy z5pKbMAaW!||AA;|xe|$gAR;a!A}skbBJ?t1zeHmT{}YiXG5JqK6U&!K`4iFZ3Zj{% zT|q=%L7bFmVNq8R1roEaB3jvTiS(<8uGbJzmT?UceGPG5qV230Uz&sES&Mvm+c2xh zx9_Y>U)sW(#SXT>o7J)22tOZ0M~m}86icj@xY@kRA+mfBL&_mKS++!cIYfvr;xcIhBzrP+@h)@3M6J#M~txJ66w_uT|*GbmJx!84ndrk7-ccnBMK!JU5^-T zMG~3UBl^@pjIjkZ5V187exZo578i;rmRKz@&b-4AS)qs_VTkdTEfF7v2&sukwS=08 zfSQPH5@{A(3y~u+x)x%Ra*@6a$*air{hKSh~*AP)Gv0CCS^S%L*)ete{2E<&;mWaOr5fXuzX9*FA zfC$7ki3Jwi2$3T(x)EZbk#PTIlA`$JH zAU?3PCWy!;h?5daEvhM^Kw?%?#Bw_>k=_*1wHYGYGMXWxn<36ithAWsh(d`)%@M1u zNFuX2qE8FN8e7l;5!(Xc*AlVT;#wk#C00wUGw)W2td_o&?XgzAJ@m#xBEA(lLRyn! zqb0OP1hhtMlgPE;C`69L=qSV%%aursLPWGdY_sGxh|o5O{SrGYye%S6Vscx=PRo}_ zX^UugBVw1O-H3?15phytw?(x>6iCc!huCAsCDPj=y0%B;TSj|CbbG{kiG3E+0Z}Ni zr~_iZ6-i`vK=g@59Iyq^h}dX^Uq{42i|dFemRK!u*t~B-WOYOgxe0N^vL)hgLWJCm zIBE$uBLZ$lY?C-{!MFI1;GolP@$Kew#&^wUxA?vh_}V~Un}4TofS+%3FRzN0_M&gC zpr=MW@x*BUQ1>gSDi++!_cn6XeKO(65lN5o6sr~`e;s{-{wv#%QG-S&J@Kg5u@-CI zp6k2WJLm%}|GjlWczgcf`zK_?%eP@?ZAdQ(;)r(@FYnc*6(QEQ|B~!pEn5!kXvr_pRyU z_a452W%u$us@hNJ>zn6u#}n2g-glT^GS#lICgU#O&fcth<3SGW$kQB!)Cs8yuk_8_SzeD5vi*S>-` zM?-bnmh{q^_0Rf_^bQ+S)mzUkC~cC2$A?f^uM(#=Ur0egm8*H{@A*%tM+{wqt);{D zSsJpY=JUS(`_5H`qyuB)^LAI15 zbKsLB9v#wR=-81VHvUE5#(voyy&0bx8Q}>}4I1%O(x|6XZ(##h&u2S%>v@?IN}PE= zc;gSQ^}F(GnI_Eg_mK0c|p*cUJR9`bwVZf~!kk{#G{ z)9LAB_j!9&)@H4=nXP}tHz4fCzON~BRU;WN>eW_;i zvQ7Ww8yduKP4M=rs-wNzm-Q9D&nPW<)ob2XrI+ull9TfKl9STyuT1Bao@?`Gl^*_s zbG*H(sWo+)+DG%K`<%Iyrqgdk>FKwo^*g@b`;{J&a?T8Dx5Zn340J+wVvwr&c*#+| z`T$#(c3O7n`BkypuF}!K2vE&pUVA){KOiz;;BJP12E-cn>NjXFnKY0#vgFfe-3LH!E#^Yup(cr5FW_U)H` zw|3)UJJ(8IvfuHiTlD`#^mj}2@+|9YqBlxjCtM!=#}xg~PQAXjgnfS1I-PW@v zM^U?Bqt{A79^0W!BDCaJ_^7OxMxO$en{w#H=CC{jtuH3w?xQtavd!E*E)j2(6 zqovDt%{e{&CCWKH{6g)ZC%Lq7&JUpq>Tkp90XuqC#Hq>k?3|I6-2X+d|8BeigVZLf$Hk5+Az+^>Mo;t>H+6M zoYRvl^uS!bu6M2;>5J+YUNxMnPulZ0=!A3O&PC#edmgCSz{w`aC*8Pj=v-6W)6VJ7 zR;urs!8qq4oNJCtz^T6*;TR%bE#N2DT1|0kg_iKMbItwee-)?^eZk2Vu0W0GKb&jn zHr9x~f|G9T^0gs-&E<=7t}V`UQnzvLMwGWZ(c3!LPUEk#lQ%l4Q>2P>?VRg?tLj{P z=b~}doa^8mk4^Ea?p(BUH{q^#t|LyT=gkm`D;fW{xQw?TYr2e`oa=Vi|U3)FM&PUpJf z>N^+fw!IS2mFgpcENM%)j2IFnu@aH*<9ADDpDWp||8_yN*-=2L#nACf}SqpYcAse zTrcNlI`=T{Zny30I33+U_?EO@nJ(WWq;GbWneAKxu11NY{oh2Y)`LI~&eLlSP6ZBz z51pIu@;!>v!xZ&;#}zn)bbsd-x_pn}?sQInOjRvC6uLS0o}BtW5n`QO>@p_d&M*QS z6SJHfMtZrs>Me2Zaa;f{LIB6lh- zb8aN=JzNXoa_5psN4tC6Z-sMD<9;u7sa`9QYW~q+F5_yK z@fqCRR8W`GkDVJsx+hMrHO{4w{+w-frOR<{Ea~rDd25|}7PrZ{Pf8r^KMwhflj~f@ z=WuOsF~s%GjVC=vHRZLzx#vmGbM8~;)TIlY+vwZ`++yc8IhTgZDtVwaiCiZql3wL9 zZgy@G?qlb+;FNp;);YHgr&DY)tamQY<$Dpg$+^#P8iZ4zJFW{cbr(`2Jsm2$jC)+h zskqCW@4C3`b?zn7MeZ7q@7&8cJqJy%FP)o4dWm!UaH`;R$l{u!Ys=TA`BJ@JVc{V% z>f&<1ZLBL^F6XB%E(OlLN;(gxm;N%ZjwAy(nE2&FdcU;lXM?ypbOJ?&dny>*SQnU zy@@L(t=IRdPQJy$B_~fhHwX8Jb3ZsY7x$xcimLS6aLTzt=jP$`=RWk(I^~-W`n{sp zPegS|>H>Z|!9oJ@G*KDf0bTR;I^*0z(&L>wOH@<83m>Z#UPaC=BAw&hZ_d4k`^35P zIPGIGtkVPS2a&koWEN>XZFMm5qT6^0=~eFPs1{N=@54FOfY+aH+Yd+=;T|Pkarr(Z zo$0O>dSj>^FNK}Xd8_{=m%(lB8sI}l?PNJzbI#9g{1Gn5ZS3z{w(_~kly`0g?g_VT zfO9KxlUyqVI=4#W??WdmIJp|P)VYezeT)m>)X}Swb8ARfa4yKX9NaY0dR2CAE$R8r zRUxYAPvAq+CFB1(5;}l&(21tgOQ(xkW}X&7`k$uC8-iaNo1RWMVz%wvs-nLU`53DY*@F zDo!CbaQU{A)~P7h(77Et{*T;M>INtC$gmPOjTqtFPSSos6b&7IqW`_Z`;&h5qNX|B5ZwRA3@bRub8 zm|8jaCFygnJ6q#a!F`}#RP%{#a3$~mzG6YYMD%LwHr`Kq749A4jm~{d`X$^#Vms#! zkS?TUbS-G_Tmk8Cae8%d?jY%-&P6+SNaOD?auF*#B2~k~@QFL$Z+7k*+(z6IVkfup z5z?2~K-Yp>aVq;;_!XyXL5$0Hl=Sb;-QnCZ+{3tK>i^D89!EY>BKg(m+;_M^&UJO} z1WuDPx<2R~tCPtdgEL2{_jWRW+!{NjD@(B>E- zc5({lJJ-v(pK#vJ^>*%OTupafxXZa;aJ8J%yJnSl8d7T`b#b}J$up!+lGcSJj(9!s zENmyO3yFT~Y2$OCPe;0DXyB>rBDe#mYsLtd?^n`ZIK4(X_Zw+%9M_RluVg2GNBWdX zucvUdddWi^FLHDnNk8rKT_EjwRMKeYF5+r205%byajuxOPT4KQG0t5gT}Z)Oi77b! z{_*;Qh4N(FNgU@gUM8(6ES=-eIrk@NALqt9cLk@N==6KuxvQi#2sJ?U2vxP#HP9fG zo8X*QT+sVJjoLIPy^(ude@=AH2Y0)3dUK)z%kd+|xfh)C#Wit#JlQ!vTvMFJ#EZ`P z|7x3I-L4dzi5Zw%g40}}j`D5it|zS{ zQRU}3SA%pBX_cX0w*;?HerV26Wh}r^SFbSARd8CjFxX{`cW>$nz3oh)Un8q}%J2Ks z+sOSM=xNK-K+~kJzzld5GT=3s39o}5=d5YdW}vCkR-oxoO^3DxJs`U=M1rP6M}lTM zp90NrYDQBtn9l&SmZ>Gvl+UuDnaSrM4*Gy*B_D+T@DOx^p3oaKJGm7;gI(}Bd;xnP zAHIZrupfFsZ}^dG`_FJ1&cInXS8*`yN#a-d4Sokrb6x^XZE7m>dC=@-8cYPuTHXV3 za1#Y<#_}f6EaffG2`WPss0zWh?PtHnskKPfhB{Ce>Op-7hX&9PZh#1A1dSmQnm|)% z2ESL}dIcBYA{2urLjQov@F!e_??98Ghu|=LQ-Ov)LgHIE3J0J7Ho_*zh0U-9w!${p z4m%(ZcEV?{3qFV4@CEFFy^s%I!an#4_QMcP zU=(N;b~HQ#V;}{_!n2^+*ykY?CO{fYgh}uMOol0t4pZSv*au(1*V^a+6u==k4Bx;J zI10yM5X3`2co6!-LofgyhJjE>kDmff`D%*y7dQ=P;4BouukaiE4w~`32vNoSxCEN+ zy$pZCRVbO(qpRhW*F3jT2K$_gXSt5Kts3z8bKs90nJ%9gXW;A%9e1NOUD^F2YIj)w!$`8 z2b!w<7~X+}-d>M+y-Q*dya$UR3p986K70U6VHqrkkDv|Q2p!;dxC1&v7tr->I#;C` z@G4A$&d|l0ob?-(+L7c|vznct0|Y|| zTn{xW(H)w}{05G|Q8);PK(m=kVHtb`n#p_s`a(Z=5Hyo{mu3IV?ZFt5cR+jafpYK* zzxYnW8PI&>3Rn!jsv|5U{VptmTgjuxyN-c*EYE^RIL-tphnvartB?T)S$>%~4Q9Yl z9~yEZ4KWE`fXVP8dq~!&;2vE3WJbOX&-R)k8h zo%Nr=UibU$KW_<-f}%`O6AAXFd8&RnF8aWFARo(@Cd}f9iaKiw_zS=4)R^l zyki!82uooFtOQLnYFcp(k3`mD$cnVVBS?CG9;4a{s3SP-vI3~daeLP4bQI*R_F!+KW_`^lc zO3g$53YvQ?fP-)d4#QD64&T8Ec!&Wv02Y(hyyW}v0d!%2zD-P|!by-$dMc#ClX`nN zg0pZWJPP+9;~*A#Ku_oeyZT4S?~^bBMuKMgo`O;EG>nF4U<{d&tJHUu%-juRVI^ln02T8GJv-rcGCoWC4bldhxf?{mhj52sG3lFV zfLq`^>n^}W3qH+dsvKvvANWIg2!x7I34-7{s0P&`1g?h~5DH;X6KX*t$b_D7n&LH4 zsCmKL;V4x&2HrRy@CAQ}3t*UPqHq8_3_rje=*vn?7V04+HQ^c?>x7;FX)qBqNjMw^ zaqL6jF&GMokOafvad-lT!;>%qMnWF6 zkOmV$vyv~sWOxy#Ksro?m*8cX2Gijcm;tXs2D}C{E%>6}nAFWAHAfi;CG(O*eU#Kk zM}1V(r#pRen+^JKr4LT?K_843!D9FjK7tjn5`sYUm!9DsY zA4di5h5MloXpXWk^aIU9MnPM+5!yj}=l~s|6|{y5p!vzlPz9<&FldT#3v7cOFb?j5 zd*B)utRfmGwi3Rnp*fTjR7<+qx1 zeJyBKZykIJgWyqk42Ho77zwL6PXgJ=Y~ofRG|t%5a{e{sxZ0ckn&@0NY>(yEG$~V`-Rjq!{dZ|* z-MQCY`PX43tbz_O4|H?A3p9fWs0VtITtCR;S~G?nn@l@jDY%}xiih7 z&IFxrx;y<19D#4)7|e%B@GcGh9%R81&`oCDRQ>|4qoJ$&^Zm#W5}H%}f2^PG{SIaG z`#D72aC!iAlSwx(?_fW=v-&KorlZ!uddLOc>rp9)E!`vyAF zc(_VMuE1r`edu4Hi+-hjN@6o?g$5L`im01VuYqnnozl+W8`uxp$#xfWXx5Fe33RVW z)AGN;?~o6l(V`C%9|7Iw(QO^w#wo}4BWShMPq@tZfe+|TNkuqGt+&E<$b(N{J?L)8 z9ncwccf$uRv7K&U)S|%JPy<3hEmX)3e*#YnY^C+qf##LHh}>&P^}0$6?4kB*&fno2 zD6Il?%l%hSt9<67(m%oXZ~{Cn@fBt4hg>Mz3Kyurd3Xv&!f?D}1g}?bDxKxuTh2cqbrvgL0evph^&$~;T1G<$ z7|dS#fC?&L&%5A0mbVcX!8}bl5&G!;1d-o%O-sI< zxS4$VHJD3$8zz7*u+PId7z-(DruzDy@UvqT{NrzV7NNq&!*dR0^emT6Pr*-uiI4`C zUD3aqZK~++Tk@mwHOUuYGQ40%D*E4@`Vz^hkPiASunrc&JFo!e!F>1xa$qsM2aDic z(3c~!VHwC}!TYcTK7bElDd;Y)?%J*beQRSSux+ZBzJ;M1qibOkXk!)jDQF{AVgsn| zDs&^rDXoK5i|WmV-el-Dk+zZF4c~wcN|inghd>q7@fW}Wwf)y5RN&{Z3qFJGum!fk zR@e!7umkkJ3jS(DmX%Llck=gvcC6*Sum`>X-M7@&1oRC6Rq!AvPk_D`pj(0`S@<4~ z!ndHy`*&~xj=^!z@-_GcPQj1x0~EUSPsE?$44j6`pxcLf$E(|odiQ%4^odDcF13gs zx+VOZ6S|M6+q_pn1!&_x;0pZdmUZ*g3;e+sbmLSvO8r3h9(4y#_b+vCQfa;CQ>&_* z)E(*ub=P9`{{a@%Be@LxjlWX52JcRsVVcB@ET;o zt@v9&GaLGlsb8}Cz^MGe zN6?_Wnb-yR4^mz+a68-zw}I!5MOV^V?@#{TM0JfO8@quf9%G>gba!dRIB)v@9uj3g z&p*xbKo|u2Os~)O{oz6A2l4O#^aZuZLy!R4<`H-tl3*wdh9U4MJO+s{3`T)kaJaq~ z@&t*eoJb~)gc0y0sK1mR1JA%zNQD<*5=?~WVLa$`dX_j2o&)96I-PD4h-okxrofAk z4%3xMHF?R!mxBs$Tx$Yb6AhYxEDxH5^o4TZslSpef^(n)J_D!W z7x)=Y!H;kfzK8GN7#xLfp#ToRe)tOZK|bt-J@5tWhRs;@LQ&V8vK#1Vbn2ANvoh{u<8 zo*nCyRk}jSHuS%Cq@Czipf=DEs}ec_c~53tvHz*Svfbp_$^R5pPD$CRBs_(xX^)jz zme=o@n(X*RVr^nwVtrygrQtEo6wv^${H<|KpfTt@ZX=@nC{X@L=tWxhG?gc{DL*`4 z$XK@udwV=x3Bg`v=&Jf8AZhVpB_ zsoHT0cvfoXo*iovWdvx)+K~!=60}VO8+&&46wBja0*r^}K%c~PaLLM4sij@ckvVA$FKz6gDhAKWyi=$mY2ga zcpsLki9Uo699ppgK7wrLRufk_Ja0_avYZ2JKo=^HS9&up7dF90SP$!91AGeVDy>t# z)ImGF2MwGrK4-@sweQ7i9J&|JlF;xRZ0-@^$= zBu@ikT_}Vfp%wfLKf&Fse?5>N1L3rf-Bj2A-qdrfI16W>BDK_Xoo?f5x=sT$kf>X_ zy49;&zPhiZfv0X%pR0S+otnnmM2sY=1tMSz%W8=mNUJ5(3hxpd64e^vy6>#pdz#@L z%nG%{LXKRw{VEc5+fOYpn#>v>QJ@KS&j3@asE_sGO81#{zgexLmnP$NCU~wdnmN{m zNVgGn3n&z7=;pr?nqF3`=(1U#wC=j;+}0hq5yVIF4-qxPq8U_GOs$|1?P&!ay^dCA zRAbib0CWcEjA+ENDyxdNBdyjeX{l5ebVpr-MR(WRKns{cM$N9ORWwf2GMaJK(Y7S& zZoHaMci#1@Sa;twRit0dr^yq|vTmU2?)=T5UwW^B=ZsR9shd(&<4z=W5n9N`8AR1Q zg{ad_{dOnoJA>|+b%ic&`F7$|^4&qy9b27hFF}3h6z{>`4R=9r=nmarIO}57|2-Z(tOp!(rG6pTZ|#FdJUfbz&`v z9QX*Pz)W}zGT;@M1QQ??M#EE(3?pF#=;$y>X2 z=nc_ZL{(1Zya{wcs#hinZ6s9tci>%E2y@)BF5z=Y&x5yN0n7(^snJXpJk6+`Yy%z9PRN7LU=Qd#-{F?auG9L@VK-_l-n$y!N@^U&FHKmSNM_V?(j#fvf zgVJfL=vmgbTK3%0DOCSUs410cBdFj)kk_)tfv2g!`W>M=rmdkBG=(P67#e}@BZd=Gl@HYJ!ziOZ zt}fIB-5=L|;SH?Qmy`6RCcWF$Z6tlssWQAr5hdq??xZv)qrPrc5qzNn=xtCSQC~OE zwEYk4#GiBklm|ah-f|$XWkubj*Egy3Eh>FGO5dcaLs|MZRjATX3u^i@2x^n42U;Oi z+X%P;8bCvc1RbR+q$5{aN2nv=DEMkXY2~%P6|`WvIkW_|hNm@eCat&2HxWBRyHtL( z1-<)FCROA{(8_4gjux^5wUF|($1R|M4la)h_vF>@Zk6#QjECo79E<=R*yErI4kIQ( zBBT!G#}IfFG}U<Vj#wWy zRT0n8X;}v#=UHENSuNvPSJJxbe^1k?ssEnV20ChaPX**uslLu@o$wUy`ShygvgN6( z)RK=7bzmwlRhg7fbE~h)ZlHB)el@wg(t5kI2XwdG4^F^if7{M8ZpxNbHmw2r1kh!v zUK)U9R}N=cl_~2~5p~D2f6J@Ep*G#*qTm7!KkX8Cp~Eua4PjBpLY zr$8f9Ei#t)2&8~!8q^IMaB6mql~JHUG=}&LjE1K{1#4%DDn~ojRj_o2rTf!CmgK3# zN>6hQx9+X{`=(A{orZ-zrezY%r9Y&MYwfohd403>#^1>+CBjfY=$@aPGH) zTA(jtRRGWT(u!EmzmiYS2T2?P4bq8_1{&BUUwQJrX0NyLzbEw@G8_iYXsGE_P(NC+{`l!{qTJT@Lh(LtUWsYyT?i{)CHg0WQNb{2#A$<{ zOLY3?UPVxgXx+c=S1{t0aWl2ANrohjdK2jgqP|J5kLRJp8la}DO#!t)-_8pGea&10 zQNP9Y#X1clOfWbL#nY(Um?^N@5oxxJ)tBvXmHhIgSy~Zp~|QNo+*e!EbEKy zO`$Tr2~q1+xgcU2h{O$M*)zGN?8e5(8 zA0@P)|Hh-PxP_?y#-o*<=J)JC6?%+yL*QQ0cM`io7w8Q7zHJPsQmTl$O514X6!+JJ zmMZQkvyVQAD3fZufem$}e?Q8yNA>r0e--4)QEQbwT2D*;Q@(ZNP4yJ$$)L*U3$L*- zn6#$=4M6q1n%XlEyWx~yXNsrE`?KCN@X8)}ck(3A3Tg?Rar*x%oZ`F(C84I*c^<)9 zeTKger*Go+f-E-BozQooC(AY2fzERkpsv%ly-9034L*I7x3q6d*Wb;ur)%{MUv2jg zXxmNfzvLUY+Ss#0edSj>)z^U2h@P(kYXenC_mlJu-88m&kk}tIh;>mJNV?=|NYs^2 zN2*^wa=KvYUH+p)-8&ded?b}0huJuRsO!KWqNm9{T~fCH)xR1i|C>JcbV*~nNEa!c z2^wER*@tJQRW0+^fMZ?BAM9*E#w0R54llz*@Qf3U-sf2!3lm@jJPG=Zse^eIw0=B1 z2jf6_Q{Z}bFp8+k=pe@E{C|J~M=(70?PMMzq{Tl5C$)r6SKTWzB+m0q` zr`mxl^sh4HREDCOyllRWB^99mJv&sv$|yXQ(b4_WQR#@%Twd*fBl)YGmq>?GsNSSZ zC7lja;6<1Wli&rI4%1Y)=gV(1NN0d5@+$FlcnxO4ao7W^;cb`;nH<3!qQ=i`;u~^M z=GW_Azg-Pq_P6VsEWZV*8UU+Es6d^&^N70hwUVfcyhB_7^FcQw#0t{O;Y0WUvfw?? zJ*7p&cVQvu_kB~G-Zv~}S)X6@t6H;cZQy?VE=4M-nT{~v_CpiKMV zOUQT2>SOr=H~?S6e)tOHkHR510*ArVUEh#i#@X>LQDaJZ)%1#Ly-oVh%e;I(U&0eA z{NM4d5#r@FA*=bsm+t$$RwEzpHZ5DXY{UAxHaEsUj0YIzEA+IV3AGX^xCYs~l^@=8 z&`tI7eY~T{-k$6!R__k-rCY~4{Cn4$Prgdz+v;`dzF(&gZRX?Mx@Fs__AOg`eP|1m zZ;h?H!@n(0kU2}JrOznJUNa;jIIZD*pI7&OI4Zhjo0e_bE$4CA{=IpchE412A6laa z2N6id!mO97eEqfmNFVQ;Fg)tu5&sY#A$9zUf0$3czx~qLKfTsH<>@{01{Uur?7u0D zI^3w^=JlY>=t3Qa*pe>(Z+VZju3f3aShA}QAMXjs@TqX(ijOz{@1*24*=8!kOjlmF z8z%nQuuG4L|H?4ej(4TJEW1oTp3l8*-mU*Xt8=oWP?Q<90C7ZdDdwZ|2d9nVzOS9DGG2Q-E z0`(V+bjTwuyt{u`^~uz@GK(!XuC6n**@U(}-bEGduI~P!75*Tj+L4Nl?C#$*P=9qq z%We;IZ9{j8zSS!BpnlyfqKALm_B$y`4Rk4}!RnCP=b!WOUW=)UnO>!Ix48=!jUOF5 z{eq8oJJ)pks@N+%{CoYE1Ey(84w%*mwTF88-{o^4*gov(-=+3BH5y472Gw z?>;(m`?{3tN(ZSrKh+i_kuSqy9`_Har%}F`yw{WWz><0=Hr)8ZAEkNK^Bc@NkxK5b zX07k@5A``y&87|T5B2u3?BNs<$@8!Y3oY&bk{##v^>3!fQpNd)Rp?v2^dxbEmWTd$ z-{s%dGlpILJq7<`5rLi}N{{ugo&VGB{+8F%7A0Am{e9)%>?rGW57l=qdYdI{>2G=5 z%73=5;VW7U2mZe~lz%S$|E4j#>)X6R?5w>V*D(0EuK%kXcPOr2J#GAbWF2fH1{20v zww6i`NQ1jf*ZsY@+_9HEy#LaqWsCbSEB~?8{;K7FtinxJ{sFF}lWXzWkpa5o?mGE% zUi)&L50}Q4x{!LkVIv;kI9&MORQ11}GJjRYHQ08W-uHjmHve(7lIvq-VJNbwP52pyZ-hv*aS+Q&7h~A5Jmu z3fa<*sI-n2^WR-B8+tBwZ#F2sZf%HBA2U3Zz z8(8y!{-M?W>$`^1cK{9b->DfK6KXdsJ$E)t`~A-9XUA^$@ovg->ea$#4y3?n+d-)Q zUkkeP274sIKQzEok{ui9U-Q4+;lF3AH7cU?mucPE-yBO>7jmlPlx?kX|D0t%;ve?k zmQ%sAyEDFTB=An4%C5wrk41mf71%RIm7f0^gvUa^CXv>A6eF~ua3Vo?Db6D8A&Ad>wDK&a?qKsGG&((?2A^$^v*J`bjAqr*qJN`0K2Y+u#l%0T9!Ugj)#hWtVr8vf8zI`Fgekk1IOxT~darjGOM2CyHK;2^D|M&W zd0esgA9KbTArfj(CSzZuKpcJ@TQ+)0@N^@@R+KQ$%!~U}-L9RHZY()cgPaG#%=u84 zfmq}9F;L1tpo+qBl11qFgR};F7L3KZ4IYmhFEZ2cpI0fBH$7gJ&-anPTvF2+^WXYf z^ckphJ8O~KAhR$7c?zML*nP%^)XPV%%TtNGu3fH_?5Q^Qa-CpXfdkVFq5z(BVi0ib z^Q6gB^tNO_*vwvM?nUc<*W2nwcu~+`aN-~WR7F8T{t&k|$IVt91mc=l0fU56wJClu z*7DLSf4CbiKEDG-Y z_{;l*E?A18b+nHNsgKaa?vu9u-0NymmRuswN($rA*KNy&nn_w|XDxxmwce6S(W8pn z0~FIRPhhv}QN}Qk{scik9-|FK%G@6R$I9wP0{4NxT=J;zfw>{~S{*})2N(ngL(xa+ zjZ)WP<%sL+?rqU15Finq>dYFe^`+ENc&daI_N8_BZm{}Nhoqt=JYnu! z6_l_Mk=#poRyyT4A0;)>ZBXp#OFr?y)!dgNs_AX0T9lcj+u=*eg)pk@MYSY1O3Wcy*$kiv(9^IaR#JyFkIZY@z z8h(%u?TE(eZ$lHx;^KWx$oqFx8{d?6^K(X1isa|QrZnMq7|@4Jg;1#Fp8mAXT5l^g z^%rB3W?#u{SEtUI=pj2t;A<;?N-3tdrt&dn))wsnW)DUT@+aRIGh3^ZO0{PPevh1Y zA^ogQyW5}opd=e|baR@Fcim+?Cqlx*0Z47Gtl)Q9<~1}Fajh0&6yClc9=aC~9QwjWOp2n5#Hx5)13ek(M~ zf`uXe5 z(3%BWYpV`}%Kt=>$IRsJ zRr`qo;vi$2exleo2-TR@bRrIfOl>2$dE@i(byYly%mOm3g;+tBwV|MqW;Xdd~2zuy7{L18j^ND{#3{ zfK<$cl(#WZRa;ec#W+ybC>UKu-@jui6s?x>wg`$2=XcdWfhWa-sMNM}IUY>23!$Q; z!GNd`Asd_DmARY{o3tGasO9YD2KzfYgigE$#}h*+atR<80g{76mM_fi+1y@;$e%1L zu#($DC;_;1M?=WvBOo&s$l&+8C$4WD+*GHn1to=QXkLd<218o3Bgi`1^YFiU$&)cL1Vz%(}ZkT;G` zbZt+`<571*d)hf3xSst&$$!91<(ptuTKe#d;Jw2nkI$vIw{Vb~mZjdT19?w?NgmdL zc2B^l!MerPV(T{1th8=a2lAZ=%11XB^JBX`Sq0{0JgI`}tdbZI#fs_DI?{@XW&zUO zPyt!sLUZk)MKxmqsi=9KPGmU=^fm58PLn|2Nq-8RWEN(+N1m)h)Ri((!?3xl;M<4R zp>~%tCS=IO!wbMB07_WR!)tb0R-@XJnJ8iJ0443(lk*>F&A%Hp{R6H2(hWa?%iNKt z1zTN-?v%ps3%b)$E{AFPjCbiqcVYb|FWeaX>GzYta!=*y^q=nJHW|E#hk0U)*|oo8 zUEe~*JY@(kZu4wQik%Fc$HPe4iUHd=+00(+Psb-idRFzM`;*Q59C!2-Ci@7U9DAAj ztmNwbS7#Ri7UmOr-6))brl8lY!i8I10rbl~up}-ve&ArOdq$l&}`=I&-({ih-NQDy^afI`t8Cbu9*v%?z~KV-WezfCu-} zV9}~(*T`!zh0uo|t8_2Eq{zN<@4fOi9K^>Dvy;swX-Gr^>o4 z{xr!CS-smvQ3V1Tlg8H-6Of_xaEc`GwDWMJKBKoyyH2rv)#+Rx^tP5WAY3$KQ38`1 zo95hj;;+{}v`|YtH9LmWZmxR+5LE!t>Qa}qTIn^}vzF_6Y6?b+wNA4kn>H<9J0e^y zadmfyroyw#Y(3lo!P4A%;Jwt4j$UW7Aq=fh!rDFkM>@CTTHP5sZ36|CVrQC_;{AkQ z@PVC_X2qxb^~?NNn)kh&VEvIuEzDm57<6TUp$m(qeY3Dw>4!?iQK?9!J>Gt&YxF>i z?Ak#xM`JqSlHuu|n@9hXb-_~Z2TS0AXbPQ;AwC~Xu`A51%-r$uO*B2*hHu4xr_O(w zSy9?-v;0zx-!U9O@%+e^Zhp=O4$Iwf~NY{`swx=8+F<@fJIO(ws{Qs?m^v1Kp@%`JEQO56QySNXY~Z5q5bYNQNqJ# z;nc1}@#EEZh!PJttf?^+JqPM_9T4D6?C;Ox9ZrwzKTU@4*_&Y2Kg-22n*ENhpDhePzo*L$Kpv1h*Dukyd7$sFv(&%P{ z+oWrSSF0uNn%I%_m?>Kd2uDDS7+2`VsQg1Y=&4{oGLp*82ll6cV4j6%%^g*LRP|aa zgonm@l;GLDcOM(rht+Mbmbh#DMo|RU?GK1DsM}RvWOff4R6~U@Xr`cq`#W=mee#ZS z6{@Nw?wZY`C>3?3i-0Hxh>F8*)-S$?*la44y&Xl*7<;vNVNl)#b)5gO%_ugx3PdPM zDx&U~E47YRDgJkDW66!-ju|{Flum&~ijTbmIVY?4JNsw(62Ww!Q;3oE2j2dmm zQ##koY393+Ph132N1-x%7ENyUY2>tbn=r6YXD>}_%zo?<7Hin}O0l|6vIpKvGj%)# zqOO#Tx;)3(zwP^EW%CNzjPTNkC65)ATWXeHw|+dG8UP1i^CGiqy1nD+<|4D&x;GQ3 z43nmKl~Rd`Vn(fRwYr!6`k#lR+sY~;cPGpzQ8L&3aT1+ckEh=xIC)whTVO$uf*6Lg!Nb#O8bvP$j#|?w zaXI>`#_4=flikgJvrZO^85cm7+C{)o5MKm$U(gRsVTc52@^10~9IO(k zb4V)rdH#c9idEr|vVxW7t;AY3Zv>z?C}hm zP4ighBWBa0Rl)?wfV)8p57`n&qc*HVLC{N2Snqw$o2dRVmsPS87eK{pc+<^1>QYw=I zf>iD(7L$6XKzGofEJ{j4c{IRAC+`MS94fnWn$fSBkv%fGd8fWBG)j59$SQ|Wqw~%j zW36IPoa~$}nS@ihqT&-4(gycM3md~$Q^ENimtJvs{Gn*Q9F3nY}Ow!q4xr)_UNNqM(vHDpZm|X8t-fJu) zWL`|lCP_uEEZlN_|B6M%F;)EswWhH#vHn%HB-i)vEI4yOqD|`pSc58`q>G!ehXkce z=(e@%^lg5r9*=fZ>H_smBM)1GdR@LWGsaGvdPG>Qf^~shSRd-ZN z5|An^iELcI)_5uJr94_bl`0#`Z_MAN8i5viYFWr&{d1mWA%D3>asQGP!(Xke>aL z_zWuJ>Z&p9r)Op1C8=@4n0;{6Z4c1qeQ+?!AE5jD5Rh->FMPzr654P43fPmY>P7~-TcL1T=&VNzF0R(*!cs_ps^dazUaS+chhslSZMUT*c zgMd?+B;0OWsoPN`+oA0@0aKp3-mWMDh;kG~i3mu;0l};KdxtX;2LzYTvAR_UL={k3 zN4|>PN%@Y65X`S{wtD!yXfPIpE1?LrvP#guy{iPntgaSRz*AMGI!OE|ayZqf8KT zbvV??C{#Mg?Fb^&f1RL_N3aoQc5+*pqh>)`b%)H*`m_+JD$g^X4lMO-8_@8MHUz38 zN_eHbG%@LMfpVSMKUVf@c$4cGi0lmrUIZO8e^A*!@Mt<96yJKtX?k%CYk_J%2~peq zQ?LEH&u0?=;URWEMxG|$bcmR`^Yv#swy?VXO;^)Fy81++<#9B$tG7V&bE{*4T`V{M z1vH%70Erb_B2}s1akKKe!{=$*akSd>f}lLUrFn$+sM!e6@CF#VqzS%2nT)VAAUN;l zTEqHRueEx=l0(ro+3D2`yg>8LV?U_c3E2D*7pUn8$oZ5DlzJL;&ALD-Cm{ceFVJl~ zrS(8l2xwZ&-d*dK#iVuOfC$La?7Tp3CjoivLgIM|ud``_G<`ylUUm|dixQy|LfA|)~8fs2BO zuI-k`rQDr@hz5?6FmE*2{ds%}ICGF+?lgoT$2)h2%+H{&>o1Vw8K9LZMoPa-PpnR~ z<|Z}2BIvm`>Cn_dh4n~kVVl7`^}a^sGSJGnYjo-so>Q+;!ddV*>6++squ(0L*|oP3 z@0uZhhY1teAhtU94C>qrHqkqS(wbl!v&cEffLaJNE`I~vI{=*ny7t$_8vSo6?P}}I z2bRd_)hBfU68Yu$cY>E~YowZ}|AG>^IaG79%*t!6$D*jy43j~NyZn}u;^tmD4 z=VVe0x4k%%X8n!9`I=$2f=6LIR^b?3osgL@hrGq136;KpjYYv*3c6r6^1HxKE||GX z-ySKkxh=*39q9@0;+JN8Z4D1R7=k+mv=Iieo~%F+K9=C|lV7 zqTLrEc_y@*rz;S^+IV}tq;Ao89`Y~lsw;l)U z=mfU#zmF(k)!$xq(8$8;%XKoAw0%gZXem9_KcZXmbi{pCex#y=6CDaqYt*KA{KY25k~2@}1nP3wgK_A@ z=A)Gv3kkkS*F>58w0=rK{9gSjJ$r;_!>5Tz52AV3%siwvPenhDYKvcPx%&QlSrxIH ziDP(A$@e8VUiF!PXnt@0vpbVFv3+-iJw`jKaS`}*YBNVgN{Q~ZNF1T$3|O!O&ncA+ z(dFlKJ_EugQaNm?!gUlPSnP8hj4;hAH?Ycd+}F+7Q;GZ9>QZ0KoDAzAvQh%n1Q4p6 z3H)&78f2nT#g$`g=;99!Tt%T2@lr@*oYpX@QUm{4a{tgnoRED<(Ln%nx&e1^%S-Bf z10C4=lG55BR}1sQ`InT?6n{deZoi~;D3yF)i2>_3JO2KXGHI9@WcLlogax*yH#f{` z>3)7iE;oTp7*|{A7OL@FRp`>InIT&XL7Gs_m6a8UV;EAcp^%>Q9fsYy09u&yI+0Dh zVz8O2)vxJlIGED@It6l(YC_fT3NmTVYq49~^gvykzyX16jm-4nt>URf zO&C%Wg?hae5w5t_=OZg!b(@M-kYU8429+uL1l)@OL~*cTV(Xc4eR}_H0SLr8dFr3? zmXdG7;w*kkS+@bX3pR=&XCC%Bx?^c=EN+#JXLhwCqV#rD=Z;wm!zLhPBV7Hu?Tf4D zwedjc;arR7_CFP3V%oOVCTq%<;+{!eFw}!0`0{+5SpuRsW7J!J$OsbtHDf> zTI8mC@Qw!Eg->7Oy|8ynoH8a3ZuX zY2ZCfhfW`b1Uj6La%uaUN45MSaRS{IzJ67@aL+8xam^ zhA^2aE|(xvJPCExNl90#0G)Y=*|~iItsEO~In-%E&C}~YLulA#^OXIeg@#2qgA&fN^)o+HZ@|6w!;EQu%IvQu1ZGbbid|KVx$d!^d>*4i!sbg~fRAPI zYT+^#R|ho5l2=U|RJFgjIYkzR+T>0f{J~t*ykNO?S>UIkoYf73$J2^p4Rk{1zn5U> zWlkNQK(QK{Qv%zM7Qo47^yKNPX@Ax?@O}audA1)R=5*i*j#enjOw+P3Ehy=Px^Cul zGYf-~_gn~_cX^72)b#5}bBe*cvebE8CYfVR*ban`>TlX;rHc&47b5d%>){=Z=l2!~0i14~+kE(Y0M6opu?%uznmbM&+U~ zeJ8xa^nIlm9eM?Bi0Q$Ns{La&Pf5{4mY=_{tT{qEyqZS4$T9!?57;rSBn2R`R(e)a z@VI*OZes>rJ=jVfPA~-bx0Iw zbE+z-6KN4#^}$NFBHS|d_0($clI0aQPb+e!HC($l5O3tuZhwPSyy}pywWiu{@&3e` z7QF>4K3LOvJf-?JqEA0)mo$#r;`2hLSQgPh8*+RHNTkq(@Uy-RWxU7pKq*Rl2gy5I ziZ1i_Yo(~@d*)Jq>cHjWz;u3B;qff-0WD4IFLnfvJt+`Uzw#bVIZdbMIK}H_Sw10Fg`(J^loadGTr_NzFcXS_{q!(mo7Zl z>Pr>2(yC_{OE^&AC-h2fLD3Aw52nqZ%u0w#cH+W@^8Zn_K0DC75s<^A&uCm3L)tk* z@1ZD}EtUI%C=m21@{3BBUG|Ael^R7MXIki0DhjHE*PK~TZzmm~8@LW-^v=Vf+-v843KUG)>d$ zoeK2A)oF#~Q_aes%GDO&vRyW*CQcB_$E)ph$}wN{&|bdgWwdlMpT3l?XBkS->1`ci zas8GA!g}3$8ta&~3#V^*#zgltrq1`}It%#K`O1H3(cuMJ;#Jp&vu7LC9iFmNw1nAH zquinJKQ^fLNxg#Mf2^+k-mz%qv~zY7InOo!r>g?8YyJnS{{K71&BLf1<8~;C7&Ke- z_`88U+3i|7Q%MHOgCVSVm1tlK6P(VOd}jEbUi#ZN=*sv2%`iYZ6DkQFSBg4ycsRismn==ZaV zRIV(RN|=J*SESFyp#S+Dg>z7N&mFHjJ056J8HXEq|D`CoTI%^;mF9Rz6%@E9Dfg?l zPIeO+m$Lj+bEH^HJ+eg=h~P^%s+K6*96n8qa&pNRCG0?6{PgbdF1N{uOv(NnjGx&_ z%B&*R`byNREH;jsEATZ-FSCuGnfedlk^I75`p=Fe6~`H@u7F@?#Kxy(^_Z2qT7ckS z8oC_eNI`%w3X{Eyj#Em;U1>8sanE{oHke(|gqe<%#B~<~ zg1yVpOOi@k{@NiL5Xyx5Pj?ZuX|%svx8py&93W%mWFrj@P&`Im-3CWWw$^%m%T;YxrP*PZo{t<6?H}%KLe6|nBCsXN4)O+dLSSX9cB8$ zD^ao=`WB@?92@z^wNWdJR|AByK$wIQo}%hB?s@L;h7!Wfhr4FbET}}2N&@>vKv)5y z>BfEG_RW2J$UTr9$wQSW4G^Xdg|O$2_OGBWTmRy#J{9?Be#;VdIdF;*+uW6kT0s(@ z1A@1kW-NSmvhfuCuQGPoU9_P3R(d-=Bh%R$G4uXbdhDAtqy*IBgDc*4cpm9VF%_BH z{^Vk#x1twT`ZDZ^@=-`W0ob+*RpWD$eXD5YAo;~U^D0)f@oA1$l(7})ZM8qrA3vZq z^&I4P4qUPq4MkD3jNV(rM-m4ut<0D$f)*!7^$_O29i_CD{`Ke#9kqdn6HzU(6r2pT z?+WEQa5B7Ub~+4U%8&4; z;%(6jA;q>1Cgn*UPr)U6Y^x8?&o>?kc<4 zS;2+KpwLsDhZ{vp`hc&vj>ASlWzf&g?(`WH8(Q=cfwd*wJN>>Wpr1IOAag&`UFh~z zhaq)8#zig#dftqLH4-?isY_{nEr(A4<29UR(X53V<`-w9#pVoD=xI}Fy}NFT2i-3X znLsV6jCg{A&0kR^%s+naUADTmQr=zjGf)J!?j2eigw))vSSw?3>dD0ln;jJq19~R^O#=Q zWS>KIo}l_3cFVu5*>O%2;_jg&)0@gvf&}I*`njf((r%i(nI$F(p3uKL1;E4^r+_D* zjVFo9UYV6<&Wc)Vr0okzcnWZ76yI>z^VnV};ea_hjVZvpG6W)zDFE0@P`}DBn^!Pb zRL5w+-p+G{{#K?x@wsN+X18u#5o!4F#qUkn%0~^*Cc9MV(bs05L&HBUTXTB1$>=@B0Rz@2^${AX2!A#lt8wZM!8S-5rdO8{B!H+XFGF1oOKSJP?cYi z8!-plNq(4`m}8I5e)+SKR9-VLkXIIvv$5rv%R*wSkE}cYWHc%nk9jyCY zHgNU}NA1Bb#TSyU0m2dxn|>)XXaC?&o`Ar_#Vl5E=oH-2N(Gm1lXmU4to`s#hLo47 zDkPp#RcK+y`V@qx;zzGh!x=OI+f4jRJNPc*H4(^fxA2>KH6!{M`#r@ zB0L;x98}jRQ%+Vj{YWWq{mLbPw7a@GVamHpikf6Q6Lp>SqjNZIikrk!DLW-P_1);! zDPJhG1|}i3SPl-#TUN?#0dy!wF}>#(BMQYMRJ}HecgulFDWnva?{+g!Y>MWEWe>$S zkdn!(KcGO_3idTcDgLz64MTpkIc33xta-h;uo8~tFYG;nv<@`ds?e-U#3vK#}g4DH|vd1-AC=?=d`dnh_!d zC5)UNoe7K1x8}UDB=rUD=DIO0g>R=196mJi$1FA_$Z+9J)kKuAIX?UR{;jAzCyp8A zn&U%p@F^TUFb20F}$s?26tPcV*Cqz@z4}I2u@C98kil)FbA>&;jjkEJukF zkF6R+leun9K=3-dZeZkZrAP1c1_bOr44P{YO878SZP(^)?BlMlk%^G!gyo)e)dMbs za-{>+tEsPLFmcpd(TNBk;@-@i?YO(e^yROB2uWeA@liqa%nL5^-kSPWx<7)*Wfo+3 zUJyAOFn-E)DimcvSJwnlB7an-O}fb+aoGMdf7}v8ZngAo(q*Ngh<9FZTlD^kXE7WR zQG8w;!?!iu1q3gMtt~g~ikcE3ws}D&?lMLRdo1OK_@@l8@=ufb;KgF1sEG9Kf)SjO zXR11_D9ICpV(+Q9mm0MagR$Lr!HMP?u^I#z5QVm)AWx7P4hSBUVLSe*RiJjW)o6+h zD;xv`krWCDCdM9A?e%J#cP&h%Jc09+7cyoE(n>f_IB%h6ulBpF_QASy=^<1#6|tv(X!eQnTEg6tJ)Yc7~U#%^mDY8Xn!5J zgLvifkq);LsUI!Zo*w$-f?Z9tp~U|Ccc5zCm`fjE%a(=d@!PJ~I+Zl{kg1R-Lk)HE z#*7Y`I^`oYq=ZFAMivBF3xC9L{#tj&xc+Caa`FV{*g-#4oPTwqyLI)OrDdH3k#->m2w5PzvG-&nyu8QMSCjl6v^#upSEkMA`oSg~2u3Izh@;C45P z1cdH+H##)}i{d0-y^Z+?1zbMlq&24tz6d~-@2-^(#j1%Ab6!(&0BX+bPQLZ=R8!M( zq(Ln2PLsK4b9b`rg>(Ms%~4<}4%$-+UG6(<^wzVWgcT7bYEp}mGXXIz)&R1lrcUH) zR>~WZlFCNQ8z2avVhs(W%m%PVL&Ah~K8rmTQxESLncFlo? zjoOp$w;#M7H#|T_Bl}Am!zh}wETKV#;+B^TfixW0m2p# zk-pKZ(?--Osz89?n4VOwF~(pPAW8t@?8BiKZ`rq8Z^W?*C8bbeRljC~!TU~LF_!G@ zNfBK4qEfd&i9y?w=QdWy4}S1NlrUw_3YY2~e&&4(r7p|3oXW$ed{iN-7f#QBO-Ke)*nIj_k-8~+zQ<6)3Yjl> z=!Cn8(rcwIh>{1zrYt1q3SfA(m^|CUPWKS)#bJZDyRR4?`k@gs=punp}#7g98Adt z#~P;C9HQnqs;E`fr>c>V)odkkLGqS}yO>PDVy>%?@#N}~YN&3#qAY+JUiA~R zfz&u|$o-4DvdTb1ck&Pc(69DRB~g5eYyo4T7_Pip&mI%SUMSWe8(e&rg$D7^oY&Av zQ4N*58`5gMJJzFBcZE=}Co4Z)=CxSigcAK7|g5 zlutM95A?E)-rXT@6J3nz2V?Goq3;l^4>0r`A~>FWw5R2ho%uOWLkXkwS4uv2oYMBu znZ_54B`Pn#$FHu5R3`M?OQC1E}<)Q;CFHUX#_O^v5z{BqSdptQ{*(5ELhFe$VeM1ki)Ga{$+C#Y2 z%ZYXJ<%G7B+8&cR7D|~NKoyoMv7vZkp;Y)6Jh4P^?x=U8kYDsAEHdMSd!hn~5P-3g z3T*3xI2aZcP90!3?~kNVU^cNl@~JBbQ_+d)wvx$^h>{sg$wQ1jslpkN)K}LnYY5M>90_I zsca@IBVd`kM|A2Jy<;}Xft_-U%hh=5+zqUL6fZo7et~7ChesD^Y!s7=aw{7F!NOf~?tqYtj_0tBQ0dq+nw~Ml89-PA;)>PCzwa)-i@3Q8ac?wbbOjy% zj3%Eh=)2h%(I+4KMH9w_IsR&dw59%C(Dy1d5f7;r;5ahp(K%zo(?2sEjc`F@C=Hkl z-2lNWh5ONW@xuUXN*EyqpoFbrV75>RWpj@SQ z2}-O`_si<{)@i}rakfe=*^VocQ1?51RVdSnQPe4~I)w#>yvg#JC*IQx1xC@Noz;Mv=tm1xF*1@3pR2}>mm_aV?HUd2S)41Ng|`^sLgw8i(=3JHX`>!317Wbd&k5!AFR7?G?w6edm!p& zAM9ati8#%SZ#1U|ETnjGlgb|uXB=)n-f5p!?$c?Y;AC&~@ofT?2?KqFr;1=hlX(Su z2iUJ)1PI*g#$KfoQ`P~p4Mi0qLgE&3nyyOnVo-0g)7^m20Kw$%H~*-@LG&lx5oj@DpmYh z;vZdowR>dr@;Msem&#`^aFQpJ4;Cs*6`kS$(tvOzM2RQ{EyLg6IT@5kz(Ni4{3jO? z$9i(c0zjaA+%ZSoN)Q^LtPQAfZ_rnPy7a~@48J_OH-^@3rdGZZu=2@cr}7V(GLugk z%JCmfvze3v2wjJnbhI}Fec(*`jQ8fY5EmYSl&p;LWA(rACLG2NQ>kVwaIvx^Zf(BU zyw-s?a)~>ONwQM%`OV0mMtAD*K&PFKFGbWJFXIePx4JfdW zKHN|do*0{?!}=gVs-&W>Wb!8s zWXkMn&@;wf9ey5D)~EBLFXyN3sBgq>%C8jI+twhT2-NL`x+PI}T>drTor>2UW~^(< zuM~B0P-PP8N+y5OK&EVK4N7C|M}VCtWV`vlMf<@<zkfBDyyr! z+BJFJPmU$S?BQx_EAov*+SHl()HxDDerrBOMMB6q1&ZJQnNKNGv8QiAHzFaFrRhT? zwi>D@kxPG+dL@y6e?T`$qL}{JnfNP-()s)OB#Kywr@Tk17IXT9a-u@Hm6qejomvPj z3O@VTF{+l()2t|Z^QWx%4Kv+i01hPvEy(6x^cjc>xZXCIpUS2iCy9xhD%^DH?dbCDP2Phr_yw0}<-3@UZ7SZduo0iy?|Ue z*K}1+2T_M1dV512TUcOvC=gfxLHSgxdoAzQOP1LH_9D4t8LdGRy8g@P&=7D{Y&qcK zH`L(mP|q=8{VHoO9YPIUzopEQe3`h3O}7}>TFh!nYP_v(S!aqKs^|P!{y|4aH9`Ls zQ1d=oRMKCI$87EWlkt2$F73EIRPR@y=yI*bT~402kpBd*vZY4dhhehEdBHiuWW;Q2 zzd0PBX5r?}E>^R2gH}<(c=Wl)D$3xea-u{Uwn{j&T{o3jUBtdTg5>J)Efu4B<|OX} zILa{_-Go(CI|}?%PS}_hGkH3hy^7XN02S+2(fKI7lg|!N!4AbyJlW=SYm3(kg&4G}_@3Zn*FGC@?O00*fH34uPu?Z3 zakM%bo4mDCgsENLQQ2?|*hnrh7*WW-e+&$WIvRM7!FO$0q8J$9 zE}JNw!PFB;>cNy;$?wLbclqR?a(*V;MkorK=Q$n~tD0J`DuLRHa<1p6&9pNXBLzv% zc}7UrYcqMr;k)pSO`H>2yP0;!8G9ity`Ap)W-2@~$7gtwBhlx;EfhH!pWkkw$tade zCyQe&vz9qMd2=`Hk#VV%TX}QQt7xP{fo(ztFXc+lu>6(Q^!$yJ40$)aT`v- zYxi~*OE`nW0jg4ap(;C5x(=f&_I&hZhOs1Y8?6}y>cSP|#m)|Gp5^)ubGKSIb{k~^ z!Y~UEysqui;ls*~ab3C?AvP!_MfwfiQD{=~WQ!RW>YQE}t_Qa{1vxADVDPOsRs*H!Y=59?j`D`lq=Q|Xs&piWd z#ZSPqkNWqHoraU`rLM+7Q^rS`p(%6%;(VgZZaT$+OY2~iq|1Zl&>>dHlW=O!b#t z!Vu3NHaslk_h{b4P&zOBkftn4oykVaVu()_(`VWFx=fD}oA1dif?4*|IylI@xa&91PIy{*$gw!H_6e6$XFj zvKn}{p$Yl`ZADt0fRRw=1>6+Ix7OCwqzRX7d8GA~*F}HlBR|UIbqgy8Ucj8X+i~^V z{yRBtf;A-%lLJ+s3RH@(|IO970K`g&r%2_-6iS$?&oAYTPb?+ebeGc-mm&1>aVi*f zD~)WYp`Xf?5Y&AdBxeeKN}fH==|3;mHeISsRSxWfq};0cl|~y)nQBi|llFhND>>&g zK4}`Lnn&IKedIV3ltVpnpxuu8&(v2{3}8N-gq7Xay0-g8e0(FG><2aV3#lKNzv)GG zTjec9&C9~V%bI@nQNG=KzaTMNiQ;H{s7NB%?|y))B%+;92dG0L4u|RwV!UYKIK8!_ z{3o!c+Kb6(?Za1=??z9Iz)wUVVUL4E;Lib6cCbSw_6v(?H_Sbl*aH8U*cUN!3 z_2O~I?Ae(hykK_ZT)k~j^`~O-eWAzVW`!3-l;a@3eAAvL^@TVZ<(9Q+$68&_@jC4i zG{jqfpB+Sl3k%QdaJf)3d1FA-*>#X^5|)Z0zfCt?htLI~4OPK{t2TybS=8$@b zF8kxv~@NRs)K#(5S5vOcR{|J`du`j3=s!ezRW>% zLm~R=oP-g6byWDTD}2^Zw!aX_`H;wl|Ntldp8;+13&6Y93<$-D{M!%8 z*h+LlTx!sFNAnx^2c4gWx?)MFse6)Q7ht?Loum`|Tz-nAWXuXXPKnlDpXpq2@_5Y; z+!}7606j-eQ4m91QXsDXv!ZOlqPFrrynuLciZWLr`E6FRzD&*c0At~InE0Dt-MX*c zfQXkGP>*l(AQhT${Q6O{zNhJUhBeJ!h%IBpJW{h`9O@74*gE7L&&Wp=7wKC_zGsED zcJtUetoF&aW};vG>r#ShTUxRRmNED&r7c1>&WVwY^jdIk zxZ^yT4PvA5XO!@e_Q}8h{PlII5on4H19ZImIm+O=0~LsnZNEKwQ8KFrAUL-f%dj|< z@Z!#UndWrLy~a~@T28k_0UzG0wgmP;y?82g3E~G+0nQe#+cEw2d`0?wQkV>QlL@v6 zqqu0m!F50+HSQ!bF1A(Ax3t*F{Vz~gStTmrEk14bk()%ui_KDmvh)6_DxB28Pk7l< z^iuH9^*qf2xUS9xO6R9M^WeIM3*@m3^4#l^SU{wI%Bs20>mf@#B#cL5G)j1NI{#qh z^0sKNf*o)NP?-l*T6GZd8bCHpT?ndM-0CLlO= zn|yj_!_Vk#vTyI}9_Yz*G{Q}fHRBg?E zh0dV=jSsmf_r#Z^C(E&*sdz;I#!T6iUbd)x1@0GUsD<;UN=eA@H+M>oSc^GV)$N8? z$a@8t7rKlh`PupkEx}Xjf*L$a_iFyDb&YA`)g)C|oL{fd3x*g02o8{s?r^wsT!6(x zjy3Qhl$tK%u8{9a^b6d(il@mvX*ng5f2wdYLzw)jLOJI~4XwFwK#Q^IwqK&xD`69J zGs+U}d&sI&i5jj#eAVP{waK9^@f)l1GJMS{G@rMqD1u<9)Ikhl#@5xvy8X12!(>W8 zqj9ES`ucGToSSUFdmJT7M!n+oNQF)dJ&mY#&Y|bb_Z&b_46AAqqE)=OeULZai9lBCJ+emm-tCTBE?5~T_0 z93VSg*6SOT=r(YOTknDWB2tQZ|NeLIf|(gbsP}rr+n*Gn3CeR7Kk@x2KR*tH$ok(&CWkteq0(|>*Np0ey_!-gSWbcx8CUoov(Ww#U$_ zn^VgdBBzbOJG~b+6#(;%g@P^Wm$n(5kMML)M(Ax7Z04w2bg+ou zyl)ZSdEa`(+}aoJ?`yGa#X2ECEos}nP5OHI$Zngy+P2Qy^i3+0^EMo%9h9Mu+2(s) z@BfN2ujva@>^XBgnts;&lX$I|q4(dGaL)YpVT%MpL-?1BnBn|_74WlO_%|-{^TRWX zFQ3`uSLTNmXGUB;r2yrhMLXvg>}ugTOH}fmC08oxA5*KxowG@=#wp*EXBDLDX9`F( RG^t>DUG#mLlT>io{{!7}96|s9 delta 126527 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 BF~I-; diff --git a/esbuild.config.js b/esbuild.config.js index 6e6b695..b9a72a8 100644 --- a/esbuild.config.js +++ b/esbuild.config.js @@ -50,10 +50,8 @@ build({ outfile: "./dist/index.slim.js", external: [ ...options.external, - "@radix-ui/react-checkbox", "@radix-ui/react-label", "@radix-ui/react-popover", - "@radix-ui/react-radio-group", "@radix-ui/react-select", "@radix-ui/react-tooltip", "class-variance-authority", diff --git a/package.json b/package.json index 8b015ce..82f1fbd 100644 --- a/package.json +++ b/package.json @@ -63,10 +63,8 @@ "@interactjs/auto-start": "1.10.26", "@interactjs/interact": "1.10.26", "@mezh-hq/react-gridlines": "1.0.1", - "@radix-ui/react-checkbox": "1.0.4", "@radix-ui/react-label": "2.0.2", "@radix-ui/react-popover": "1.0.7", - "@radix-ui/react-radio-group": "1.1.3", "@radix-ui/react-select": "2.0.0", "@radix-ui/react-switch": "1.1.0", "@radix-ui/react-tooltip": "1.0.6", diff --git a/src/components/core/checkbox.tsx b/src/components/core/checkbox.tsx deleted file mode 100644 index 305558e..0000000 --- a/src/components/core/checkbox.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from "react"; -import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; -import { Check } from "lucide-react"; -import { twMerge } from "tailwind-merge"; - -const Checkbox = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - -)); -Checkbox.displayName = CheckboxPrimitive.Root.displayName; - -export { Checkbox }; diff --git a/src/components/core/index.tsx b/src/components/core/index.tsx index 2b3b28b..d9ce7f9 100644 --- a/src/components/core/index.tsx +++ b/src/components/core/index.tsx @@ -1,8 +1,6 @@ -export * from "./checkbox"; export * from "./input"; export * from "./label"; export * from "./popover"; -export * from "./radio-group"; export * from "./select"; export * from "./switch"; export * from "./typography"; diff --git a/src/components/core/radio-group.tsx b/src/components/core/radio-group.tsx deleted file mode 100644 index dc85488..0000000 --- a/src/components/core/radio-group.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import * as React from "react"; -import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"; -import { Check } from "lucide-react"; -import { twMerge } from "tailwind-merge"; - -const RadioGroup = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => { - return ; -}); -RadioGroup.displayName = RadioGroupPrimitive.Root.displayName; - -const RadioGroupItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => { - return ( - - - - - - ); -}); -RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName; - -export { RadioGroup, RadioGroupItem }; From 2686da197475b5d3b0aed2da4b598aacd357f31f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 27 Aug 2024 16:44:15 +0000 Subject: [PATCH 40/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82f1fbd..812dd8e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.6", + "version": "3.0.0-blizzard.7", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs", From 2f062c28010c5a9e74471d542a4df6e4a472dbf5 Mon Sep 17 00:00:00 2001 From: Akalanka Perera Date: Tue, 27 Aug 2024 22:15:06 +0530 Subject: [PATCH 41/42] Patch: removed unused dependencies --- bun.lockb | Bin 629040 -> 571704 bytes package.json | 2 -- 2 files changed, 2 deletions(-) diff --git a/bun.lockb b/bun.lockb index 7b34d3d98fcbe046678912c219cc6dbbf9256135..6497d8bd8ad0552ea34894b4cecb0c96a5a5dcb6 100755 GIT binary patch delta 57440 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 ToY28SK5#V6zDO@^R^R$JPHHD! diff --git a/package.json b/package.json index 812dd8e..3917130 100644 --- a/package.json +++ b/package.json @@ -107,9 +107,7 @@ "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-storybook": "0.6.13", - "install": "0.13.0", "lefthook": "1.4.3", - "npm": "10.8.1", "postcss": "8.4.31", "prettier": "2.8.8", "sonner": "1.5.0", From 84ccf683f4eb74764505139db2a129809a60fcd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 27 Aug 2024 16:45:49 +0000 Subject: [PATCH 42/42] CI: @mezh-hq/react-seat-toolkit - prerelease skip-checks: true --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3917130..f7668fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mezh-hq/react-seat-toolkit", - "version": "3.0.0-blizzard.7", + "version": "3.0.0-blizzard.8", "description": "React UI library to design and render seat layouts", "main": "dist/index.cjs", "module": "dist/index.mjs",