+
@@ -54,4 +38,4 @@ function PaletteVisualizer() {
);
}
-export default PaletteVisualizer;
+export default GraphicVisualizer;
diff --git a/apps/web/components/palette/base-color-palettes.tsx b/apps/web/components/palette/base-color-palettes.tsx
index 43ea72f..dc13c74 100644
--- a/apps/web/components/palette/base-color-palettes.tsx
+++ b/apps/web/components/palette/base-color-palettes.tsx
@@ -3,12 +3,12 @@ import { useColorStore } from "@/store/store";
import { BaseColorTypes } from "@/types/app";
import { cn } from "@ui/lib/utils";
import React from "react";
-import ColorString from "./color-string";
import PaletteButton from "./base-palette-button";
+import { colorHelper } from "@/lib/colorHelper";
function BaseColorPalettes() {
- const { colorPalettes } = useColorStore.getState();
+ const { colorPalettes, colorMode } = useColorStore.getState();
const animation = (i, type) => {
let baseDelay = 0.12;
switch (type) {
@@ -43,21 +43,20 @@ function BaseColorPalettes() {
)}
key={`base-color-palette-${type}`}
>
- {colorPalettes[type].map((_, i) => {
+ {colorPalettes[type].map((color, i) => {
const step = i;
return (
-
+ {colorHelper.toColorMode(color.raw, colorMode)}
diff --git a/apps/web/components/palette/color-picker.tsx b/apps/web/components/palette/color-picker.tsx
index 5a7363f..7c70f40 100644
--- a/apps/web/components/palette/color-picker.tsx
+++ b/apps/web/components/palette/color-picker.tsx
@@ -1,12 +1,8 @@
"use client";
import { colorHelper } from "@/lib/colorHelper";
-import {
- Performance,
- useColorStore,
- useSiteSettingsStore,
-} from "@/store/store";
-import { BaseColorTypes, BaseColors, RawColor } from "@/types/app";
+import { useColorStore, useSiteSettingsStore } from "@/store/store";
+import { BaseColorTypes } from "@/types/app";
import { cn } from "@ui/lib/utils";
import { AnimatePresence, motion, useReducedMotion } from "framer-motion";
import { useEffect, useState } from "react";
diff --git a/apps/web/components/toolbar/plugin/shareable-link.plugin.tsx b/apps/web/components/toolbar/plugin/shareable-link.plugin.tsx
new file mode 100644
index 0000000..5950893
--- /dev/null
+++ b/apps/web/components/toolbar/plugin/shareable-link.plugin.tsx
@@ -0,0 +1,65 @@
+"use client";
+
+import { Input } from "ui/components/ui/input";
+import { Button } from "ui/components/ui/button";
+import { Copy } from "lucide-react";
+import React, { Fragment, useState } from "react";
+import { Skeleton } from "@ui/components/ui/skeleton";
+import { cn } from "ui/lib/utils";
+import Image from "next/image";
+import { useToast } from "ui/components/ui/use-toast";
+
+function ShareableLinkPlugin({ colors, setOpen }) {
+ const { toast } = useToast();
+ const [loadingSocialPreview, setLoadingSocialPreview] = useState(true);
+ const handleCopy = () => {
+ navigator.clipboard.writeText(
+ `${process.env.NEXT_PUBLIC_URL}/?colors=${colors}`,
+ );
+ setOpen(false);
+ toast({
+ title: "Copied to clipboard!",
+ });
+ };
+ return (
+
+
+
+
+ setLoadingSocialPreview(false)}
+ width={288}
+ height={151}
+ />
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default ShareableLinkPlugin;
diff --git a/apps/web/components/toolbar/shareable-link.tsx b/apps/web/components/toolbar/shareable-link.tsx
index f0b8171..1667dc7 100644
--- a/apps/web/components/toolbar/shareable-link.tsx
+++ b/apps/web/components/toolbar/shareable-link.tsx
@@ -8,32 +8,24 @@ import {
import DesktopPreviewToolbarIcon from "../ui/desktop-primary-toolbar-button";
import primaryToolbarMenu from "../ui/primary-toolbar-menu";
import { useEffect, useState } from "react";
-import { Input } from "ui/components/ui/input";
-import { Button } from "ui/components/ui/button";
-import { Copy } from "lucide-react";
import { useColorStore } from "@/store/store";
import { colorHelper } from "@/lib/colorHelper";
-import { Skeleton } from "@ui/components/ui/skeleton";
-import { cn } from "ui/lib/utils";
-import Image from "next/image";
-import { useToast } from "ui/components/ui/use-toast";
+import dynamic from "next/dynamic";
+import { Skeleton } from "ui/components/ui/skeleton";
+
+const ShareableLinkPlugin = dynamic(
+ () => import("@/components/toolbar/plugin/shareable-link.plugin"),
+ {
+ loading: () =>
,
+ ssr: false,
+ },
+);
function ToolbarShareableLink() {
const menuItem = primaryToolbarMenu.Share;
const { baseColors } = useColorStore();
const [open, setOpen] = useState(false);
const [colors, setColors] = useState("");
- const { toast } = useToast();
- const [loadingSocialPreview, setLoadingSocialPreview] = useState(true);
- const handleCopy = () => {
- navigator.clipboard.writeText(
- `${process.env.NEXT_PUBLIC_URL}/?colors=${colors}`,
- );
- setOpen(false);
- toast({
- title: "Copied to clipboard!",
- });
- };
useEffect(() => {
if (!baseColors) return;
let search = Object.values(baseColors)
@@ -48,38 +40,7 @@ function ToolbarShareableLink() {
-
-
-
-
- setLoadingSocialPreview(false)}
- width={288}
- height={151}
- />
-
-
-
-
-
-
-
-
+ {open && }
);
diff --git a/apps/web/components/visualizer/contact-form.tsx b/apps/web/components/visualizer/contact-form.tsx
index 37e5cd4..35481d8 100644
--- a/apps/web/components/visualizer/contact-form.tsx
+++ b/apps/web/components/visualizer/contact-form.tsx
@@ -27,7 +27,7 @@ import { Globe, Mail, Phone } from "lucide-react";
export default function VisContactForm() {
return (
-
+
@@ -166,6 +166,7 @@ export default function VisContactForm() {
Pronoun
+ {/* //! THIS CHEVRON ICON BREAKS SSR */}
diff --git a/apps/web/components/visualizer/hero-section.tsx b/apps/web/components/visualizer/hero-section.tsx
index d43e809..527df45 100644
--- a/apps/web/components/visualizer/hero-section.tsx
+++ b/apps/web/components/visualizer/hero-section.tsx
@@ -60,7 +60,7 @@ export default function VisHeroSection() {
-
+
-
+
-
+
-
+
=6'}
@@ -2366,6 +2415,77 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: false
+ /d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+ dependencies:
+ internmap: 2.0.3
+ dev: false
+
+ /d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-format@3.1.0:
+ resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-color: 3.1.0
+ dev: false
+
+ /d3-path@3.1.0:
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ d3-format: 3.1.0
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ dev: false
+
+ /d3-shape@3.2.0:
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-path: 3.1.0
+ dev: false
+
+ /d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-time: 3.1.0
+ dev: false
+
+ /d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+ dev: false
+
/damerau-levenshtein@1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
dev: false
@@ -2402,6 +2522,10 @@ packages:
dependencies:
ms: 2.1.2
+ /decimal.js-light@2.5.1:
+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
+ dev: false
+
/decompress-response@6.0.0:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
@@ -2533,6 +2657,12 @@ packages:
dependencies:
esutils: 2.0.3
+ /dom-helpers@3.4.0:
+ resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==}
+ dependencies:
+ '@babel/runtime': 7.23.1
+ dev: false
+
/dot-case@2.1.1:
resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==}
dependencies:
@@ -3077,6 +3207,10 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
+ /eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+ dev: false
+
/execa@5.1.1:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
@@ -3123,6 +3257,11 @@ packages:
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ /fast-equals@5.0.1:
+ resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==}
+ engines: {node: '>=6.0.0'}
+ dev: false
+
/fast-glob@3.3.1:
resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
engines: {node: '>=8.6.0'}
@@ -3725,6 +3864,11 @@ packages:
has: 1.0.4
side-channel: 1.0.4
+ /internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+ dev: false
+
/interpret@1.4.0:
resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
engines: {node: '>= 0.10'}
@@ -4248,7 +4392,6 @@ packages:
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- dev: true
/log-symbols@3.0.0:
resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==}
@@ -5114,6 +5257,10 @@ packages:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
dev: false
+ /react-lifecycles-compat@3.0.4:
+ resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
+ dev: false
+
/react-remove-scroll-bar@2.3.4(@types/react@18.2.24)(react@17.0.2):
resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==}
engines: {node: '>=10'}
@@ -5149,6 +5296,31 @@ packages:
use-sidecar: 1.1.2(@types/react@18.2.24)(react@17.0.2)
dev: false
+ /react-resize-detector@8.1.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==}
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ lodash: 4.17.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /react-smooth@2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==}
+ peerDependencies:
+ prop-types: ^15.6.0
+ react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ fast-equals: 5.0.1
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-transition-group: 2.9.0(react-dom@18.2.0)(react@18.2.0)
+ dev: false
+
/react-style-singleton@2.2.1(@types/react@18.2.24)(react@17.0.2):
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
@@ -5166,6 +5338,20 @@ packages:
tslib: 2.6.2
dev: false
+ /react-transition-group@2.9.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==}
+ peerDependencies:
+ react: '>=15.0.0'
+ react-dom: '>=15.0.0'
+ dependencies:
+ dom-helpers: 3.4.0
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-lifecycles-compat: 3.0.4
+ dev: false
+
/react@17.0.2:
resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
engines: {node: '>=0.10.0'}
@@ -5200,6 +5386,34 @@ packages:
dependencies:
picomatch: 2.3.1
+ /recharts-scale@0.4.5:
+ resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==}
+ dependencies:
+ decimal.js-light: 2.5.1
+ dev: false
+
+ /recharts@2.9.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-cVgiAU3W5UrA8nRRV/N0JrudgZzY/vjkzrlShbH+EFo1vs4nMlXgshZWLI0DfDLmn4/p4pF7Lq7F5PU+K94Ipg==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ prop-types: ^15.6.0
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ classnames: 2.3.2
+ eventemitter3: 4.0.7
+ lodash: 4.17.21
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-is: 16.13.1
+ react-resize-detector: 8.1.0(react-dom@18.2.0)(react@18.2.0)
+ react-smooth: 2.0.5(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0)
+ recharts-scale: 0.4.5
+ tiny-invariant: 1.3.1
+ victory-vendor: 36.6.11
+ dev: false
+
/rechoir@0.6.2:
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
engines: {node: '>= 0.10'}
@@ -5814,6 +6028,10 @@ packages:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: true
+ /tiny-invariant@1.3.1:
+ resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
+ dev: false
+
/tinycolor2@1.6.0:
resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
@@ -6204,6 +6422,25 @@ packages:
builtins: 5.0.1
dev: true
+ /victory-vendor@36.6.11:
+ resolution: {integrity: sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==}
+ dependencies:
+ '@types/d3-array': 3.0.9
+ '@types/d3-ease': 3.0.1
+ '@types/d3-interpolate': 3.0.3
+ '@types/d3-scale': 4.0.6
+ '@types/d3-shape': 3.1.4
+ '@types/d3-time': 3.0.2
+ '@types/d3-timer': 3.0.1
+ d3-array: 3.2.4
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-scale: 4.0.2
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-timer: 3.0.1
+ dev: false
+
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}