diff --git a/package-lock.json b/package-lock.json
index 79098c608..c8f285c31 100755
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,6 +19,7 @@
"@next/bundle-analyzer": "^12.2.5",
"@soywod/pin-field": "^0.1.9",
"@tippyjs/react": "^4.2.6",
+ "@udecode/plate": "^26.0.5",
"@urql/core": "^4.1.4",
"@urql/next": "^1.1.0",
"chalk": "^2.4.1",
@@ -72,6 +73,10 @@
"sanitize-html": "^2.5.2",
"scroll-into-view-if-needed": "1.5.0",
"sentry-testkit": "^2.1.0",
+ "slate": "^0.101.1",
+ "slate-history": "^0.100.0",
+ "slate-hyperscript": "^0.100.0",
+ "slate-react": "^0.101.1",
"sonner": "^1.0.0",
"store": "^2.0.12",
"stringz": "^2.0.0",
@@ -2605,6 +2610,32 @@
"@floating-ui/utils": "^0.1.3"
}
},
+ "node_modules/@floating-ui/react": {
+ "version": "0.22.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.22.3.tgz",
+ "integrity": "sha512-RlF+7yU3/abTZcUez44IHoEH89yDHHonkYzZocynTWbl6J6MiMINMbyZSmSKdRKdadrC+MwQLdEexu++irvZhQ==",
+ "dependencies": {
+ "@floating-ui/react-dom": "^1.3.0",
+ "aria-hidden": "^1.1.3",
+ "tabbable": "^6.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz",
+ "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
"node_modules/@floating-ui/utils": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
@@ -4550,6 +4581,41 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
+ "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@react-dnd/asap": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz",
@@ -4927,6 +4993,11 @@
"@types/node": "*"
}
},
+ "node_modules/@types/is-hotkey": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/@types/is-hotkey/-/is-hotkey-0.1.10.tgz",
+ "integrity": "sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ=="
+ },
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
@@ -4987,6 +5058,19 @@
"@types/node": "*"
}
},
+ "node_modules/@types/lodash": {
+ "version": "4.14.202",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
+ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ=="
+ },
+ "node_modules/@types/mdast": {
+ "version": "3.0.15",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
+ "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
"node_modules/@types/minimatch": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
@@ -5125,6 +5209,11 @@
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz",
"integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA=="
},
+ "node_modules/@types/unist": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
+ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
+ },
"node_modules/@types/yargs": {
"version": "15.0.17",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz",
@@ -5338,6 +5427,877 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@udecode/plate": {
+ "version": "26.0.5",
+ "resolved": "https://registry.npmjs.org/@udecode/plate/-/plate-26.0.5.tgz",
+ "integrity": "sha512-lqIuZpK+ve9E3J5P4gU13Lpfj27v9MW9KIE7ADwscVlRDy5cSuQDuo5P9I5Pz5AHIbnR4n94vL9OijH+IXc1bA==",
+ "dependencies": {
+ "@udecode/plate-alignment": "25.0.1",
+ "@udecode/plate-autoformat": "25.0.1",
+ "@udecode/plate-basic-elements": "25.0.1",
+ "@udecode/plate-basic-marks": "25.0.1",
+ "@udecode/plate-block-quote": "25.0.1",
+ "@udecode/plate-break": "25.0.1",
+ "@udecode/plate-code-block": "25.0.1",
+ "@udecode/plate-combobox": "25.0.1",
+ "@udecode/plate-comments": "26.0.0",
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-find-replace": "25.0.1",
+ "@udecode/plate-floating": "26.0.4",
+ "@udecode/plate-font": "25.0.1",
+ "@udecode/plate-heading": "25.0.1",
+ "@udecode/plate-highlight": "25.0.1",
+ "@udecode/plate-horizontal-rule": "25.0.1",
+ "@udecode/plate-indent": "25.0.1",
+ "@udecode/plate-indent-list": "25.0.1",
+ "@udecode/plate-kbd": "25.0.1",
+ "@udecode/plate-line-height": "25.0.1",
+ "@udecode/plate-link": "26.0.4",
+ "@udecode/plate-list": "25.0.1",
+ "@udecode/plate-media": "25.0.1",
+ "@udecode/plate-mention": "25.0.1",
+ "@udecode/plate-node-id": "25.0.1",
+ "@udecode/plate-normalizers": "25.0.1",
+ "@udecode/plate-paragraph": "25.0.1",
+ "@udecode/plate-reset-node": "25.0.1",
+ "@udecode/plate-resizable": "26.0.5",
+ "@udecode/plate-select": "25.0.1",
+ "@udecode/plate-serializer-csv": "26.0.5",
+ "@udecode/plate-serializer-docx": "26.0.5",
+ "@udecode/plate-serializer-html": "26.0.0",
+ "@udecode/plate-serializer-md": "26.0.4",
+ "@udecode/plate-suggestion": "25.0.1",
+ "@udecode/plate-tabbable": "25.0.1",
+ "@udecode/plate-table": "26.0.5",
+ "@udecode/plate-trailing-block": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-alignment": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-alignment/-/plate-alignment-25.0.1.tgz",
+ "integrity": "sha512-Fj13i88phMKBBy3maUHuP+/5vzWMfXE2wzaTjx7uCA3Ahp9NM5tdgvYOrAHaax1jJ0KfW2+yRAcHJpPJ31WKZQ==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-autoformat": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-autoformat/-/plate-autoformat-25.0.1.tgz",
+ "integrity": "sha512-/hJ74BCpaI+sLVW2MP4V7RMJz7Z8MRgGBp+8U4Dzv0HhJ6XkTnauEgYLd03gwHg8R0jkWcnQ+r3CCE0dhHrGnA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-autoformat/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-basic-elements": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-basic-elements/-/plate-basic-elements-25.0.1.tgz",
+ "integrity": "sha512-5Go3xD0M4IVZ899spDddo6+reUxyxonDvNx59+ZYk5p/qjEF7tmn7Wnb4EQvN+q9u3Td026c+TN3/Tk1tTMFgg==",
+ "dependencies": {
+ "@udecode/plate-block-quote": "25.0.1",
+ "@udecode/plate-code-block": "25.0.1",
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-heading": "25.0.1",
+ "@udecode/plate-paragraph": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-basic-marks": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-basic-marks/-/plate-basic-marks-25.0.1.tgz",
+ "integrity": "sha512-RG0jZkSQ3dbyEk4k4xXqjHqtfPsvKHa6fsI1ZA/4agsfp24kQ3Zjba1yfXeEeswlF815iIVv9PgV85cw03KdYA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-block-quote": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-block-quote/-/plate-block-quote-25.0.1.tgz",
+ "integrity": "sha512-X9sgYiBRoJKMg/36y68hHHIHkPyNoXlpGGGfmNdgNteTqaO9ojC4JhXrTK2p1FJT8iC9Ddy9S0Wy2d9VZM1osQ==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-break": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-break/-/plate-break-25.0.1.tgz",
+ "integrity": "sha512-lT3w/OyGWatxhg3eTYEMculI9FoE80uKIYyzgFDJ2Jt066taB1hTypBqWPKZ9aXjDYJxUX/+OB6t1g/OSz2uyQ==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-code-block": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-code-block/-/plate-code-block-25.0.1.tgz",
+ "integrity": "sha512-KcGkM1MCxBrAs5bnychIzLm6Y+uUD06+LFw4hKmkX8YBYkqMssR7MxCAuK4iVMA6+NRkOnK7p2AWwdmiV9s5OA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "prismjs": "^1.29.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-combobox": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-combobox/-/plate-combobox-25.0.1.tgz",
+ "integrity": "sha512-RAXmVQVQR9C5NA3G/UDYzl8kub3IZBNzo+U8Cg9juiHMiFhHnzmnH2m4Fjp7hOeeNRHogdJ1Pw8PeZOYJqNDQw==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "downshift": "^6.1.12"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-comments": {
+ "version": "26.0.0",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-comments/-/plate-comments-26.0.0.tgz",
+ "integrity": "sha512-bqcURZhonp6BGhAltZPyVd8LAh2NitlPovHmlokEFtCqpvZEvk/inZE2MXx9B40Wktj2aihtfUkbhKzhXYpeRA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-comments/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-common": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-common/-/plate-common-25.0.1.tgz",
+ "integrity": "sha512-eajam97XzZlNianSo+oNm9XeJmPkn9/8asVs3NYxB6jeRBbG1qZ+vT20PNvMQD8uGksMvpEKfSm/i3oZNMPZQA==",
+ "dependencies": {
+ "@udecode/plate-core": "25.0.1",
+ "@udecode/plate-utils": "25.0.1",
+ "@udecode/slate": "25.0.0",
+ "@udecode/slate-react": "25.0.0",
+ "@udecode/slate-utils": "25.0.0",
+ "@udecode/utils": "24.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-core": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-core/-/plate-core-25.0.1.tgz",
+ "integrity": "sha512-0+1RJMJ7YeXdZ66EJB17KY4b9BjQ/w8arMY8ZTEzUnp9Qgph/BUha9vP0JnJ604+ZszwQqX0RdIpFbQ4B1c1lw==",
+ "dependencies": {
+ "@udecode/slate": "25.0.0",
+ "@udecode/slate-react": "25.0.0",
+ "@udecode/slate-utils": "25.0.0",
+ "@udecode/utils": "24.3.0",
+ "@udecode/zustood": "^1.1.3",
+ "clsx": "^1.2.1",
+ "is-hotkey": "^0.2.0",
+ "jotai": "1.7.2",
+ "lodash": "^4.17.21",
+ "nanoid": "^3.3.6",
+ "react-hotkeys-hook": "^4.4.1",
+ "use-deep-compare": "^1.1.0",
+ "zustand": "^3.7.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-core/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-find-replace": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-find-replace/-/plate-find-replace-25.0.1.tgz",
+ "integrity": "sha512-la/X9sBA4542brlLKmLImmmIKWQ6NRsVIyfvbD8eZIDYbj1nVCIT/rK0IdDm1FeN+EOvoevCpWXoWNIqanh22A==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-floating": {
+ "version": "26.0.4",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-floating/-/plate-floating-26.0.4.tgz",
+ "integrity": "sha512-Nvbpn9Uava3Es1xkKSIC6YFDnEgySnFo1F8gCyx2g1/CkfPazRsQqr6QiZX4djqJe+wzEelkMxz4kzIS8GyfOQ==",
+ "dependencies": {
+ "@floating-ui/core": "^1.3.1",
+ "@floating-ui/react": "^0.22.3",
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-font": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-font/-/plate-font-25.0.1.tgz",
+ "integrity": "sha512-RKJeviM4mkpN9TTLbTg7CBN0grFXsJ0/NVbAg3iSNkALCCMMzA7eeCZtrC0VO8nMMBrmJuwmX6u0cd9Y7Ijakg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-font/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-heading": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-heading/-/plate-heading-25.0.1.tgz",
+ "integrity": "sha512-YxFgkT0CITsRkPaXu0TCA8XetQoseAlyXgcpb2zzJXS9oW/tOGwjG2L+K/pqndUd3Yys+ltjWwd9Q0a4aZLnIQ==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-highlight": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-highlight/-/plate-highlight-25.0.1.tgz",
+ "integrity": "sha512-2/qR1+PyB1Oh6A3e8wVjrPwdDdnd5cLaVwAKIcOpFRDv2SXJn/6Yoz1h6/hqkBXGPFCSRYVwMi687J/8vXC8kQ==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-horizontal-rule": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-horizontal-rule/-/plate-horizontal-rule-25.0.1.tgz",
+ "integrity": "sha512-7d8SzwvRH3J54s1n8nnaFKBSr36m/glh631DM3eMZRnKpsgy0OcCqv53n6LTF30nT7NzWq0N5uUKzSQrA7T0Uw==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-indent": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-indent/-/plate-indent-25.0.1.tgz",
+ "integrity": "sha512-8oaNdd1J5C64uhtAwtwb77T6g5x9pXvfHJTR3wB8E6PXptZqLGfEut6HGeHpO1equMmq4OM6y0bsaxNJJFIOhA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-indent-list": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-indent-list/-/plate-indent-list-25.0.1.tgz",
+ "integrity": "sha512-RgarmzUOFXkU3m1E7yLzmLPE533QesDmxn/rgGQu2oiO4sKCjOq7yaEX/i8xlf4jcwwbXzc0PmUMtZZpNQwiDg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-indent": "25.0.1",
+ "@udecode/plate-list": "25.0.1",
+ "clsx": "^1.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-kbd": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-kbd/-/plate-kbd-25.0.1.tgz",
+ "integrity": "sha512-7hlkKM0qX8qS4ihrouwWCVnxhtZWn0+R6QBTLZwS9yNL6/QuareXC0/Q53QiDCZKIiPZYjFXi0b+VzF+Opl0jg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-line-height": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-line-height/-/plate-line-height-25.0.1.tgz",
+ "integrity": "sha512-eQQ9f1JqE1EKnjUxwrXypmqXkzueF8aMWZvkX8QpqsKsUNt9aaD5qceo++G1dfDPZ4JcOo85MVCAxzr8bSSaCw==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-link": {
+ "version": "26.0.4",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-link/-/plate-link-26.0.4.tgz",
+ "integrity": "sha512-iZdtRKEHv79rKju24pxp79iUM1rTZ2hc4+WmdlpfvLfoWiyMt9Ggf/1MqeTMM8x+aB4IzrpHw4mxB+0M+Tuy/A==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-floating": "26.0.4",
+ "@udecode/plate-normalizers": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-list": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-list/-/plate-list-25.0.1.tgz",
+ "integrity": "sha512-+uHPyCpAKOpArPcEQpJyUDcT5UQ/BIL4aZXe5pOvmyFGGNDO8sCEF4uNQMXPzQs7F6yp1OF6EtZoZEPLkXay/Q==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-reset-node": "25.0.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-list/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-media": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-media/-/plate-media-25.0.1.tgz",
+ "integrity": "sha512-bvn4ec46E6D31znB3ltNfBcy3DaKd3zKZ960awjYjvwIaY+00N6ogQVvoAYDz4svvRXPFzDcJK/bQAoBnrfZSg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "js-video-url-parser": "^0.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-mention": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-mention/-/plate-mention-25.0.1.tgz",
+ "integrity": "sha512-0y5LWl5IKLty9J5Ye80xktWlksG87LLThlOkM3MDhOKI9yi2gavRsSGIl1kl1o/K+F7AJiUnrR7l2jUBwuoZDA==",
+ "dependencies": {
+ "@udecode/plate-combobox": "25.0.1",
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-node-id": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-node-id/-/plate-node-id-25.0.1.tgz",
+ "integrity": "sha512-XauQoF4o01K00/H1HfanbwhvtcrzTvCn/xRbVzkMPL3SJ/8ob/4NxIIS6yagfX9KsHMMyI64KbluNnQ/BjDtNw==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-node-id/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-normalizers": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-normalizers/-/plate-normalizers-25.0.1.tgz",
+ "integrity": "sha512-7DASnEWc2yZFTJlo2W9HvqluSUOjG2t8ZmIhIzb1RzW1Tt5zdkDPLk4XtVPzG1XxItIJeQJqNPSJOUMg0deI5w==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-normalizers/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-paragraph": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-paragraph/-/plate-paragraph-25.0.1.tgz",
+ "integrity": "sha512-ePiTBZobaTvN+bUpLyh4h0hYAoLk27u8EMCWXEsdqbx45ah3XBlYglxE3rOfNe4y5fOrXcYep/NB0lSL/fpSxg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-reset-node": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-reset-node/-/plate-reset-node-25.0.1.tgz",
+ "integrity": "sha512-28DhstVg+Qqocqf8xGGYTqmRUquXsbTE5LkjrJODjxQYkcNSQNMVi1DAd/dX4a+iBDdehWZseiBqtKitDtt7kw==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-resizable": {
+ "version": "26.0.5",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-resizable/-/plate-resizable-26.0.5.tgz",
+ "integrity": "sha512-fiQsxsBsEzNJwcSToqCLzXZWnVPcEKs5kzbkomw7K7I1eREc9sFdCVe5oh540p3uf+XoGo2mCrJ4PevCQRGSyw==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-select": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-select/-/plate-select-25.0.1.tgz",
+ "integrity": "sha512-Q7iLEODlXXJlOwMOZMUdZ9jUa9VGA1HqcWY3t764SNH3IJRmtHaao11TmxdDzbKgVrCi4EP4nkpOKeBDYzIH4w==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-serializer-csv": {
+ "version": "26.0.5",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-serializer-csv/-/plate-serializer-csv-26.0.5.tgz",
+ "integrity": "sha512-LQ+dQXqlD15c9vwMwf4gxojvQKXvO7xrkuzvCtcoDqd3TMTyfgOOkS3qb+aKdIVVEYCV767wMXTX0e+Nz03zbg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-table": "26.0.5",
+ "papaparse": "^5.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-serializer-docx": {
+ "version": "26.0.5",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-serializer-docx/-/plate-serializer-docx-26.0.5.tgz",
+ "integrity": "sha512-LwDV5zUzf3rGNdqbLuTt1IgTN8O8TUVAurDnGsZWY8jyy+458jSDRBUjOF+haAWkjRoffPmWB6GqWEA0oWOq2A==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-heading": "25.0.1",
+ "@udecode/plate-indent": "25.0.1",
+ "@udecode/plate-indent-list": "25.0.1",
+ "@udecode/plate-media": "25.0.1",
+ "@udecode/plate-paragraph": "25.0.1",
+ "@udecode/plate-table": "26.0.5",
+ "validator": "^13.9.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-serializer-html": {
+ "version": "26.0.0",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-serializer-html/-/plate-serializer-html-26.0.0.tgz",
+ "integrity": "sha512-j2R9ATJaGa66/v+pNWvfWVpBpx32B4AYlWHcMnAWyMohPY/5jPF9wwib2RiEQm7X513BhGUgESxZGq0bB6qmvA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "html-entities": "^2.4.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-serializer-md": {
+ "version": "26.0.4",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-serializer-md/-/plate-serializer-md-26.0.4.tgz",
+ "integrity": "sha512-NT26fYhmNzzDLGU5LJX6jowKXQQsOq/KqodRG/eweqtFaVjp3SAYkkSxLGSgJ/titUnoFmcUpt4VKuuj3ssQxA==",
+ "dependencies": {
+ "@udecode/plate-basic-marks": "25.0.1",
+ "@udecode/plate-block-quote": "25.0.1",
+ "@udecode/plate-code-block": "25.0.1",
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-heading": "25.0.1",
+ "@udecode/plate-horizontal-rule": "25.0.1",
+ "@udecode/plate-link": "26.0.4",
+ "@udecode/plate-list": "25.0.1",
+ "@udecode/plate-media": "25.0.1",
+ "@udecode/plate-paragraph": "25.0.1",
+ "remark-parse": "^9.0.0",
+ "unified": "^9.2.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-suggestion": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-suggestion/-/plate-suggestion-25.0.1.tgz",
+ "integrity": "sha512-JpslSyFgSFdxrPbh82sZmYYTMXdMGvEuZbbe99Iqz4Q2UzpHY7EmF/vltREkmy1wXbwvCrB1asTTclkeRS8HmA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-tabbable": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-tabbable/-/plate-tabbable-25.0.1.tgz",
+ "integrity": "sha512-ocBApi0P4Ue/i9cc7Cwf3kLFQWknA2vtPfpGYm+4WwcIqX8OaLMSAu+vr4SGhv/uQoY5eI8DiLJLLvH3z9SxSg==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "tabbable": "^6.2.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-table": {
+ "version": "26.0.5",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-table/-/plate-table-26.0.5.tgz",
+ "integrity": "sha512-pzxIBTDeJ+86ESGIFrc8zj1JzIkYh3I3ivKUNp3zK3Qvr1XXGKVfN4puRXfvNhuAP4mS2VT+3YlW79okKX8MkA==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1",
+ "@udecode/plate-resizable": "26.0.5",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-table/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/plate-trailing-block": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-trailing-block/-/plate-trailing-block-25.0.1.tgz",
+ "integrity": "sha512-0J3f2fQXPU+2pbkFHaNirxEPrD9scf7RlSdHtotiWdiKFRl+diZXgaIO2vIgGsQOxqxcvEEA3zmT574Op3P8UQ==",
+ "dependencies": {
+ "@udecode/plate-common": "25.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-utils": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/@udecode/plate-utils/-/plate-utils-25.0.1.tgz",
+ "integrity": "sha512-kn0I5JmMxjczmU7/YkSoKTcTsOp1O/YLNh9iLTgtLTsI8wBXwshHYgqsvbG/qu9Mt9L9GkHp4LpXZoK/vLNiLA==",
+ "dependencies": {
+ "@radix-ui/react-slot": "^1.0.2",
+ "@udecode/plate-core": "25.0.1",
+ "@udecode/slate": "25.0.0",
+ "@udecode/slate-react": "25.0.0",
+ "@udecode/slate-utils": "25.0.0",
+ "@udecode/utils": "24.3.0",
+ "clsx": "^1.2.1",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-hyperscript": ">=0.66.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/plate-utils/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/slate": {
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/@udecode/slate/-/slate-25.0.0.tgz",
+ "integrity": "sha512-mGb9nMDwIygLqERwJ8kTOfo3wIxMQ0xLJEPKn09jrshEIxUCyO3mYj8y/5vOMcrzj6yexOsgQ6VNX8ylS3lnIQ==",
+ "dependencies": {
+ "@udecode/utils": "24.3.0"
+ },
+ "peerDependencies": {
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0"
+ }
+ },
+ "node_modules/@udecode/slate-react": {
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/@udecode/slate-react/-/slate-react-25.0.0.tgz",
+ "integrity": "sha512-mgaRFxzyXvVqYWmg2NCfH0cgBqEv2NCLqMpYrlgromRgTAqPqhID5jq7jRTcGLHL49RjTlxRs6dwsQJ6iRLxBw==",
+ "dependencies": {
+ "@udecode/slate": "25.0.0",
+ "@udecode/utils": "24.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0",
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0",
+ "slate-react": ">=0.99.0"
+ }
+ },
+ "node_modules/@udecode/slate-utils": {
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/@udecode/slate-utils/-/slate-utils-25.0.0.tgz",
+ "integrity": "sha512-H8dECl5Tu44Nt946rkSXCJ1yzsc2R9GXSoA9oNIBmcyNo3jTHZOyG/Ocn3RGgfzAK996A43GBD/keNabJEPtQg==",
+ "dependencies": {
+ "@udecode/slate": "25.0.0",
+ "@udecode/utils": "24.3.0",
+ "lodash": "^4.17.21"
+ },
+ "peerDependencies": {
+ "slate": ">=0.94.0",
+ "slate-history": ">=0.93.0"
+ }
+ },
+ "node_modules/@udecode/slate-utils/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/@udecode/utils": {
+ "version": "24.3.0",
+ "resolved": "https://registry.npmjs.org/@udecode/utils/-/utils-24.3.0.tgz",
+ "integrity": "sha512-/Y2lh/Ih1wx4zN35Ky2Z1G1/5f7cSAS7F6dkhrcbJUnDF0srTidoEIRabK+og/yIK/MCEFfOsQGetoV7Ert5hg=="
+ },
+ "node_modules/@udecode/zustood": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@udecode/zustood/-/zustood-1.1.3.tgz",
+ "integrity": "sha512-f3mxHDaOF+q2XvDh/mMvLhCNs0LfCLhIBl8jGmvZT/i3WWq7YujzGXgnbK8mxIkun9irfe6wlPhg9sTIB9Gnug==",
+ "dependencies": {
+ "immer": "^9.0.6",
+ "react-tracked": "^1.7.9"
+ },
+ "peerDependencies": {
+ "zustand": ">=3.5.10"
+ }
+ },
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@@ -5718,6 +6678,17 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
+ "node_modules/aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/aria-query": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
@@ -6435,6 +7406,15 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/bail": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
+ "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -6878,6 +7858,33 @@
"node": ">=10"
}
},
+ "node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/chardet": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
@@ -7107,6 +8114,14 @@
"node": ">=0.8"
}
},
+ "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",
@@ -7354,6 +8369,11 @@
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"dev": true
},
+ "node_modules/compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -8687,6 +9707,18 @@
"node": ">=8"
}
},
+ "node_modules/direction": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz",
+ "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==",
+ "bin": {
+ "direction": "cli.js"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/discontinuous-range": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
@@ -8824,6 +9856,26 @@
"node": ">=8"
}
},
+ "node_modules/downshift": {
+ "version": "6.1.12",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.12.tgz",
+ "integrity": "sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==",
+ "dependencies": {
+ "@babel/runtime": "^7.14.8",
+ "compute-scroll-into-view": "^1.0.17",
+ "prop-types": "^15.7.2",
+ "react-is": "^17.0.2",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.12.0"
+ }
+ },
+ "node_modules/downshift/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -10104,8 +11156,7 @@
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"node_modules/extend-shallow": {
"version": "2.0.1",
@@ -11475,6 +12526,21 @@
"node": ">=10"
}
},
+ "node_modules/html-entities": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz",
+ "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ]
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -11887,6 +12953,15 @@
"node": ">= 4"
}
},
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
"node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -12155,6 +13230,28 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-array-buffer": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
@@ -12294,6 +13391,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-descriptor": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
@@ -12402,6 +13508,20 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-hotkey": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-hotkey/-/is-hotkey-0.2.0.tgz",
+ "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+ },
"node_modules/is-installed-globally": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
@@ -14924,6 +16044,55 @@
"@sideway/pinpoint": "^2.0.0"
}
},
+ "node_modules/jotai": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.7.2.tgz",
+ "integrity": "sha512-ksvpW1Wu+/HwW1iDYq23PpXLu2df5Vv+eWw70jRAx7IEY4c+qRsORULnqPFurSy/X8LSoPcRhVDJx/cyf8jjMg==",
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "*",
+ "@babel/template": "*",
+ "@urql/core": "*",
+ "immer": "*",
+ "optics-ts": "*",
+ "react": ">=16.8",
+ "react-query": "*",
+ "valtio": "*",
+ "wonka": "*",
+ "xstate": "*"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "@babel/template": {
+ "optional": true
+ },
+ "@urql/core": {
+ "optional": true
+ },
+ "immer": {
+ "optional": true
+ },
+ "optics-ts": {
+ "optional": true
+ },
+ "react-query": {
+ "optional": true
+ },
+ "valtio": {
+ "optional": true
+ },
+ "wonka": {
+ "optional": true
+ },
+ "xstate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/js-cookie": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
@@ -14934,6 +16103,11 @@
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
+ "node_modules/js-video-url-parser": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/js-video-url-parser/-/js-video-url-parser-0.5.1.tgz",
+ "integrity": "sha512-/vwqT67k0AyIGMHAvSOt+n4JfrZWF7cPKgKswDO35yr27GfW4HtjpQVlTx6JLF45QuPm8mkzFHkZgFVnFm4x/w=="
+ },
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -15986,6 +17160,31 @@
"resolved": "https://registry.npmjs.org/mastani-codehighlight/-/mastani-codehighlight-0.0.7.tgz",
"integrity": "sha512-D4qjXyoN26zeNh2Zc6eoRtJPkH5FhP879+xgKk90dw60x6ZfFLxRDU+mk8y5eoEqalw4OH0H1DPGNqi27QL+Dw=="
},
+ "node_modules/mdast-util-from-markdown": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+ "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "micromark": "~2.11.0",
+ "parse-entities": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
@@ -16061,6 +17260,25 @@
"node": ">= 8"
}
},
+ "node_modules/micromark": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+ "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
"node_modules/micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
@@ -17513,6 +18731,11 @@
"node": ">=6"
}
},
+ "node_modules/papaparse": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz",
+ "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw=="
+ },
"node_modules/parallax-controller": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/parallax-controller/-/parallax-controller-1.7.0.tgz",
@@ -17544,6 +18767,23 @@
"node": ">=6"
}
},
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/parse-filepath": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
@@ -18422,6 +19662,11 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/proxy-compare": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.4.0.tgz",
+ "integrity": "sha512-FD8KmQUQD6Mfpd0hywCOzcon/dbkFP8XBd9F1ycbKtvVsfv6TsFUKJ2eC0Iz2y+KzlkdT1Z8SY6ZSgm07zOyqg=="
+ },
"node_modules/proxy-from-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
@@ -18743,6 +19988,15 @@
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz",
"integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw=="
},
+ "node_modules/react-hotkeys-hook": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.4.1.tgz",
+ "integrity": "sha512-sClBMBioFEgFGYLTWWRKvhxcCx1DRznd+wkFHwQZspnRBkHTgruKIHptlK/U/2DPX8BhHoRGzpMVWUXMmdZlmw==",
+ "peerDependencies": {
+ "react": ">=16.8.1",
+ "react-dom": ">=16.8.1"
+ }
+ },
"node_modules/react-i18next": {
"version": "11.18.6",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz",
@@ -18952,6 +20206,29 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/react-tracked": {
+ "version": "1.7.11",
+ "resolved": "https://registry.npmjs.org/react-tracked/-/react-tracked-1.7.11.tgz",
+ "integrity": "sha512-+XXv4dJH7NnLtSD/cPVL9omra4A3KRK91L33owevXZ81r7qF/a9DdCsVZa90jMGht/V1Ym9sasbmidsJykhULQ==",
+ "dependencies": {
+ "proxy-compare": "2.4.0",
+ "use-context-selector": "1.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": "*",
+ "react-native": "*",
+ "scheduler": ">=0.19.0"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@@ -19390,6 +20667,18 @@
"jsesc": "bin/jsesc"
}
},
+ "node_modules/remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+ "dependencies": {
+ "mdast-util-from-markdown": "^0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/remarkable": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.0.tgz",
@@ -20598,6 +21887,118 @@
"node": ">=8"
}
},
+ "node_modules/slate": {
+ "version": "0.101.1",
+ "resolved": "https://registry.npmjs.org/slate/-/slate-0.101.1.tgz",
+ "integrity": "sha512-k/rVkVb0TEMmaTbkRVJeJzE8lxnyGDc0VC67D91Zrf5hcdHfVaWypBGD25QHCJsndn9Xa0jSJ/xfM2new5E2Zg==",
+ "dependencies": {
+ "immer": "^10.0.3",
+ "is-plain-object": "^5.0.0",
+ "tiny-warning": "^1.0.3"
+ }
+ },
+ "node_modules/slate-history": {
+ "version": "0.100.0",
+ "resolved": "https://registry.npmjs.org/slate-history/-/slate-history-0.100.0.tgz",
+ "integrity": "sha512-x5rUuWLNtH97hs9PrFovGgt3Qc5zkTm/5mcUB+0NR/TK923eLax4HsL6xACLHMs245nI6aJElyM1y6hN0y5W/Q==",
+ "dependencies": {
+ "is-plain-object": "^5.0.0"
+ },
+ "peerDependencies": {
+ "slate": ">=0.65.3"
+ }
+ },
+ "node_modules/slate-history/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/slate-hyperscript": {
+ "version": "0.100.0",
+ "resolved": "https://registry.npmjs.org/slate-hyperscript/-/slate-hyperscript-0.100.0.tgz",
+ "integrity": "sha512-fb2KdAYg6RkrQGlqaIi4wdqz3oa0S4zKNBJlbnJbNOwa23+9FLD6oPVx9zUGqCSIpy+HIpOeqXrg0Kzwh/Ii4A==",
+ "dependencies": {
+ "is-plain-object": "^5.0.0"
+ },
+ "peerDependencies": {
+ "slate": ">=0.65.3"
+ }
+ },
+ "node_modules/slate-hyperscript/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/slate-react": {
+ "version": "0.101.1",
+ "resolved": "https://registry.npmjs.org/slate-react/-/slate-react-0.101.1.tgz",
+ "integrity": "sha512-YMUeqK4gWBguiQXczBWL2H4Y07R8Ux4ZzH22933a/IFr/+1Ue1d1AIcjl6JyF//OqaQN+rGvVfEhqZncDUTwOw==",
+ "dependencies": {
+ "@juggle/resize-observer": "^3.4.0",
+ "@types/is-hotkey": "^0.1.8",
+ "@types/lodash": "^4.14.200",
+ "direction": "^1.0.4",
+ "is-hotkey": "^0.2.0",
+ "is-plain-object": "^5.0.0",
+ "lodash": "^4.17.21",
+ "scroll-into-view-if-needed": "^3.1.0",
+ "tiny-invariant": "1.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=18.2.0",
+ "react-dom": ">=18.2.0",
+ "slate": ">=0.99.0"
+ }
+ },
+ "node_modules/slate-react/node_modules/compute-scroll-into-view": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz",
+ "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg=="
+ },
+ "node_modules/slate-react/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/slate-react/node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/slate-react/node_modules/scroll-into-view-if-needed": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
+ "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
+ "dependencies": {
+ "compute-scroll-into-view": "^3.0.2"
+ }
+ },
+ "node_modules/slate/node_modules/immer": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz",
+ "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/slate/node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/slice-ansi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
@@ -21576,6 +22977,11 @@
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
"dev": true
},
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
+ },
"node_modules/table": {
"version": "5.4.6",
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
@@ -21986,6 +23392,16 @@
"resolved": "https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz",
"integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w=="
},
+ "node_modules/tiny-invariant": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+ "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ },
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
"node_modules/tinykeys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tinykeys/-/tinykeys-2.1.0.tgz",
@@ -22181,6 +23597,15 @@
"node": ">=8"
}
},
+ "node_modules/trough": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
+ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/ts-easing": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
@@ -22805,6 +24230,53 @@
"node": ">=4"
}
},
+ "node_modules/unified": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
+ "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
+ "dependencies": {
+ "bail": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-buffer": "^2.0.0",
+ "is-plain-obj": "^2.0.0",
+ "trough": "^1.0.0",
+ "vfile": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unified/node_modules/is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unified/node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/union-value": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@@ -22831,6 +24303,18 @@
"node": ">=8"
}
},
+ "node_modules/unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "dependencies": {
+ "@types/unist": "^2.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -23037,6 +24521,44 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/use-context-selector": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/use-context-selector/-/use-context-selector-1.4.1.tgz",
+ "integrity": "sha512-Io2ArvcRO+6MWIhkdfMFt+WKQX+Vb++W8DS2l03z/Vw/rz3BclKpM0ynr4LYGyU85Eke+Yx5oIhTY++QR0ZDoA==",
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": "*",
+ "react-native": "*",
+ "scheduler": ">=0.19.0"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-deep-compare": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/use-deep-compare/-/use-deep-compare-1.1.0.tgz",
+ "integrity": "sha512-6yY3zmKNCJ1jjIivfZMZMReZjr8e6iC6Uqtp701jvWJ6ejC/usXD+JjmslZDPJQgX8P4B1Oi5XSLHkOLeYSJsA==",
+ "dependencies": {
+ "dequal": "1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/use-deep-compare/node_modules/dequal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-1.0.0.tgz",
+ "integrity": "sha512-/Nd1EQbQbI9UbSHrMiKZjFLrXSnU328iQdZKPQf78XQI6C+gutkFUeoHpG5J08Ioa6HeRbRNFpSIclh1xyG0mw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/use-isomorphic-layout-effect": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
@@ -23158,6 +24680,14 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "node_modules/validator": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
+ "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -23172,6 +24702,56 @@
"extsprintf": "^1.2.0"
}
},
+ "node_modules/vfile": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+ "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "is-buffer": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0",
+ "vfile-message": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile/node_modules/is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@@ -24077,6 +25657,22 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/zustand": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
+ "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
}
}
}
diff --git a/package.json b/package.json
index adf4500dc..b650691af 100755
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
"@next/bundle-analyzer": "^12.2.5",
"@soywod/pin-field": "^0.1.9",
"@tippyjs/react": "^4.2.6",
+ "@udecode/plate": "^26.0.5",
"@urql/core": "^4.1.4",
"@urql/next": "^1.1.0",
"chalk": "^2.4.1",
@@ -101,6 +102,10 @@
"sanitize-html": "^2.5.2",
"scroll-into-view-if-needed": "1.5.0",
"sentry-testkit": "^2.1.0",
+ "slate": "^0.101.1",
+ "slate-history": "^0.100.0",
+ "slate-hyperscript": "^0.100.0",
+ "slate-react": "^0.101.1",
"sonner": "^1.0.0",
"store": "^2.0.12",
"stringz": "^2.0.0",
diff --git a/src/app/editor/page.tsx b/src/app/editor/page.tsx
new file mode 100644
index 000000000..d34784dd9
--- /dev/null
+++ b/src/app/editor/page.tsx
@@ -0,0 +1,18 @@
+'use client'
+
+import React from 'react'
+import { Plate, PlateContent } from '@udecode/plate-common'
+
+import { Wrapper } from './styles'
+
+const BasicEditorDefaultDemo = () => {
+ return (
+
+ console.log('## onChange: ', data)}>
+
+
+
+ )
+}
+
+export default BasicEditorDefaultDemo
diff --git a/src/app/editor/styles/index.tsx b/src/app/editor/styles/index.tsx
new file mode 100644
index 000000000..ff372050c
--- /dev/null
+++ b/src/app/editor/styles/index.tsx
@@ -0,0 +1,9 @@
+import styled from 'styled-components'
+
+export const Wrapper = styled.div`
+ margin-top: 10%;
+ width: 800px;
+ height: 300px;
+ border: 1px solid;
+`
+export const holder = 1
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 1bf419bea..195ccd59e 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,14 +1,10 @@
'use client'
-import Link from 'next/link'
-
import LandingPage from '@/containers/content/LandingPage'
export default function Page() {
return (
- go to home
-
)
diff --git a/src/app/test/error.tsx b/src/app/test/error.tsx
deleted file mode 100644
index 7ea73779b..000000000
--- a/src/app/test/error.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-'use client'
-
-const Error = () => {
- return (
-
-
Test Page Error
-
- )
-}
-
-export default Error
diff --git a/src/app/test/page.tsx b/src/app/test/page.tsx
deleted file mode 100644
index 96ab89e1c..000000000
--- a/src/app/test/page.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-'use client'
-
-import Link from 'next/link'
-
-import useRootStore from '@/hooks/useRootStore'
-// import { useStore, initRootStore } from '@/stores/init'
-
-const TestPage = () => {
- console.log('## in test page')
- const rootStore = useRootStore()
- // const rootStore = initRootStore({})
- // const rootStore = useStore()
-
- // rootStore.mark({ wallpaperEditor: { wallpaper: 'orange' }, firstLoad: false })
- // setTimeout(() => {
- // rootStore.mark({ wallpaperEditor: { wallpaper: 'orange' }, firstLoad: false })
- // })
-
- return (
-
-
-
Test
-
- go to home
-
-
- go to home2
-
-
foot: {rootStore.activeDemo}
- {/*
paper: {rootStore.wallpaperEditor.wallpaper}
*/}
-
- )
-}
-
-export default TestPage
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/CoverPreview.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/CoverPreview.tsx
new file mode 100644
index 000000000..0213b4c4d
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/CoverPreview.tsx
@@ -0,0 +1,29 @@
+import { FC } from 'react'
+
+import {
+ Wrapper,
+ Header,
+ Dot,
+ BlocksWrapper,
+ BlocksSolidIcon,
+} from '../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/cover_preview'
+
+const CoverPreview: FC = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default CoverPreview
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EditorPreview/Toolbox.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EditorPreview/Toolbox.tsx
new file mode 100644
index 000000000..b16ce9705
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EditorPreview/Toolbox.tsx
@@ -0,0 +1,50 @@
+import { FC } from 'react'
+
+import {
+ Wrapper,
+ ICON,
+ Item,
+ Title,
+ ColorBall,
+} from '../../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/toolbox'
+
+const EditorToolbox: FC = () => {
+ return (
+
+ -
+
+ 旋转
+
+ -
+
+ 弧度
+
+ -
+
+ 阴影
+
+ -
+
+ 位置
+
+ -
+
+ 大小
+
+ -
+
+ 灯光
+
+ -
+
+ 比例
+
+ -
+
+ 背景
+
+
+ )
+}
+
+export default EditorToolbox
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EditorPreview/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EditorPreview/index.tsx
new file mode 100644
index 000000000..681655d7f
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EditorPreview/index.tsx
@@ -0,0 +1,54 @@
+import { FC } from 'react'
+
+import TagNode from '@/widgets/TagNode'
+import { COLOR_NAME } from '@/constant/colors'
+
+import Toolbox from './Toolbox'
+import CoverPreview from '../CoverPreview'
+
+import {
+ Wrapper,
+ Header,
+ Title,
+ Version,
+ Bar,
+ Cover,
+ TagsWrapper,
+ TagItem,
+ Content,
+} from '../../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview'
+
+const EditorPreview: FC = () => {
+ return (
+
+
+
+ 文章封面图编辑器 v2.0
+
+
+
+
+
+ Web
+
+
+
+
+ Mobile
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default EditorPreview
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EmotionBar.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EmotionBar.tsx
new file mode 100644
index 000000000..f932ca1db
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EmotionBar.tsx
@@ -0,0 +1,38 @@
+import { FC } from 'react'
+
+import {
+ Wrapper,
+ Item,
+ EmojiImg,
+ Count,
+} from '../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar'
+
+const EMOTION_STATIC = '/icons/static/emotion'
+
+const EditorPreview: FC = () => {
+ return (
+
+ -
+
+ 41
+
+
+ -
+
+ 32
+
+
+ -
+
+ 17
+
+
+ -
+
+ 10
+
+
+ )
+}
+
+export default EditorPreview
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EmotionBarBad.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EmotionBarBad.tsx
new file mode 100644
index 000000000..af3d9a347
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/EmotionBarBad.tsx
@@ -0,0 +1,33 @@
+import { FC } from 'react'
+
+import {
+ Wrapper,
+ Item,
+ EmojiImg,
+ Count,
+} from '../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar_bad'
+
+const EMOTION_STATIC = '/icons/static/emotion'
+
+const EditorPreview: FC = () => {
+ return (
+
+ -
+
+ 14
+
+
+ -
+
+ 12
+
+
+ -
+
+ 35
+
+
+ )
+}
+
+export default EditorPreview
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/MainList/Footer.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/MainList/Footer.tsx
new file mode 100644
index 000000000..0f9f63dfd
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/MainList/Footer.tsx
@@ -0,0 +1,41 @@
+import { FC } from 'react'
+
+import { mockUsers } from '@/mock'
+
+import { SpaceGrow } from '@/widgets/Common'
+import Facepile from '@/widgets/Facepile'
+
+import {
+ Wrapper,
+ UpvoteWrapper,
+ UpvoteIcon,
+ UpvoteCount,
+ UsersWrapper,
+ PublishDate,
+} from '../../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/footer'
+
+type TProps = {
+ upvotesCount?: number
+ date?: string
+}
+
+const Footer: FC = ({ upvotesCount = 24, date = '2013-12-01' }) => {
+ const users = mockUsers(3)
+
+ return (
+
+
+
+ {upvotesCount}
+
+
+
+
+
+
+ {date}
+
+ )
+}
+
+export default Footer
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/MainList/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/MainList/index.tsx
new file mode 100644
index 000000000..e2d3bdbdd
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/MainList/index.tsx
@@ -0,0 +1,101 @@
+import { FC } from 'react'
+
+import { COLOR_NAME } from '@/constant/colors'
+
+import TagNode from '@/widgets/TagNode'
+
+import CoverPreview from '../CoverPreview'
+import Footer from './Footer'
+
+import {
+ Wrapper,
+ Header,
+ Title,
+ Version,
+ Bar,
+ Cover,
+ TagsWrapper,
+ TagItem,
+ Content,
+ Divider,
+ Previous,
+ StarIcon,
+ StarIcon2,
+ StarIcon3,
+} from '../../../../styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list'
+
+const MainList: FC = () => {
+ return (
+
+
+
+
+
+
+ 文章封面图编辑器 v2.0
+
+
+
+
+
+ Web
+
+
+
+
+ Mobile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 加持的文章搜索 v1.9
+
+
+
+
+
+
+ Web
+
+
+
+
+ 编辑器
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default MainList
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/index.tsx
new file mode 100644
index 000000000..7597c0ce7
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/ChangelogDemo/index.tsx
@@ -0,0 +1,21 @@
+import { FC } from 'react'
+
+import MainList from './MainList'
+import EditorPreview from './EditorPreview'
+import EmotionBar from './EmotionBar'
+import EmotionBarBad from './EmotionBarBad'
+
+import { Wrapper } from '../../../styles/articles_intro_tabs/changelog_tab/changelog_demo'
+
+const ChangeLogDemo: FC = () => {
+ return (
+
+
+
+
+
+
+ )
+}
+
+export default ChangeLogDemo
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/IntroDigest.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/IntroDigest.tsx
new file mode 100644
index 000000000..c5bf9df36
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/IntroDigest.tsx
@@ -0,0 +1,26 @@
+import { FC } from 'react'
+
+import { DesktopOnly } from '@/widgets/Common'
+
+import IntroItems from './IntroItems'
+import {
+ Wrapper,
+ Digest,
+ Hightlight,
+} from '../../styles/articles_intro_tabs/changelog_tab/intro_digest'
+
+const IntroDigest: FC = () => {
+ return (
+
+
+ 官方团队发布更新日志,方便用户快速获取产品
+ 新功能以及Bug 修复等。
+
+
+
+
+
+ )
+}
+
+export default IntroDigest
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/IntroItems.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/IntroItems.tsx
new file mode 100644
index 000000000..fbc48c1c4
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/IntroItems.tsx
@@ -0,0 +1,41 @@
+import { FC } from 'react'
+
+import { COLOR_NAME } from '@/constant/colors'
+import { SpaceGrow, DesktopOnly } from '@/widgets/Common'
+
+import FeatItem from '../FeatItem'
+import MoreLink from '../MoreLink'
+
+import { FeatList } from '../../styles/articles_intro_tabs/intro_items'
+
+const Contents = () => {
+ const color = COLOR_NAME.RED
+
+ return (
+ <>
+
+
+
+
+
+
+ >
+ )
+}
+
+const IntroItems: FC = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default IntroItems
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/index.tsx
new file mode 100644
index 000000000..9058e35df
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/ChangelogTab/index.tsx
@@ -0,0 +1,17 @@
+import { FC } from 'react'
+
+import IntroDigest from './IntroDigest'
+import ChangelogDemo from './ChangelogDemo'
+
+import { Wrapper } from '../../styles/articles_intro_tabs/changelog_tab'
+
+const ChangelogFeat: FC = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default ChangelogFeat
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/Content.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/Content.tsx
new file mode 100644
index 000000000..5767c646d
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/Content.tsx
@@ -0,0 +1,53 @@
+import { FC } from 'react'
+
+import type { TThread } from '@/spec'
+import { THREAD } from '@/constant/thread'
+
+import DiscussTab from './DiscussTab'
+import ChangelogTab from './ChangelogTab'
+import KanbanTab from './KanbanTab'
+import HelpTab from './HelpTab'
+
+import { Wrapper } from '../styles/articles_intro_tabs/content'
+
+type TProps = {
+ tab: TThread
+}
+
+const Content: FC = ({ tab }) => {
+ let TabContent = null
+
+ switch (tab) {
+ case THREAD.POST: {
+ TabContent = DiscussTab
+ break
+ }
+
+ case THREAD.KANBAN: {
+ TabContent = KanbanTab
+ break
+ }
+
+ case THREAD.CHANGELOG: {
+ TabContent = ChangelogTab
+ break
+ }
+
+ case THREAD.DOC: {
+ TabContent = HelpTab
+ break
+ }
+
+ default: {
+ TabContent = DiscussTab
+ }
+ }
+
+ return (
+
+
+
+ )
+}
+
+export default Content
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/CommentItem.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/CommentItem.tsx
new file mode 100644
index 000000000..f998bc4d8
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/CommentItem.tsx
@@ -0,0 +1,40 @@
+import { FC } from 'react'
+
+import type { TUser } from '@/spec'
+
+import ImgFallback from '@/widgets/ImgFallback'
+
+import {
+ Avatar,
+ Wrapper,
+ RightPart,
+ Nicname,
+ Bar,
+} from '../../../styles/articles_intro_tabs/discuss_tab/discuss_demo/comment_item'
+
+type TProps = {
+ user?: TUser
+ nickname?: string
+ opacity?: number
+ width?: number
+ index?: number
+}
+
+const CommentItem: FC = ({ user, nickname = '', opacity = 1, index = 0, width = 30 }) => {
+ return (
+
+ } />
+
+ {nickname}
+ {index === 1 ? (
+
+ ) : (
+
+ )}
+
+
+
+ )
+}
+
+export default CommentItem
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/PostItem.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/PostItem.tsx
similarity index 51%
rename from src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/PostItem.tsx
rename to src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/PostItem.tsx
index f6e71f016..d34f85fd8 100644
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/PostItem.tsx
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/PostItem.tsx
@@ -1,22 +1,34 @@
import { FC } from 'react'
+import ArticleCatState from '@/widgets/ArticleCatState'
+
+import type { TArticleCat } from '@/spec'
+
import {
Wrapper,
UpvotesWrapper,
RightPart,
- Bar,
+ Title,
Footer,
UpvoteIcon,
Count,
-} from '../../../styles/feature_wall/discuss_feat/discuss_demo/post_item'
+} from '../../../styles/articles_intro_tabs/discuss_tab/discuss_demo/post_item'
type TProps = {
+ title?: string
opacity?: number
count?: number
width?: number
+ cat?: TArticleCat
}
-const PostItem: FC = ({ opacity = 1, count = 9, width = 80 }) => {
+const PostItem: FC = ({
+ title = '',
+ cat = 'FEATURE',
+ opacity = 1,
+ count = 9,
+ width = 80,
+}) => {
return (
@@ -25,11 +37,9 @@ const PostItem: FC = ({ opacity = 1, count = 9, width = 80 }) => {
-
-
-
+ {title}
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/index.tsx
new file mode 100644
index 000000000..1cce80d41
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/DiscussDemo/index.tsx
@@ -0,0 +1,118 @@
+import { FC } from 'react'
+
+import { mockUsers } from '@/mock'
+import { ARTICLE_CAT } from '@/constant/gtd'
+import { COLOR_NAME } from '@/constant/colors'
+
+import { SpaceGrow } from '@/widgets/Common'
+import ArticleCatState from '@/widgets/ArticleCatState'
+import TagNode from '@/widgets/TagNode'
+
+import PostItem from './PostItem'
+import CommentItem from './CommentItem'
+
+import {
+ Wrapper,
+ Title,
+ ListsWrapper,
+ DetailWrapper,
+ Status,
+ UpvoteWrapper,
+ UpvoteIcon,
+ CommentIcon,
+ UpvoteCount,
+ Tag,
+ Header,
+ Count,
+ Bar,
+ CommentsHeader,
+} from '../../../styles/articles_intro_tabs/discuss_tab/discuss_demo'
+
+const DiscussDemo: FC = () => {
+ const users = mockUsers(5)
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ 蹲一个暗黑模式
+
+
+
+ 101
+
+
+
+
+ 18
+
+
+
+
+
+
+
+ 评论 18
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DiscussDemo
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/IntroDigest.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/IntroDigest.tsx
new file mode 100644
index 000000000..bf3dcda41
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/IntroDigest.tsx
@@ -0,0 +1,25 @@
+import { FC } from 'react'
+
+import IntroItems from './IntroItems'
+
+import {
+ Wrapper,
+ Digest,
+ Hightlight,
+} from '../../styles/articles_intro_tabs/discuss_tab/intro_digest'
+
+const IntroDigest: FC = () => {
+ return (
+
+
+ 完善简洁的论坛功能,满足用户与团队,
+ 用户与用户间的互动交流。
+
+
+
+ {/* */}
+
+ )
+}
+
+export default IntroDigest
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/IntroItems.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/IntroItems.tsx
new file mode 100644
index 000000000..b1655b1e3
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/IntroItems.tsx
@@ -0,0 +1,49 @@
+import { FC } from 'react'
+
+import { COLOR_NAME } from '@/constant/colors'
+import { SpaceGrow, DesktopOnly, MobileOnly } from '@/widgets/Common'
+
+import FeatItem from '../FeatItem'
+import MoreLink from '../MoreLink'
+
+import { FeatList, MobileIntroLists } from '../../styles/articles_intro_tabs/intro_items'
+
+const Contents = () => {
+ const color = COLOR_NAME.PURPLE
+
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ )
+}
+
+const IntroItems: FC = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default IntroItems
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/UserCards.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/UserCards.tsx
new file mode 100644
index 000000000..d1c1aee5b
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/UserCards.tsx
@@ -0,0 +1,50 @@
+import { FC } from 'react'
+
+import { mockUsers } from '@/mock'
+
+import {
+ Wrapper,
+ CardWrapper,
+ Avatar,
+ Say,
+} from '../../styles/articles_intro_tabs/discuss_tab/user_cards'
+
+const UserCards: FC = () => {
+ const users = mockUsers(8)
+
+ return (
+
+
+
+ 蹲一个暗黑模式?
+
+
+
+
+ 管理员可以删除评论吗
+
+
+
+
+ 可以私有部署吗
+
+
+
+
+ 手机上标题过小
+
+
+
+
+ 更新日志支持预发布
+
+
+
+
+ 安卓版本在哪里下载?
+
+
+ )
+}
+
+export default UserCards
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/index.tsx
new file mode 100644
index 000000000..96790a9be
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/DiscussTab/index.tsx
@@ -0,0 +1,18 @@
+import { FC } from 'react'
+
+import DiscussDemo from './DiscussDemo'
+
+import IntroDigest from './IntroDigest'
+
+import { Wrapper } from '../../styles/articles_intro_tabs/discuss_tab'
+
+const DiscussFeat: FC = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default DiscussFeat
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/FeatItem.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/FeatItem.tsx
new file mode 100644
index 000000000..f9f8b4c68
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/FeatItem.tsx
@@ -0,0 +1,20 @@
+import { FC } from 'react'
+
+import type { TColor } from '@/spec'
+
+import { Wrapper, Text, CheckIcon } from '../styles/articles_intro_tabs/feat_item'
+
+type TProps = {
+ text?: string
+} & TColor
+
+const FeatItem: FC = ({ text = '--', color }) => {
+ return (
+
+
+ {text}
+
+ )
+}
+
+export default FeatItem
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/Article.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/Article.tsx
new file mode 100644
index 000000000..35afa59e4
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/Article.tsx
@@ -0,0 +1,78 @@
+import { FC } from 'react'
+
+import useTheme from '@/hooks/useTheme'
+
+import { SpaceGrow } from '@/widgets/Common'
+import {
+ Wrapper,
+ InnerWrapper,
+ LeftArrowIcon,
+ RightArrowIcon,
+ InnerContent,
+ Title,
+ CoverWrappers,
+ Cover,
+ CoverTitle,
+ Bar,
+ ShareIcon,
+ Footer,
+ ArrowText,
+ Feedback,
+ GoodIcon,
+ SodoIcon,
+ BadIcon,
+ CommentDot,
+ CommentDotSolid,
+} from '../../../styles/articles_intro_tabs/help_tab/help_demo/article'
+
+const Article: FC = () => {
+ const { themeMap } = useTheme()
+
+ return (
+
+
+
+
+ 自定义帮助台封面
+
+
+
+ 卡片视图
+
+
+ 列表视图
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Article
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/DirTree.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/DirTree.tsx
new file mode 100644
index 000000000..34d5d53c0
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/DirTree.tsx
@@ -0,0 +1,50 @@
+import { FC } from 'react'
+
+import { Br } from '@/widgets/Common'
+
+import {
+ Wrapper,
+ PinnedItem,
+ BookIcon,
+ GithubIcon,
+ DirName,
+ File,
+} from '../../../styles/articles_intro_tabs/help_tab/help_demo/dir_tree'
+
+const DirTree: FC = () => {
+ return (
+
+
+
+ 全部文档
+
+
+
+ Github
+
+
+
+ 社区
+ 基本信息
+ 整体布局
+ 管理员
+
+
+ 讨论区
+ 帖子布局
+ 标签设置
+
+
+ 看板
+ 看板颜色
+ 状态转换
+
+
+ 更新日志
+ 封面编辑器
+ 基本信息设置
+
+ )
+}
+
+export default DirTree
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/InlineComment.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/InlineComment.tsx
new file mode 100644
index 000000000..85a479bbe
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/InlineComment.tsx
@@ -0,0 +1,27 @@
+import { FC } from 'react'
+
+import { mockUsers } from '@/mock'
+
+import {
+ Wrapper,
+ User,
+ Avatar,
+ Nickname,
+ Comment,
+} from '../../../styles/articles_intro_tabs/help_tab/help_demo/inline_comment'
+
+const InlineComment: FC = () => {
+ const user = mockUsers(1)
+
+ return (
+
+
+
+ {user[0].nickname}
+
+ 可以在行内评论里支持富文本内容吗?
+
+ )
+}
+
+export default InlineComment
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/index.tsx
new file mode 100644
index 000000000..f39c98274
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/HelpDemo/index.tsx
@@ -0,0 +1,19 @@
+import { FC } from 'react'
+
+import DirTree from './DirTree'
+import Article from './Article'
+import InlineComment from './InlineComment'
+
+import { Wrapper } from '../../../styles/articles_intro_tabs/help_tab/help_demo'
+
+const HelpItem: FC = () => {
+ return (
+
+
+
+
+
+ )
+}
+
+export default HelpItem
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/IntroDigest.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/IntroDigest.tsx
new file mode 100644
index 000000000..4a895818d
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/IntroDigest.tsx
@@ -0,0 +1,20 @@
+import { FC } from 'react'
+
+import IntroItems from './IntroItems'
+
+import { Wrapper, Digest, Hightlight } from '../../styles/articles_intro_tabs/help_tab/intro_digest'
+
+const IntroDigest: FC = () => {
+ return (
+
+
+ 沉淀常见问题,公共知识库以及
+ 操作指南等,快速解决用户疑惑。
+
+
+
+
+ )
+}
+
+export default IntroDigest
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/IntroItems.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/IntroItems.tsx
new file mode 100644
index 000000000..7a2f1c21a
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/IntroItems.tsx
@@ -0,0 +1,51 @@
+import { FC } from 'react'
+
+import { COLOR_NAME } from '@/constant/colors'
+import { SpaceGrow, DesktopOnly, MobileOnly } from '@/widgets/Common'
+
+import FeatItem from '../FeatItem'
+import MoreLink from '../MoreLink'
+
+import { FeatList, MobileIntroLists } from '../../styles/articles_intro_tabs/intro_items'
+
+const Contents = () => {
+ const color = COLOR_NAME.CYAN
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+const IntroItems: FC = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default IntroItems
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/index.tsx
new file mode 100644
index 000000000..11b5620b5
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/HelpTab/index.tsx
@@ -0,0 +1,17 @@
+import { FC } from 'react'
+
+import IntroDigest from './IntroDigest'
+import HelpDemo from './HelpDemo'
+
+import { Wrapper } from '../../styles/articles_intro_tabs/help_tab'
+
+const KanbanFeat: FC = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default KanbanFeat
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/IntroDigest.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/IntroDigest.tsx
new file mode 100644
index 000000000..16e575d6a
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/IntroDigest.tsx
@@ -0,0 +1,56 @@
+import { FC } from 'react'
+
+import { COLOR_NAME } from '@/constant/colors'
+
+import FeatItem from '../FeatItem'
+
+import {
+ Wrapper,
+ Digest,
+ Highlight,
+ InnerWrapper,
+ FeatureWrapper,
+ FeatureItem,
+} from '../../styles/articles_intro_tabs/kanban_tab/intro_digest'
+
+const IntroDigest: FC = () => {
+ const color = COLOR_NAME.BLUE
+
+ return (
+
+
+
+ 通过经典的看板视图,让用户直观的了解团队相关工作的
+ 计划和进度。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default IntroDigest
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/IntroImage.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/IntroImage.tsx
new file mode 100644
index 000000000..0fb534f04
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/IntroImage.tsx
@@ -0,0 +1,16 @@
+import { FC } from 'react'
+// import { Parallax } from 'react-scroll-parallax'
+
+import KanbanDemo from './KanbanDemo'
+
+import { Wrapper } from '../../styles/articles_intro_tabs/kanban_tab/intro_image'
+
+const IntroImage: FC = () => {
+ return (
+
+
+
+ )
+}
+
+export default IntroImage
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/Banner.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/Banner.tsx
new file mode 100644
index 000000000..dc734973c
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/Banner.tsx
@@ -0,0 +1,60 @@
+import { FC } from 'react'
+
+import { mockUsers } from '@/mock'
+
+import { SpaceGrow } from '@/widgets/Common'
+import Facepile from '@/widgets/Facepile'
+
+import {
+ Wrapper,
+ InnerWrapper,
+ Header,
+ Title,
+ UsersWrapper,
+ KanbenIcon,
+ LabelBar,
+ Bar,
+ Item,
+ Label,
+ Icon1,
+ Icon2,
+ Icon3,
+} from '../../../styles/articles_intro_tabs/kanban_tab/banner'
+
+const Banner: FC = () => {
+ const users = mockUsers(5)
+
+ return (
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+
+ )
+}
+
+export default Banner
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/KanbanItem.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/KanbanItem.tsx
new file mode 100644
index 000000000..7d56ea296
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/KanbanItem.tsx
@@ -0,0 +1,54 @@
+import { FC } from 'react'
+
+import type { TArticleCat } from '@/spec'
+
+import ArticleCatState from '@/widgets/ArticleCatState'
+
+import {
+ Wrapper,
+ TargetWrapper,
+ Title,
+ Footer,
+ UpvoteIcon,
+ Count,
+} from '../../../styles/articles_intro_tabs/kanban_tab/kanban_demo/kanban_item'
+
+type TProps = {
+ opacity?: number
+ count?: number
+ title?: string
+ cat?: TArticleCat
+ draging?: boolean
+ dragTarget?: boolean
+}
+
+const KanbanItem: FC = ({
+ opacity = 1,
+ count = 9,
+ title = '支持暗黑模式',
+ cat = 'FEATURE',
+ draging = false,
+ dragTarget = false,
+}) => {
+ if (dragTarget) {
+ return (
+
+ 已解决
+
+ )
+ }
+
+ return (
+
+ {title}
+
+
+
+ )
+}
+
+export default KanbanItem
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/index.tsx
new file mode 100644
index 000000000..74c9dd273
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/KanbanDemo/index.tsx
@@ -0,0 +1,49 @@
+import { FC } from 'react'
+
+import { ARTICLE_CAT } from '@/constant/gtd'
+
+import Banner from './Banner'
+import KanbanItem from './KanbanItem'
+
+import { BoardsWrapper, Board } from '../../../styles/articles_intro_tabs/kanban_tab/kanban_demo'
+
+const KanbanDemo: FC = () => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default KanbanDemo
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/index.tsx
new file mode 100644
index 000000000..d43ec77c2
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/KanbanTab/index.tsx
@@ -0,0 +1,17 @@
+import { FC } from 'react'
+
+import IntroDigest from './IntroDigest'
+import IntroImage from './IntroImage'
+
+import { Wrapper } from '../../styles/articles_intro_tabs/kanban_tab'
+
+const KanbanFeat: FC = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default KanbanFeat
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/MoreLink.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/MoreLink.tsx
new file mode 100644
index 000000000..af1dba77d
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/MoreLink.tsx
@@ -0,0 +1,22 @@
+import { FC } from 'react'
+
+import type { TColor } from '@/spec'
+import { COLOR_NAME } from '@/constant/colors'
+import ArrowButton from '@/widgets/Buttons/ArrowButton'
+
+import { Wrapper } from '../styles/articles_intro_tabs/more_link'
+
+type TProps = {
+ title?: string
+ href: string
+} & TColor
+
+const MoreLink: FC = ({ title = '了解更多', href, color }) => {
+ return (
+
+ {title}
+
+ )
+}
+
+export default MoreLink
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/PreviewBars.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/PreviewBars.tsx
new file mode 100644
index 000000000..79cc64f08
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/PreviewBars.tsx
@@ -0,0 +1,77 @@
+import { FC } from 'react'
+
+import type { TColor, TThread } from '@/spec'
+import { THREAD } from '@/constant/thread'
+
+import { Row, Column, TreeColumn, DocColumn, Bar } from '../styles/articles_intro_tabs/preview_bars'
+
+type TProps = {
+ tab: TThread
+} & TColor
+
+const PreviewBars: FC = ({ tab, $color }) => {
+ switch (tab) {
+ case THREAD.KANBAN: {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+
+ case THREAD.CHANGELOG: {
+ return (
+ <>
+
+
+
+ >
+ )
+ }
+
+ case THREAD.DOC: {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+
+ default: {
+ return (
+ <>
+
+
+
+
+ >
+ )
+ }
+ }
+}
+
+export default PreviewBars
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/Tabs.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/Tabs.tsx
new file mode 100644
index 000000000..96771fb5e
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/Tabs.tsx
@@ -0,0 +1,65 @@
+import { FC } from 'react'
+
+import type { TThread } from '@/spec'
+import { THREAD } from '@/constant/thread'
+import { COLOR_NAME } from '@/constant/colors'
+
+import PreviewBars from './PreviewBars'
+
+import { Wrapper, TabItem, IconBox, ICON, Title, Desc } from '../styles/articles_intro_tabs/tabs'
+
+const TAB_ITEMS = [
+ {
+ key: THREAD.POST,
+ title: '讨论区',
+ desc: '功能建议 / Bug / 疑问 / 交流',
+ color: COLOR_NAME.PURPLE,
+ },
+ {
+ key: THREAD.KANBAN,
+ title: '看板',
+ desc: '规划中 / 正在进行 / 已完成',
+ color: COLOR_NAME.BLUE,
+ },
+ {
+ key: THREAD.CHANGELOG,
+ title: '更新日志',
+ desc: '新功能 / 修复 / 版本日志',
+ color: COLOR_NAME.RED,
+ },
+ {
+ key: THREAD.DOC,
+ title: '帮助台',
+ desc: '帮助文档 / 产品手册',
+ color: COLOR_NAME.CYAN,
+ },
+]
+
+type TProps = {
+ tab: TThread
+ onChange: (tab: TThread) => void
+}
+const Tabs: FC = ({ tab, onChange }) => {
+ return (
+
+ {TAB_ITEMS.map((item) => {
+ const $color = item.color
+ const $active = item.key === tab
+ const Icon = ICON[item.key]
+
+ return (
+ onChange(item.key as TThread)}>
+
+
+
+
+ {item.title}
+ {item.desc}
+
+ )
+ })}
+
+ )
+}
+
+export default Tabs
diff --git a/src/containers/content/LandingPage/ArticlesIntroTabs/index.tsx b/src/containers/content/LandingPage/ArticlesIntroTabs/index.tsx
new file mode 100644
index 000000000..10cac4311
--- /dev/null
+++ b/src/containers/content/LandingPage/ArticlesIntroTabs/index.tsx
@@ -0,0 +1,22 @@
+import { FC, useState } from 'react'
+
+import type { TThread } from '@/spec'
+import { THREAD } from '@/constant/thread'
+
+import Tabs from './Tabs'
+import Content from './Content'
+
+import { Wrapper } from '../styles/articles_intro_tabs'
+
+const ArticlesIntroTabs: FC = () => {
+ const [tab, setTab] = useState(THREAD.POST)
+
+ return (
+
+ setTab(tab)} />
+
+
+ )
+}
+
+export default ArticlesIntroTabs
diff --git a/src/containers/content/LandingPage/DashboardIntros/ContentPreview.tsx b/src/containers/content/LandingPage/DashboardIntros/ContentPreview.tsx
new file mode 100644
index 000000000..5350ec3d5
--- /dev/null
+++ b/src/containers/content/LandingPage/DashboardIntros/ContentPreview.tsx
@@ -0,0 +1,34 @@
+import { FC } from 'react'
+
+import type { TDashboardPath } from '@/spec'
+import { DASHBOARD_ROUTE } from '@/constant/route'
+
+import { Wrapper, Title } from '../styles/dashboard_intros/content_preview'
+
+type TProps = {
+ tab: TDashboardPath
+}
+
+const ContentPreview: FC = ({ tab }) => {
+ let Content = null
+
+ switch (tab) {
+ case DASHBOARD_ROUTE.INFO: {
+ Content = 基本信息
+ break
+ }
+
+ case DASHBOARD_ROUTE.LAYOUT: {
+ Content = 布局与样式
+ break
+ }
+
+ default: {
+ Content = 其他
+ }
+ }
+
+ return {Content}
+}
+
+export default ContentPreview
diff --git a/src/containers/content/LandingPage/DashboardIntros/DashboardPreview.tsx b/src/containers/content/LandingPage/DashboardIntros/DashboardPreview.tsx
new file mode 100644
index 000000000..6d33ddc75
--- /dev/null
+++ b/src/containers/content/LandingPage/DashboardIntros/DashboardPreview.tsx
@@ -0,0 +1,34 @@
+import { FC } from 'react'
+
+import type { TDashboardPath } from '@/spec'
+import { DASHBOARD_ROUTE } from '@/constant/route'
+
+import { Wrapper, Title } from '../styles/dashboard_intros/dashboard_preview'
+
+type TProps = {
+ tab: TDashboardPath
+}
+
+const DashboardPreview: FC = ({ tab }) => {
+ let Content = null
+
+ switch (tab) {
+ case DASHBOARD_ROUTE.INFO: {
+ Content = 基本信息
+ break
+ }
+
+ case DASHBOARD_ROUTE.LAYOUT: {
+ Content = 布局与样式
+ break
+ }
+
+ default: {
+ Content = 其他
+ }
+ }
+
+ return {Content}
+}
+
+export default DashboardPreview
diff --git a/src/containers/content/LandingPage/DashboardIntros/SideMenus.tsx b/src/containers/content/LandingPage/DashboardIntros/SideMenus.tsx
new file mode 100644
index 000000000..1467535ec
--- /dev/null
+++ b/src/containers/content/LandingPage/DashboardIntros/SideMenus.tsx
@@ -0,0 +1,46 @@
+import { FC } from 'react'
+
+import type { TDashboardPath } from '@/spec'
+
+import { TABS_ITEMS } from './constant'
+
+import {
+ Wrapper,
+ InnerWrapper,
+ Header,
+ Title,
+ Highlight,
+ Desc,
+ Tabs,
+ TabItem,
+} from '../styles/dashboard_intros/side_menu'
+
+type TProps = {
+ tab: TDashboardPath
+ onChange: (tab: TDashboardPath) => void
+}
+
+const SideMenus: FC = ({ tab, onChange }) => {
+ return (
+
+
+
+
+ 完善的后台管理
+
+ 强大的自定义设置,所见即所得,满足你的品牌个性化及内容管理需要。
+
+
+
+ {TABS_ITEMS.map((item) => (
+ onChange(item.key)}>
+ {item.title}
+
+ ))}
+
+
+
+ )
+}
+
+export default SideMenus
diff --git a/src/containers/content/LandingPage/DashboardIntros/constant.ts b/src/containers/content/LandingPage/DashboardIntros/constant.ts
new file mode 100644
index 000000000..0ecff4baf
--- /dev/null
+++ b/src/containers/content/LandingPage/DashboardIntros/constant.ts
@@ -0,0 +1,42 @@
+import { DASHBOARD_ROUTE } from '@/constant/route'
+
+export const TABS_ITEMS = [
+ {
+ key: DASHBOARD_ROUTE.INFO,
+ title: '基本信息',
+ },
+ {
+ key: DASHBOARD_ROUTE.LAYOUT,
+ title: '布局与样式',
+ },
+ {
+ key: DASHBOARD_ROUTE.SEO,
+ title: 'SEO 优化',
+ },
+ {
+ key: DASHBOARD_ROUTE.POST,
+ title: '社区内容管理',
+ },
+ {
+ key: DASHBOARD_ROUTE.TAGS,
+ title: '标签设置与管理',
+ },
+ {
+ key: DASHBOARD_ROUTE.ADMINS,
+ title: '管理员 / 权限',
+ },
+ {
+ key: DASHBOARD_ROUTE.HEADER,
+ title: '页头 / 页脚自定义',
+ },
+ {
+ key: DASHBOARD_ROUTE.WIDGETS,
+ title: '绑定与集成',
+ },
+ {
+ key: DASHBOARD_ROUTE.TREND,
+ title: '统计分析',
+ },
+]
+
+export const holder = 1
diff --git a/src/containers/content/LandingPage/DashboardIntros/index.tsx b/src/containers/content/LandingPage/DashboardIntros/index.tsx
new file mode 100644
index 000000000..fdbb7b569
--- /dev/null
+++ b/src/containers/content/LandingPage/DashboardIntros/index.tsx
@@ -0,0 +1,26 @@
+import { FC, useState } from 'react'
+
+import type { TDashboardPath } from '@/spec'
+import { DASHBOARD_ROUTE } from '@/constant/route'
+
+import SideMenus from './SideMenus'
+import ContentPreview from './ContentPreview'
+import DashboardPreview from './DashboardPreview'
+
+import { Wrapper, Right } from '../styles/dashboard_intros'
+
+const DashboardIntros: FC = () => {
+ const [tab, setTab] = useState(DASHBOARD_ROUTE.INFO)
+
+ return (
+
+ setTab(tab)} />
+
+
+
+
+
+ )
+}
+
+export default DashboardIntros
diff --git a/src/containers/content/LandingPage/FeatureWall/BgDots.tsx b/src/containers/content/LandingPage/FeatureWall/BgDots.tsx
deleted file mode 100644
index 02607f4cd..000000000
--- a/src/containers/content/LandingPage/FeatureWall/BgDots.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { FC } from 'react'
-
-import type { TActive } from '@/spec'
-
-import type { TFeatType } from '../spec'
-import { Wrapper } from '../styles/feature_wall/bg_dots'
-
-type TProps = {
- featType: TFeatType
-} & TActive
-
-const BgDots: FC = ({ featType, $active }) => {
- return
-}
-
-export default BgDots
diff --git a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/ChangelogDemo.tsx b/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/ChangelogDemo.tsx
deleted file mode 100644
index 027733ee0..000000000
--- a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/ChangelogDemo.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { FC } from 'react'
-
-import {
- Wrapper,
- Header,
- Title,
- GreyTitle,
- Bar,
- GreyBar,
- Cover,
- TagsWrapper,
- Content,
- Divider,
- Footer,
- Previous,
- StarIcon,
- StarIcon2,
- StarIcon3,
-} from '../../styles/feature_wall/changelog_feat/changelog_demo'
-
-const ChangeLogDemo: FC = () => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default ChangeLogDemo
diff --git a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroDigest.tsx b/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroDigest.tsx
deleted file mode 100644
index ae6b61cfa..000000000
--- a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroDigest.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { FC, useState, useEffect } from 'react'
-
-import ViewportTracker from '@/widgets/ViewportTracker'
-
-import { DesktopOnly } from '@/widgets/Common'
-import useScrollDir from '@/hooks/useScrollDir'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatHead from '../FeatHead'
-
-import IntroItems from './IntroItems'
-
-import { Wrapper } from '../../styles/feature_wall/changelog_feat/intro_digest'
-import { checkBlockInView } from '../helper'
-
-type TProps = {
- inViewChange: (inView: boolean) => void
-}
-
-const IntroDigest: FC = ({ inViewChange }) => {
- const [inView, setInView] = useState(false)
- const [headInView, setHeadInview] = useState(false)
- const [footInView, setFootInview] = useState(false)
-
- const scrollDir = useScrollDir()
-
- useEffect(() => {
- if (checkBlockInView(headInView, footInView, scrollDir)) {
- setInView(true)
- inViewChange(true)
- } else {
- setInView(false)
- inViewChange(false)
- }
- }, [headInView, footInView, scrollDir, inViewChange])
-
- return (
-
-
- setHeadInview(true)} onLeave={() => setHeadInview(false)} />
-
-
-
-
-
-
-
- setFootInview(true)} onLeave={() => setFootInview(false)} />
-
-
- )
-}
-
-export default IntroDigest
diff --git a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroImage.tsx b/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroImage.tsx
deleted file mode 100644
index 4e92c20fa..000000000
--- a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroImage.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { FC, useEffect, useState } from 'react'
-import useMobileDetect from '@groupher/use-mobile-detect-hook'
-
-import type { TActive } from '@/spec'
-import { DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import ChangelogDemo from './ChangelogDemo'
-
-import { FEAT_TYPE } from '../../constant'
-import BgDots from '../BgDots'
-
-import {
- Wrapper,
- ImageWrapper,
- ColorBlock,
- ColorBlockHolder,
- IconsWrapper,
- Icon1,
- Icon2,
- Icon3,
-} from '../../styles/feature_wall/changelog_feat/intro_image'
-
-type TProps = TActive
-
-const IntroImage: FC = ({ $active }) => {
- const [loaded, setLoaded] = useState(false)
-
- const { isMobile } = useMobileDetect()
-
- useEffect(() => {
- setLoaded(true)
- }, [])
-
- return (
-
-
-
-
-
-
-
- {!loaded && }
-
- {loaded && }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default IntroImage
diff --git a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroItems.tsx b/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroItems.tsx
deleted file mode 100644
index 4422cda20..000000000
--- a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/IntroItems.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { FC } from 'react'
-
-import { SpaceGrow, DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatItem from '../FeatItem'
-import MoreLink from '../MoreLink'
-
-import { FeatList, MobileIntroLists } from '../../styles/feature_wall/intro_items'
-
-const featType = FEAT_TYPE.CHANGELOG
-
-const Contents = () => {
- return (
- <>
-
-
-
-
-
-
- >
- )
-}
-
-const IntroItems: FC = () => {
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default IntroItems
diff --git a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/index.tsx b/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/index.tsx
deleted file mode 100644
index e7a9d577b..000000000
--- a/src/containers/content/LandingPage/FeatureWall/ChangelogFeat/index.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { FC, useState } from 'react'
-
-import { MobileOnly } from '@/widgets/Common'
-
-import IntroDigest from './IntroDigest'
-import IntroImage from './IntroImage'
-import IntroItems from './IntroItems'
-
-import { Wrapper } from '../../styles/feature_wall/changelog_feat'
-
-const ChangelogFeat: FC = () => {
- const [inView, setInView] = useState(false)
-
- return (
-
- setInView(cur)} />
-
-
-
-
-
-
- )
-}
-
-export default ChangelogFeat
diff --git a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/C2H.tsx b/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/C2H.tsx
deleted file mode 100644
index 9d38e02ac..000000000
--- a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/C2H.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { FC } from 'react'
-
-import {
- Wrapper,
- CurlyLineIcon,
- Desc,
- Desc2,
- Desc3,
- Desc4,
-} from '../../styles/feature_wall/curly_line_desc/c2h'
-
-const CurlyLineDesc: FC = () => {
- return (
-
- 常见问题
- 新手指南
- 开发文档
- 配置指南
-
-
- )
-}
-
-export default CurlyLineDesc
diff --git a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/D2K.tsx b/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/D2K.tsx
deleted file mode 100644
index fe0fdf24a..000000000
--- a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/D2K.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { FC } from 'react'
-
-import {
- Wrapper,
- CurlyLineIcon,
- Desc,
- Desc2,
- Desc3,
- Desc4,
-} from '../../styles/feature_wall/curly_line_desc/d2k'
-
-const CurlyLineDesc: FC = () => {
- return (
-
- 功能 x 计划中
- 功能 Z 已完成
- Bug Y 修复中
- Bug Z 已修复
-
-
- )
-}
-
-export default CurlyLineDesc
diff --git a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/K2C.tsx b/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/K2C.tsx
deleted file mode 100644
index 4da20ebd1..000000000
--- a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/K2C.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { FC } from 'react'
-
-import {
- Wrapper,
- CurlyLineIcon,
- Desc,
- Desc2,
- Desc3,
- Desc4,
-} from '../../styles/feature_wall/curly_line_desc/k2c'
-
-const CurlyLineDesc: FC = () => {
- return (
-
- 新增功能 x
- 修复问题 Y
- 解决性能问题 G
- 感谢 A,B,C 用户的贡献
-
-
- )
-}
-
-export default CurlyLineDesc
diff --git a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/U2D.tsx b/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/U2D.tsx
deleted file mode 100644
index ae4f463c6..000000000
--- a/src/containers/content/LandingPage/FeatureWall/CurlyLineDesc/U2D.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { FC } from 'react'
-
-import {
- Wrapper,
- Circle,
- CurlyLineIcon,
- Desc,
- Desc2,
- Desc3,
- Desc4,
- Desc5,
-} from '../../styles/feature_wall/curly_line_desc/u2d'
-
-const CurlyLineDesc: FC = () => {
- return (
-
-
- 收集沉淀
- 细节讨论
- SEO 友好
- 分享反馈
- 直达团队
-
-
- )
-}
-
-export default CurlyLineDesc
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/CommentItem.tsx b/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/CommentItem.tsx
deleted file mode 100644
index 701d64c33..000000000
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/CommentItem.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { FC } from 'react'
-
-import {
- Avatar,
- Wrapper,
- RightPart,
- Bar,
-} from '../../../styles/feature_wall/discuss_feat/discuss_demo/comment_item'
-
-type TProps = {
- opacity?: number
- width?: number
- index?: number
-}
-
-const COMEMNTS = [
- {
- name: 'xy',
- color: '#bb9ac4',
- bg: '#fbf6fb',
- },
- {
- name: 'lm',
- color: '#5660B8',
- bg: '#F7F8FF',
- },
- {
- name: 'bl',
- color: '#BF9B46',
- bg: '#FEFBF4',
- },
-]
-
-const CommentItem: FC = ({ opacity = 1, index = 0, width = 30 }) => {
- const comment = COMEMNTS[index]
-
- return (
-
-
- {comment.name}
-
-
-
- {index === 1 ? (
-
- ) : (
-
- )}
-
-
-
- )
-}
-
-export default CommentItem
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/index.tsx b/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/index.tsx
deleted file mode 100644
index abfeb7bda..000000000
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/DiscussDemo/index.tsx
+++ /dev/null
@@ -1,68 +0,0 @@
-import { FC } from 'react'
-
-import { Space, SpaceGrow } from '@/widgets/Common'
-
-import PostItem from './PostItem'
-import CommentItem from './CommentItem'
-
-import {
- Wrapper,
- ListsWrapper,
- DetailWrapper,
- Status,
- UpvoteWrapper,
- ViewIcon,
- UpvoteIcon,
- CommentIcon,
- Count,
- Bar,
- CommentsHeader,
-} from '../../../styles/feature_wall/discuss_feat/discuss_demo'
-
-const DiscussDemo: FC = () => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 赞同
- 86
-
-
-
-
- 120
-
-
- 18
-
-
-
-
-
-
-
- 评论 18
-
-
-
-
-
-
-
-
- )
-}
-
-export default DiscussDemo
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroDigest.tsx b/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroDigest.tsx
deleted file mode 100644
index 3460bd56c..000000000
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroDigest.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import { FC, useState, useEffect } from 'react'
-
-import { DesktopOnly } from '@/widgets/Common'
-import ViewportTracker from '@/widgets/ViewportTracker'
-import useScrollDir from '@/hooks/useScrollDir'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatHead from '../FeatHead'
-
-import IntroItems from './IntroItems'
-import { Wrapper } from '../../styles/feature_wall/discuss_feat/intro_digest'
-import { checkBlockInView } from '../helper'
-
-type TProps = {
- inViewChange: (inView: boolean) => void
-}
-
-const IntroDigest: FC = ({ inViewChange }) => {
- const [inView, setInView] = useState(false)
- const [headInView, setHeadInview] = useState(false)
- const [footInView, setFootInview] = useState(false)
-
- const scrollDir = useScrollDir()
-
- useEffect(() => {
- if (checkBlockInView(headInView, footInView, scrollDir)) {
- setInView(true)
- inViewChange(true)
- } else {
- setInView(false)
- inViewChange(false)
- }
- }, [headInView, footInView, scrollDir, inViewChange])
-
- return (
-
-
- setHeadInview(true)} onLeave={() => setHeadInview(false)} />
-
-
-
-
-
-
-
- setFootInview(true)} onLeave={() => setFootInview(false)} />
-
-
- )
-}
-
-export default IntroDigest
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroImage.tsx b/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroImage.tsx
deleted file mode 100644
index e7a8c75fd..000000000
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroImage.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { FC, useEffect, useState } from 'react'
-import useMobileDetect from '@groupher/use-mobile-detect-hook'
-
-import type { TActive } from '@/spec'
-import { DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-import BgDots from '../BgDots'
-
-import DiscussDemo from './DiscussDemo'
-
-import {
- Wrapper,
- ImageWrapper,
- ColorBlock,
- ColorBlockHolder,
- IconsWrapper,
- Icon1,
- Icon2,
- Icon3,
-} from '../../styles/feature_wall/discuss_feat/intro_image'
-
-type TProps = TActive
-
-const IntroImage: FC = ({ $active }) => {
- const { isMobile } = useMobileDetect()
-
- const [loaded, setLoaded] = useState(false)
-
- useEffect(() => {
- setLoaded(true)
- }, [])
-
- return (
-
-
-
-
-
-
- {!loaded && }
-
- {loaded && }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default IntroImage
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroItems.tsx b/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroItems.tsx
deleted file mode 100644
index 60c8372a4..000000000
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/IntroItems.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { FC } from 'react'
-
-import { SpaceGrow, DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatItem from '../FeatItem'
-import MoreLink from '../MoreLink'
-
-import { FeatList, MobileIntroLists } from '../../styles/feature_wall/intro_items'
-
-const featType = FEAT_TYPE.DISCUSS
-
-const Contents = () => {
- return (
- <>
-
-
-
-
-
-
-
- >
- )
-}
-
-const IntroItems: FC = () => {
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default IntroItems
diff --git a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/index.tsx b/src/containers/content/LandingPage/FeatureWall/DiscussFeat/index.tsx
deleted file mode 100644
index 78046f0f0..000000000
--- a/src/containers/content/LandingPage/FeatureWall/DiscussFeat/index.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { FC, useState } from 'react'
-
-import { MobileOnly } from '@/widgets/Common'
-
-import IntroDigest from './IntroDigest'
-import IntroImage from './IntroImage'
-import IntroItems from './IntroItems'
-
-import { Wrapper } from '../../styles/feature_wall/discuss_feat'
-
-const DiscussFeat: FC = () => {
- const [inView, setInView] = useState(false)
-
- return (
-
- {
- setInView(cur)
- }}
- />
-
-
-
-
-
- )
-}
-
-export default DiscussFeat
diff --git a/src/containers/content/LandingPage/FeatureWall/FeatHead.tsx b/src/containers/content/LandingPage/FeatureWall/FeatHead.tsx
deleted file mode 100644
index b6fc6a050..000000000
--- a/src/containers/content/LandingPage/FeatureWall/FeatHead.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { FC } from 'react'
-
-import type { TActive } from '@/spec'
-
-import type { TFeatType } from '../spec'
-import { FEAT } from '../constant'
-
-import { Wrapper, Title, Hint, Desc } from '../styles/feature_wall/feat_head'
-
-type TProps = {
- featType: TFeatType
- title: string
- desc: string
- alignRight?: boolean
-} & TActive
-
-const FeatHead: FC = ({ title, desc, featType, $active, alignRight = false }) => {
- return (
-
-
- {title} {FEAT[featType].HINT}
-
- {desc}
-
- )
-}
-
-export default FeatHead
diff --git a/src/containers/content/LandingPage/FeatureWall/FeatItem.tsx b/src/containers/content/LandingPage/FeatureWall/FeatItem.tsx
deleted file mode 100644
index 3c10926dd..000000000
--- a/src/containers/content/LandingPage/FeatureWall/FeatItem.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { FC } from 'react'
-
-import type { TFeatType } from '../spec'
-import { Wrapper, Text, CheckIcon } from '../styles/feature_wall/feat_item'
-
-type TProps = {
- featType: TFeatType
- text?: string
-}
-
-const FeatItem: FC = ({ text = '--', featType }) => {
- return (
-
-
- {text}
-
- )
-}
-
-export default FeatItem
diff --git a/src/containers/content/LandingPage/FeatureWall/HelpFeat/HelpDemo.tsx b/src/containers/content/LandingPage/FeatureWall/HelpFeat/HelpDemo.tsx
deleted file mode 100644
index 570bacd31..000000000
--- a/src/containers/content/LandingPage/FeatureWall/HelpFeat/HelpDemo.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { FC } from 'react'
-
-import { SpaceGrow } from '@/widgets/Common'
-import {
- Wrapper,
- Sidebar,
- PinnedItem,
- BookIcon,
- QuestionIcon,
- Content,
- Footer,
- LeftArrowIcon,
- RightArrowIcon,
- InnerContent,
- Cover,
- Bar,
- ShareIcon,
-} from '../../styles/feature_wall/help_feat/help_demo'
-
-const HelpItem: FC = () => {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default HelpItem
diff --git a/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroDigest.tsx b/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroDigest.tsx
deleted file mode 100644
index 65207983b..000000000
--- a/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroDigest.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { FC, useState, useEffect } from 'react'
-
-import useScrollDir from '@/hooks/useScrollDir'
-
-import { DesktopOnly } from '@/widgets/Common'
-import ViewportTracker from '@/widgets/ViewportTracker'
-
-import { FEAT_TYPE } from '../../constant'
-import FeatHead from '../FeatHead'
-import IntroItems from './IntroItems'
-
-import { Wrapper } from '../../styles/feature_wall/help_feat/intro_digest'
-import { checkBlockInView } from '../helper'
-
-type TProps = {
- inViewChange: (inView: boolean) => void
- alignRight?: boolean
-}
-
-const IntroDigest: FC = ({ inViewChange, alignRight = false }) => {
- const [inView, setInView] = useState(false)
- const [headInView, setHeadInview] = useState(false)
- const [footInView, setFootInview] = useState(false)
-
- const scrollDir = useScrollDir()
-
- useEffect(() => {
- if (checkBlockInView(headInView, footInView, scrollDir)) {
- setInView(true)
- inViewChange(true)
- } else {
- setInView(false)
- inViewChange(false)
- }
- }, [headInView, footInView, scrollDir, inViewChange])
-
- return (
-
-
- setHeadInview(true)} onLeave={() => setHeadInview(false)} />
-
-
-
-
-
-
- setFootInview(true)} onLeave={() => setFootInview(false)} />
-
-
- )
-}
-
-export default IntroDigest
diff --git a/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroImage.tsx b/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroImage.tsx
deleted file mode 100644
index d29b3cae9..000000000
--- a/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroImage.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { FC, useEffect, useState } from 'react'
-import useMobileDetect from '@groupher/use-mobile-detect-hook'
-
-import type { TActive } from '@/spec'
-import { DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-import BgDots from '../BgDots'
-
-import HelpDemo from './HelpDemo'
-
-import {
- Wrapper,
- ImageWrapper,
- ColorBlock,
- ColorBlockHolder,
- IconsWrapper,
- Icon1,
- Icon2,
- Icon3,
-} from '../../styles/feature_wall/help_feat/intro_image'
-
-type TProps = TActive
-
-const IntroImage: FC = ({ $active }) => {
- const [loaded, setLoaded] = useState(false)
-
- const { isMobile } = useMobileDetect()
-
- useEffect(() => {
- setLoaded(true)
- }, [])
-
- return (
-
-
-
-
-
-
-
- {!loaded && }
-
- {loaded && }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default IntroImage
diff --git a/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroItems.tsx b/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroItems.tsx
deleted file mode 100644
index 565303eaf..000000000
--- a/src/containers/content/LandingPage/FeatureWall/HelpFeat/IntroItems.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { FC } from 'react'
-
-import { SpaceGrow, DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatItem from '../FeatItem'
-import MoreLink from '../MoreLink'
-
-import { FeatList, MobileIntroLists } from '../../styles/feature_wall/intro_items'
-
-const featType = FEAT_TYPE.HELP
-
-const Contents = () => {
- return (
- <>
-
-
-
-
-
-
-
- >
- )
-}
-
-const IntroItems: FC = () => {
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default IntroItems
diff --git a/src/containers/content/LandingPage/FeatureWall/HelpFeat/index.tsx b/src/containers/content/LandingPage/FeatureWall/HelpFeat/index.tsx
deleted file mode 100644
index 842aed90e..000000000
--- a/src/containers/content/LandingPage/FeatureWall/HelpFeat/index.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { FC, useState } from 'react'
-
-import { DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import IntroDigest from './IntroDigest'
-import IntroImage from './IntroImage'
-
-import IntroItems from './IntroItems'
-
-import { Wrapper } from '../../styles/feature_wall/help_feat'
-
-const KanbanFeat: FC = () => {
- const [inView, setInView] = useState(false)
-
- return (
-
-
-
- setInView(cur)} />
-
-
-
- setInView(cur)} alignRight />
-
-
-
-
- )
-}
-
-export default KanbanFeat
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroDigest.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroDigest.tsx
deleted file mode 100644
index 1a17583de..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroDigest.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { FC, useState, useEffect } from 'react'
-
-import { DesktopOnly } from '@/widgets/Common'
-import ViewportTracker from '@/widgets/ViewportTracker'
-import useScrollDir from '@/hooks/useScrollDir'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatHead from '../FeatHead'
-
-import IntroItems from './IntroItems'
-import { Wrapper } from '../../styles/feature_wall/kanban_feat/intro_digest'
-import { checkBlockInView } from '../helper'
-
-type TProps = {
- inViewChange: (inView: boolean) => void
- alignRight?: boolean
-}
-
-const IntroDigest: FC = ({ inViewChange, alignRight = false }) => {
- const [inView, setInView] = useState(false)
- const [headInView, setHeadInview] = useState(false)
- const [footInView, setFootInview] = useState(false)
-
- const scrollDir = useScrollDir()
-
- useEffect(() => {
- if (checkBlockInView(headInView, footInView, scrollDir)) {
- setInView(true)
- inViewChange(true)
- } else {
- setInView(false)
- inViewChange(false)
- }
- }, [headInView, footInView, scrollDir, inViewChange])
-
- return (
-
-
- setHeadInview(true)} onLeave={() => setHeadInview(false)} />
-
-
-
-
-
-
- setFootInview(true)} onLeave={() => setFootInview(false)} />
-
-
- )
-}
-
-export default IntroDigest
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroImage.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroImage.tsx
deleted file mode 100644
index bc8b6a9fb..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroImage.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { FC, useEffect, useState } from 'react'
-// import { Parallax } from 'react-scroll-parallax'
-import useMobileDetect from '@groupher/use-mobile-detect-hook'
-
-import type { TActive } from '@/spec'
-import { DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-import BgDots from '../BgDots'
-
-import KanbanDemo from './KanbanDemo'
-
-import {
- Wrapper,
- ImageWrapper,
- ColorBlock,
- ColorBlockHolder,
- IconsWrapper,
- Icon1,
- Icon2,
- Icon3,
-} from '../../styles/feature_wall/kanban_feat/intro_image'
-
-type TProps = TActive
-
-const IntroImage: FC = ({ $active }) => {
- const [loaded, setLoaded] = useState(false)
- const { isMobile } = useMobileDetect()
-
- useEffect(() => {
- setLoaded(true)
- }, [])
-
- return (
-
-
-
-
-
-
-
- {!loaded && }
-
- {loaded && }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default IntroImage
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroItems.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroItems.tsx
deleted file mode 100644
index c754ac303..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/IntroItems.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { FC } from 'react'
-
-import { SpaceGrow, DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import { FEAT_TYPE } from '../../constant'
-
-import FeatItem from '../FeatItem'
-import MoreLink from '../MoreLink'
-
-import { FeatList, MobileIntroLists } from '../../styles/feature_wall/intro_items'
-
-const featType = FEAT_TYPE.KANBAN
-
-const Contents = () => {
- return (
- <>
-
-
-
-
-
-
- >
- )
-}
-
-const IntroItems: FC = () => {
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default IntroItems
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/Banner.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/Banner.tsx
deleted file mode 100644
index 1f27d5e31..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/Banner.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { FC } from 'react'
-
-import { SpaceGrow } from '@/widgets/Common'
-import {
- Wrapper,
- Header,
- KanbenIcon,
- Bar,
- Item,
- Title,
- Icon1,
- Icon2,
- Icon3,
-} from '../../../styles/feature_wall/kanban_feat/banner'
-
-const Banner: FC = () => {
- return (
-
-
- -
-
- 已排期
-
-
- -
-
- 进行中
-
-
- -
-
- 已完成
-
-
- )
-}
-
-export default Banner
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/KanbanItem.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/KanbanItem.tsx
deleted file mode 100644
index 2625fd163..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/KanbanItem.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { FC } from 'react'
-
-import {
- Wrapper,
- Bar,
- Footer,
- UpvoteIcon,
- Count,
-} from '../../../styles/feature_wall/kanban_feat/kanban_demo/kanban_item'
-
-type TProps = {
- opacity?: number
- count?: number
- width?: number
-}
-
-const KanbanItem: FC = ({ opacity = 1, count = 9, width = 80 }) => {
- return (
-
-
-
-
-
-
- )
-}
-
-export default KanbanItem
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/index.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/index.tsx
deleted file mode 100644
index 034457a09..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/KanbanDemo/index.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { FC } from 'react'
-
-import Banner from './Banner'
-import KanbanItem from './KanbanItem'
-
-import { BoardsWrapper, Board } from '../../../styles/feature_wall/kanban_feat/kanban_demo'
-
-const KanbanDemo: FC = () => {
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default KanbanDemo
diff --git a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/index.tsx b/src/containers/content/LandingPage/FeatureWall/KanbanFeat/index.tsx
deleted file mode 100644
index ac8035b59..000000000
--- a/src/containers/content/LandingPage/FeatureWall/KanbanFeat/index.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { FC, useState } from 'react'
-
-import { DesktopOnly, MobileOnly } from '@/widgets/Common'
-
-import IntroDigest from './IntroDigest'
-import IntroImage from './IntroImage'
-import IntroItems from './IntroItems'
-
-import { Wrapper } from '../../styles/feature_wall/kanban_feat'
-
-const KanbanFeat: FC = () => {
- const [inView, setInView] = useState(false)
-
- return (
-
-
-
- setInView(cur)} />
-
-
-
- setInView(cur)} alignRight />
-
-
-
-
- )
-}
-
-export default KanbanFeat
diff --git a/src/containers/content/LandingPage/FeatureWall/MoreLink.tsx b/src/containers/content/LandingPage/FeatureWall/MoreLink.tsx
deleted file mode 100644
index 0536eebc7..000000000
--- a/src/containers/content/LandingPage/FeatureWall/MoreLink.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import { FC } from 'react'
-
-import { COLOR_NAME } from '@/constant/colors'
-import ArrowButton from '@/widgets/Buttons/ArrowButton'
-
-import type { TFeatType } from '../spec'
-import { Wrapper } from '../styles/feature_wall/more_link'
-
-type TProps = {
- title?: string
- href: string
- featType: TFeatType
-}
-
-const LINK_COLOR = {
- DISCUSS: COLOR_NAME.PURPLE,
- CHANGELOG: COLOR_NAME.RED,
- HELP: COLOR_NAME.ORANGE,
- KANBAN: COLOR_NAME.BLUE,
-}
-
-const MoreLink: FC = ({ title = '了解更多', href, featType }) => {
- return (
-
- {title}
-
- )
-}
-
-export default MoreLink
diff --git a/src/containers/content/LandingPage/FeatureWall/UserVoice.tsx b/src/containers/content/LandingPage/FeatureWall/UserVoice.tsx
deleted file mode 100644
index c715ac418..000000000
--- a/src/containers/content/LandingPage/FeatureWall/UserVoice.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { FC } from 'react'
-import useMobileDetect from '@groupher/use-mobile-detect-hook'
-import { Parallax } from 'react-scroll-parallax'
-
-import { COLOR_NAME } from '@/constant/colors'
-
-import {
- Wrapper,
- Card,
- Avatar,
- Title,
- TreeWrapper,
- TreesIcon,
-} from '../styles/feature_wall/user_voice'
-import { TColorName } from '@/spec'
-
-type TVoiceCard = {
- color: TColorName
- text: string
- uname: string
-}
-
-const VoiceCard: FC = ({ color, text, uname }) => {
- return (
-
- {uname}
- {text}
-
- )
-}
-
-const UserVoice: FC = () => {
- const { isMobile } = useMobileDetect()
-
- const speed = 20
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default UserVoice
diff --git a/src/containers/content/LandingPage/FeatureWall/helper.ts b/src/containers/content/LandingPage/FeatureWall/helper.ts
deleted file mode 100644
index 68a900b5d..000000000
--- a/src/containers/content/LandingPage/FeatureWall/helper.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { TScrollDirection } from '@/spec'
-
-/**
- * check feat block is in view
- */
-export const checkBlockInView = (
- headInView: boolean,
- footInView: boolean,
- scrollDir: TScrollDirection,
-): boolean => {
- return (
- (headInView && footInView) ||
- (headInView && scrollDir === 'up') ||
- (footInView && scrollDir === 'up') ||
- (headInView && scrollDir === 'down') ||
- (footInView && !headInView && scrollDir === 'down')
- )
-}
-
-export const holder = 1
diff --git a/src/containers/content/LandingPage/FeatureWall/index.tsx b/src/containers/content/LandingPage/FeatureWall/index.tsx
deleted file mode 100644
index 7c48a3eee..000000000
--- a/src/containers/content/LandingPage/FeatureWall/index.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { FC } from 'react'
-
-import UserVoice from './UserVoice'
-
-import ChangelogFeat from './ChangelogFeat'
-import DiscussFeat from './DiscussFeat'
-import KanbanFeat from './KanbanFeat'
-import HelpFeat from './HelpFeat'
-
-import CurlyLineU2D from './CurlyLineDesc/U2D'
-import CurlyLineD2K from './CurlyLineDesc/D2K'
-import CurlyLineK2C from './CurlyLineDesc/K2C'
-import CurlyLineC2H from './CurlyLineDesc/C2H'
-
-import { Wrapper, Slogan, Title, Desc, Wall } from '../styles/feature_wall'
-
-const FeatureWall: FC = () => {
- return (
-
-
- 为团队和用户之间架设桥梁
- 你只需专注产品的核心工作,将那些“无聊”却又重要的体力活交给 Groupher
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default FeatureWall
diff --git a/src/containers/content/LandingPage/UsersWall/index.tsx b/src/containers/content/LandingPage/UsersWall/index.tsx
index 799512600..37f0bae97 100644
--- a/src/containers/content/LandingPage/UsersWall/index.tsx
+++ b/src/containers/content/LandingPage/UsersWall/index.tsx
@@ -1,5 +1,4 @@
-import { FC, ReactNode, useState, useEffect } from 'react'
-import useMobileDetect from '@groupher/use-mobile-detect-hook'
+import { FC, ReactNode } from 'react'
import { COLOR_NAME } from '@/constant/colors'
import { mockUsers } from '@/mock'
@@ -74,20 +73,13 @@ const CardsList = () => {
}
const UsersWall: FC = () => {
- const [loaded, setLoaded] = useState(false)
- const { isMobile } = useMobileDetect()
-
- useEffect(() => {
- setLoaded(true)
- }, [])
-
return (
被众多优秀开发者和团队青睐
从独立开发者到中小型创业团队,我们用产品力回报信任
- {loaded && }
+
diff --git a/src/containers/content/LandingPage/constant.ts b/src/containers/content/LandingPage/constant.ts
deleted file mode 100644
index 5b8bba87e..000000000
--- a/src/containers/content/LandingPage/constant.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import type { TFeatType } from './spec'
-
-export const FEAT = {
- DISCUSS: {
- COLOR: '#ad86bf',
- HINT: 'Discuss',
- },
-
- KANBAN: {
- COLOR: '#6399ff',
- HINT: 'Roadmap',
- },
-
- CHANGELOG: {
- COLOR: '#ec6760',
- HINT: 'Changelog',
- },
-
- HELP: {
- COLOR: '#ce9f6f',
- HINT: 'HelpDesk',
- },
-}
-
-export const FEAT_TYPE = {
- CHANGELOG: 'CHANGELOG',
- DISCUSS: 'DISCUSS',
- HELP: 'HELP',
- KANBAN: 'KANBAN',
-} as Record
diff --git a/src/containers/content/LandingPage/index.tsx b/src/containers/content/LandingPage/index.tsx
index 467d39fab..eb2906bf2 100644
--- a/src/containers/content/LandingPage/index.tsx
+++ b/src/containers/content/LandingPage/index.tsx
@@ -4,7 +4,7 @@
*/
import { FC, useEffect, useState } from 'react'
-import dynamic from 'next/dynamic'
+// import dynamic from 'next/dynamic'
// import { ParallaxProvider } from 'react-scroll-parallax'
import { useRouter } from 'next/navigation'
import { observer } from 'mobx-react-lite'
@@ -19,10 +19,11 @@ import FaqList from '@/widgets/FaqList'
import HomeHeader from '@/widgets/HomeHeader'
import CoverImage from './CoverImage'
-import WallpaperBar from './WallpaperBar'
+// import WallpaperBar from './WallpaperBar'
-import FeatureWall from './FeatureWall'
+import ArticlesIntroTabs from './ArticlesIntroTabs'
import TechStacks from './TechStacks'
+import DashboardIntros from './DashboardIntros'
import EnjoyDev from './EnjoyDev'
import UsersWall from './UsersWall'
@@ -49,10 +50,6 @@ import {
import { useInit, changeGlowEffect } from './logic'
-const ParallaxProvider = dynamic(() => import('./Parallax'), {
- ssr: false,
-})
-
const LandingPage: FC = () => {
const router = useRouter()
const store = useStore()
@@ -69,7 +66,7 @@ const LandingPage: FC = () => {
return (
-
+ {/* */}
@@ -113,28 +110,18 @@ const LandingPage: FC = () => {
- setBannerLayout(layout)}
- />
+ /> */}
-
-
-
-
-
-
+
-
-
-
-
-
-
-
+ {/* */}
+
diff --git a/src/containers/content/LandingPage/spec.d.ts b/src/containers/content/LandingPage/spec.d.ts
deleted file mode 100644
index 55f7f51b5..000000000
--- a/src/containers/content/LandingPage/spec.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export type TFeatType = 'CHANGELOG' | 'HELP' | 'KANBAN' | 'DISCUSS'
diff --git a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/Star.tsx b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/Star.tsx
similarity index 100%
rename from src/containers/content/LandingPage/styles/feature_wall/changelog_feat/Star.tsx
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/Star.tsx
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/cover_preview.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/cover_preview.ts
new file mode 100644
index 000000000..7cdcb0012
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/cover_preview.ts
@@ -0,0 +1,39 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+import BlocksSolidSVG from '@/icons/BlocksSolid'
+
+export const Wrapper = styled.div`
+ ${css.column()};
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ background: ${theme('htmlBg')};
+ width: 180px;
+ height: 80px;
+ box-shadow: rgb(201 201 201 / 30%) 0px 1px 10px 0px, rgb(199 199 199 / 15%) 0px 2px 6px 2px;
+ box-shadow: ${theme('button.boxShadow')};
+ border-top-left-radius: 6px;
+ padding: 5px;
+`
+export const Header = styled.div`
+ ${css.row('align-center')};
+ margin-bottom: 15px;
+ margin-left: 3px;
+`
+export const Dot = styled.div`
+ ${css.circle(5)};
+ background: ${theme('hint')};
+ opacity: 0.3;
+ margin-left: 5px;
+`
+export const BlocksWrapper = styled.div`
+ ${css.row('align-center')};
+`
+export const BlocksSolidIcon = styled(BlocksSolidSVG)`
+ ${css.size(40)};
+ fill: ${theme('hint')};
+ opacity: 0.1;
+ margin-left: 5px;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/index.ts
new file mode 100644
index 000000000..7eceb05f8
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/index.ts
@@ -0,0 +1,69 @@
+import styled from 'styled-components'
+
+import { Bar as BarBase } from '@/widgets/Common'
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.column('align-center')};
+ width: 300px;
+ height: 280px;
+ z-index: 2;
+ background: ${theme('htmlBg')};
+ border-radius: 10px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ box-shadow: rgba(100, 100, 111, 0.1) 1px 2px 29px 0px;
+
+ position: relative;
+ margin-left: -80px;
+ margin-top: -20px;
+`
+export const Header = styled.div`
+ ${css.column()};
+ width: 200px;
+ margin-top: 25px;
+ margin-bottom: 10px;
+`
+export const Cover = styled.div`
+ position: relative;
+ overflow: hidden;
+ width: 200px;
+ height: 100px;
+ border-radius: 5px;
+ margin-bottom: 5px;
+
+ background: ${theme('rainbow.redBg')};
+ border: 1px dotted;
+ border-color: ${theme('rainbow.redBg')};
+`
+export const Title = styled.div`
+ ${css.row('align-center')};
+ color: ${theme('article.digest')};
+ font-weight: 500;
+ font-size: 16px;
+`
+export const Version = styled.span`
+ color: ${theme('hint')};
+ opacity: 0.8;
+ font-size: 15px;
+ margin-left: 8px;
+`
+export const TagsWrapper = styled.div`
+ ${css.row('align-center')};
+ margin-top: 2px;
+ color: ${theme('hint')};
+ gap: 0 8px;
+`
+export const TagItem = styled.div`
+ ${css.row('align-center')};
+ font-size: 12px;
+`
+export const Content = styled.div`
+ ${css.column()};
+ margin-top: 15px;
+ width: 200px;
+ gap: 10px;
+`
+export const Bar = styled(BarBase)`
+ background: ${theme('hint')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/toolbox.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/toolbox.ts
new file mode 100644
index 000000000..af92ae2ad
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/editor_preview/toolbox.ts
@@ -0,0 +1,58 @@
+import styled from 'styled-components'
+
+import ArchSVG from '@/icons/Arch'
+import RotateSVG from '@/icons/Rotate'
+import ShadowSVG from '@/icons/Shadow'
+import BlocksSVG from '@/icons/Blocks'
+import LightSVG from '@/icons/FlashLight'
+import RatioSVG from '@/icons/Ratio'
+import SizeSVG from '@/icons/ImageSize'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-both')};
+ gap: 0 3px;
+ width: 276px;
+ height: 38px;
+ border-radius: 5px;
+ background: ${theme('alphaBg')};
+ margin-top: -14px;
+ z-index: 10;
+ box-shadow: rgb(108 108 108 / 16%) 0px 3px 36px 0px, rgba(0, 0, 0, 0.06) 0px 0px 0px 1px;
+`
+export const Item = styled.div`
+ background: ${theme('htmlBg')};
+ ${css.size(30)};
+ ${css.column('align-both')};
+ box-shadow: ${theme('button.boxShadow')};
+ padding: 2px;
+ padding-top: 3px;
+ border-radius: 4px;
+`
+export const Title = styled.div`
+ font-size: 9px;
+ color: ${theme('hint')};
+ margin-top: 3px;
+`
+export const ColorBall = styled.div`
+ ${css.circle(10)};
+ margin-top: -2px;
+ background: ${theme('rainbow.redBg')};
+`
+// icons
+const commonIcon = (comp) => {
+ return styled(comp)`
+ ${css.size(12)};
+ fill: ${theme('article.digest')};
+ `
+}
+export const ICON = {
+ Arch: commonIcon(ArchSVG),
+ Rotate: commonIcon(RotateSVG),
+ Ratio: commonIcon(RatioSVG),
+ Shadow: commonIcon(ShadowSVG),
+ Size: commonIcon(SizeSVG),
+ Position: commonIcon(BlocksSVG),
+ Light: commonIcon(LightSVG),
+}
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar.ts
new file mode 100644
index 000000000..83bfcff37
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar.ts
@@ -0,0 +1,37 @@
+import styled from 'styled-components'
+
+import Img from '@/Img'
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-center')};
+ gap: 0 15px;
+ width: 254px;
+ height: 42px;
+ z-index: 2;
+ padding: 0 15px;
+ background: ${theme('htmlBg')};
+ border-radius: 10px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ box-shadow: rgba(100, 100, 111, 0.1) 1px 2px 29px 0px;
+
+ position: absolute;
+ bottom: 142px;
+ right: 68px;
+`
+export const EmojiImg = styled(Img)`
+ ${css.size(20)};
+ opacity: 0.8;
+`
+export const Item = styled.div`
+ ${css.row('align-both')};
+ height: 1005;
+`
+export const Count = styled.div`
+ font-size: 16px;
+ font-weight: 500;
+ color: ${theme('article.digest')};
+ opacity: 0.8;
+ margin-left: 6px;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar_bad.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar_bad.ts
new file mode 100644
index 000000000..eb95cc8a5
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/emotion_bar_bad.ts
@@ -0,0 +1,17 @@
+import styled from 'styled-components'
+
+import { theme } from '@/css'
+
+import { Wrapper as WrapperBase } from './emotion_bar'
+
+export { EmojiImg, Item, Count } from './emotion_bar'
+
+export const Wrapper = styled(WrapperBase)`
+ width: 200px;
+ position: absolute;
+ bottom: 60px;
+ right: 50px;
+ transform: rotate(3deg);
+ background: ${theme('alphaBg2')};
+ opacity: 0.8;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/index.ts
new file mode 100644
index 000000000..5b6698de9
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/index.ts
@@ -0,0 +1,11 @@
+import styled from 'styled-components'
+
+import css from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-start')};
+ margin-right: -10px;
+ position: relative;
+`
+
+export const holder = 1
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/footer.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/footer.ts
new file mode 100644
index 000000000..4e03df293
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/footer.ts
@@ -0,0 +1,41 @@
+import styled from 'styled-components'
+
+import UpvoteSVG from '@/icons/Upvote'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-center', 'justify-between')};
+ margin-top: 14px;
+ width: 200px;
+`
+export const UpvoteWrapper = styled.div`
+ ${css.row('align-both')};
+ margin-left: -4px;
+ height: 18px;
+ width: 38px;
+ opacity: 0.8;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ border-radius: 4px;
+`
+export const UpvoteIcon = styled(UpvoteSVG)`
+ ${css.size(11)};
+ fill: ${theme('article.digest')};
+`
+export const UpvoteCount = styled.div`
+ color: ${theme('article.digest')};
+ font-weight: 500;
+ font-size: 10px;
+ margin-left: 2px;
+`
+export const UsersWrapper = styled.div`
+ transform: scale(0.85);
+ margin-left: 3px;
+ opacity: 0.8;
+`
+export const PublishDate = styled.div`
+ color: ${theme('hint')};
+ font-size: 10px;
+ opacity: 0.8;
+`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/changelog_demo.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/index.ts
similarity index 54%
rename from src/containers/content/LandingPage/styles/feature_wall/changelog_feat/changelog_demo.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/index.ts
index 5f1c25121..4c3233d6c 100644
--- a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/changelog_demo.ts
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/changelog_demo/main_list/index.ts
@@ -2,96 +2,93 @@ import styled from 'styled-components'
import { Bar as BarBase } from '@/widgets/Common'
-import css, { theme, animate } from '@/css'
+import css, { theme } from '@/css'
-import StarSVG from './Star'
+import StarSVG from '../../Star'
export const Wrapper = styled.div`
- ${css.column('align-both')};
+ ${css.column('align-start')};
+ width: 360px;
+ height: 460px;
+ z-index: 2;
+ background: ${theme('htmlBg')};
+ border-radius: 10px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ box-shadow: rgba(100, 100, 111, 0.1) 1px 2px 29px 0px;
+
position: relative;
- padding-left: 10px;
+ padding-left: 40px;
+ margin-top: 18px;
`
export const Header = styled.div`
${css.column()};
- width: 260px;
+ width: 200px;
margin-top: 25px;
margin-bottom: 10px;
`
export const Cover = styled.div`
- width: 260px;
- height: 140px;
+ position: relative;
+ overflow: hidden;
+ width: 200px;
+ height: 100px;
border-radius: 5px;
- margin-top: 5px;
margin-bottom: 5px;
- background: linear-gradient(137deg, rgba(244, 183, 180, 1) 52%, rgba(235, 171, 62, 0.3) 100%);
- backdrop-filter: blur(5px);
-
- opacity: 0.4;
+ background: ${theme('hoverBg')};
+ border: 1px dotted;
+ border-color: ${theme('hoverBg')};
`
export const Title = styled.div`
${css.row('align-center')};
- color: #f9b7b6;
- font-weight: 600;
- font-size: 12px;
-`
-export const GreyTitle = styled(Title)`
color: ${theme('article.digest')};
+ font-weight: 500;
+ font-size: 16px;
+`
+export const Version = styled.span`
+ color: ${theme('hint')};
+ opacity: 0.8;
+ font-size: 15px;
+ margin-left: 8px;
`
export const TagsWrapper = styled.div`
${css.row('align-center')};
- margin-top: 10px;
+ margin-top: 2px;
+ color: ${theme('hint')};
+ gap: 0 8px;
+`
+export const TagItem = styled.div`
+ ${css.row('align-center')};
+ font-size: 12px;
`
export const Content = styled.div`
${css.column()};
margin-top: 15px;
- width: 260px;
+ width: 200px;
gap: 10px;
`
-export const Footer = styled.div`
- ${css.row('align-center', 'justify-between')};
- margin-top: 20px;
- width: 260px;
-`
export const Divider = styled.div`
width: 300px;
height: 1px;
-
- border-bottom: 1px solid transparent;
- border-image: linear-gradient(0.35turn, transparent, #f9b7b6, #f9b7b6, #f9b7b6, transparent);
-
- border-image-slice: 1;
-
+ background: ${theme('divider')};
margin-top: 30px;
-
- opacity: 0.5;
`
-
export const Bar = styled(BarBase)`
- background: #f9b7b6;
-`
-
-export const GreyBar = styled(BarBase)`
- background: ${theme('article.digest')};
+ background: ${theme('hint')};
`
export const Previous = styled.div`
- opacity: 0.2;
+ opacity: 0.75;
`
export const StarIcon = styled(StarSVG)`
${css.size(13)};
- fill: #f9b7b6;
+ fill: ${theme('rainbow.orange')};
position: absolute;
- top: 60px;
- right: 100px;
+ top: 140px;
+ left: 30px;
filter: drop-shadow(2px 4px 6px #f1cac9);
z-index: 3;
- animation: ${animate.blinker} 3s linear infinite alternate;
-
- ${css.media.mobile`
- animation: none;
- `};
`
export const StarIcon2 = styled(StarSVG)`
@@ -99,12 +96,11 @@ export const StarIcon2 = styled(StarSVG)`
fill: #ffd67e;
position: absolute;
- top: 170px;
+ top: 70px;
right: 180px;
filter: drop-shadow(2px 4px 6px #f1cac9);
z-index: 3;
- animation: ${animate.breath} 2s linear infinite alternate;
${css.media.mobile`
animation: none;
@@ -122,8 +118,6 @@ export const StarIcon3 = styled(StarSVG)`
filter: drop-shadow(2px 4px 6px #f1cac9);
z-index: 3;
- animation: ${animate.breath} 2s linear infinite alternate;
-
${css.media.mobile`
animation: none;
`};
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/index.ts
new file mode 100644
index 000000000..945c5cb12
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/index.ts
@@ -0,0 +1,17 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-both')};
+ width: 100%;
+ position: relative;
+
+ *::selection {
+ background-color: ${theme('rainbow.red')} !important;
+ color: white;
+ }
+`
+export const Slogan = styled.div`
+ ${css.column('align-both')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/intro_digest.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/intro_digest.ts
new file mode 100644
index 000000000..fab5f00a5
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/changelog_tab/intro_digest.ts
@@ -0,0 +1,31 @@
+import styled from 'styled-components'
+
+import type { TTestable } from '@/spec'
+import css, { theme } from '@/css'
+
+export { FeatList } from '..'
+
+export const Wrapper = styled.div.attrs(({ $testid }) => ({
+ 'data-test-id': $testid,
+}))`
+ ${css.column('align-start')};
+ margin-right: 50px;
+
+ *::selection {
+ background-color: ${theme('rainbow.orange')} !important;
+ color: white;
+ }
+`
+export const Digest = styled.div`
+ color: ${theme('hint')};
+ opacity: 0.9;
+ line-height: 28px;
+ width: 300px;
+ margin-top: -100px;
+ margin-bottom: 30px;
+ font-size: 16px;
+`
+export const Hightlight = styled.span`
+ color: ${theme('rainbow.red')};
+ font-weight: 500;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/content.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/content.ts
new file mode 100644
index 000000000..927780194
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/content.ts
@@ -0,0 +1,19 @@
+import styled from 'styled-components'
+
+import type { TThread } from '@/spec'
+import { THREAD } from '@/constant/thread'
+
+import css from '@/css'
+
+export const Wrapper = styled.div<{ tab: TThread }>`
+ ${css.column('align-both')};
+ width: 100%;
+ height: ${({ tab }) => {
+ if (tab === THREAD.KANBAN) return '700px'
+ return '640px'
+ }};
+ background: #fbfbfb;
+ transition: all 0.15s;
+`
+
+export const holder = 1
diff --git a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/comment_item.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/comment_item.ts
similarity index 62%
rename from src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/comment_item.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/comment_item.ts
index 328209042..1d39f8ec8 100644
--- a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/comment_item.ts
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/comment_item.ts
@@ -1,7 +1,7 @@
import styled from 'styled-components'
import { Bar as BarBase } from '@/widgets/Common'
-
+import Img from '@/Img'
import css, { theme } from '@/css'
export const Wrapper = styled.div<{ opacity: number }>`
@@ -10,21 +10,20 @@ export const Wrapper = styled.div<{ opacity: number }>`
opacity: ${({ opacity }) => opacity};
margin-bottom: 12px;
`
-type TAvatar = { color: string; bg: string }
-
-export const Avatar = styled.div`
+export const Avatar = styled(Img)`
${css.size(20)};
- ${css.row('align-both')};
- color: ${({ color }) => color};
- font-size: 10px;
- font-weight: 600;
border-radius: 4px;
- background-color: ${({ bg }) => bg};
+`
+export const Nicname = styled.div`
+ color: ${theme('article.title')};
+ font-size: 11px;
+ margin-top: -2px;
`
export const RightPart = styled.div`
${css.column()};
margin-left: 15px;
`
export const Bar = styled(BarBase)`
- background: ${theme('rainbow.purple')};
+ background: ${theme('hint')};
+ opacity: 0.5;
`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/index.ts
new file mode 100644
index 000000000..57f609be8
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/index.ts
@@ -0,0 +1,106 @@
+import styled from 'styled-components'
+
+import { Bar as BarBase } from '@/widgets/Common'
+
+import UpvoteSVG from '@/icons/Upvote'
+import CommentSVG from '@/icons/Comment'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-end')};
+ position: relative;
+`
+export const ListsWrapper = styled.div`
+ background: ${theme('htmlBg')};
+ width: 320px;
+ height: 380px;
+ padding: 25px;
+ z-index: 2;
+ box-shadow: rgba(100, 100, 111, 0.1) 1px 2px 29px 0px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ border-radius: 5px;
+ margin-bottom: 20px;
+`
+export const DetailWrapper = styled.div`
+ background: ${theme('htmlBg')};
+ flex-grow: 1;
+ height: 100%;
+ padding: 30px;
+ padding-top: 18px;
+ z-index: 2;
+
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ border-radius: 10px;
+
+ width: 340px;
+ height: 450px;
+ margin-left: -20px;
+ box-shadow: rgba(100, 100, 111, 0.1) 0px 3px 29px 0px;
+`
+export const Header = styled.div`
+ ${css.row('align-center')};
+ margin-bottom: 10px;
+ transform: scale(0.8);
+ margin-left: -30px;
+`
+export const Tag = styled.div`
+ font-size: 13px;
+ color: ${theme('article.digest')};
+`
+
+export const Title = styled.div`
+ color: ${theme('article.title')};
+ font-weight: 500;
+ font-size: 16px;
+`
+export const Status = styled.div`
+ ${css.row('align-center')};
+ margin-top: 10px;
+ margin-bottom: 22px;
+`
+export const UpvoteWrapper = styled.div`
+ ${css.row('align-center')};
+ border: 1px solid;
+ color: ${theme('article.title')};
+ border-color: ${theme('button.upvoteBorder')};
+ padding: 2px 6px;
+ border-radius: 5px;
+ margin-top: 2px;
+`
+export const UpvoteIcon = styled(UpvoteSVG)`
+ ${css.size(12)};
+ fill: ${theme('article.digest')};
+`
+export const UpvoteCount = styled.div`
+ color: ${theme('article.title')};
+ font-size: 13px;
+ font-weight: 500;
+ margin-left: 3px;
+`
+export const CommentIcon = styled(CommentSVG)`
+ ${css.size(10)};
+ fill: ${theme('hint')};
+ opacity: 0.6;
+`
+export const Count = styled.div`
+ color: ${theme('hint')};
+ font-size: 12px;
+ font-weight: 400;
+ margin-left: 3px;
+ opacity: 0.8;
+`
+export const Bar = styled(BarBase)`
+ background: ${theme('article.title')};
+`
+export const CommentsHeader = styled.div`
+ ${css.row('align-center')};
+ color: ${theme('article.title')};
+ font-weight: 500;
+ font-size: 12px;
+ margin-top: 24px;
+ margin-bottom: 15px;
+ opacity: 0.8;
+`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/post_item.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/post_item.ts
similarity index 69%
rename from src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/post_item.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/post_item.ts
index dad489806..0c91ece30 100644
--- a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/post_item.ts
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/discuss_demo/post_item.ts
@@ -1,13 +1,12 @@
import styled from 'styled-components'
-import { Bar as BarBase } from '@/widgets/Common'
import UpvoteSVG from '@/icons/Upvote'
import css, { theme } from '@/css'
export const Wrapper = styled.div<{ opacity: number }>`
${css.row()};
- background: ${theme('alphaBg2')};
+ background: ${theme('htmlBg')};
border-radius: 6px;
height: 50px;
padding: 3px 6px;
@@ -19,7 +18,7 @@ export const UpvotesWrapper = styled.div`
${css.column('align-both')};
border: 1px solid;
- border-color: #dac7e3;
+ border-color: ${theme('button.upvoteBorder')};
border-radius: 8px;
box-shadow: rgb(151 149 165 / 15%) 0px 8px 24px;
@@ -28,22 +27,26 @@ export const RightPart = styled.div`
${css.column()};
margin-left: 14px;
`
+export const Title = styled.div`
+ font-size: 13px;
+ font-weight: 500;
+ color: ${theme('article.title')};
+`
export const Footer = styled.div`
- ${css.row('align-center')};
+ transform: scale(0.8);
+ width: 120px;
+ margin-top: 4px;
+ margin-left: -18px;
`
export const UpvoteIcon = styled(UpvoteSVG)`
${css.size(12)};
transform: scaleY(0.8);
- fill: ${theme('rainbow.purple')};
+ fill: ${theme('article.digest')};
opacity: 0.8;
margin-top: 2px;
`
export const Count = styled.div`
font-size: 13px;
- color: ${theme('rainbow.purple')};
-`
-
-export const Bar = styled(BarBase)`
- background: ${theme('rainbow.purple')};
+ color: ${theme('article.title')};
`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/index.ts
new file mode 100644
index 000000000..a8a2065ec
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/index.ts
@@ -0,0 +1,12 @@
+import styled from 'styled-components'
+
+import css from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-both')};
+ position: relative;
+ margin-left: 10px;
+`
+export const Slogan = styled.div`
+ ${css.column('align-both')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/intro_digest.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/intro_digest.ts
new file mode 100644
index 000000000..d4252713a
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/intro_digest.ts
@@ -0,0 +1,32 @@
+import styled from 'styled-components'
+
+import type { TTestable } from '@/spec'
+import css, { theme } from '@/css'
+
+export { FeatList } from '..'
+
+export const Wrapper = styled.div.attrs(({ $testid }) => ({
+ 'data-test-id': $testid,
+}))`
+ ${css.column('align-start')};
+ margin-right: 10px;
+
+ *::selection {
+ background-color: ${theme('rainbow.purple')} !important;
+ color: white;
+ }
+`
+export const Digest = styled.div`
+ color: ${theme('hint')};
+ opacity: 0.9;
+ line-height: 28px;
+ width: 300px;
+ margin-top: -40px;
+ margin-bottom: 30px;
+ font-size: 16px;
+`
+
+export const Hightlight = styled.span`
+ color: ${theme('rainbow.purple')};
+ font-weight: 500;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/user_cards.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/user_cards.ts
new file mode 100644
index 000000000..f4e57b523
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/discuss_tab/user_cards.ts
@@ -0,0 +1,39 @@
+import styled from 'styled-components'
+
+import Img from '@/Img'
+import css, { theme } from '@/css'
+
+import { WithPosition } from '@/widgets/Common'
+
+export const Wrapper = styled.div`
+ margin-top: 40px;
+ position: relative;
+`
+
+export const CardWrapper = styled(WithPosition)`
+ ${css.row('align-center')};
+ gap: 0 10px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ background: ${theme('htmlBg')};
+ padding: 2px 8px;
+ height: 42px;
+ border-radius: 10px;
+ box-shadow: ${theme('button.boxShadow')};
+ width: auto;
+ position: absolute;
+ top: ${({ top }) => `${top}px`};
+ left: ${({ left }) => `${left}px`};
+`
+export const Avatar = styled(Img)`
+ ${css.size(25)};
+ border-radius: 5px;
+ opacity: 0.8;
+ filter: saturate(0.7);
+ box-shadow: ${theme('button.boxShadow')};
+`
+export const Say = styled.div`
+ color: ${theme('article.digest')};
+ font-size: 13px;
+ word-break: keep-all;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/feat_item.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/feat_item.ts
new file mode 100644
index 000000000..744ec64a2
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/feat_item.ts
@@ -0,0 +1,21 @@
+import styled from 'styled-components'
+
+import type { TColor } from '@/spec'
+
+import css, { theme, rainbow } from '@/css'
+import CheckSVG from '@/icons/CheckBold'
+
+export const Wrapper = styled.div`
+ ${css.row('align-center')};
+`
+export const CheckIcon = styled(CheckSVG)`
+ ${css.size(16)};
+ fill: ${({ $color }) => rainbow($color)};
+ opacity: 0.8;
+ margin-right: 14px;
+`
+
+export const Text = styled.div`
+ color: ${theme('article.digest')};
+ font-size: 16px;
+`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/BadSVG.tsx b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/BadSVG.tsx
similarity index 100%
rename from src/containers/content/LandingPage/styles/feature_wall/help_feat/BadSVG.tsx
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/BadSVG.tsx
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/GoodSVG.tsx b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/GoodSVG.tsx
similarity index 100%
rename from src/containers/content/LandingPage/styles/feature_wall/help_feat/GoodSVG.tsx
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/GoodSVG.tsx
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/SoSoSVG.tsx b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/SoSoSVG.tsx
similarity index 100%
rename from src/containers/content/LandingPage/styles/feature_wall/help_feat/SoSoSVG.tsx
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/SoSoSVG.tsx
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/article.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/article.ts
new file mode 100644
index 000000000..7b5d6d1ee
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/article.ts
@@ -0,0 +1,169 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+import ShareSVG from '@/icons/Share'
+import GoodSVG from '@/icons/EmojiGood'
+import SosoSVG from '@/icons/EmojiSoSo'
+import BadSVG from '@/icons/EmojiBad'
+
+import { Bar as BarBase } from '@/widgets/Common'
+
+import ArrowSimple from '@/icons/ArrowSimple'
+
+export const Wrapper = styled.div`
+ ${css.column('align-center')};
+ margin-left: -40px;
+ z-index: 10;
+ width: 368px;
+ height: 480px;
+ gap: 10px;
+ border-radius: 5px;
+ background: ${theme('htmlBg')};
+ box-shadow: rgba(100, 100, 111, 0.1) 0px 3px 29px 0px;
+ position: relative;
+
+ &:after {
+ content: '';
+ position: absolute;
+ top: -2px;
+ right: 2px;
+ width: 370px;
+ z-index: -1;
+ height: 50%;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ background: ${theme('htmlBg')};
+ border-radius: 6px;
+ transform: rotate(-2deg);
+ box-shadow: rgba(100, 100, 111, 0.1) 0px 3px 29px 0px;
+ }
+`
+export const InnerWrapper = styled.div`
+ ${css.column('align-center')};
+ width: 100%;
+ height: 100%;
+ z-index: 10;
+ background: ${theme('htmlBg')};
+ padding: 15px 30px;
+ padding-top: 25px;
+ border: 1px solid;
+ border-radius: 5px;
+ border-color: ${theme('divider')};
+`
+export const InnerContent = styled.div`
+ ${css.column()};
+ width: 260px;
+ position: relative;
+`
+export const ShareIcon = styled(ShareSVG)`
+ ${css.size(12)};
+ fill: ${theme('hint')};
+ opacity: 0.6;
+ position: absolute;
+ top: 6px;
+ right: -1px;
+`
+
+const ArrowIcon = styled(ArrowSimple)`
+ ${css.size(18)};
+ fill: ${theme('hint')};
+`
+export const LeftArrowIcon = styled(ArrowIcon)``
+export const RightArrowIcon = styled(ArrowIcon)`
+ transform: rotate(180deg);
+`
+export const Header = styled.div`
+ ${css.column()};
+ width: 260px;
+ margin-top: 25px;
+ margin-bottom: 10px;
+`
+export const CoverWrappers = styled.div`
+ ${css.row('align-center', 'justify-between')};
+ margin-top: 18px;
+ width: 260px;
+ height: 110px;
+ margin-bottom: 12px;
+`
+type TCover = { $fromBg: string; $toBg: string }
+export const Cover = styled.div`
+ ${css.row('align-both')};
+ width: 49%;
+ height: 100%;
+ border-radius: 8px;
+
+ background: ${theme('rainbow.cyan')};
+
+ background: ${({ $fromBg, $toBg }) => {
+ return `linear-gradient(180deg, ${$fromBg} 0%, ${$toBg} 100%)`
+ // return `radial-gradient(circle, ${$toBg} 0%, ${$fromBg} 90%)`
+ }};
+
+ backdrop-filter: blur(5px);
+ opacity: 0.3;
+`
+export const CoverTitle = styled.div`
+ font-size: 16px;
+ font-weight: 600;
+ color: ${theme('button.fg')};
+ margin-bottom: 50px;
+`
+
+export const Title = styled.div`
+ ${css.row('align-center')};
+ color: ${theme('article.title')};
+ font-weight: 500;
+ font-size: 16px;
+`
+export const Bar = styled(BarBase)`
+ background: ${theme('hint')};
+`
+export const Previous = styled.div`
+ opacity: 0.2;
+`
+export const Footer = styled.div`
+ ${css.row('align-center')};
+ margin-top: 40px;
+ width: 100%;
+`
+export const ArrowText = styled.div`
+ font-size: 12px;
+ color: ${theme('hint')};
+`
+export const Feedback = styled.div`
+ ${css.row('align-both')};
+ gap: 0 18px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ border-radius: 10px;
+ padding: 8px 14px;
+ box-shadow: rgba(100, 100, 111, 0.1) 0px 3px 29px 0px;
+ filter: saturate(0.7);
+ margin-top: 25px;
+ width: 132px;
+`
+export const GoodIcon = styled(GoodSVG)`
+ ${css.size(20)};
+`
+export const SodoIcon = styled(SosoSVG)`
+ ${css.size(20)};
+`
+export const BadIcon = styled(BadSVG)`
+ ${css.size(20)};
+`
+
+export const CommentDot = styled.div`
+ position: absolute;
+ right: 120px;
+ bottom: 228px;
+ ${css.circle(14)};
+ ${css.row('align-both')};
+ background: ${theme('rainbow.cyanBg')};
+ z-index: 100;
+`
+export const CommentDotSolid = styled.div`
+ ${css.circle(8)};
+ background: ${theme('rainbow.cyan')};
+ box-shadow: ${theme('button.boxShadow')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/dir_tree.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/dir_tree.ts
new file mode 100644
index 000000000..84b1c6405
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/dir_tree.ts
@@ -0,0 +1,50 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+import GithubSVG from '@/icons/Github8'
+import BookSVG from '@/icons/Book'
+
+export const Wrapper = styled.div`
+ background: ${theme('htmlBg')};
+ margin-top: 40px;
+ width: 170px;
+ height: 410px;
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ border-radius: 6px;
+ box-shadow: rgba(100, 100, 111, 0.1) 1px 2px 29px 0px;
+ padding: 15px 18px;
+`
+export const DirName = styled.div<{ opacity?: number }>`
+ color: ${theme('article.title')};
+ font-size: 12px;
+ font-weight: 500;
+ margin-bottom: 6px;
+ opacity: ${({ opacity }) => opacity};
+`
+export const File = styled.div<{ opacity?: number }>`
+ color: ${theme('article.digest')};
+ font-size: 12px;
+ font-weight: 400;
+ margin-bottom: 4px;
+ margin-left: 4px;
+ opacity: ${({ opacity }) => opacity || 0.8};
+`
+export const BookIcon = styled(BookSVG)`
+ ${css.size(12)};
+ margin-top: -3px;
+ fill: ${theme('article.digest')};
+ margin-right: 3px;
+`
+export const GithubIcon = styled(GithubSVG)`
+ ${css.size(11)};
+ margin-top: -4px;
+ margin-left: 1px;
+ fill: ${theme('article.digest')};
+ margin-right: 4px;
+`
+export const PinnedItem = styled.div`
+ ${css.row('align-center')};
+ margin-bottom: 3px;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/index.ts
new file mode 100644
index 000000000..226333362
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/index.ts
@@ -0,0 +1,11 @@
+import styled from 'styled-components'
+
+import css from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row()};
+ position: relative;
+ margin-right: -15px;
+`
+
+export const holder = 1
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/inline_comment.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/inline_comment.ts
new file mode 100644
index 000000000..64ccddf40
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/help_demo/inline_comment.ts
@@ -0,0 +1,36 @@
+import styled from 'styled-components'
+
+import Img from '@/Img'
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ position: absolute;
+ bottom: 146px;
+ right: -78px;
+ background: ${theme('htmlBg')};
+ ${css.column('align-start')};
+ z-index: 10;
+ width: 188px;
+ height: 100px;
+ padding: 10px;
+
+ border: 1px solid;
+ border-radius: 8px;
+ border-color: ${theme('divider')};
+ box-shadow: rgba(100, 100, 111, 0.1) 0px 3px 29px 0px;
+`
+export const User = styled.div`
+ ${css.row('align-center')};
+ margin-bottom: 10px;
+`
+export const Avatar = styled(Img)`
+ ${css.size(18)};
+ border-radius: 4px;
+`
+export const Nickname = styled.div`
+ font-size: 13px;
+ margin-left: 6px;
+`
+export const Comment = styled.div`
+ color: ${theme('article.digest')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/index.ts
new file mode 100644
index 000000000..b9e58f7b2
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/index.ts
@@ -0,0 +1,23 @@
+import styled from 'styled-components'
+
+import type { TActive, TTestable } from '@/spec'
+
+import css, { theme } from '@/css'
+
+type TWrapper = TActive
+
+export const Wrapper = styled.div.attrs(({ $testid }) => ({
+ 'data-test-id': $testid,
+}))`
+ ${css.row('align-both')};
+ width: 100%;
+ position: relative;
+
+ *::selection {
+ background-color: ${theme('rainbow.cyan')} !important;
+ color: white;
+ }
+`
+export const Slogan = styled.div`
+ ${css.column('align-both')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/intro_digest.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/intro_digest.ts
new file mode 100644
index 000000000..525c715b6
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/help_tab/intro_digest.ts
@@ -0,0 +1,34 @@
+import styled from 'styled-components'
+
+import type { TTestable } from '@/spec'
+import css, { theme } from '@/css'
+
+export { FeatList } from '..'
+
+export const Wrapper = styled.div.attrs(({ $testid }) => ({
+ 'data-test-id': $testid,
+}))`
+ ${css.column('align-start')};
+ width: 380px;
+ height: 430px;
+
+ *::selection {
+ background-color: ${theme('rainbow.cyan')} !important;
+ color: white;
+ }
+`
+
+export const Digest = styled.div`
+ color: ${theme('hint')};
+ opacity: 0.9;
+ line-height: 28px;
+ width: 300px;
+ margin-top: -40px;
+ margin-bottom: 16px;
+ font-size: 16px;
+`
+
+export const Hightlight = styled.span`
+ color: ${theme('rainbow.cyan')};
+ font-weight: 500;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/index.ts
new file mode 100644
index 000000000..c86deb22a
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/index.ts
@@ -0,0 +1,25 @@
+import styled from 'styled-components'
+
+import css from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.column('align-both')};
+ width: 100%;
+ margin-top: 140px;
+ margin-bottom: 130px;
+`
+export const FeatList = styled.div`
+ ${css.column()};
+ gap: 18px 0;
+ margin-top: 28px;
+
+ ${css.media.mobile`
+ ${css.row()};
+ `};
+`
+export const MobileIntroLists = styled.div`
+ ${css.rowWrap()};
+ gap: 16px 0;
+ padding-left: 10px;
+ margin-top: -25px;
+`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/intro_items.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/intro_items.ts
similarity index 100%
rename from src/containers/content/LandingPage/styles/feature_wall/intro_items.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/intro_items.ts
diff --git a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/banner.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/banner.ts
similarity index 51%
rename from src/containers/content/LandingPage/styles/feature_wall/kanban_feat/banner.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/banner.ts
index 203ad950f..6db957317 100644
--- a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/banner.ts
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/banner.ts
@@ -1,59 +1,73 @@
import styled from 'styled-components'
-import { Bar as BarBase } from '@/widgets/Common'
+import { Bar as BarBase, WithPosition } from '@/widgets/Common'
import KanbenSVG from '@/icons/Kanban'
import GtdWipSVG from '@/icons/GtdWip'
import GtdDoneSVG from '@/icons/GtdDone'
import GtdTodoSVG from '@/icons/GtdTodo'
-import css from '@/css'
+import css, { theme } from '@/css'
export const Wrapper = styled.div`
- ${css.column()};
- flex-grow: 1;
+ ${css.column('align-both')};
width: 100%;
- padding: 15px 32px;
- position: relative;
+ flex-grow: 1;
+`
+export const InnerWrapper = styled.div`
+ ${css.column()};
+ width: 650px;
+ height: 100%;
+ padding-top: 24px;
`
export const Header = styled.div`
${css.row('align-center')};
`
+export const Title = styled.div`
+ color: ${theme('article.digest')};
+ font-size: 13px;
+ font-weight: 500;
+`
+export const UsersWrapper = styled.div`
+ filter: saturate(0.7);
+ transform: scale(0.95);
+`
export const Bar = styled(BarBase)`
- background: #c3d6f3;
+ background: ${theme('hint')};
`
-
export const KanbenIcon = styled(KanbenSVG)`
${css.size(18)};
transform: rotate(180deg);
- fill: #5d9dfb;
- opacity: 0.5;
+ fill: ${theme('hint')};
+ margin-left: -1px;
+ margin-right: 2px;
+ opacity: 0.8;
`
-
-export const Item = styled.div<{ left: number }>`
+export const LabelBar = styled.div`
+ flex-grow: 1;
+ width: 100%;
+ margin-bottom: 10px;
+ position: relative;
+`
+export const Item = styled(WithPosition)`
${css.row('align-center')};
- position: absolute;
- bottom: 8px;
- left: ${({ left }) => `${left}px`};
`
-
-export const Title = styled.div`
- color: #5d9dfb;
+export const Label = styled.div`
+ fill: ${theme('hint')};
font-size: 11px;
margin-left: 5px;
`
-
export const Icon1 = styled(GtdTodoSVG)`
${css.size(12)};
- fill: #5799fb;
+ fill: ${theme('hint')};
opacity: 0.6;
`
export const Icon2 = styled(GtdWipSVG)`
${css.size(12)};
- fill: #5799fb;
+ fill: ${theme('hint')};
opacity: 0.8;
`
export const Icon3 = styled(GtdDoneSVG)`
${css.size(12)};
- fill: #69b8cc;
+ fill: ${theme('hint')};
`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/index.ts
new file mode 100644
index 000000000..219a8776e
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/index.ts
@@ -0,0 +1,19 @@
+import styled from 'styled-components'
+
+import css from '@/css'
+
+export const DesktopOnly = styled.div`
+ ${css.row('align-center', 'justify-between')};
+ ${css.media.mobile`
+ display: none;
+ `};
+`
+
+export const Wrapper = styled.div`
+ ${css.column('align-both')};
+ width: 100%;
+ position: relative;
+`
+export const Slogan = styled.div`
+ ${css.column('align-both')};
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/intro_digest.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/intro_digest.ts
new file mode 100644
index 000000000..f7fe18fda
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/intro_digest.ts
@@ -0,0 +1,43 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+export { FeatList } from '..'
+
+export const Wrapper = styled.div`
+ ${css.column('align-both')};
+ width: 100%;
+ height: 200px;
+
+ *::selection {
+ background-color: ${theme('rainbow.blue')} !important;
+ color: white;
+ }
+`
+export const Digest = styled.div`
+ font-size: 16px;
+ color: ${theme('hint')};
+ margin-bottom: 20px;
+ opacity: 0.9;
+ margin-top: 10px;
+ margin-left: 76px;
+`
+export const Highlight = styled.span`
+ color: ${theme('rainbow.blue')};
+ font-weight: 500;
+ margin-left: 1px;
+ margin-right: 1px;
+`
+export const InnerWrapper = styled.div`
+ ${css.column('align-start')};
+ width: 800px;
+`
+export const FeatureWrapper = styled.div`
+ ${css.row()};
+ margin-left: 76px;
+ flex-wrap: wrap;
+`
+export const FeatureItem = styled.div`
+ width: 33%;
+ margin-bottom: 10px;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/intro_image.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/intro_image.ts
new file mode 100644
index 000000000..32adaa6fe
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/intro_image.ts
@@ -0,0 +1,17 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.column('align-end')};
+ margin-bottom: 42px;
+ width: 840px;
+ height: 430px;
+ background: ${theme('htmlBg')};
+ border: 1px solid;
+ border-color: ${theme('divider')};
+ border-radius: 10px;
+ box-shadow: rgb(97 97 97 / 10%) 1px 2px 29px 0px;
+`
+
+export const holder = 1
diff --git a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/kanban_demo/index.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/kanban_demo/index.ts
similarity index 52%
rename from src/containers/content/LandingPage/styles/feature_wall/kanban_feat/kanban_demo/index.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/kanban_demo/index.ts
index 7201e4110..f7127fc22 100644
--- a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/kanban_demo/index.ts
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/kanban_demo/index.ts
@@ -1,10 +1,10 @@
import styled from 'styled-components'
-import css from '@/css'
+import css, { theme } from '@/css'
export const BoardsWrapper = styled.div`
${css.row('justify-center', 'align-end')};
- gap: 0 18px;
+ gap: 0 28px;
width: 100%;
`
export const Board = styled.div<{ shadow?: boolean }>`
@@ -13,15 +13,13 @@ export const Board = styled.div<{ shadow?: boolean }>`
gap: 6px;
overflow: hidden;
- width: 168px;
- height: 300px;
- /* background: linear-gradient(180deg, #c8d6f24f 34%, #c8d6f24f 100%); */
- background: linear-gradient(180deg, #c8d6f24f 34%, #deecff4f 100%);
- background: #d8deec4f;
+ width: 200px;
+ height: 332px;
+ /* background: linear-gradient(180deg, #c8d6f24f 34%, #deecff2e 100%); */
+ background: linear-gradient(180deg, #dfdfdf4f 34%, #d7d7d72e 100%);
border-radius: 8px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
-
- box-shadow: ${({ shadow }) => (shadow ? '#c3d6f336 1px 5px 17px 7px' : 'none')}; ;
+ box-shadow: ${theme('button.boxShadow')};
`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/kanban_demo/kanban_item.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/kanban_demo/kanban_item.ts
new file mode 100644
index 000000000..95081732a
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/kanban_tab/kanban_demo/kanban_item.ts
@@ -0,0 +1,68 @@
+import styled from 'styled-components'
+
+import UpvoteSVG from '@/icons/Upvote'
+import css, { theme } from '@/css'
+
+type TWrapper = { opacity: number; $draging: boolean }
+
+export const Wrapper = styled.div`
+ ${css.column('justify-between')};
+ background: ${theme('htmlBg')};
+ border-radius: 6px;
+ min-height: 62px;
+ padding: 8px 6px;
+ opacity: ${({ opacity }) => opacity};
+
+ /* box-shadow: rgba(17, 12, 46, 0.15) 6px -1px 17px 1px; */
+
+ ${({ $draging }) =>
+ $draging
+ ? `transform: rotate(-3deg) scale(0.95);
+ box-shadow: rgba(255, 255, 255, 0.1) 0px 1px 1px 0px inset, rgba(50, 50, 93, 0.25) 0px 10px 100px -20px, rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
+ margin-left: 5px; margin-right: -7px;z-index: 100; margin-top: -5px;
+ border: 1px solid; `
+ : ''}
+ border-color: ${({ $draging }) => ($draging ? theme('rainbow.blue') : '')};
+`
+export const TargetWrapper = styled.div`
+ ${css.row('align-both')};
+ width: 94%;
+ margin-left: 3%;
+ border-radius: 6px;
+ min-height: 48px;
+ padding: 8px 6px;
+ border: 1px dashed;
+ border-color: ${theme('rainbow.green')};
+ color: ${theme('rainbow.green')};
+ background: ${theme('alphaBg2')};
+ font-style: italic;
+ font-size: 13px;
+ opacity: 0.65;
+`
+
+export const Title = styled.div`
+ font-size: 13px;
+ color: ${theme('article.digest')};
+ font-weight: 500;
+`
+export const Footer = styled.div`
+ ${css.row('align-center')};
+ width: calc(100% + 20px);
+ margin-left: -9px;
+ transform: scale(0.9);
+ opacity: 0.8;
+ margin-top: 8px;
+`
+
+export const UpvoteIcon = styled(UpvoteSVG)`
+ ${css.size(11)};
+ fill: ${theme('article.digest')};
+ margin-top: 1px;
+`
+
+export const Count = styled.div`
+ font-size: 13px;
+ color: ${theme('article.title')};
+ margin-left: 4px;
+ flex-grow: 1;
+`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/more_link.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/more_link.ts
similarity index 60%
rename from src/containers/content/LandingPage/styles/feature_wall/more_link.ts
rename to src/containers/content/LandingPage/styles/articles_intro_tabs/more_link.ts
index 75272e3f6..dccf23adc 100644
--- a/src/containers/content/LandingPage/styles/feature_wall/more_link.ts
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/more_link.ts
@@ -1,11 +1,9 @@
import styled from 'styled-components'
import Link from 'next/link'
-// import type { TActive, TTestable } from '@/spec'
-import type { TFeatType } from '../../spec'
-import { FEAT } from '../../constant'
+import type { TColor } from '@/spec'
-import css from '@/css'
+import css, { rainbow } from '@/css'
import ArrowSVG from '@/icons/Arrow'
export const Wrapper = styled(Link)`
@@ -29,14 +27,14 @@ export const Wrapper = styled(Link)`
transition: all 0.2s;
`
-export const Text = styled.div<{ featType: TFeatType }>`
- color: ${({ featType }) => FEAT[featType].COLOR};
+export const Text = styled.div`
+ color: ${({ $color }) => rainbow($color)};
font-weight: 600;
font-size: 14px;
`
-export const ArrowIcon = styled(ArrowSVG)<{ featType: TFeatType }>`
+export const ArrowIcon = styled(ArrowSVG)`
${css.size(14)};
- fill: ${({ featType }) => FEAT[featType].COLOR};
+ fill: ${({ $color }) => rainbow($color)};
margin-left: 10px;
transform: rotate(180deg);
`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/preview_bars.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/preview_bars.ts
new file mode 100644
index 000000000..e857a3b4c
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/preview_bars.ts
@@ -0,0 +1,46 @@
+import styled from 'styled-components'
+
+import type { TColor } from '@/spec'
+
+import { WithMargin } from '@/widgets/Common'
+import css, { rainbow } from '@/css'
+
+export const Row = styled.div`
+ ${css.row('align-both')};
+`
+export const Column = styled(WithMargin)`
+ ${css.column('align-start')};
+ ${css.size(36)};
+ width: 18px;
+ position: relative;
+`
+
+export const TreeColumn = styled(WithMargin)`
+ ${css.column('align-start')};
+ width: 6px;
+ height: 36px;
+ position: relative;
+`
+export const DocColumn = styled(Column)`
+ width: 30px;
+ height: 36px;
+ position: relative;
+`
+
+type TBar = {
+ width?: number
+ height?: number
+ top?: number
+ $radius?: number
+} & TColor
+
+export const Bar = styled.div`
+ position: absolute;
+ top: ${({ top }) => `${top || 5}px`};
+ left: 5px;
+ width: ${({ width }) => `${width || 50}%`};
+ height: ${({ height }) => `${height || 4}px`};
+ border-radius: ${({ $radius }) => `${$radius || 5}px`};
+ background: ${({ $color }) => rainbow($color)};
+ opacity: 0.2;
+`
diff --git a/src/containers/content/LandingPage/styles/articles_intro_tabs/tabs.ts b/src/containers/content/LandingPage/styles/articles_intro_tabs/tabs.ts
new file mode 100644
index 000000000..1eb093a54
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/articles_intro_tabs/tabs.ts
@@ -0,0 +1,92 @@
+import styled from 'styled-components'
+
+import type { TActive, TColor } from '@/spec'
+import { THREAD } from '@/constant/thread'
+
+import DiscussSVG from '@/icons/DiscussSolid'
+import TadaSVG from '@/icons/Tada'
+import GuideSVG from '@/icons/Book'
+import KanbanSVG from '@/icons/Kanban'
+
+import css, { rainbow, rainbowLight, theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.row('align-both')};
+ border-bottom: 1px solid;
+ border-bottom-color: ${theme('divider')};
+ gap: 0 64px;
+ width: 100%;
+`
+export const TabItem = styled.div`
+ ${css.column('align-both')};
+ width: 162px;
+ border-bottom: 2px solid;
+ border-bottom-color: ${({ $active }) => ($active ? theme('article.title') : 'transparent')};
+ padding-bottom: 22px;
+ cursor: pointer;
+
+ filter: ${({ $active }) => ($active ? 'saturate(1)' : 'saturate(0)')};
+ opacity: ${({ $active }) => ($active ? 1 : 0.8)};
+
+ &:hover {
+ opacity: 1;
+ border-bottom-color: ${({ $active }) => ($active ? theme('article.title') : theme('hoverBg'))};
+ }
+`
+type TIconBox = TColor & TActive
+export const IconBox = styled.div`
+ ${css.size(40)};
+ border-radius: 6px;
+ background: ${({ $color, $active }) => ($active ? rainbowLight($color) : 'transparent')};
+ position: relative;
+ border: 1px dotted;
+ border-color: ${({ $color }) => rainbow($color)};
+ transform: scale(0.9);
+`
+
+type TIcon = TColor
+const commonIcon = (comp) => {
+ return styled(comp)`
+ ${css.size(28)};
+ fill: ${({ $color }) => rainbow($color)};
+ position: absolute;
+ bottom: -8px;
+ right: -8px;
+ `
+}
+
+export const ICON = {
+ [THREAD.POST]: commonIcon(DiscussSVG),
+ [THREAD.KANBAN]: styled(commonIcon(KanbanSVG))`
+ transform: rotate(180deg) rotateY(180deg);
+ bottom: -9px;
+ right: -8px;
+ `,
+ [THREAD.CHANGELOG]: styled(commonIcon(TadaSVG))`
+ ${css.size(26)};
+ bottom: -9px;
+ right: -8px;
+ `,
+ [THREAD.DOC]: styled(commonIcon(GuideSVG))`
+ bottom: -9px;
+ right: -8px;
+ `,
+}
+
+export const Title = styled.div`
+ font-size: 18px;
+ margin-top: 18px;
+ margin-bottom: 5px;
+ color: ${({ $active }) => ($active ? theme('article.title') : theme('article.digest'))};
+ font-weight: 500;
+
+ ${TabItem}:hover & {
+ color: ${theme('article.title')};
+ }
+
+ transition: all 0.2s;
+`
+export const Desc = styled.div`
+ font-size: 13px;
+ color: ${theme('article.digest')};
+`
diff --git a/src/containers/content/LandingPage/styles/dashboard_intros/content_preview.ts b/src/containers/content/LandingPage/styles/dashboard_intros/content_preview.ts
new file mode 100644
index 000000000..55a861fc2
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/dashboard_intros/content_preview.ts
@@ -0,0 +1,21 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ padding: 10px;
+ background: ${theme('htmlBg')};
+ color: ${theme('article.digest')};
+ width: 500px;
+ height: 430px;
+ border-radius: 5px;
+ box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
+ position: absolute;
+ bottom: 32px;
+ left: 0;
+ z-index: 1;
+`
+export const Title = styled.div`
+ font-size: 16px;
+ color: ${theme('article.digest')};
+`
diff --git a/src/containers/content/LandingPage/styles/dashboard_intros/dashboard_preview.ts b/src/containers/content/LandingPage/styles/dashboard_intros/dashboard_preview.ts
new file mode 100644
index 000000000..47efd6c94
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/dashboard_intros/dashboard_preview.ts
@@ -0,0 +1,23 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ padding: 20px;
+ background: ${theme('htmlBg')};
+ border: 1px solid;
+ border-color: ${theme('hoverBg')};
+ color: ${theme('article.digest')};
+ height: 580px;
+ width: 420px;
+ border-radius: 5px;
+ box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
+ position: absolute;
+ left: 200px;
+ bottom: 32px;
+ z-index: 2;
+`
+export const Title = styled.div`
+ font-size: 16px;
+ color: ${theme('article.digest')};
+`
diff --git a/src/containers/content/LandingPage/styles/dashboard_intros/index.ts b/src/containers/content/LandingPage/styles/dashboard_intros/index.ts
new file mode 100644
index 000000000..539ac7641
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/dashboard_intros/index.ts
@@ -0,0 +1,30 @@
+import styled from 'styled-components'
+
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ margin-top: 100px;
+ ${css.row('align-both')};
+ width: 100%;
+ height: 728px;
+ background: #fbfbfb;
+ position: relative;
+
+ &:after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 35px;
+ width: 100%;
+ background: ${theme('htmlBg')};
+ border-top: 1px solid;
+ border-top-color: ${theme('hoverBg')};
+ z-index: 2;
+ }
+`
+export const Right = styled.div`
+ width: 60%;
+ height: 100%;
+ position: relative;
+`
diff --git a/src/containers/content/LandingPage/styles/dashboard_intros/side_menu.ts b/src/containers/content/LandingPage/styles/dashboard_intros/side_menu.ts
new file mode 100644
index 000000000..c91c00db0
--- /dev/null
+++ b/src/containers/content/LandingPage/styles/dashboard_intros/side_menu.ts
@@ -0,0 +1,69 @@
+import styled from 'styled-components'
+
+import type { TActive } from '@/spec'
+import css, { theme } from '@/css'
+
+export const Wrapper = styled.div`
+ ${css.column('align-both')};
+ width: 43%;
+ height: 100%;
+ padding-left: 60px;
+`
+export const InnerWrapper = styled.div`
+ ${css.column('align-start')};
+`
+export const Header = styled.div`
+ ${css.column('align-start')};
+ width: 300px;
+ margin-bottom: 38px;
+`
+export const Title = styled.div`
+ color: ${theme('article.digest')};
+ font-size: 28px;
+ font-weight: 500;
+`
+export const Highlight = styled.span`
+ color: ${theme('rainbow.orange')};
+ font-weight: 600;
+ margin-left: 1px;
+`
+export const Desc = styled.div`
+ color: ${theme('hint')};
+ width: 350px;
+ font-size: 16px;
+ margin-top: 10px;
+ line-height: 26px;
+`
+export const Tabs = styled.div`
+ ${css.column('align-start')};
+ gap: 20px 0;
+ border-left: 2px solid;
+ border-left-color: #e9e9e9;
+ padding: 0 20px;
+`
+export const TabItem = styled.div`
+ position: relative;
+ font-size: 16px;
+ font-weight: 500;
+ color: ${({ $active }) => ($active ? theme('article.title') : theme('article.digest'))};
+ opacity: ${({ $active }) => ($active ? 1 : 0.8)};
+ cursor: pointer;
+
+ &:hover {
+ color: ${theme('article.title')};
+ }
+
+ &:before {
+ content: '';
+ position: absolute;
+ opacity: ${({ $active }) => ($active ? 1 : 0)};
+ top: 2px;
+ left: -23px;
+ height: 20px;
+ width: 4px;
+ border-radius: 5px;
+ background: ${theme('rainbow.orange')};
+ }
+
+ transition: all 0.2s;
+`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/bg_dots.ts b/src/containers/content/LandingPage/styles/feature_wall/bg_dots.ts
deleted file mode 100644
index dc9caf968..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/bg_dots.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive } from '@/spec'
-import css from '@/css'
-
-import type { TFeatType } from '../../spec'
-import { FEAT } from '../../constant'
-
-type TWrapper = { featType: TFeatType } & TActive
-export const Wrapper = styled.div`
- ${css.size(600)};
- background: ${({ featType }) => `radial-gradient(${FEAT[featType].COLOR} 1px, transparent 1px)`};
-
- background-size: 26px 26px;
- position: absolute;
- top: -80px;
- border-radius: 100px;
-
- opacity: ${({ $active }) => ($active ? 0.7 : 0.5)};
-
- transition: all 0.2s;
- transition-delay: 1s;
-
- z-index: -1;
-
- ${css.media.mobile`
- transform: scale(0.8);
- `};
-`
-
-export const holder = 1
diff --git a/src/containers/content/LandingPage/styles/feature_wall/card.ts b/src/containers/content/LandingPage/styles/feature_wall/card.ts
deleted file mode 100644
index 13f24d02c..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/card.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import styled from 'styled-components'
-
-import type { TColorName } from '@/spec'
-import css, { theme, rainbowLight } from '@/css'
-
-import Img from '@/Img'
-
-export const Wrapper = styled.div`
- color: ${theme('article.digest')};
- width: 300px;
- /* height: 300px; */
- height: auto;
- border-radius: 10px;
- font-size: 16px;
- background: #ffffffd4;
- padding: 20px;
- box-shadow: 0 5px 25px rgb(35 35 35 / 10%);
- margin-bottom: 25px;
-`
-
-export const Header = styled.div`
- ${css.row('align-center')};
- margin-bottom: 10px;
-`
-
-export const Avatar = styled(Img)<{ color: TColorName }>`
- ${css.circle(30)};
- border: 2px solid;
- padding: 2px;
- border-color: gold;
- border-color: ${({ color }) => rainbowLight(color)};
- background-color: ${({ color }) => rainbowLight(color)};
-`
-
-export const User = styled.div``
-
-export const Nickname = styled.div`
- color: ${theme('article.title')};
- margin-left: 10px;
- font-size: 14px;
-`
-
-export const Content = styled.div``
diff --git a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/index.ts b/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/index.ts
deleted file mode 100644
index a728b04fd..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/index.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-type TWrapper = TActive
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.row('align-center', 'justify-between')};
- width: 100%;
- height: 730px;
- padding: 0 12%;
- margin-top: -268px;
- position: relative;
-
- /* background: radial-gradient(circle at 20% 30%, #ffdbbb4a, transparent 20%); */
-
- // right
- /* background: radial-gradient(circle at 68% 50%, #e5847873 0, transparent 35%); */
- &:after {
- content: '';
- position: absolute;
- width: 100%;
- height: 100%;
- background: radial-gradient(circle at 60% 50%, #e5847873 0, transparent 35%);
- opacity: ${({ $active }) => ($active ? 0.5 : 0)};
- transition: opacity 0.5s;
- transition-delay: 1s;
- z-index: -1;
- }
-
- ${css.media.mobile`
- ${css.column()};
- margin-top: 80px;
- padding: 0 18px;
- height: auto;
- &:after {
- display: none;
- }
- `};
-`
-export const Slogan = styled.div`
- ${css.column('align-both')};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/intro_digest.ts b/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/intro_digest.ts
deleted file mode 100644
index 77dbf283c..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/intro_digest.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-import css from '@/css'
-
-import { FEAT } from '../../../constant'
-
-export { FeatList } from '..'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-start')};
- width: 48%;
- height: 430px;
- padding-left: 1%;
-
- *::selection {
- background-color: ${FEAT.CHANGELOG.COLOR} !important;
- color: white;
- }
-
- ${css.media.mobile`
- width: 100%;
- padding: 0;
- height: auto;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/intro_image.ts b/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/intro_image.ts
deleted file mode 100644
index f9873e622..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/changelog_feat/intro_image.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-import EmojiSVG from '@/icons/EmojiTada'
-import BroadcastSVG from '@/icons/Broadcast'
-import CommentSVG from '@/icons/Heart'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.columnGrow('align-both')};
- position: relative;
-
- ${css.media.mobile`
- transform: scale(0.52);
- margin-top: -50px;
- `};
-`
-export const ImageWrapper = styled.div`
- width: 600px;
- height: 400px;
- z-index: 2;
- background: white;
- padding: 5px;
- border-radius: 10px;
- border: 1px dotted;
- border-color: #f9b7b5;
- overflow: hidden;
-`
-
-export const ColorBlock = styled.div`
- position: absolute;
- top: -400px;
- left: 0;
- width: 600px;
- height: 390px;
-
- background: linear-gradient(137deg, rgb(253 223 222) 52%, rgb(252 242 223) 100%);
- border-radius: 20px;
- /* transform: rotate(-4deg); */
- transform: rotate(4deg);
-
- /* box-shadow: ${({ $active }) => ($active ? '0 5px 25px rgb(35 35 35 / 10%)' : 'none')}; */
-
- ${css.media.mobile`
- left: 0;
- top: 0;
- `};
-`
-export const ColorBlockHolder = styled(ColorBlock)`
- left: 0px;
- top: 0;
- opacity: 0.3;
-`
-export const IconsWrapper = styled.div`
- position: absolute;
- ${css.row('align-center')};
- gap: 0 18px;
- bottom: -40px;
- right: -250px;
- z-index: -3;
-`
-export const Icon1 = styled(BroadcastSVG)`
- ${css.size(19)};
- fill: #f46b68;
- opacity: 0.85;
- margin-top: -1px;
-`
-export const Icon2 = styled(CommentSVG)`
- ${css.size(18)};
- fill: #f48d68;
- opacity: 0.8;
-`
-export const Icon3 = styled(EmojiSVG)`
- ${css.size(19)};
- opacity: 0.5;
- margin-top: -2px;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/C2HSVG.tsx b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/C2HSVG.tsx
deleted file mode 100644
index 651306e5c..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/C2HSVG.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { memo, SVGProps } from 'react'
-
-const SVG = (props: SVGProps) => {
- return (
-
- )
-}
-
-export default memo(SVG)
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/D2KSVG.tsx b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/D2KSVG.tsx
deleted file mode 100644
index f391958e2..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/D2KSVG.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { memo, SVGProps } from 'react'
-
-const SVG = (props: SVGProps) => {
- return (
-
- )
-}
-
-export default memo(SVG)
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/K2CSVG.tsx b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/K2CSVG.tsx
deleted file mode 100644
index ee45abd2a..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/K2CSVG.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { memo, SVGProps } from 'react'
-
-const SVG = (props: SVGProps) => {
- return (
-
- )
-}
-
-export default memo(SVG)
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/U2DSVG.tsx b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/U2DSVG.tsx
deleted file mode 100644
index ed8b32936..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/U2DSVG.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { memo, SVGProps } from 'react'
-
-const SVG = (props: SVGProps) => {
- return (
-
- )
-}
-
-export default memo(SVG)
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/c2h.ts b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/c2h.ts
deleted file mode 100644
index d88761480..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/c2h.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-
-import css, { theme } from '@/css'
-
-import CurlyLineSVG from './C2HSVG'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-both')};
- width: 100%;
- height: auto;
- position: relative;
- margin-top: -272px;
- z-index: -2;
-
- ${css.media.mobile`
- display: none;
- `};
-`
-
-export const DescBlock = styled.div`
- position: absolute;
- top: 100px;
- ${css.row('align-center')};
- color: ${theme('article.title')};
- font-size: 13px;
- font-weight: 400;
- opacity: 0.4;
-`
-
-export const Desc = styled(DescBlock)`
- left: calc(50% - 80px);
- top: 216px;
- transform: rotate(4deg);
-`
-
-export const Desc2 = styled(DescBlock)`
- left: calc(50% - 155px);
- top: 290px;
- transform: rotate(3deg);
-`
-export const Desc3 = styled(DescBlock)`
- left: calc(50% + 80px);
- top: 240px;
- transform: rotate(-2deg);
-`
-export const Desc4 = styled(DescBlock)`
- left: calc(50% - 26px);
- top: 278px;
- transform: rotate(2deg);
-`
-
-export const CurlyLineIcon = styled(CurlyLineSVG)`
- ${css.size(520)};
- opacity: 0.5;
- z-index: -2;
- z-index: -2;
-
- transform: rotate(9deg) scaleY(1.2);
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/d2k.ts b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/d2k.ts
deleted file mode 100644
index b1e3784f8..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/d2k.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-
-import css, { theme } from '@/css'
-
-import CurlyLineSVG from './D2KSVG'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-both')};
- width: 100%;
- height: auto;
- position: relative;
- margin-top: -272px;
- z-index: -1;
-
- ${css.media.mobile`
- display: none;
- `};
-`
-
-export const DescBlock = styled.div`
- position: absolute;
- top: 100px;
- ${css.row('align-center')};
- color: ${theme('article.digest')};
- font-size: 13px;
- font-weight: 400;
- opacity: 0.4;
-`
-
-export const Desc = styled(DescBlock)`
- left: calc(50% - 78px);
- top: 216px;
- transform: rotate(4deg);
-`
-
-export const Desc2 = styled(DescBlock)`
- left: calc(50% - 185px);
- top: 270px;
- transform: rotate(3deg);
-`
-export const Desc3 = styled(DescBlock)`
- left: calc(50% + 68px);
- top: 250px;
- transform: rotate(-2deg);
-`
-export const Desc4 = styled(DescBlock)`
- left: calc(50% + -25px);
- top: 290px;
- transform: rotate(2deg);
-`
-
-export const CurlyLineIcon = styled(CurlyLineSVG)`
- ${css.size(520)};
- opacity: 0.5;
- z-index: -2;
-
- transform: rotate(8deg) scaleY(1.2);
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/k2c.ts b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/k2c.ts
deleted file mode 100644
index 9fd31b904..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/k2c.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-
-import css, { theme } from '@/css'
-
-import CurlyLineSVG from './K2CSVG'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-both')};
- width: 100%;
- height: auto;
- position: relative;
- margin-top: -268px;
- z-index: -1;
-
- ${css.media.mobile`
- display: none;
- `};
-`
-
-export const DescBlock = styled.div`
- position: absolute;
- top: 100px;
- ${css.row('align-center')};
- color: ${theme('article.digest')};
- font-size: 13px;
- font-weight: 400;
- opacity: 0.4;
-`
-export const Desc = styled(DescBlock)`
- left: calc(50% - 25px);
- top: 200px;
- transform: rotate(-4deg);
-`
-export const Desc2 = styled(DescBlock)`
- left: calc(50% - 150px);
- top: 230px;
- transform: rotate(3deg);
-`
-export const Desc3 = styled(DescBlock)`
- left: calc(50% + 80px);
- top: 250px;
- transform: rotate(-2deg);
-`
-export const Desc4 = styled(DescBlock)`
- left: calc(50% - 110px);
- top: 285px;
- transform: rotate(-3deg);
-`
-export const CurlyLineIcon = styled(CurlyLineSVG)`
- ${css.size(500)};
- transform: rotatey(180deg) rotate(7deg) scaleY(1.2);
- opacity: 0.5;
- z-index: -2;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/u2d.ts b/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/u2d.ts
deleted file mode 100644
index fc1b4b04f..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/curly_line_desc/u2d.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-
-import css, { theme } from '@/css'
-
-import CurlyLineSVG from './U2DSVG'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-both')};
- width: 100%;
- height: auto;
- position: relative;
- margin-top: -50px;
- z-index: -1;
-
- ${css.media.mobile`
- display: none;
- `};
-`
-export const Circle = styled.div`
- ${css.circle(8)};
- border: 1px solid;
- border-color: ${theme('article.info')};
- position: absolute;
- left: calc(50% - 44px);
- top: 110px;
- opacity: 0.4;
-`
-
-export const DescBlock = styled.div`
- position: absolute;
- top: 100px;
- ${css.row('align-center')};
- color: ${theme('article.digest')};
- font-size: 13px;
- font-weight: 400;
- opacity: 0.4;
-`
-
-export const Desc = styled(DescBlock)`
- left: calc(50% - 125px);
- top: 145px;
- transform: rotate(4deg);
-`
-
-export const Desc2 = styled(DescBlock)`
- left: calc(50% - 100px);
- top: 240px;
- transform: rotate(-3deg);
-`
-export const Desc3 = styled(DescBlock)`
- left: calc(50% - 10px);
- top: 180px;
- transform: rotate(-2deg);
-`
-export const Desc4 = styled(DescBlock)`
- left: calc(50% + 100px);
- top: 240px;
- transform: rotate(-2deg);
-`
-export const Desc5 = styled(DescBlock)`
- left: calc(50% - 40px);
- top: 275px;
- transform: rotate(3deg);
-`
-export const CurlyLineIcon = styled(CurlyLineSVG)`
- ${css.size(500)};
- transform: rotatey(180deg) rotate(2deg) scaleY(1);
- margin-left: 60px;
- opacity: 0.6;
- z-index: -1;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/index.ts b/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/index.ts
deleted file mode 100644
index 08f5a1265..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/discuss_demo/index.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import styled from 'styled-components'
-
-import { Bar as BarBase } from '@/widgets/Common'
-
-import ViewSVG from '@/icons/article/Viewed'
-import UpvoteSVG from '@/icons/Upvote'
-import CommentSVG from '@/icons/Comment'
-
-import css, { theme } from '@/css'
-
-export const Wrapper = styled.div`
- ${css.row('justify-between')};
- position: relative;
- padding: 30px;
- opacity: 0.8;
-`
-export const ListsWrapper = styled.div`
- width: 240px;
- height: 380px;
-`
-export const DetailWrapper = styled.div`
- flex-grow: 1;
- height: 360px;
- padding: 8px 20px;
- padding-left: 40px;
- margin-top: -10px;
-
- border-left: 1px solid transparent;
- border-image: linear-gradient(0.5turn, transparent, #eae3ef, #eae3ef, #eae3ef, transparent);
-
- border-image-slice: 1;
-`
-export const Status = styled.div`
- ${css.row('align-center')};
- margin-top: 10px;
- margin-bottom: 22px;
-`
-export const UpvoteWrapper = styled.div`
- ${css.row('align-center')};
- border: 1px solid;
- color: ${theme('rainbow.purple')};
- font-size: 11px;
- font-weight: 500;
- border-color: #e5d7ea;
- padding: 0 10px;
- border-radius: 10px;
- margin-top: 2px;
-`
-export const ViewIcon = styled(ViewSVG)`
- ${css.size(10)};
- fill: ${theme('rainbow.purple')};
- opacity: 0.6;
-`
-export const UpvoteIcon = styled(UpvoteSVG)`
- ${css.size(10)};
- fill: ${theme('rainbow.purple')};
- transform: scaleY(0.8);
- opacity: 0.8;
- margin-right: 3px;
-`
-export const CommentIcon = styled(CommentSVG)`
- ${css.size(10)};
- fill: ${theme('rainbow.purple')};
- opacity: 0.6;
-`
-export const Count = styled.div`
- color: ${theme('rainbow.purple')};
- font-size: 12px;
- font-weight: 400;
- margin-left: 3px;
- opacity: 0.8;
-`
-export const Bar = styled(BarBase)`
- background: ${theme('rainbow.purple')};
-`
-export const CommentsHeader = styled.div`
- ${css.row('align-center')};
- color: ${theme('rainbow.purple')};
- font-weight: 500;
- font-size: 12px;
- margin-top: 24px;
- margin-bottom: 15px;
- opacity: 0.8;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/index.ts b/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/index.ts
deleted file mode 100644
index 173cd1e65..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/index.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-type TWrapper = TActive
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.row('align-center', 'justify-between')};
- width: 100%;
- height: 730px;
- padding: 0 12%;
- margin-top: -168px;
- position: relative;
-
- /* background: radial-gradient(circle at 20% 30%, #ffdbbb4a, transparent 20%); */
-
- &:after {
- content: '';
- position: absolute;
- width: 100%;
- height: 100%;
- background: radial-gradient(circle at 60% 52%, #9b9bb861 0, transparent 35%);
- opacity: ${({ $active }) => ($active ? 0.4 : 0)};
- transition: opacity 0.5s;
- transition-delay: 1s;
- z-index: -1;
- }
-
- ${css.media.mobile`
- ${css.column()};
- margin-top: 200px;
- padding: 0 18px;
- height: auto;
-
- &:after {
- display: none;
- }
- `};
-`
-export const Slogan = styled.div`
- ${css.column('align-both')};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/intro_digest.ts b/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/intro_digest.ts
deleted file mode 100644
index 40839c2fc..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/intro_digest.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-import css from '@/css'
-
-import { FEAT } from '../../../constant'
-
-export { FeatList } from '..'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-start')};
- width: 48%;
- height: 430px;
- padding-left: 1%;
-
- *::selection {
- background-color: ${FEAT.DISCUSS.COLOR} !important;
- color: white;
- }
-
- ${css.media.mobile`
- width: 100%;
- padding: 0;
- height: auto;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/intro_image.ts b/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/intro_image.ts
deleted file mode 100644
index dc4cf3ea9..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/discuss_feat/intro_image.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-import UpvoteSVG from '@/icons/Upvote'
-import CommentSVG from '@/icons/Comment'
-import ShareSVG from '@/icons/Share'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.columnGrow('align-both')};
- position: relative;
-
- ${css.media.mobile`
- transform: scale(0.52);
- margin-top: -50px;
- `};
-`
-export const ImageWrapper = styled.div`
- width: 600px;
- height: 400px;
-
- z-index: 2;
- background: white;
- padding: 5px;
- border-radius: 10px;
- border: 1px dotted;
- border-color: #af92c1;
- overflow: hidden;
-`
-export const ColorBlock = styled.div`
- position: absolute;
- left: -300px;
- top: -400px;
-
- left: 0;
- top: -400px;
-
- width: 600px;
- height: 390px;
-
- background: linear-gradient(137deg, rgb(233 222 241) 52%, rgb(240 225 238) 100%);
- border-radius: 20px;
-
- box-shadow: ${({ $active }) => ($active ? '0 5px 25px rgb(35 35 35 / 10%)' : 'none')};
- transform: rotate(-5deg);
-
- ${css.media.mobile`
- left: 0;
- top: 0;
- transform: rotate(-4deg);
- opacity: 0.8;
- `};
-`
-export const ColorBlockHolder = styled(ColorBlock)`
- left: 0px;
- top: 0;
- opacity: 0.3;
-`
-export const IconsWrapper = styled.div`
- position: absolute;
- ${css.row('align-center')};
- gap: 0 18px;
- bottom: -30px;
- right: -250px;
- z-index: -1;
-`
-export const Icon1 = styled(UpvoteSVG)`
- ${css.size(18)};
- fill: #b086bd;
- opacity: 0.8;
- transform: scaleY(0.8);
- margin-top: -1px;
-`
-export const Icon2 = styled(CommentSVG)`
- ${css.size(16)};
- fill: #b086bd;
- opacity: 0.6;
-`
-export const Icon3 = styled(ShareSVG)`
- ${css.size(18)};
- fill: #b086bd;
- opacity: 0.7;
- margin-top: -1px;
- margin-left: -2px;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/feat_head.ts b/src/containers/content/LandingPage/styles/feature_wall/feat_head.ts
deleted file mode 100644
index e7abbab8d..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/feat_head.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import styled from 'styled-components'
-
-import css, { theme } from '@/css'
-
-import type { TActive } from '@/spec'
-// import type { TActive, TTestable } from '@/spec'
-import type { TFeatType } from '../../spec'
-import { FEAT } from '../../constant'
-
-export const Wrapper = styled.div<{ alignRight: boolean }>`
- ${css.column()};
- align-items: ${({ alignRight }) => (alignRight ? 'flex-end' : 'flex-start')};
-`
-export const Title = styled.div<{ featType: TFeatType }>`
- ${css.row('align-center')};
- /* color: ${({ featType }) => FEAT[featType].COLOR}; */
- color: ${theme('article.title')};
- font-size: 21px;
- font-weight: 500;
- text-shadow: rgb(0 0 0 / 8%) 0px 10px 20px;
-
- ${css.media.mobile`
- font-size: 20px;
- padding-left: 5px;
- `};
-`
-
-export const Hint = styled.div`
- font-size: 22px;
- margin-left: 15px;
- opacity: ${({ $active }) => ($active ? 0.2 : 0)};
-
- font-style: italic;
-
- transition: all 0.3s;
- transition-delay: 0.5s;
-
- ${css.media.mobile`
- font-size: 20px;
- margin-left: 8px;
- `};
-`
-
-export const Desc = styled.div<{ alignRight: boolean }>`
- font-size: 16px;
- color: ${theme('article.digest')};
- margin-top: 12px;
- width: 340px;
- opacity: 0.65;
-
- text-align: ${({ alignRight }) => (alignRight ? 'right' : 'left')};
-
- ${css.media.mobile`
- font-size: 14px;
- width: 100%;
- padding: 0 5px;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/feat_item.ts b/src/containers/content/LandingPage/styles/feature_wall/feat_item.ts
deleted file mode 100644
index a2d21f241..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/feat_item.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import styled from 'styled-components'
-
-import css, { theme } from '@/css'
-
-import CheckSVG from '@/icons/CheckBold'
-
-// import type { TActive, TTestable } from '@/spec'
-import type { TFeatType } from '../../spec'
-import { FEAT } from '../../constant'
-
-export const Wrapper = styled.div`
- ${css.row('align-center')};
- margin-left: 18px;
-
- ${css.media.mobile`
- margin-left: 0;
- min-width: 50%;
- `};
-`
-
-export const CheckIcon = styled(CheckSVG)<{ featType: TFeatType }>`
- ${css.size(16)};
- fill: ${({ featType }) => FEAT[featType].COLOR};
- opacity: 0.6;
- margin-right: 14px;
-
- ${css.media.mobile`
- ${css.size(10)};
- margin-right: 5px;
- `};
-`
-
-export const Text = styled.div`
- color: ${theme('article.digest')};
- font-size: 16px;
-
- ${css.media.mobile`
- font-size: 12px;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/help_demo.ts b/src/containers/content/LandingPage/styles/feature_wall/help_feat/help_demo.ts
deleted file mode 100644
index 9c1385d0b..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/help_feat/help_demo.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import styled from 'styled-components'
-
-import css, { theme } from '@/css'
-
-import ShareSVG from '@/icons/Share'
-import QuestionSVG from '@/icons/Question'
-import BookSVG from '@/icons/Book'
-import { Bar as BarBase } from '@/widgets/Common'
-
-import ArrowSimple from '@/icons/ArrowSimple'
-
-export const Wrapper = styled.div`
- ${css.row()};
- width: 100%;
- padding: 30px 40px;
-`
-export const Sidebar = styled.div`
- width: 115px;
- height: 340px;
- border-right: 1px solid;
- border-right-color: ${theme('divider')};
-`
-export const Content = styled.div`
- ${css.column('align-center')};
- flex-grow: 1;
- width: 260px;
- gap: 10px;
- padding-left: 15px;
-`
-export const InnerContent = styled.div`
- ${css.column()};
- width: 260px;
- position: relative;
-`
-export const ShareIcon = styled(ShareSVG)`
- ${css.size(12)};
- fill: #e9c79a;
- position: absolute;
- top: 11px;
- right: -1px;
-`
-
-export const Footer = styled.div`
- ${css.row('align-center')};
- margin-top: 20px;
- width: 100%;
- width: 270px;
-`
-const ArrowIcon = styled(ArrowSimple)`
- ${css.size(18)};
- fill: #aac387;
-`
-export const LeftArrowIcon = styled(ArrowIcon)``
-export const RightArrowIcon = styled(ArrowIcon)`
- transform: rotate(180deg);
-`
-export const BookIcon = styled(BookSVG)`
- ${css.size(15)};
- fill: #e9c79a;
- z-index: 1;
-`
-export const QuestionIcon = styled(QuestionSVG)`
- ${css.size(12)};
- fill: #e9c79a;
- z-index: 1;
-`
-export const PinnedItem = styled.div`
- ${css.row('align-center')};
- margin-bottom: 10px;
-`
-export const Header = styled.div`
- ${css.column()};
- width: 260px;
- margin-top: 25px;
- margin-bottom: 10px;
-`
-export const Cover = styled.div`
- width: 260px;
- height: 140px;
- border-radius: 5px;
- margin-top: 10px;
- margin-bottom: 10px;
-
- background: linear-gradient(137deg, #ecc297 52%, #fcebd9 100%);
- backdrop-filter: blur(5px);
-
- opacity: 0.3;
-`
-export const Title = styled.div`
- ${css.row('align-center')};
- color: #f9b7b6;
- font-weight: 600;
- font-size: 12px;
-`
-export const GreyTitle = styled(Title)`
- color: ${theme('article.digest')};
-`
-export const TagsWrapper = styled.div`
- ${css.row('align-center')};
- margin-top: 10px;
-`
-
-export const Divider = styled.div`
- width: 300px;
- height: 1px;
-
- border-bottom: 1px solid transparent;
- border-image: linear-gradient(0.35turn, transparent, #b6cc97, #b6cc97, #b6cc97, transparent);
-
- border-image-slice: 1;
-
- margin-top: 30px;
-
- opacity: 0.5;
-`
-
-export const Bar = styled(BarBase)`
- background: #dcb370;
- background: #ecc297;
-`
-
-export const GreyBar = styled(BarBase)`
- background: ${theme('article.digest')};
-`
-export const Previous = styled.div`
- opacity: 0.2;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/index.ts b/src/containers/content/LandingPage/styles/feature_wall/help_feat/index.ts
deleted file mode 100644
index 103db0dad..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/help_feat/index.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-type TWrapper = TActive
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.row('align-center', 'justify-between')};
- width: 100%;
- height: 730px;
- padding: 0 12%;
- margin-top: -280px;
- position: relative;
-
- /* background: ${({ $active }) =>
- $active
- ? 'radial-gradient(circle at 68% 50%, #e5847873 0, transparent 35%),radial-gradient(circle at 20% 30%, #ffdbbb4a, transparent 20%);'
- : 'radial-gradient(circle at 20% 30%, #ffdbbb4a, transparent 20%)'}; */
-
- background: radial-gradient(circle at 75% 50%, #c6be9a26 0, transparent 20%);
-
- // right
- /* background: radial-gradient(circle at 68% 50%, #e5847873 0, transparent 35%); */
-
- &:after {
- content: '';
- position: absolute;
- width: 100%;
- height: 100%;
- background: radial-gradient(circle at 20% 50%, #faf1e7 0, transparent 30%);
- opacity: ${({ $active }) => ($active ? 0.8 : 0)};
- transition: opacity 0.5s;
- transition-delay: 1s;
- z-index: -1;
- }
-
- ${css.media.mobile`
- ${css.column()};
- margin-top: 80px;
- padding: 0 18px;
- height: auto;
-
- &:after {
- display: none;
- }
- `};
-`
-export const Slogan = styled.div`
- ${css.column('align-both')};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/intro_digest.ts b/src/containers/content/LandingPage/styles/feature_wall/help_feat/intro_digest.ts
deleted file mode 100644
index 72ae1280e..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/help_feat/intro_digest.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-import css from '@/css'
-
-import { FEAT } from '../../../constant'
-
-export { FeatList } from '..'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-start')};
- width: 48%;
- height: 430px;
- padding-left: 12%;
-
- *::selection {
- background-color: ${FEAT.HELP.COLOR} !important;
- color: white;
- }
-
- ${css.media.mobile`
- width: 100%;
- padding: 0;
- height: auto;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/help_feat/intro_image.ts b/src/containers/content/LandingPage/styles/feature_wall/help_feat/intro_image.ts
deleted file mode 100644
index e9a70300b..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/help_feat/intro_image.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-import BadSVG from './BadSVG'
-import SoSoSVG from './SoSoSVG'
-import GoodSVG from './GoodSVG'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.columnGrow('align-both')};
- position: relative;
-
- ${css.media.mobile`
- transform: scale(0.52);
- margin-top: -50px;
- `};
-`
-export const ImageWrapper = styled.div`
- width: 600px;
- height: 400px;
-
- background: white;
- border: 1px dotted;
- border-color: #d5a14e;
- border-radius: 10px;
- z-index: 2;
-`
-export const ColorBlock = styled.div`
- position: absolute;
- left: 0;
- top: -400px;
- width: 600px;
- height: 390px;
-
- background: linear-gradient(137deg, #ffe9d6 52%, #fffbf5 100%);
- border-radius: 20px;
- transform: rotate(4deg);
-
- ${css.media.mobile`
- left: -140px;
- top: 5px;
- `};
-`
-export const ColorBlockHolder = styled(ColorBlock)`
- left: 0px;
- top: 0;
- opacity: 0.3;
-`
-export const IconsWrapper = styled.div`
- position: absolute;
- ${css.row('align-center')};
- gap: 0 18px;
- bottom: -40px;
- left: -260px;
-`
-
-export const Icon1 = styled(BadSVG)`
- ${css.size(19)};
- opacity: 0.85;
- margin-top: -1px;
-`
-export const Icon2 = styled(SoSoSVG)`
- ${css.size(19)};
- opacity: 0.85;
- margin-top: -1px;
-`
-export const Icon3 = styled(GoodSVG)`
- ${css.size(20)};
- opacity: 0.8;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/index.ts b/src/containers/content/LandingPage/styles/feature_wall/index.ts
deleted file mode 100644
index b02cfb18d..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/index.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-
-import css, { theme } from '@/css'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-both')};
- width: 100%;
- height: auto;
-`
-export const Slogan = styled.div`
- ${css.column('align-both')};
-`
-export const Title = styled.div`
- color: ${theme('article.title')};
- font-size: 38px;
- font-weight: 500;
- position: relative;
-
- text-shadow: rgb(0 0 0 / 8%) 0px 10px 20px;
- opacity: 0.9;
-
- ${css.media.mobile`
- font-size: 22px;
- `};
-`
-
-export const Desc = styled.div`
- font-size: 17px;
- ${theme('article.digest')};
- margin-top: 12px;
- opacity: 0.8;
-
- ${css.media.mobile`
- font-size: 15px;
- text-align: center;
- padding: 0 20px;
- opacity: 0.6;
- `};
-`
-//
-export const Wall = styled.div`
- ${css.column('align-both')};
- width: 100%;
- margin-top: -120px;
-`
-
-export const FeatList = styled.div`
- ${css.column()};
- gap: 18px 0;
- margin-top: 28px;
-
- ${css.media.mobile`
- ${css.row()};
- `};
-`
-
-export const MobileIntroLists = styled.div`
- ${css.rowWrap()};
- gap: 16px 0;
- padding-left: 10px;
- margin-top: -25px;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/index.ts b/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/index.ts
deleted file mode 100644
index e6b8c1324..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/index.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-type TWrapper = TActive
-
-export const DesktopOnly = styled.div`
- ${css.row('align-center', 'justify-between')};
- ${css.media.mobile`
- display: none;
- `};
-`
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.row('align-center', 'justify-between')};
- width: 100%;
- height: 730px;
- padding: 0 12%;
- margin-top: -280px;
- position: relative;
-
- /* background: radial-gradient(circle at 75% 28%, #f0f9fe4d 0, transparent 20%); */
-
- // right
- /* background: radial-gradient(circle at 68% 50%, #e5847873 0, transparent 35%); */
-
- &:after {
- content: '';
- position: absolute;
- width: 100%;
- height: 100%;
- background: radial-gradient(circle at 20% 50%, #ccddefde 0, transparent 30%);
- opacity: ${({ $active }) => ($active ? 0.3 : 0)};
- transition: opacity 0.3s;
- transition-delay: 1s;
- z-index: -1;
- }
-
- ${css.media.mobile`
- ${css.column()};
- margin-top: 80px;
- padding: 0 18px;
- height: auto;
-
- &:after {
- display: none;
- }
- `};
-`
-export const Slogan = styled.div`
- ${css.column('align-both')};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/intro_digest.ts b/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/intro_digest.ts
deleted file mode 100644
index 3cf4bc6b8..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/intro_digest.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable } from '@/spec'
-import css from '@/css'
-
-import { FEAT } from '../../../constant'
-
-export { FeatList } from '..'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.column('align-start')};
- width: 48%;
- height: 430px;
- padding-left: 12%;
-
- *::selection {
- background-color: ${FEAT.KANBAN.COLOR} !important;
- color: white;
- }
-
- ${css.media.mobile`
- width: 100%;
- padding: 0;
- height: auto;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/intro_image.ts b/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/intro_image.ts
deleted file mode 100644
index a9ba1f08e..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/intro_image.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import styled from 'styled-components'
-
-import type { TActive, TTestable } from '@/spec'
-
-import css from '@/css'
-
-import GtdWipSVG from '@/icons/GtdWip'
-import GtdDoneSVG from '@/icons/GtdDone'
-import GtdTodoSVG from '@/icons/GtdTodo'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.columnGrow('align-both')};
- position: relative;
-
- ${css.media.mobile`
- transform: scale(0.52);
- margin-top: -50px;
- `};
-`
-export const ImageWrapper = styled.div`
- ${css.column('align-end')};
- width: 600px;
- height: 400px;
- background: white;
- border: 1px dotted;
- border-color: #c8d5f2;
- border-radius: 10px;
- z-index: 2;
-`
-
-export const ColorBlock = styled.div`
- position: absolute;
- left: 0;
- top: -400px;
- width: 600px;
- height: 390px;
- background: linear-gradient(137deg, rgb(226 236 255) 52%, rgb(219 238 241) 100%);
- /* backdrop-filter: blur(5px); */
- border-radius: 20px;
- /* box-shadow: ${({ $active }) => ($active ? '0 5px 25px rgb(35 35 35 / 10%)' : 'none')}; */
- transform: rotate(4deg);
-
- ${css.media.mobile`
- left: -140px;
- top: 5px;
- `};
-`
-export const ColorBlockHolder = styled(ColorBlock)`
- left: 0px;
- top: 0;
- opacity: 0.3;
-`
-export const IconsWrapper = styled.div`
- position: absolute;
- ${css.row('align-center')};
- gap: 0 15px;
- bottom: -38px;
- left: -270px;
-`
-export const Icon1 = styled(GtdTodoSVG)`
- ${css.size(19)};
- fill: #5799fb;
- opacity: 0.6;
-`
-export const Icon2 = styled(GtdWipSVG)`
- ${css.size(20)};
- fill: #5799fb;
- opacity: 0.8;
-`
-export const Icon3 = styled(GtdDoneSVG)`
- ${css.size(19)};
- fill: #69b8cc;
- opacity: 0.8;
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/kanban_demo/kanban_item.ts b/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/kanban_demo/kanban_item.ts
deleted file mode 100644
index c2d3407fd..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/kanban_feat/kanban_demo/kanban_item.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import styled from 'styled-components'
-
-import { Bar as BarBase } from '@/widgets/Common'
-import UpvoteSVG from '@/icons/Upvote'
-
-import css from '@/css'
-
-export const Wrapper = styled.div<{ opacity: number }>`
- ${css.column()};
- background: white;
- border-radius: 6px;
- height: 50px;
- padding: 3px 6px;
- opacity: ${({ opacity }) => opacity};
-`
-
-export const Bar = styled(BarBase)`
- background: #a4c4f4;
-`
-
-export const Footer = styled.div`
- ${css.row('align-center')};
-`
-
-export const UpvoteIcon = styled(UpvoteSVG)`
- ${css.size(10)};
- transform: scaleY(0.8);
- fill: #5d9dfb;
- opacity: 0.8;
- margin-top: 1px;
-`
-
-export const Count = styled.div`
- font-size: 13px;
- color: #5d9dfb;
- margin-left: 4px;
- flex-grow: 1;
- /* opacity: 0.8; */
-`
diff --git a/src/containers/content/LandingPage/styles/feature_wall/user_voice.ts b/src/containers/content/LandingPage/styles/feature_wall/user_voice.ts
deleted file mode 100644
index 91b624cd6..000000000
--- a/src/containers/content/LandingPage/styles/feature_wall/user_voice.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import styled from 'styled-components'
-
-import type { TTestable, TColorName } from '@/spec'
-import css, { theme, rainbow, rainbowLight } from '@/css'
-import TreesSVG from '@/icons/Trees'
-
-export const Wrapper = styled.div.attrs(({ $testid }) => ({
- 'data-test-id': $testid,
-}))`
- ${css.rowWrap('align-both')};
- gap: 40px 25px;
- height: auto;
- margin-top: 80px;
- width: 1080px;
- width: 80%;
- border-radius: 50%;
- position: relative;
-
- ${css.media.mobile`
- border-radius: 15px;
- gap: 30px 20px;
- width: 100%;
- margin-top: 40px;
- `};
-`
-export const TreeWrapper = styled.div`
- height: 240px;
- width: 700px;
- border-radius: 300px;
- opacity: 0.03;
- z-index: -1;
- overflow: hidden;
- position: absolute;
- top: -20px;
- left: 200px;
-
- ${css.media.mobile`
- top: 20px;
- left: 0;
- width: 100%;
- height: 350px;
- `};
-`
-export const TreesIcon = styled(TreesSVG)`
- height: 240px;
- width: 700px;
- fill: ${theme('article.digest')};
-
- ${css.media.mobile`
- width: 100%;
- height: 350px;
- `};
-`
-export const Card = styled.div`
- ${css.row('align-center')};
- background: white;
- /* border: 1px solid; */
- border-color: ${theme('divider')};
- border-radius: 15px;
- width: auto;
- padding: 5px 10px;
- z-index: 2;
-
- /* box-shadow: ${css.cardShadow}; */
- box-shadow: 0 5px 25px rgb(35 35 35 / 10%);
-
- ${css.media.mobile`
- padding: 5px 6px;
- `};
-`
-export const Avatar = styled.div<{ color: TColorName }>`
- ${css.circle(30)};
- ${css.row('align-both')};
- padding: 2px;
- color: ${({ color }) => rainbow(color)};
- font-size: 12px;
- background-color: ${({ color }) => rainbowLight(color)};
-
- ${css.media.mobile`
- ${css.circle(20)};
- ${css.row('align-both')};
- font-size: 8px;
- `};
-`
-export const Title = styled.div`
- color: ${theme('article.title')};
- font-size: 15px;
- margin-left: 8px;
-
- ${css.media.mobile`
- font-size: 12px;
- margin-left: 5px;
- `};
-`
diff --git a/src/containers/content/LandingPage/styles/users_wall/index.ts b/src/containers/content/LandingPage/styles/users_wall/index.ts
index 2935b1c82..744260d55 100644
--- a/src/containers/content/LandingPage/styles/users_wall/index.ts
+++ b/src/containers/content/LandingPage/styles/users_wall/index.ts
@@ -9,6 +9,7 @@ export const Wrapper = styled.div.attrs(({ $testid }) => ({
}))`
${css.column('align-both')};
width: 100%;
+ position: relative;
`
export const Slogan = styled.div`
${css.column('align-both')};
@@ -67,10 +68,11 @@ export const WallInner = styled.div`
`
export const BgGradient = styled.div`
position: absolute;
- top: -10vh;
- left: -50vw;
+ top: 12vh;
+ left: -14vw;
width: 100vw;
height: 100vh;
+ opacity: 0.7;
background: radial-gradient(circle at 50% 50%, #e8c3afc4 0, transparent 35%);
`
diff --git a/src/containers/editor/ArticleEditor/ArticleCover.tsx b/src/containers/editor/ArticleEditor/ArticleCover.tsx
index 104210473..68ed4f8d6 100644
--- a/src/containers/editor/ArticleEditor/ArticleCover.tsx
+++ b/src/containers/editor/ArticleEditor/ArticleCover.tsx
@@ -12,7 +12,7 @@ const CoverEditor = dynamic(() => import('@/containers/editor/CoverEditor'), {
})
const ArticleCover: FC = () => {
- const [hasCover, setHasCover] = useState(false)
+ const [hasCover, setHasCover] = useState(true)
return (
diff --git a/src/containers/editor/ArticleEditor/index.tsx b/src/containers/editor/ArticleEditor/index.tsx
index 7af6d04c9..736d70b5a 100755
--- a/src/containers/editor/ArticleEditor/index.tsx
+++ b/src/containers/editor/ArticleEditor/index.tsx
@@ -62,9 +62,7 @@ const ArticleEditor: FC = ({ metric = METRIC.ARTICLE_EDITOR }) => {
{isArchived && }
-
-
`
border: 1px solid;
z-index: 1;
- border-color: ${({ $active, $color }) =>
- $active ? rainbow($color, 'article.digest') : theme('divider')};
+ border-color: ${({ $active, $color }) => ($active ? rainbowLink($color) : theme('divider'))};
box-shadow: ${({ $active }) => ($active ? css.cardShadow : 'none')};
background: ${theme('alphaBg')};
diff --git a/src/containers/thread/DashboardThread/styles/layout/index.ts b/src/containers/thread/DashboardThread/styles/layout/index.ts
index ac93292e2..2d6c69634 100644
--- a/src/containers/thread/DashboardThread/styles/layout/index.ts
+++ b/src/containers/thread/DashboardThread/styles/layout/index.ts
@@ -1,7 +1,7 @@
import styled from 'styled-components'
import type { TActive, TColor, TColorName } from '@/spec'
-import css, { theme, rainbow } from '@/css'
+import css, { theme, rainbow, rainbowLink } from '@/css'
export const Wrapper = styled.div`
${css.column()};
@@ -44,19 +44,18 @@ export const TitleBase = styled.div`
type TBlockBase = TActive & TColor
export const BlockBase = styled.div`
- opacity: ${({ $active }) => ($active ? 0.8 : theme('dashboardBlockOpacity'))};
+ opacity: ${({ $active }) => ($active ? 0.85 : theme('dashboardBlockOpacity'))};
box-shadow: ${({ $active }) => ($active ? css.cardShadow : '')};
-
background-color: ${({ $active }) => ($active ? theme('alphaBg') : 'transparent')};
border: 1px solid;
border-radius: 7px;
- border-color: ${({ $active, $color }) => ($active ? rainbow($color, 'hint') : theme('primary'))};
+ border-color: ${({ $active, $color }) => ($active ? rainbowLink($color) : theme('primary'))};
padding: 16px 15px;
&:hover {
- opacity: 0.6;
- border-color: ${({ $color }) => rainbow($color)};
+ opacity: ${({ $active }) => ($active ? 0.85 : 0.65)};
+ border-color: ${({ $color }) => rainbowLink($color)};
cursor: pointer;
}
diff --git a/src/spec/theme.d.ts b/src/spec/theme.d.ts
index ae5c46beb..0969f47f6 100755
--- a/src/spec/theme.d.ts
+++ b/src/spec/theme.d.ts
@@ -20,6 +20,7 @@ export type TThemeMap = {
yellow: string
green: string
cyan: string
+ cyanBg: string
blue: string
purple: string
diff --git a/src/widgets/ArticleCatState/index.tsx b/src/widgets/ArticleCatState/index.tsx
index e063a8f6c..7c0685253 100755
--- a/src/widgets/ArticleCatState/index.tsx
+++ b/src/widgets/ArticleCatState/index.tsx
@@ -23,6 +23,7 @@ export type TProps = {
cat?: TArticleCat
state?: TArticleState
smaller?: boolean
+ noBorder?: boolean
// size?
} & TSpace
@@ -31,10 +32,11 @@ const ArticleCatState: FC = ({
cat = ARTICLE_CAT.FEATURE,
state = ARTICLE_STATE.DEFAULT,
smaller = true,
+ noBorder = false,
...restProps
}) => {
return (
-
+
{cat && }
{cat && cat !== ARTICLE_CAT.OTHER && }
diff --git a/src/widgets/ArticleCatState/styles/index.ts b/src/widgets/ArticleCatState/styles/index.ts
index e7e5a3721..2bc5f0c46 100755
--- a/src/widgets/ArticleCatState/styles/index.ts
+++ b/src/widgets/ArticleCatState/styles/index.ts
@@ -3,13 +3,13 @@ import styled from 'styled-components'
import type { TSpace, TTestable } from '@/spec'
import css, { theme } from '@/css'
-type TWrapper = TTestable & TSpace
+type TWrapper = TTestable & TSpace & { $noBorder: boolean }
export const Wrapper = styled.div.attrs(({ $testid }) => ({
'data-test-id': $testid,
}))`
${css.row('align-center')};
color: ${theme('article.digest')};
- border: 1px solid;
+ border: ${({ $noBorder }) => ($noBorder ? 'none' : '1px solid')};
border-color: ${theme('divider')};
border-radius: 6px;
diff --git a/src/widgets/Common/index.ts b/src/widgets/Common/index.ts
index 681cad1f7..64e8da247 100755
--- a/src/widgets/Common/index.ts
+++ b/src/widgets/Common/index.ts
@@ -133,3 +133,11 @@ export const MarkdownStyles = styled.div`
export const WithMargin = styled.div`
${(props) => css.spaceMargins(props)};
`
+
+export const WithPosition = styled.div`
+ position: absolute;
+ ${({ top }) => (top !== undefined ? `top: ${top}px;` : '')}
+ ${({ left }) => (left !== undefined ? `left: ${left}px;` : '')}
+ ${({ bottom }) => (bottom !== undefined ? `bottom: ${bottom}px;` : '')}
+ ${({ right }) => (right !== undefined ? `right: ${right}px;` : '')}
+`
diff --git a/src/widgets/Icons/Blocks.tsx b/src/widgets/Icons/Blocks.tsx
new file mode 100644
index 000000000..fc02f1a31
--- /dev/null
+++ b/src/widgets/Icons/Blocks.tsx
@@ -0,0 +1,18 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/BlocksSolid.tsx b/src/widgets/Icons/BlocksSolid.tsx
new file mode 100644
index 000000000..88e67c5c5
--- /dev/null
+++ b/src/widgets/Icons/BlocksSolid.tsx
@@ -0,0 +1,18 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/DiscussSolid.tsx b/src/widgets/Icons/DiscussSolid.tsx
new file mode 100644
index 000000000..63591f8d6
--- /dev/null
+++ b/src/widgets/Icons/DiscussSolid.tsx
@@ -0,0 +1,11 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/Drag.tsx b/src/widgets/Icons/Drag.tsx
new file mode 100644
index 000000000..f5f10e315
--- /dev/null
+++ b/src/widgets/Icons/Drag.tsx
@@ -0,0 +1,11 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/EmojiBad.tsx b/src/widgets/Icons/EmojiBad.tsx
new file mode 100644
index 000000000..6b4fa700a
--- /dev/null
+++ b/src/widgets/Icons/EmojiBad.tsx
@@ -0,0 +1,25 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/EmojiGood.tsx b/src/widgets/Icons/EmojiGood.tsx
new file mode 100644
index 000000000..771405a87
--- /dev/null
+++ b/src/widgets/Icons/EmojiGood.tsx
@@ -0,0 +1,22 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/EmojiSoSo.tsx b/src/widgets/Icons/EmojiSoSo.tsx
new file mode 100644
index 000000000..54c0b18f2
--- /dev/null
+++ b/src/widgets/Icons/EmojiSoSo.tsx
@@ -0,0 +1,19 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/src/widgets/Icons/FlashLight.tsx b/src/widgets/Icons/FlashLight.tsx
new file mode 100644
index 000000000..2c0f873fc
--- /dev/null
+++ b/src/widgets/Icons/FlashLight.tsx
@@ -0,0 +1,11 @@
+import { memo, SVGProps } from 'react'
+
+const SVG = (props: SVGProps) => {
+ return (
+
+ )
+}
+
+export default memo(SVG)
diff --git a/utils/themes/skins/day.ts b/utils/themes/skins/day.ts
index c1cf561f5..33ddfc940 100644
--- a/utils/themes/skins/day.ts
+++ b/utils/themes/skins/day.ts
@@ -10,7 +10,7 @@ const contentBoxBg = '#fff'
const fontColor = primaryColor
const markdownFont = '#9eb8bd'
const border = '#EAE9E9'
-const link = '#005196' // '#6494cd'
+const link = '#256eab' // '#005196' // '#6494cd'
const actionText = '#647392'
const descText = '#666'
@@ -71,7 +71,7 @@ const day = {
red: '#ca5f4d',
redBg: '#ffbfba3d',
- orange: '#ce9f6f',
+ orange: 'orange',
orangeBg: '#FEF7E8',
brown: '#8d691e',
diff --git a/utils/themes/skins/night.ts b/utils/themes/skins/night.ts
index b5664cf16..272e9264f 100644
--- a/utils/themes/skins/night.ts
+++ b/utils/themes/skins/night.ts
@@ -66,7 +66,7 @@ const night = {
hint,
articleCardShadow: '0 2px 40px 0 rgb(62 62 62 / 27%))',
articleCardHover: '#575757',
- dashboardBlockOpacity: 0.7,
+ dashboardBlockOpacity: 0.95,
rainbow: {
red: '#ca5f4d',