diff --git a/package.json b/package.json index d7cd751..b147bf9 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,9 @@ "start": "next start --port 3333" }, "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", "@headlessui/react": "^1.7.17", "@next-auth/prisma-adapter": "^1.0.7", "@prisma/client": "^5.1.1", @@ -38,6 +41,7 @@ "@trpc/react-query": "^10.37.1", "@trpc/server": "^10.37.1", "@types/uuid": "^9.0.3", + "@uiw/react-color": "^2.0.3", "axios": "^1.5.1", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a67cbe..f45da7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.2.0) '@headlessui/react': specifier: ^1.7.17 version: 1.7.17(react-dom@18.2.0)(react@18.2.0) @@ -86,6 +95,9 @@ dependencies: '@types/uuid': specifier: ^9.0.3 version: 9.0.6 + '@uiw/react-color': + specifier: ^2.0.3 + version: 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) axios: specifier: ^1.5.1 version: 1.5.1 @@ -217,6 +229,49 @@ packages: dependencies: regenerator-runtime: 0.14.0 + /@dnd-kit/accessibility@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0): + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/utilities@3.2.2(react@18.2.0): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2175,6 +2230,323 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@uiw/color-convert@2.0.3(@babel/runtime@7.23.2): + resolution: {integrity: sha512-lP/dnZzaiUDMrn3F+WYAG/TLhIanoy5A0HAPEO6Z/s3Jv5AI0nOM2bVOm0HI+vNiHZkVTkE1oGP0k+endEA+9A==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + dependencies: + '@babel/runtime': 7.23.2 + dev: false + + /@uiw/react-color-alpha@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bTO0jMTT2fFZr8lGpDrOCbMSbidkgYMuCmyc6A8p6WfyCznKZvKG5WG9KukDOB2ReJUZKIaiR20CgUa6opS3Hw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-drag-event-interactive': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-block@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KDl4PBtv8/IAQ/HeonxsFka+9ppBTjKBhI7U/j6oxqvVPWuvqOZSGlAtr9oIGZnEG14CXZPg4xNVLkZQkfJ8vg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-swatch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-chrome@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qT9mdTf1wc1zTAb5K2sAs4VtNM9GwcR36ZeCbrLYLRMpovu4ynsZBAn0hR4RYc1xJJsedRZtelWPInAKLvwyEA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-hsla': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-rgba': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-github': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-hue': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-saturation': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-circle@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IBMzGOSVQvN/x5dAFk2j1bkGzWX/nWz9kmbcdETRhIQtBcP1AmrQHaRL3E+GX7oTB6cRMg2W20baxHgj97NQIQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-swatch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-colorful@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IjnvYyroW/Kmz1ICSwQ6HUpl7cs6Rkh2mVuFGvYd8FOxBjbQuAI/pfVi8I54rgkesn8uRVYlbvl4ROfAl3RrHw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-hue': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-saturation': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-compact@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xjPn46zuFZZ0RqEB8ZelSdtU0ySpp4Ekgw+Wu/W7ZZrUGBXypgFSbQqudggOq7ovhU+4qxGOGqrN4SGHqH36mg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-rgba': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-swatch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-editable-input-hsla@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RwFgPlOv/OjAtegCYIsoIFbWHhAEE44SMT/44zGlRfYq6PX3KvXjEfHpM7F7EFJHYuRfKFpQRhikc1kSkOeWVw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-editable-input-rgba': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-editable-input-rgba@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ROz25EVr5F9XgNLG9p0RKMTgzg5ORh2RxMKC8Ch3vXrdTt4FL350Kq0N5KMHs7gyQAzcr4GQmuaCLlbEHHYAwA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-editable-input@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Zy+BuvtQ5c2XcSPN+zgVQ0gnz4fl+1YB1kpKnTYNyZptL2HXWPygwz2OdfNB/bVNRR34s5/4x3jD/zNQTBe60w==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-github@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pMv6lc76UmReAKtKlNSyHoFTpeeyD4z2Vr51uiiQqHS09wXisyPRX0KvpvWnGtBXXci9dkOx8kpohwhiKGpPHw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-swatch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-hue@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Bi9/JkLH6FSxULC52y7kjLlunkRbL6TRuAzm5+BBs/4tSf+VL8Xp5Dr2gCPJG1vuA4ohDx9vl3P5QO4Rk9h8wQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-material@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xgJ76LvF+LM+8emUby1EwcIwdtTLlA0JpQePwZi78J1DY3gQs9tTWHCaAkqZoprHiNlzXTHtqi8Wg/i0MIPLPw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-rgba': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-saturation@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+AZM3WemWv7w/uRGmSY5lXWdSJoKKysKMW+C7/qkWNQmN/WjG6YmC4ZtcEqPr7BbWFXSS2DJTn15fNBvxCFKDg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-drag-event-interactive': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-shade-slider@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TTxNkzExgurWKklC90+D1HbtRMD37wKoK9kOLOvLynEm3r5SgcifjvZLNIBC8CUTbQutazAKl1IXgQCST09ang==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-sketch@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OS7nD7DlsYhtQJrSQOwM2kXcLrpqYzbLcY6dy55odmgMPx1ixbhhgXfDp8zAPOT5+guPAOdfy4PV4fpUGGYiSg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-rgba': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-hue': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-saturation': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-swatch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-slider@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ejIVLFVwNYGlGqesJOwOgw1DYBljeHB2pznJCQI/YZyVVq9pM/fjDCjpxFQ/BgU7k/Ezs/UW90QHIxOy+tct4g==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-swatch@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xKUASrSB4wPQ+kmMV1Yr1gQ9BZvMzkdotr9o+CYFGvZNSLclEur0cIhu5RkBhZ6PGP6Vd54mod43amY/a905lw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color-wheel@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IEQ75777ZNvaA2dunTc/zD7OmcwbTjKeLGZ7Mo8ID+Em0rLF7SCC+9g2pF8G468MAc9HwyfRjv8K6Z69PWUyNg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-drag-event-interactive': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-color@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-W2zin6cxq1clQAJoUSbFbp07SkMKtYaoCOK1dLGE0OUM/oYMEw9eXTa8VbvVCY1e3plkXnA+/HgiCFBm6tVsQg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + '@uiw/color-convert': 2.0.3(@babel/runtime@7.23.2) + '@uiw/react-color-alpha': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-block': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-chrome': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-circle': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-colorful': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-compact': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-hsla': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-editable-input-rgba': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-github': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-hue': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-material': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-saturation': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-shade-slider': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-sketch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-slider': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-swatch': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + '@uiw/react-color-wheel': 2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@uiw/react-drag-event-interactive@2.0.3(@babel/runtime@7.23.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-r9VQbvpk2z0ux3GenmT5K4BVQqT91eBSDQjYuR43Ya0kJaD2yJPuPe8JqvKTFR3/C9kldolJoWbxl0mbuu1X0w==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.23.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true diff --git a/src/assets/12.svg b/src/assets/12.svg new file mode 100644 index 0000000..5afc7a0 --- /dev/null +++ b/src/assets/12.svg @@ -0,0 +1,11 @@ + + + + +12% vol. + diff --git a/src/assets/FE.svg b/src/assets/FE.svg new file mode 100644 index 0000000..17485cf --- /dev/null +++ b/src/assets/FE.svg @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/src/assets/PRODUIT DE FRANCE.svg b/src/assets/PRODUIT DE FRANCE.svg new file mode 100644 index 0000000..318e3a6 --- /dev/null +++ b/src/assets/PRODUIT DE FRANCE.svg @@ -0,0 +1,11 @@ + + + + +PRODUCE OF FRANCE + diff --git a/src/assets/QUALITÉ.svg b/src/assets/QUALITÉ.svg new file mode 100644 index 0000000..ae7eef3 --- /dev/null +++ b/src/assets/QUALITÉ.svg @@ -0,0 +1,11 @@ + + + + +BRUT + diff --git a/src/assets/centilitrage.svg b/src/assets/centilitrage.svg new file mode 100644 index 0000000..6557410 --- /dev/null +++ b/src/assets/centilitrage.svg @@ -0,0 +1,11 @@ + + + + +750 ml + diff --git a/src/assets/sulfites.svg b/src/assets/sulfites.svg new file mode 100644 index 0000000..e8a6e86 --- /dev/null +++ b/src/assets/sulfites.svg @@ -0,0 +1,11 @@ + + + + +Contient des sulfites + diff --git a/src/assets/ÉLABORATION.svg b/src/assets/ÉLABORATION.svg new file mode 100644 index 0000000..135ca05 --- /dev/null +++ b/src/assets/ÉLABORATION.svg @@ -0,0 +1,11 @@ + + + + +ÉLABORÉ PAR ERAL CHARLES DELROCHE, 51200 ÉPERNAY, FRANCE - RM-00000-01 + diff --git a/src/components/canvas.tsx b/src/components/canvas.tsx index 4c97171..b47c9cf 100644 --- a/src/components/canvas.tsx +++ b/src/components/canvas.tsx @@ -12,6 +12,8 @@ import { import { useEffect, useState } from "react"; import { Toolbar } from "@/components/toolbar"; import TransformableText from "@/components/transformable-text"; +import LayerBorder from "@/components/layer-border"; +import { CANVAS_PADDING_X, CANVAS_PADDING_Y } from "@/consts/canvas-params"; const Canvas = () => { const dispatch = useAppDispatch(); @@ -33,7 +35,6 @@ const Canvas = () => { if (!clickedOnEmpty) { return; } - console.log(target); dispatch(deselectItem()); }; @@ -54,42 +55,6 @@ const Canvas = () => { setSelected(!isEditing); } - // function toggleTransforming() { - // setIsTransforming(!isTransforming); - // setSelected(!isTransforming); - // } - // - // const handleWheel = (e: Konva.KonvaEventObject) => { - // e.evt.preventDefault(); - // - // const scaleBy = 1.02; - // const targetStage = e.target.getStage()!; - // const oldScale = targetStage.scaleX(); - // - // const mousePointTo = { - // x: - // targetStage.getPointerPosition().x / oldScale - - // targetStage.x() / oldScale, - // y: - // targetStage.getPointerPosition().y / oldScale - - // targetStage.y() / oldScale, - // }; - // - // const newScale = e.evt.deltaY < 0 ? oldScale * scaleBy : oldScale / scaleBy; - // - // dispatch( - // setStageScale({ - // scale: newScale, - // x: - // (targetStage.getPointerPosition().x / newScale - mousePointTo.x) * - // newScale, - // y: - // (targetStage.getPointerPosition().y / newScale - mousePointTo.y) * - // newScale, - // }), - // ); - // }; - return (
@@ -112,7 +77,6 @@ const Canvas = () => { y={stage.y} scaleX={stage.scale} scaleY={stage.scale} - // onWheel={handleWheel} > {!!backgroundRect && ( @@ -125,7 +89,14 @@ const Canvas = () => { id={backgroundId} /> )} - {items.map((item) => { + + + {items.toReversed().map((item) => { if (item.type === StageItemType.Image) { return ( { } })} - {/* - - - */} + {/**/} + +
diff --git a/src/components/image-toolbar.tsx b/src/components/image-toolbar.tsx index a25d119..3f0d8c4 100644 --- a/src/components/image-toolbar.tsx +++ b/src/components/image-toolbar.tsx @@ -1,10 +1,12 @@ import React from "react"; import { TbFlipHorizontal, TbFlipVertical } from "react-icons/tb"; +import { BsArrowsFullscreen } from "react-icons/Bs"; import { Toggle } from "@/components/ui/toggle"; -import { useAppDispatch } from "@/hooks"; +import { useAppDispatch, useAppSelector } from "@/hooks"; import { type StageImageItem, updateImage } from "@/store/app.slice"; import ImageOpacityTool from "@/components/image-editing-tools/image-opacity-tool"; import { Separator } from "@/components/ui/separator"; +import { CANVAS_PADDING_X, CANVAS_PADDING_Y } from "@/consts/canvas-params"; type Props = { selectedItemId: string; @@ -13,6 +15,9 @@ type Props = { export function ImageToolbar({ selectedItemId, currentImage }: Props) { const dispatch = useAppDispatch(); + + const stageParams = useAppSelector((state) => state.app.stage); + const flipImageVerticaly = () => { const currentScale = currentImage.scaleY; let editOffsetY = currentImage.height; @@ -40,6 +45,19 @@ export function ImageToolbar({ selectedItemId, currentImage }: Props) { }), ); }; + + const setAsBackground = () => { + dispatch( + updateImage({ + id: selectedItemId, + x: CANVAS_PADDING_X, + y: CANVAS_PADDING_Y, + width: stageParams.width - 2 * CANVAS_PADDING_X, + height: stageParams.height - 2 * CANVAS_PADDING_Y, + }), + ); + }; + return ( <> flipImageHorizontaly()}> @@ -53,6 +71,9 @@ export function ImageToolbar({ selectedItemId, currentImage }: Props) { selectedItemId={selectedItemId} currentImage={currentImage} /> + setAsBackground()}> + + ); } diff --git a/src/components/layer-border.tsx b/src/components/layer-border.tsx new file mode 100644 index 0000000..cf172b0 --- /dev/null +++ b/src/components/layer-border.tsx @@ -0,0 +1,63 @@ +import React from "react"; +import { Layer, Line } from "react-konva"; +import { + CANVAS_PADDING_X, + CANVAS_PADDING_Y, + DASH_SPACING, + DASH_STROKE_COLOR, + DASH_STROKE_WIDTH, + DASH_WIDTH, +} from "@/consts/canvas-params"; +import { useAppSelector } from "@/hooks"; + +export default function LayerBorder() { + const stage = useAppSelector((state) => state.app.stage); + return ( + + + + + + + ); +} diff --git a/src/components/layer-item.tsx b/src/components/layer-item.tsx new file mode 100644 index 0000000..fa05959 --- /dev/null +++ b/src/components/layer-item.tsx @@ -0,0 +1,42 @@ +import React from "react"; +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; +import { type StageItem, StageItemType } from "@/store/app.slice"; +import { useAppDispatch } from "@/hooks"; + +export default function LayerItem({ item }: { item: StageItem }) { + const dispatch = useAppDispatch(); + const { attributes, listeners, setNodeRef, transform, transition } = + useSortable({ + id: item.id, + }); + + const style = { + transform: CSS.Transform.toString(transform), + transition, + }; + return ( +
+ {item.type === StageItemType.Text ? ( + item.params.text < 5 ? ( + item.params.text + ) : ( + item.params.text?.substring(0, 5) + "..." + ) + ) : ( + {item.params.imageUrl} + )} + {item.type} +
+ ); +} diff --git a/src/components/layout/navbar.tsx b/src/components/layout/navbar.tsx index 2e020da..93c4549 100644 --- a/src/components/layout/navbar.tsx +++ b/src/components/layout/navbar.tsx @@ -1,6 +1,7 @@ import { UserNav } from "./user-nav"; import Image from "next/image"; import logo from "@/assets/logo.png"; +import { Switch } from "@/components/ui/switch"; export const Navbar = () => { return ( @@ -12,7 +13,7 @@ export const Navbar = () => { alt="Logo" layout="fill" // required objectFit="cover" // change as you like - className="rounded-full" // you can use other classes here too + className="rounded-full object-cover" // you can use other classes here too />
diff --git a/src/components/layout/sidebar/background-select.tsx b/src/components/layout/sidebar/background-select.tsx index 83d1b52..a4de24d 100644 --- a/src/components/layout/sidebar/background-select.tsx +++ b/src/components/layout/sidebar/background-select.tsx @@ -8,12 +8,13 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { RxLayout } from "react-icons/rx"; import { Label } from "@/components/ui/label"; -import { useAppDispatch } from "@/hooks"; +import { useAppDispatch, useAppSelector } from "@/hooks"; import { selectBackground } from "@/store/app.slice"; export const BackgroundSelect = () => { const dispatch = useAppDispatch(); const [open, setOpen] = useState(false); + const bgColor = useAppSelector((state) => state.app.background); const handleBackgroundSelect = (color: string) => { dispatch(selectBackground(color)); @@ -40,30 +41,17 @@ export const BackgroundSelect = () => { -
-
handleBackgroundSelect("red")} - > - Red -
-
-
- -
diff --git a/src/components/layout/sidebar/layers.tsx b/src/components/layout/sidebar/layers.tsx index d4520ef..073aa96 100644 --- a/src/components/layout/sidebar/layers.tsx +++ b/src/components/layout/sidebar/layers.tsx @@ -8,19 +8,26 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { RxStack } from "react-icons/rx"; import { useAppDispatch, useAppSelector } from "@/hooks"; -import { OrderDirection, updateItemOrder } from "@/store/app.slice"; +import { selectItem, setStageItems } from "@/store/app.slice"; +import { closestCenter, DndContext, type DragEndEvent } from "@dnd-kit/core"; +import { + arrayMove, + SortableContext, + verticalListSortingStrategy, +} from "@dnd-kit/sortable"; +import LayerItem from "@/components/layer-item"; export const Layers = () => { const dispatch = useAppDispatch(); const items = useAppSelector((state) => state.app.items); - const updateImageLayer = (id: string, direction: OrderDirection) => { - dispatch( - updateItemOrder({ - id, - direction, - }), - ); + const handleDragEnd = (e: DragEndEvent) => { + const { active, over } = e; + const oldIndex = items.findIndex((item) => item.id === active.id); + const newIndex = items.findIndex((item) => item.id === over?.id); + const result = arrayMove(items, oldIndex, newIndex); + dispatch(setStageItems(result)); + dispatch(selectItem(active.id)); }; return ( @@ -33,26 +40,22 @@ export const Layers = () => { - Layer + Layers - - {items.map((item) => ( -
- {item.id} - - -
- ))} + + + + {items.map((item) => ( + + ))} + +
diff --git a/src/components/layout/sidebar/legacy.tsx b/src/components/layout/sidebar/legacy.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/components/layout/sidebar/select-template.tsx b/src/components/layout/sidebar/select-template.tsx index 8450f67..a2563d8 100644 --- a/src/components/layout/sidebar/select-template.tsx +++ b/src/components/layout/sidebar/select-template.tsx @@ -1,33 +1,69 @@ -import React from "react"; +import React, { useState } from "react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; -import { PiFrameCornersDuotone } from "react-icons/pi"; -import { useAppDispatch } from "@/hooks"; import { Card, CardHeader, CardTitle } from "@/components/ui/card"; +import { useAppDispatch } from "@/hooks"; +import { LuLayoutTemplate } from "react-icons/lu"; +import { ScrollArea } from "@/components/ui/scroll-area"; -export function SelectTemplate() { +export const SelectTemplate = () => { const dispatch = useAppDispatch(); + const [open, setOpen] = useState(false); + const handleSizeSelect = () => { + setOpen(false); + }; return ( - + - - - {/**/} - - - - Cadre + + + + Template + + +
+
+ Image +
+
+ Image +
{" "} +
+ Image +
{" "} +
+ Image +
{" "} +
+ Image +
{" "} +
+ Image +
{" "} +
+ Image +
{" "} +
+ Image +
+
+
); -} +}; diff --git a/src/components/layout/sidebar/sidebar.tsx b/src/components/layout/sidebar/sidebar.tsx index 8028029..c0ea5d0 100644 --- a/src/components/layout/sidebar/sidebar.tsx +++ b/src/components/layout/sidebar/sidebar.tsx @@ -3,6 +3,8 @@ import ImageInput from "@/components/layout/sidebar/image-input"; import SizeSelect from "@/components/layout/sidebar/size-select"; import { BackgroundSelect } from "@/components/layout/sidebar/background-select"; import { Layers } from "@/components/layout/sidebar/layers"; +import { SelectTemplate } from "@/components/layout/sidebar/select-template"; +import { Switch } from "@/components/ui/switch"; export function Sidebar() { return ( @@ -10,7 +12,7 @@ export function Sidebar() { - {/**/} +
diff --git a/src/components/layout/sidebar/size-select.tsx b/src/components/layout/sidebar/size-select.tsx index 02ef73d..65c828a 100644 --- a/src/components/layout/sidebar/size-select.tsx +++ b/src/components/layout/sidebar/size-select.tsx @@ -42,13 +42,13 @@ const SizeSelect = () => {
- - -
diff --git a/src/components/legales.tsx b/src/components/legales.tsx new file mode 100644 index 0000000..a6233b4 --- /dev/null +++ b/src/components/legales.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { Image, Layer } from "react-konva"; +import women from "../assets/logo.png"; +import useImage from "use-image"; + +export default function Legales() { + const [test] = useImage(women); + return ( + + {women} + + ); +} diff --git a/src/components/ui/scroll-area.tsx b/src/components/ui/scroll-area.tsx new file mode 100644 index 0000000..ffc5a82 --- /dev/null +++ b/src/components/ui/scroll-area.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; + +import { cn } from "@/lib/utils"; + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)); +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)); +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; + +export { ScrollArea, ScrollBar }; diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx new file mode 100644 index 0000000..aa58baa --- /dev/null +++ b/src/components/ui/switch.tsx @@ -0,0 +1,27 @@ +import * as React from "react" +import * as SwitchPrimitives from "@radix-ui/react-switch" + +import { cn } from "@/lib/utils" + +const Switch = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +Switch.displayName = SwitchPrimitives.Root.displayName + +export { Switch } diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx new file mode 100644 index 0000000..7f3502f --- /dev/null +++ b/src/components/ui/table.tsx @@ -0,0 +1,117 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)) +Table.displayName = "Table" + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableHeader.displayName = "TableHeader" + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableBody.displayName = "TableBody" + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + tr]:last:border-b-0", + className + )} + {...props} + /> +)) +TableFooter.displayName = "TableFooter" + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableRow.displayName = "TableRow" + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableHead.displayName = "TableHead" + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)) +TableCell.displayName = "TableCell" + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +TableCaption.displayName = "TableCaption" + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +} diff --git a/src/consts/canvas-params.ts b/src/consts/canvas-params.ts new file mode 100644 index 0000000..973bcad --- /dev/null +++ b/src/consts/canvas-params.ts @@ -0,0 +1,6 @@ +export const CANVAS_PADDING_X = 20; +export const CANVAS_PADDING_Y = 20; +export const DASH_WIDTH = 5; +export const DASH_SPACING = 3; +export const DASH_STROKE_WIDTH = 1; +export const DASH_STROKE_COLOR = "#c6a25e"; diff --git a/src/store/app.slice.ts b/src/store/app.slice.ts index 056e0cb..3b2610d 100644 --- a/src/store/app.slice.ts +++ b/src/store/app.slice.ts @@ -13,7 +13,6 @@ export enum StageItemType { type StageItemCommon = { id: string; - order: number; }; export type StageTextItem = { @@ -28,7 +27,7 @@ export type StageImageItem = { type StageItemSpecific = StageTextItem | StageImageItem; -type StageItem = StageItemCommon & StageItemSpecific; +export type StageItem = StageItemCommon & StageItemSpecific; const initialState = { stage: { width: 500, height: 500, scale: 1, x: 0, y: 0 }, @@ -57,15 +56,13 @@ const defaultImageConfig = { scaleY: 1, }; -export enum OrderDirection { - Up = "up", - Down = "down", -} - export const appSlice = createSlice({ name: "app", initialState, reducers: { + setStageItems: (state, action: PayloadAction) => { + state.items = action.payload; + }, setStageScale: ( state, action: PayloadAction<{ x: number; y: number; scale: number }>, @@ -80,7 +77,6 @@ export const appSlice = createSlice({ state.items.push({ type: StageItemType.Text, id: textId, - order: state.items.length + 1, params: { text: action.payload.initialValue, @@ -102,7 +98,6 @@ export const appSlice = createSlice({ state.items.push({ type: StageItemType.Image, id: imageId, - order: state.items.length + 1, params: { imageUrl: action.payload.imageUrl, width: action.payload.width, @@ -112,83 +107,6 @@ export const appSlice = createSlice({ }); }, - updateImageOrder: ( - state, - action: PayloadAction<{ id: string; direction: OrderDirection }>, - ) => { - const imageToUpdateIndex = state.items.findIndex( - (img) => img.id === action.payload.id, - ); - const imageToUpdate = state.items[imageToUpdateIndex]; - - if (!imageToUpdate) return; - const isLast = imageToUpdate.order === state.items.length; - const isFirst = imageToUpdate.order === 1; - - let newOrder = imageToUpdate.order; - if (action.payload.direction === OrderDirection.Up && !isLast) { - newOrder = imageToUpdate.order + 1; - } - if (action.payload.direction === OrderDirection.Down && !isFirst) { - newOrder = imageToUpdate.order - 1; - } - - state.items[imageToUpdateIndex] = { - ...imageToUpdate, - order: newOrder, - }; - - state.items.sort((a, b) => { - if (a === b) return 0; - if (a < b) return 1; - return -1; - }); - }, - - updateItemOrder: ( - state, - action: PayloadAction<{ id: string; direction: OrderDirection }>, - ) => { - const itemToUpdateIndex = state.items.findIndex( - (item) => item.id === action.payload.id, - ); - const itemToUpdate = state.items[itemToUpdateIndex]; - - if (!itemToUpdate) return; - const isLast = itemToUpdate.order === state.items.length; - const isFirst = itemToUpdate.order === 1; - - let newOrder = itemToUpdate.order; - if (action.payload.direction === OrderDirection.Up && !isLast) { - newOrder = itemToUpdate.order + 1; - } - if (action.payload.direction === OrderDirection.Down && !isFirst) { - newOrder = itemToUpdate.order - 1; - } - const prevItemIndex = state.items.findIndex( - (item) => item.order === newOrder, - ); - const prevItem = state.items[prevItemIndex]; - - if (!prevItem) return; - - state.items[prevItemIndex] = { - ...prevItem, - order: itemToUpdate.order, - }; - - state.items[itemToUpdateIndex] = { - ...itemToUpdate, - order: newOrder, - }; - - state.items.sort((a, b) => { - if (a === b) return 0; - if (a < b) return 1; - return -1; - }); - }, - selectBackground: (state, action: PayloadAction) => { state.background = { fill: action.payload, @@ -258,15 +176,14 @@ export const appSlice = createSlice({ }); export const { - setStageScale, addImage, addText, - selectItem, deselectItem, updateText, updateImage, deleteStageItem, updateStage, selectBackground, - updateItemOrder, + setStageItems, + selectItem, } = appSlice.actions; diff --git a/todo.md b/todo.md index 5437ee9..577eb08 100644 --- a/todo.md +++ b/todo.md @@ -1,4 +1,12 @@ - text transform box doesn't update it's size on font size change -- layout order doesn't work correctly with > 2 objects + + + + +- Authorization provider +- Template properties ( assets ) +- Canvas sizes +- what to add or change? +- \ No newline at end of file