diff --git a/package-lock.json b/package-lock.json index d704353..e8d44e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,9 +22,12 @@ "react": "^18.3.1", "react-color": "^2.19.3", "react-dom": "^18.3.1", + "react-draggable": "^4.4.6", + "react-rnd": "^10.4.12", "react-router-dom": "^6.25.1", "react-scripts": "^5.0.1", "three": "^0.167.0", + "twemoji": "^14.0.2", "web-vitals": "^2.1.4" } }, @@ -4408,16 +4411,6 @@ "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -6722,6 +6715,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6787,6 +6788,60 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -7448,13 +7503,6 @@ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "license": "CC0-1.0" }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT", - "optional": true - }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", @@ -7485,35 +7533,6 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "license": "BSD-2-Clause" }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -7920,20 +7939,6 @@ ], "license": "BSD-2-Clause" }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "license": "MIT", - "optional": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", @@ -9844,21 +9849,6 @@ "node": ">=6" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -10442,19 +10432,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "license": "MIT", - "optional": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -10604,21 +10581,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-proxy-middleware": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", @@ -13771,53 +13733,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "license": "MIT", - "optional": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -14472,33 +14387,6 @@ "node": ">=8" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -14633,52 +14521,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause", - "optional": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -16927,6 +16769,15 @@ "node": ">=0.10.0" } }, + "node_modules/re-resizable": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.17.tgz", + "integrity": "sha512-OBqd1BwVXpEJJn/yYROG+CbeqIDBWIp6wathlpB0kzZWWZIY1gPTsgK2yJEui5hOvkCdC2mcexF2V3DZVfLq2g==", + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -17110,6 +16961,7 @@ "react": "^18.3.1" } }, +<<<<<<< HEAD "node_modules/react-dom/node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -17117,6 +16969,19 @@ "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" +======= + "node_modules/react-draggable": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", + "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" +>>>>>>> 868e3a829d260da9ce8fc3cf28341aeae09d1c03 } }, "node_modules/react-error-overlay": { @@ -17156,6 +17021,25 @@ "node": ">=0.10.0" } }, + "node_modules/react-rnd": { + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.12.tgz", + "integrity": "sha512-EZ0ddi+R9JQVqk6jtPzvy11z5kjdw3aZbtiRmA9KP09UNx3LZT8WFrWO3QXbH7dHo1DKO3Rh8usCCwaJgu6Ahg==", + "dependencies": { + "re-resizable": "6.9.17", + "react-draggable": "4.4.6", + "tslib": "2.6.2" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/react-router": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", @@ -19425,19 +19309,6 @@ "node": ">= 4.0.0" } }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/troika-three-text": { "version": "0.49.1", "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", @@ -19577,6 +19448,62 @@ } } }, + "node_modules/twemoji": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-14.0.2.tgz", + "integrity": "sha512-BzOoXIe1QVdmsUmZ54xbEH+8AgtOKUiG53zO5vVP2iUu6h5u9lN15NcuS6te4OY96qx0H7JK9vjjl9WQbkTRuA==", + "dependencies": { + "fs-extra": "^8.0.1", + "jsonfile": "^5.0.0", + "twemoji-parser": "14.0.0", + "universalify": "^0.1.2" + } + }, + "node_modules/twemoji-parser": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz", + "integrity": "sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==" + }, + "node_modules/twemoji/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/twemoji/node_modules/fs-extra/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/twemoji/node_modules/jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "dependencies": { + "universalify": "^0.1.2" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/twemoji/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -20005,19 +19932,6 @@ "browser-process-hrtime": "^1.0.0" } }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "license": "MIT", - "optional": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -20066,16 +19980,6 @@ "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", "license": "MIT" }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=12" - } - }, "node_modules/webpack": { "version": "5.93.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", @@ -20394,49 +20298,12 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "license": "MIT", - "optional": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -20937,16 +20804,6 @@ } } }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=12" - } - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index 10d1037..cb1fc0f 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,12 @@ "react": "^18.3.1", "react-color": "^2.19.3", "react-dom": "^18.3.1", + "react-draggable": "^4.4.6", + "react-rnd": "^10.4.12", "react-router-dom": "^6.25.1", "react-scripts": "^5.0.1", "three": "^0.167.0", + "twemoji": "^14.0.2", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/assets/css/Model.css b/src/assets/css/Model.css index 1774e38..0303b2d 100644 --- a/src/assets/css/Model.css +++ b/src/assets/css/Model.css @@ -62,7 +62,7 @@ canvas { transform: translate(-50%, -50%); width: 80%; height: 80%; - background-color: white; + background-color: rgb(0, 0, 0); } .ThreeD-close-button { diff --git a/src/assets/css/ShapeSelectionModal.css b/src/assets/css/ShapeSelectionModal.css index bf08b4b..4c0fce6 100644 --- a/src/assets/css/ShapeSelectionModal.css +++ b/src/assets/css/ShapeSelectionModal.css @@ -39,9 +39,9 @@ } .close-button { - background: #dc3545; + background: #e07a5f; } .close-button:hover { - background: #c82333; + background: #e07a5f; } \ No newline at end of file diff --git a/src/assets/css/SidebarButton.css b/src/assets/css/SidebarButton.css deleted file mode 100644 index 7ef7a79..0000000 --- a/src/assets/css/SidebarButton.css +++ /dev/null @@ -1,19 +0,0 @@ -.sidebar-button { - display: flex; - flex-direction: column; - align-items: center; - cursor: pointer; - color: white; -} - -.button-icon { - width: 50px; - height: 50px; - margin-bottom: 5px; -} - -.button-label { - font-size: 14px; - color: white; - text-align: center; -} diff --git a/src/assets/css/SketchHome.css b/src/assets/css/SketchHome.css index 42f3bd4..1f0499a 100644 --- a/src/assets/css/SketchHome.css +++ b/src/assets/css/SketchHome.css @@ -1,7 +1,5 @@ -@charset "utf-8"; - .sketchtoolhome-container { - position: relative; + position: absolute; width: 100%; height: 100%; background-color: #ffffff; @@ -45,9 +43,10 @@ position: fixed; background-color: #3d405b; z-index: 2; /*top-bar와 마찬가지*/ + gap: 1rem; } -.side-text, .side-eraser, .side-elements, .side-pen, .side-handdler, .side-Hand, .Panning{ +.side-text, .side-elements, .side-pen, .side-handdler, .side-panning, .side-zoom-out, .side-zoom-in{ position: flex; display: flex; align-items: center; @@ -56,47 +55,21 @@ border: none; cursor: pointer; color: white; - font-size: 1rem; + gap: 1rem; } /* 사이드바 하위 개체(텍스트,지우개,펜,요소,핸들러) */ -.canvas-container { - display: block;/* 이미지 노출 영역 지정 할 수 있게 */ - overflow: hidden;/* 컨테이너 영역보다 큰 이미지는 스크롤 할 수 있게 */ - position: fixed;/* 모바일 및 웹 두가지 화면에서 개별 지정할 수 있게 */ - align-items: center;/* 수직 중앙 정렬 */ - justify-items: center;/* 수평 중앙 정렬 */ - z-index: 1;/* top,side보다는 우선순위 다르게 */ +.canvas-window { + z-index: 1; background-color: #f4f1de; } /* 변경한 CSS Redo-Button이 추가되면서 바뀜 web에서는 위치와 mobile에서 위치가 다름 */ - - -/* ZoomIN, Out 버튼 위치 조절해야해요!! */ -/* ZoomIN, Out 버튼 위치 조절해야해요!! */ -/* ZoomIN, Out 버튼 위치 조절해야해요!! */ - - - -.undo-button, -.redo-button { +.control-button { z-index: 2; border: none; background: none; cursor: pointer; -} /* 되돌리기 및 다시 실행 버튼 */ - -.undo-button { - position: fixed; - bottom: 10%; - right: 0.5rem; -} - -.redo-button { - position: fixed; - bottom: 10%; - right: 1.5rem; } .placeholder { @@ -106,18 +79,20 @@ transform: translate(-50%, -50%); } -.canvas-container canvas { - position: absolute; +.canvas-container > canvas{ + /* position: absolute; */ border: 1px solid #ddd; - cursor: grab; /* 기본 커서 스타일 */ - transition: transform 0.2s ease; /* 부드러운 이동을 위한 트랜지션 */ - border: 5px solid black; + cursor: grab; + transition: transform 0.2s ease; + border: 5px solid black; + display: flex; } .inactive-canvas { display: none; } + @media only screen and (max-width: 1000px) { .side-bar { position: fixed; @@ -133,8 +108,7 @@ .side-function { display: flex; flex-direction: row; - margin-left: 1rem; - gap: 0.5em; + gap: 0em; } .side-apply { @@ -144,24 +118,35 @@ border: none; } - .canvas-container{ - height: calc(100vh); + .canvas-window { + position: relative; + height: calc(87vh); width: calc(100vw); - left: 0px; - top: 0px; + top: 6vh; + display: flex; + justify-content: center; + align-items: center; } - .undo-button{ - position: fixed; - bottom: 10; - right: 0.5rem; - margin-right: 1rem; + .canvas-container > canvas { + border: 1px solid #ddd; + cursor: grab; + transition: transform 0.2s ease; + border: 5px solid black; + transform: translate(12.5%, 5%); } - .redo-button { + + .control-button { position: fixed; - bottom: 10%; - right: 1.5rem; - margin-right: 1rem; + bottom: 9%; + right: 1%; + } + + .undo-button, .redo-button{ + z-index: 2; + border: none; + background: none; + cursor: pointer; } } /* 모바일 및 타블렛 대응 */ @@ -191,25 +176,44 @@ margin-bottom: 1rem; } - .canvas-container{ - height: calc(100vh); - width: calc(100vw); - left: 0px; - top: 0px; + .canvas-window { + position: relative; + height: calc(94vh); + width: calc(93vw); + top: 6vh; + left: 7vw; + display: flex; + justify-content: center; + align-items: center; + } + + .canvas-container > canvas { + border: 1px solid #ddd; + cursor: grab; + transition: transform 0.2s ease; + border: 5px solid black; + transform: translate(12.5%, 5%); } - .undo-button{ + .control-button { position: fixed; bottom: 1%; right: 1%; margin-right: 1rem; - } - .redo-button{ - position: fixed; - bottom: 1%; - right: 3%; - margin-right: 1rem; + + .undo-button,.redo-button { + z-index: 2; + border: none; + background: none; + cursor: pointer; } } /* 웹 화면 대응 */ + +@media only screen and (max-width: 500px) { + .side-function { + width: 250px; + overflow-x: auto; + } +} /* 모바일 사이드바 스크롤 환경*/ \ No newline at end of file diff --git a/src/assets/css/ToolSettings.css b/src/assets/css/ToolSettings.css index 412d4d4..37471f5 100644 --- a/src/assets/css/ToolSettings.css +++ b/src/assets/css/ToolSettings.css @@ -1,99 +1,163 @@ -/* 펜 설정 창 */ -.pen-settings-picker { - position: absolute; - top: 220px; - left: 150px; - z-index: 1000; - background-color: white; - border: 1px solid #ddd; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); - padding: 10px; /* 패딩을 늘려서 버튼과 내용의 공간을 확보합니다. */ - width: 150px; /* 선택창의 너비를 늘려서 버튼이 충분히 보이도록 합니다. */ - border-radius: 8px; /* 선택창의 모서리를 둥글게 합니다. */ +.wrapper { + background-color: #81b29a; + border-radius: 50px; + border-style: solid; + border-color: #3d405b; } -/* 지우개 설정 창 */ -.eraser-settings-picker { - position: absolute; - top: 120px; - left: 140px; - z-index: 1000; - background-color: white; - border: 1px solid #ddd; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); - padding: 20px; /* 패딩을 늘려서 버튼과 내용의 공간을 확보합니다. */ - width: 150px; /* 선택창의 너비를 늘려서 버튼이 충분히 보이도록 합니다. */ - border-radius: 8px; /* 선택창의 모서리를 둥글게 합니다. */ -} +@media only screen and (max-width: 1000px) { + .wrapper { + display: flex; + justify-content: center; + align-items: center; + min-width: 75vw; + min-height: 50vh; + z-index: 3; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } -/* 이모지 선택기 컨테이너 */ -.emoji-picker-container { - position: absolute; - top: 150px; - left: 120px; - z-index: 1000; - padding: 20px; /* 패딩을 늘려서 버튼과 내용의 공간을 확보합니다. */ - width: 300px; /* 선택창의 너비를 늘려서 버튼이 충분히 보이도록 합니다. */ - border-radius: 8px; /* 선택창의 모서리를 둥글게 합니다. */ -} + /* 텍스트 css 영역*/ + .text-settings { + min-width: 50%; + display: flex; + justify-content: center; + flex-direction: column; + gap: 6rem; + } -/* 색상 선택기 주변 스타일 */ -.color-picker-container { - position: relative; - background-color: white; - padding: 10px; - border-radius: 4px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); -} + #text-input { + width: 75%; + margin: auto; + } -.text-tool-container { - position: absolute; - top: 80px; /* 텍스트 버튼과의 상단 간격 */ - left: 150px; /* 텍스트 버튼 우측에 위치 */ - z-index: 10; - background: white; - border: 1px solid #ccc; - padding: 10px; - box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); -} -.close-button { - display: block; - margin-top: 5px; /* 닫기 버튼과 내용 사이의 공간을 확보합니다. */ - background-color: #f44336; /* 버튼 색상 */ - color: white; /* 버튼 텍스트 색상 */ - border: none; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; - font-size: 15px; - text-align: center; -} + .text-select { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + } -.close-button:hover { - background-color: #d32f2f; /* 버튼 hover 색상 */ -} + #text-px, .text-font { + width: 100px; + } + + .text-button { + display: flex; + justify-content: space-between; + } + + .text-apply, .close-button { + background-color: #e07a5f; + border: none; + border-radius: 5px; + border-style: solid; + border-color: #3d405b; + border-width: medium; + color: white; + font-size: 1rem; + } + + /* 이모지 css 영역 */ + .emoji-settings { + min-width: 50%; + min-height: 75%; + display: flex; + justify-content: center; + flex-direction: column; + gap: 1rem; + align-items: center; + } -.cancel-button { - display: block; - margin-top: 7px; /* 버튼과 내용 사이의 공간을 확보합니다. */ - background-color: #f44336; /* 버튼 색상 */ - color: white; /* 버튼 텍스트 색상 */ - border: none; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; - font-size: 15px; - text-align: center; + /* 펜 css 영역 */ + .pen-settings { + min-width: 50%; + min-height: 50%; + display: flex; + justify-content: center; + flex-direction: column; + gap: 6rem; + align-items: center; + } } +/*웹 환경 수정 좀 해야됨.*/ +@media only screen and (min-width: 1001px) { + .wrapper { + display: flex; + justify-content: center; + align-items: center; + min-width: 30vw; + min-height: 50vh; + z-index: 3; + position: fixed; + top: 6%; + left: 7%; + border-radius: 0; + } -/* 반응형 스타일 */ -@media (max-width: 768px) { - .pen-settings-picker, .eraser-settings-picker, .emoji-picker-container { - top: auto; - bottom: 20px; - left: 50%; - transform: translateX(-50%); - width: 90%; /* 반응형 디자인에서 선택창의 너비를 조정합니다. */ + /* 텍스트 css 영역 */ + .text-settings { + min-width: 50%; + display: flex; + justify-content: center; + flex-direction: column; + gap: 6rem; + } + + #text-input { + width: 75%; + margin: auto; + } + + .text-select { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + } + + #text-px, .text-font { + width: 100px; + } + + .text-button { + display: flex; + justify-content: space-between; + } + + .text-apply, .close-button { + background-color: #e07a5f; + border: none; + border-radius: 5px; + border-style: solid; + border-color: #3d405b; + border-width: medium; + color: white; + font-size: 1rem; + } + + /* 이모지 css 영역 */ + .emoji-settings { + min-width: 50%; + min-height: 75%; + display: flex; + justify-content: center; + flex-direction: column; + gap: 1rem; + align-items: center; + } + + /* 펜 css 영역 */ + .pen-settings { + min-width: 50%; + min-height: 50%; + display: flex; + justify-content: center; + flex-direction: column; + gap: 6rem; + align-items: center; } } \ No newline at end of file diff --git "a/src/assets/css/aa\353\202\230\354\244\221\354\227\220\354\247\200\354\233\214.css" "b/src/assets/css/aa\353\202\230\354\244\221\354\227\220\354\247\200\354\233\214.css" new file mode 100644 index 0000000..21e9dab --- /dev/null +++ "b/src/assets/css/aa\353\202\230\354\244\221\354\227\220\354\247\200\354\233\214.css" @@ -0,0 +1,106 @@ +/*텍스트*/ +.text-tool-container { + position: absolute; + top: 100px; /* 텍스트 버튼과의 상단 간격 */ + left: 150px; /* 텍스트 버튼 우측에 위치 */ + z-index: 10; + background: white; + border: 1px solid #ccc; + padding: 10px; + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); +} + +.text-tool { + +} + +.cancel-button { + display: block; + margin-top: 7px; /* 버튼과 내용 사이의 공간을 확보합니다. */ + background-color: #f44336; /* 버튼 색상 */ + color: white; /* 버튼 텍스트 색상 */ + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + font-size: 15px; + text-align: center; +} + + + + + + + + + +/*이모지*/ +/*emoji-settings라는 부모 개체가 없었음.*/ + +.emoji-picker-container { + position: absolute; + top: 150px; + left: 120px; + z-index: 1000; + padding: 20px; /* 패딩을 늘려서 버튼과 내용의 공간을 확보합니다. */ + width: 300px; /* 선택창의 너비를 늘려서 버튼이 충분히 보이도록 합니다. */ + border-radius: 8px; /* 선택창의 모서리를 둥글게 합니다. */ +} + +/*cancel-button같이 사용함 얘네도*/ + + + + + + + + + +/*펜*/ +/*얘도 tool-settings라는 부모 개체가 없었음.*/ +.pen-settings-picker { + position: absolute; + top: 220px; + left: 150px; + z-index: 1000; + background-color: white; + border: 1px solid #ddd; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + padding: 10px; /* 패딩을 늘려서 버튼과 내용의 공간을 확보합니다. */ + width: 150px; /* 선택창의 너비를 늘려서 버튼이 충분히 보이도록 합니다. */ + border-radius: 8px; /* 선택창의 모서리를 둥글게 합니다. */ +} + +/* 색상 선택기 주변 스타일 */ +.color-picker-container { + position: relative; + background-color: white; + padding: 10px; + border-radius: 4px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.close-button { + display: block; + margin-top: 5px; /* 닫기 버튼과 내용 사이의 공간을 확보합니다. */ + background-color: #f44336; /* 버튼 색상 */ + color: white; /* 버튼 텍스트 색상 */ + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + font-size: 15px; + text-align: center; +} + + + +@media only screen and (max-width: 1000px) { + +} + +@media only screen and (min-width: 1001px) { + +} \ No newline at end of file diff --git a/src/assets/icon/back.png b/src/assets/icon/back.png new file mode 100644 index 0000000..d98bae5 Binary files /dev/null and b/src/assets/icon/back.png differ diff --git a/src/assets/icon/hand.png b/src/assets/icon/hand.png index a74560e..db04c75 100644 Binary files a/src/assets/icon/hand.png and b/src/assets/icon/hand.png differ diff --git a/src/assets/icon/minus.png b/src/assets/icon/minus.png index 1984640..fe77c1a 100644 Binary files a/src/assets/icon/minus.png and b/src/assets/icon/minus.png differ diff --git a/src/assets/icon/panning.png b/src/assets/icon/panning.png index c7e822b..c3f9a64 100644 Binary files a/src/assets/icon/panning.png and b/src/assets/icon/panning.png differ diff --git a/src/assets/icon/plus.png b/src/assets/icon/plus.png index 7a72254..3c3c46b 100644 Binary files a/src/assets/icon/plus.png and b/src/assets/icon/plus.png differ diff --git a/src/assets/icon/redo.png b/src/assets/icon/redo.png index 0d0982a..a14c675 100644 Binary files a/src/assets/icon/redo.png and b/src/assets/icon/redo.png differ diff --git a/src/components/EmojiSettings.jsx b/src/components/EmojiSettings.jsx index 3bbc513..15e4db0 100644 --- a/src/components/EmojiSettings.jsx +++ b/src/components/EmojiSettings.jsx @@ -6,16 +6,11 @@ import 'assets/css/ToolSettings.css'; const EmojiSettings = ({ onAddEmoji, - selectedTool, - showEmojiPicker, - closeSettings, - setEmojiUrl + setEmojiUrl, + closeSettings }) => { const handleSelectEmoji = (emojiObject) => { setEmojiUrl(emojiObject.imageUrl) - - - closeSettings(); // 이모지 선택 후 설정 창 닫기 onAddEmoji({ url: emojiObject.imageUrl }) @@ -23,13 +18,10 @@ const EmojiSettings = ({ return (