chore: run lint fix
This commit is contained in:
+4
-2
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"extends": "next/core-web-vitals",
|
"plugins": ["prettier"],
|
||||||
|
"extends": ["next/core-web-vitals", "plugin:prettier/recommended"],
|
||||||
"rules": {
|
"rules": {
|
||||||
"no-console": "warn"
|
"no-console": "warn",
|
||||||
|
"prettier/prettier": "error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"semi": true,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"printWidth": 80,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid",
|
||||||
|
"embeddedLanguageFormatting": "auto",
|
||||||
|
"endOfLine": "auto"
|
||||||
|
}
|
||||||
Generated
+496
@@ -26,11 +26,13 @@
|
|||||||
"encoding": "^0.1.13",
|
"encoding": "^0.1.13",
|
||||||
"eslint": "8.49.0",
|
"eslint": "8.49.0",
|
||||||
"eslint-config-next": "13.4.19",
|
"eslint-config-next": "13.4.19",
|
||||||
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
"next": "13.4.19",
|
"next": "13.4.19",
|
||||||
"next-themes": "^0.2.1",
|
"next-themes": "^0.2.1",
|
||||||
"nextjs-toploader": "^1.4.2",
|
"nextjs-toploader": "^1.4.2",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"postcss": "8.4.29",
|
"postcss": "8.4.29",
|
||||||
|
"prettier": "^3.0.3",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
"react-icons": "^4.11.0",
|
"react-icons": "^4.11.0",
|
||||||
@@ -41,6 +43,9 @@
|
|||||||
"svix": "^1.11.0",
|
"svix": "^1.11.0",
|
||||||
"tailwindcss": "3.3.3",
|
"tailwindcss": "3.3.3",
|
||||||
"typescript": "5.2.2"
|
"typescript": "5.2.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint-config-prettier": "^9.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aashutoshrathi/word-wrap": {
|
"node_modules/@aashutoshrathi/word-wrap": {
|
||||||
@@ -1320,6 +1325,25 @@
|
|||||||
"node": ">=10.12.0"
|
"node": ">=10.12.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@pkgr/utils": {
|
||||||
|
"version": "2.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",
|
||||||
|
"integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
|
||||||
|
"dependencies": {
|
||||||
|
"cross-spawn": "^7.0.3",
|
||||||
|
"fast-glob": "^3.3.0",
|
||||||
|
"is-glob": "^4.0.3",
|
||||||
|
"open": "^9.1.0",
|
||||||
|
"picocolors": "^1.0.0",
|
||||||
|
"tslib": "^2.6.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/unts"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@rushstack/eslint-patch": {
|
"node_modules/@rushstack/eslint-patch": {
|
||||||
"version": "1.3.3",
|
"version": "1.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
|
||||||
@@ -1955,6 +1979,14 @@
|
|||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/big-integer": {
|
||||||
|
"version": "1.6.51",
|
||||||
|
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
|
||||||
|
"integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/binary-extensions": {
|
"node_modules/binary-extensions": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
||||||
@@ -1963,6 +1995,17 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/bplist-parser": {
|
||||||
|
"version": "0.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
|
||||||
|
"integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
|
||||||
|
"dependencies": {
|
||||||
|
"big-integer": "^1.6.44"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 5.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.11",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
@@ -2014,6 +2057,20 @@
|
|||||||
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
|
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/bundle-name": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==",
|
||||||
|
"dependencies": {
|
||||||
|
"run-applescript": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/busboy": {
|
"node_modules/busboy": {
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
|
||||||
@@ -2404,6 +2461,49 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/default-browser": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==",
|
||||||
|
"dependencies": {
|
||||||
|
"bundle-name": "^3.0.0",
|
||||||
|
"default-browser-id": "^3.0.0",
|
||||||
|
"execa": "^7.1.1",
|
||||||
|
"titleize": "^3.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.16"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/default-browser-id": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
|
||||||
|
"dependencies": {
|
||||||
|
"bplist-parser": "^0.2.0",
|
||||||
|
"untildify": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/define-lazy-prop": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/define-properties": {
|
"node_modules/define-properties": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
|
||||||
@@ -2776,6 +2876,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint-config-prettier": {
|
||||||
|
"version": "9.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
|
||||||
|
"integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"eslint-config-prettier": "bin/cli.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"eslint": ">=7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint-import-resolver-node": {
|
"node_modules/eslint-import-resolver-node": {
|
||||||
"version": "0.3.9",
|
"version": "0.3.9",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
|
||||||
@@ -2936,6 +3048,34 @@
|
|||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint-plugin-prettier": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==",
|
||||||
|
"dependencies": {
|
||||||
|
"prettier-linter-helpers": "^1.0.0",
|
||||||
|
"synckit": "^0.8.5"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^14.18.0 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/prettier"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@types/eslint": ">=8.0.0",
|
||||||
|
"eslint": ">=8.0.0",
|
||||||
|
"prettier": ">=3.0.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@types/eslint": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"eslint-config-prettier": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint-plugin-react": {
|
"node_modules/eslint-plugin-react": {
|
||||||
"version": "7.33.2",
|
"version": "7.33.2",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
|
||||||
@@ -3091,6 +3231,28 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/execa": {
|
||||||
|
"version": "7.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
|
||||||
|
"integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
|
||||||
|
"dependencies": {
|
||||||
|
"cross-spawn": "^7.0.3",
|
||||||
|
"get-stream": "^6.0.1",
|
||||||
|
"human-signals": "^4.3.0",
|
||||||
|
"is-stream": "^3.0.0",
|
||||||
|
"merge-stream": "^2.0.0",
|
||||||
|
"npm-run-path": "^5.1.0",
|
||||||
|
"onetime": "^6.0.0",
|
||||||
|
"signal-exit": "^3.0.7",
|
||||||
|
"strip-final-newline": "^3.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^14.18.0 || ^16.14.0 || >=18.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sindresorhus/execa?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/extend": {
|
"node_modules/extend": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||||
@@ -3101,6 +3263,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
|
||||||
},
|
},
|
||||||
|
"node_modules/fast-diff": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
|
||||||
|
},
|
||||||
"node_modules/fast-glob": {
|
"node_modules/fast-glob": {
|
||||||
"version": "3.3.1",
|
"version": "3.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
|
||||||
@@ -3320,6 +3487,17 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/get-stream": {
|
||||||
|
"version": "6.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
|
||||||
|
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/get-symbol-description": {
|
"node_modules/get-symbol-description": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
|
||||||
@@ -3595,6 +3773,14 @@
|
|||||||
"node": "*"
|
"node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/human-signals": {
|
||||||
|
"version": "4.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
|
||||||
|
"integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.18.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/iconv-lite": {
|
"node_modules/iconv-lite": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||||
@@ -3822,6 +4008,20 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"url": "https://github.com/sponsors/wooorm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-docker": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
|
||||||
|
"bin": {
|
||||||
|
"is-docker": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-extglob": {
|
"node_modules/is-extglob": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||||
@@ -3875,6 +4075,23 @@
|
|||||||
"url": "https://github.com/sponsors/wooorm"
|
"url": "https://github.com/sponsors/wooorm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-inside-container": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
|
||||||
|
"dependencies": {
|
||||||
|
"is-docker": "^3.0.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"is-inside-container": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.16"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-map": {
|
"node_modules/is-map": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
|
||||||
@@ -3969,6 +4186,17 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-stream": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-string": {
|
"node_modules/is-string": {
|
||||||
"version": "1.0.7",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
|
||||||
@@ -4042,6 +4270,31 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-wsl": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
|
||||||
|
"dependencies": {
|
||||||
|
"is-docker": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/is-wsl/node_modules/is-docker": {
|
||||||
|
"version": "2.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
|
||||||
|
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
|
||||||
|
"bin": {
|
||||||
|
"is-docker": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/isarray": {
|
"node_modules/isarray": {
|
||||||
"version": "2.0.5",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
|
||||||
@@ -4499,6 +4752,11 @@
|
|||||||
"url": "https://opencollective.com/unified"
|
"url": "https://opencollective.com/unified"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/merge-stream": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
|
||||||
|
},
|
||||||
"node_modules/merge2": {
|
"node_modules/merge2": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||||
@@ -5073,6 +5331,17 @@
|
|||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/mimic-fn": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
@@ -5277,6 +5546,31 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/npm-run-path": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
|
||||||
|
"integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
|
||||||
|
"dependencies": {
|
||||||
|
"path-key": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/npm-run-path/node_modules/path-key": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/nprogress": {
|
"node_modules/nprogress": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
|
||||||
@@ -5407,6 +5701,37 @@
|
|||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/onetime": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"mimic-fn": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/open": {
|
||||||
|
"version": "9.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz",
|
||||||
|
"integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
|
||||||
|
"dependencies": {
|
||||||
|
"default-browser": "^4.0.0",
|
||||||
|
"define-lazy-prop": "^3.0.0",
|
||||||
|
"is-inside-container": "^1.0.0",
|
||||||
|
"is-wsl": "^2.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.16"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/optionator": {
|
"node_modules/optionator": {
|
||||||
"version": "0.9.3",
|
"version": "0.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
|
||||||
@@ -5694,6 +6019,31 @@
|
|||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/prettier": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
|
||||||
|
"bin": {
|
||||||
|
"prettier": "bin/prettier.cjs"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/prettier-linter-helpers": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-diff": "^1.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/prismjs": {
|
"node_modules/prismjs": {
|
||||||
"version": "1.29.0",
|
"version": "1.29.0",
|
||||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
||||||
@@ -6125,6 +6475,102 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/run-applescript": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==",
|
||||||
|
"dependencies": {
|
||||||
|
"execa": "^5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/execa": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
|
||||||
|
"dependencies": {
|
||||||
|
"cross-spawn": "^7.0.3",
|
||||||
|
"get-stream": "^6.0.0",
|
||||||
|
"human-signals": "^2.1.0",
|
||||||
|
"is-stream": "^2.0.0",
|
||||||
|
"merge-stream": "^2.0.0",
|
||||||
|
"npm-run-path": "^4.0.1",
|
||||||
|
"onetime": "^5.1.2",
|
||||||
|
"signal-exit": "^3.0.3",
|
||||||
|
"strip-final-newline": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sindresorhus/execa?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/human-signals": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.17.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/is-stream": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/mimic-fn": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/npm-run-path": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
|
||||||
|
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
|
||||||
|
"dependencies": {
|
||||||
|
"path-key": "^3.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/onetime": {
|
||||||
|
"version": "5.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
|
||||||
|
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
|
||||||
|
"dependencies": {
|
||||||
|
"mimic-fn": "^2.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/run-applescript/node_modules/strip-final-newline": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/run-parallel": {
|
"node_modules/run-parallel": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
|
||||||
@@ -6247,6 +6693,11 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/signal-exit": {
|
||||||
|
"version": "3.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
|
||||||
|
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
|
||||||
|
},
|
||||||
"node_modules/skin-tone": {
|
"node_modules/skin-tone": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
|
||||||
@@ -6403,6 +6854,17 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/strip-final-newline": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/strip-json-comments": {
|
"node_modules/strip-json-comments": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||||
@@ -6562,6 +7024,21 @@
|
|||||||
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
|
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/synckit": {
|
||||||
|
"version": "0.8.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
|
||||||
|
"integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==",
|
||||||
|
"dependencies": {
|
||||||
|
"@pkgr/utils": "^2.3.1",
|
||||||
|
"tslib": "^2.5.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^14.18.0 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/unts"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tailwindcss": {
|
"node_modules/tailwindcss": {
|
||||||
"version": "3.3.3",
|
"version": "3.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
|
||||||
@@ -6630,6 +7107,17 @@
|
|||||||
"node": ">=0.8"
|
"node": ">=0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/titleize": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/to-no-case": {
|
"node_modules/to-no-case": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz",
|
||||||
@@ -6924,6 +7412,14 @@
|
|||||||
"url": "https://opencollective.com/unified"
|
"url": "https://opencollective.com/unified"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/untildify": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/update-browserslist-db": {
|
"node_modules/update-browserslist-db": {
|
||||||
"version": "1.0.11",
|
"version": "1.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
|
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
|
||||||
|
|||||||
@@ -27,11 +27,13 @@
|
|||||||
"encoding": "^0.1.13",
|
"encoding": "^0.1.13",
|
||||||
"eslint": "8.49.0",
|
"eslint": "8.49.0",
|
||||||
"eslint-config-next": "13.4.19",
|
"eslint-config-next": "13.4.19",
|
||||||
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
"next": "13.4.19",
|
"next": "13.4.19",
|
||||||
"next-themes": "^0.2.1",
|
"next-themes": "^0.2.1",
|
||||||
"nextjs-toploader": "^1.4.2",
|
"nextjs-toploader": "^1.4.2",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"postcss": "8.4.29",
|
"postcss": "8.4.29",
|
||||||
|
"prettier": "^3.0.3",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
"react-icons": "^4.11.0",
|
"react-icons": "^4.11.0",
|
||||||
@@ -42,5 +44,8 @@
|
|||||||
"svix": "^1.11.0",
|
"svix": "^1.11.0",
|
||||||
"tailwindcss": "3.3.3",
|
"tailwindcss": "3.3.3",
|
||||||
"typescript": "5.2.2"
|
"typescript": "5.2.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint-config-prettier": "^9.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { UserProfile } from '@clerk/nextjs';
|
|||||||
|
|
||||||
export default function AccountPage() {
|
export default function AccountPage() {
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col items-center'>
|
<main className="flex flex-col items-center">
|
||||||
<UserProfile
|
<UserProfile
|
||||||
appearance={{
|
appearance={{
|
||||||
elements: {
|
elements: {
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import FollowingPosts from '@/components/FollowingPosts';
|
|||||||
|
|
||||||
export default function FollowingPage() {
|
export default function FollowingPage() {
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col items-center flex-1'>
|
<main className="flex flex-col items-center flex-1">
|
||||||
<div className='flex flex-col w-full max-w-4xl gap-4'>
|
<div className="flex flex-col w-full max-w-4xl gap-4">
|
||||||
<h1 className='text-4xl font-bold'>Following</h1>
|
<h1 className="text-4xl font-bold">Following</h1>
|
||||||
<FollowingPosts />
|
<FollowingPosts />
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
+3
-10
@@ -19,11 +19,7 @@ export default function RootLayout({
|
|||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<html
|
<html lang="en" className="w-full h-full" suppressHydrationWarning>
|
||||||
lang='en'
|
|
||||||
className='w-full h-full'
|
|
||||||
suppressHydrationWarning
|
|
||||||
>
|
|
||||||
<body
|
<body
|
||||||
className={`w-full h-full flex flex-col bg-white text-primary-gray dark:bg-primary-gray dark:text-white ${inter.className}`}
|
className={`w-full h-full flex flex-col bg-white text-primary-gray dark:bg-primary-gray dark:text-white ${inter.className}`}
|
||||||
>
|
>
|
||||||
@@ -32,12 +28,9 @@ export default function RootLayout({
|
|||||||
>
|
>
|
||||||
<ConvexProvider>
|
<ConvexProvider>
|
||||||
<NextThemesProvider>
|
<NextThemesProvider>
|
||||||
<NextTopLoader
|
<NextTopLoader color="#3743e5" showSpinner={false} />
|
||||||
color='#3743e5'
|
|
||||||
showSpinner={false}
|
|
||||||
/>
|
|
||||||
<Navbar />
|
<Navbar />
|
||||||
<div className='flex flex-col p-4 w-full h-full overflow-y-auto'>
|
<div className="flex flex-col p-4 w-full h-full overflow-y-auto">
|
||||||
{children}
|
{children}
|
||||||
<Footer />
|
<Footer />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { SignIn } from '@clerk/nextjs';
|
|||||||
|
|
||||||
export default function LoginPage() {
|
export default function LoginPage() {
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col flex-1 items-center'>
|
<main className="flex flex-col flex-1 items-center">
|
||||||
<SignIn
|
<SignIn
|
||||||
appearance={{
|
appearance={{
|
||||||
elements: {
|
elements: {
|
||||||
|
|||||||
+3
-3
@@ -2,9 +2,9 @@ import AllPosts from '@/components/AllPosts';
|
|||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col items-center flex-1'>
|
<main className="flex flex-col items-center flex-1">
|
||||||
<div className='flex flex-col w-full max-w-4xl gap-4'>
|
<div className="flex flex-col w-full max-w-4xl gap-4">
|
||||||
<h1 className='text-4xl font-bold'>Home</h1>
|
<h1 className="text-4xl font-bold">Home</h1>
|
||||||
<AllPosts />
|
<AllPosts />
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export default function EditPostPage({ params }: { params: { id: string } }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col flex-1 w-full items-center'>
|
<main className="flex flex-col flex-1 w-full items-center">
|
||||||
{user.isLoaded && post !== undefined ? (
|
{user.isLoaded && post !== undefined ? (
|
||||||
<Editor
|
<Editor
|
||||||
clerkUserId={user.user.id}
|
clerkUserId={user.user.id}
|
||||||
@@ -59,8 +59,8 @@ export default function EditPostPage({ params }: { params: { id: string } }) {
|
|||||||
submitAction={submitAction}
|
submitAction={submitAction}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<div className='flex gap-2 items-center'>
|
<div className="flex gap-2 items-center">
|
||||||
<SpinningLoader className='animate-spin w-5 h-5' />
|
<SpinningLoader className="animate-spin w-5 h-5" />
|
||||||
Loading...
|
Loading...
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+11
-18
@@ -68,34 +68,27 @@ export default function PostPage({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col flex-1 w-full items-center'>
|
<main className="flex flex-col flex-1 w-full items-center">
|
||||||
<div className='flex flex-col w-full max-w-4xl gap-4'>
|
<div className="flex flex-col w-full max-w-4xl gap-4">
|
||||||
{post !== undefined && user.isLoaded ? (
|
{post !== undefined && user.isLoaded ? (
|
||||||
<>
|
<>
|
||||||
<div className='flex flex-col min-w-0 p-1 rounded-md border border-gray-600'>
|
<div className="flex flex-col min-w-0 p-1 rounded-md border border-gray-600">
|
||||||
<Post
|
<Post post={post} limit={false} showReply={false} />
|
||||||
post={post}
|
|
||||||
limit={false}
|
|
||||||
showReply={false}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div className='w-full'>
|
<div className="w-full">
|
||||||
<PostReplies parentId={post._id} />
|
<PostReplies parentId={post._id} />
|
||||||
</div>
|
</div>
|
||||||
<div className='flex w-full h-80 gap-4'>
|
<div className="flex w-full h-80 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<Image
|
<Image
|
||||||
alt='user profile image'
|
alt="user profile image"
|
||||||
src={user.user.imageUrl}
|
src={user.user.imageUrl}
|
||||||
width={40}
|
width={40}
|
||||||
height={40}
|
height={40}
|
||||||
className='rounded-full object-cover border-4 border-primary-accent'
|
className="rounded-full object-cover border-4 border-primary-accent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div ref={replyRef} className="flex w-full">
|
||||||
ref={replyRef}
|
|
||||||
className='flex w-full'
|
|
||||||
>
|
|
||||||
<Editor
|
<Editor
|
||||||
clerkUserId={user.user.id}
|
clerkUserId={user.user.id}
|
||||||
parentPostId={post._id}
|
parentPostId={post._id}
|
||||||
@@ -106,8 +99,8 @@ export default function PostPage({
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<div className='flex w-full justify-center gap-2'>
|
<div className="flex w-full justify-center gap-2">
|
||||||
<SpinningLoader className='animate-spin w-5 h-5' /> Loading post...
|
<SpinningLoader className="animate-spin w-5 h-5" /> Loading post...
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -43,15 +43,12 @@ export default function AddPost() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col flex-1 w-full items-center'>
|
<main className="flex flex-col flex-1 w-full items-center">
|
||||||
{user.isLoaded ? (
|
{user.isLoaded ? (
|
||||||
<Editor
|
<Editor clerkUserId={user.user.id} submitAction={submitAction} />
|
||||||
clerkUserId={user.user.id}
|
|
||||||
submitAction={submitAction}
|
|
||||||
/>
|
|
||||||
) : (
|
) : (
|
||||||
<div className='flex gap-2 items-center'>
|
<div className="flex gap-2 items-center">
|
||||||
<SpinningLoader className='animate-spin w-5 h-5' />
|
<SpinningLoader className="animate-spin w-5 h-5" />
|
||||||
Loading...
|
Loading...
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ export default async function UserProfilePage({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col flex-1 w-full items-center'>
|
<main className="flex flex-col flex-1 w-full items-center">
|
||||||
<div className='w-full max-w-4xl'>
|
<div className="w-full max-w-4xl">
|
||||||
<UserProfile user={user} />
|
<UserProfile user={user} />
|
||||||
<UserPosts user={user} />
|
<UserPosts user={user} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ export default function SearchPage({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col items-center flex-1'>
|
<main className="flex flex-col items-center flex-1">
|
||||||
<div className='flex flex-col w-full max-w-4xl gap-4'>
|
<div className="flex flex-col w-full max-w-4xl gap-4">
|
||||||
<h1 className='text-4xl font-bold'>Here's what we found</h1>
|
<h1 className="text-4xl font-bold">Here's what we found</h1>
|
||||||
<SearchResults term={term} />
|
<SearchResults term={term} />
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { SignUp } from '@clerk/nextjs';
|
|||||||
|
|
||||||
export default function SignUpPage() {
|
export default function SignUpPage() {
|
||||||
return (
|
return (
|
||||||
<main className='flex flex-col flex-1 items-center'>
|
<main className="flex flex-col flex-1 items-center">
|
||||||
<SignUp
|
<SignUp
|
||||||
appearance={{
|
appearance={{
|
||||||
elements: {
|
elements: {
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ export default function AllPosts() {
|
|||||||
|
|
||||||
if (pager.isLoading === false && pager.results.length == 0) {
|
if (pager.isLoading === false && pager.results.length == 0) {
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col justify-center items-center gap-2'>
|
<div className="flex flex-col justify-center items-center gap-2">
|
||||||
<h2 className='text-2xl'>
|
<h2 className="text-2xl">
|
||||||
Hmmm it doesn't look like anyone has posted.
|
Hmmm it doesn't look like anyone has posted.
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
@@ -28,12 +28,12 @@ export default function AllPosts() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
{pager.results.map(post => (
|
{pager.results.map(post => (
|
||||||
<div
|
<div
|
||||||
key={post._id}
|
key={post._id}
|
||||||
className='w-full border border-t-0 border-gray-600 first:border-t last:rounded-b-md p-1 last:mb-4'
|
className="w-full border border-t-0 border-gray-600 first:border-t last:rounded-b-md p-1 last:mb-4"
|
||||||
>
|
>
|
||||||
<Post post={post} />
|
<Post post={post} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+12
-15
@@ -92,30 +92,30 @@ export default function Editor({
|
|||||||
return (
|
return (
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
className='flex flex-col flex-1 w-full shadow-md rounded-md dark:bg-secondary-gray border border-gray-600'
|
className="flex flex-col flex-1 w-full shadow-md rounded-md dark:bg-secondary-gray border border-gray-600"
|
||||||
>
|
>
|
||||||
<div className='flex items-center justify-between rounded-t-md p-4 pb-0 border-b border-gray-600 dark:bg-primary-gray'>
|
<div className="flex items-center justify-between rounded-t-md p-4 pb-0 border-b border-gray-600 dark:bg-primary-gray">
|
||||||
<div className='flex items-center'>
|
<div className="flex items-center">
|
||||||
<button
|
<button
|
||||||
className='flex items-center justify-center px-3 py-2 rounded-t-md -mb-[1px] disabled:bg-white disabled:border disabled:border-b-0 disabled:border-gray-600 disabled:dark:bg-secondary-gray'
|
className="flex items-center justify-center px-3 py-2 rounded-t-md -mb-[1px] disabled:bg-white disabled:border disabled:border-b-0 disabled:border-gray-600 disabled:dark:bg-secondary-gray"
|
||||||
disabled={mode === 'write'}
|
disabled={mode === 'write'}
|
||||||
onClick={() => setMode('write')}
|
onClick={() => setMode('write')}
|
||||||
type='button'
|
type="button"
|
||||||
>
|
>
|
||||||
Write
|
Write
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className='flex items-center justify-center px-3 py-2 rounded-t-md -mb-[1px] disabled:bg-white disabled:border disabled:border-b-0 disabled:border-gray-600 disabled:dark:bg-secondary-gray'
|
className="flex items-center justify-center px-3 py-2 rounded-t-md -mb-[1px] disabled:bg-white disabled:border disabled:border-b-0 disabled:border-gray-600 disabled:dark:bg-secondary-gray"
|
||||||
disabled={mode === 'preview'}
|
disabled={mode === 'preview'}
|
||||||
onClick={() => setMode('preview')}
|
onClick={() => setMode('preview')}
|
||||||
type='button'
|
type="button"
|
||||||
>
|
>
|
||||||
Preview
|
Preview
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div></div>
|
<div></div>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-col pt-4 px-4 h-0 flex-grow overflow-auto'>
|
<div className="flex flex-col pt-4 px-4 h-0 flex-grow overflow-auto">
|
||||||
<div
|
<div
|
||||||
className={`${mode === 'write' ? '' : 'hidden'} flex-1 overflow-auto`}
|
className={`${mode === 'write' ? '' : 'hidden'} flex-1 overflow-auto`}
|
||||||
ref={editorRef}
|
ref={editorRef}
|
||||||
@@ -124,21 +124,18 @@ export default function Editor({
|
|||||||
<PostContent content={Text.of(currentDoc).toString()} />
|
<PostContent content={Text.of(currentDoc).toString()} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex items-center justify-end p-4 gap-4'>
|
<div className="flex items-center justify-end p-4 gap-4">
|
||||||
<button
|
<button onClick={() => router.back()} type="button">
|
||||||
onClick={() => router.back()}
|
|
||||||
type='button'
|
|
||||||
>
|
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type='submit'
|
type="submit"
|
||||||
disabled={
|
disabled={
|
||||||
!currentDoc.join() ||
|
!currentDoc.join() ||
|
||||||
!currentDoc.join().trim() ||
|
!currentDoc.join().trim() ||
|
||||||
creatingOrUpdating
|
creatingOrUpdating
|
||||||
}
|
}
|
||||||
className='py-1 px-4 bg-primary-accent text-white rounded-md disabled:opacity-50 flex items-center justify-center gap-2'
|
className="py-1 px-4 bg-primary-accent text-white rounded-md disabled:opacity-50 flex items-center justify-center gap-2"
|
||||||
>
|
>
|
||||||
Post
|
Post
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ export default function FollowingPosts() {
|
|||||||
|
|
||||||
if (pager.isLoading === false && pager.results.length == 0) {
|
if (pager.isLoading === false && pager.results.length == 0) {
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col justify-center items-center gap-2'>
|
<div className="flex flex-col justify-center items-center gap-2">
|
||||||
<h2 className='text-2xl'>
|
<h2 className="text-2xl">
|
||||||
Hmmm it doesn't look like you follow anyone or anyone who has
|
Hmmm it doesn't look like you follow anyone or anyone who has
|
||||||
made a post yet.
|
made a post yet.
|
||||||
</h2>
|
</h2>
|
||||||
<Link
|
<Link
|
||||||
href='/'
|
href="/"
|
||||||
className='max-w-max py-1 px-3 text-white bg-primary-accent rounded-md'
|
className="max-w-max py-1 px-3 text-white bg-primary-accent rounded-md"
|
||||||
>
|
>
|
||||||
Find someone to follow
|
Find someone to follow
|
||||||
</Link>
|
</Link>
|
||||||
@@ -36,12 +36,12 @@ export default function FollowingPosts() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
{pager.results.map(post => (
|
{pager.results.map(post => (
|
||||||
<div
|
<div
|
||||||
key={post._id}
|
key={post._id}
|
||||||
className='w-full border border-t-0 border-gray-600 first:border-t last:rounded-b-md p-1 last:mb-4'
|
className="w-full border border-t-0 border-gray-600 first:border-t last:rounded-b-md p-1 last:mb-4"
|
||||||
>
|
>
|
||||||
<Post post={post} />
|
<Post post={post} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+11
-23
@@ -2,43 +2,31 @@ import Link from 'next/link';
|
|||||||
|
|
||||||
export default function Footer() {
|
export default function Footer() {
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col w-full items-center justify-center px-4 mt-4'>
|
<div className="flex flex-col w-full items-center justify-center px-4 mt-4">
|
||||||
<footer className='flex flex-col items-center justify-between gap-2 w-full max-w-4xl text-sm text-primary-white border-t border-gray-600 py-4'>
|
<footer className="flex flex-col items-center justify-between gap-2 w-full max-w-4xl text-sm text-primary-white border-t border-gray-600 py-4">
|
||||||
<div className='flex items-center justify-center w-full flex-wrap gap-4'>
|
<div className="flex items-center justify-center w-full flex-wrap gap-4">
|
||||||
<Link
|
<Link href="/about" className="hover:text-primary-orange">
|
||||||
href='/about'
|
|
||||||
className='hover:text-primary-orange'
|
|
||||||
>
|
|
||||||
About
|
About
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link href="/contact" className="hover:text-primary-orange">
|
||||||
href='/contact'
|
|
||||||
className='hover:text-primary-orange'
|
|
||||||
>
|
|
||||||
Contact
|
Contact
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link href="/terms" className="hover:text-primary-orange">
|
||||||
href='/terms'
|
|
||||||
className='hover:text-primary-orange'
|
|
||||||
>
|
|
||||||
Terms
|
Terms
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link href="/privacy" className="hover:text-primary-orange">
|
||||||
href='/privacy'
|
|
||||||
className='hover:text-primary-orange'
|
|
||||||
>
|
|
||||||
Privacy
|
Privacy
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href='https://github.com/StevanFreeborn/conve-x'
|
href="https://github.com/StevanFreeborn/conve-x"
|
||||||
className='hover:text-primary-orange'
|
className="hover:text-primary-orange"
|
||||||
>
|
>
|
||||||
Code
|
Code
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span className='self-center whitespace-nowrap italic'>
|
<span className="self-center whitespace-nowrap italic">
|
||||||
conve<span className='font-bold text-primary-accent'>X</span>
|
conve<span className="font-bold text-primary-accent">X</span>
|
||||||
</span>
|
</span>
|
||||||
<span> © 2023</span>
|
<span> © 2023</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ export default function Loader({
|
|||||||
}) {
|
}) {
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
<div className='flex w-full items-center justify-center gap-2 p-5 text-sm'>
|
<div className="flex w-full items-center justify-center gap-2 p-5 text-sm">
|
||||||
<SpinningLoader className='animate-spin w-5 h-5' />
|
<SpinningLoader className="animate-spin w-5 h-5" />
|
||||||
Loading...
|
Loading...
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -23,15 +23,15 @@ export default function Loader({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex items-center'>
|
<div className="flex items-center">
|
||||||
<button
|
<button
|
||||||
className='bg-primary-accent text-white px-3 py-1 rounded-full text-sm'
|
className="bg-primary-accent text-white px-3 py-1 rounded-full text-sm"
|
||||||
onClick={loadButtonClickHandler}
|
onClick={loadButtonClickHandler}
|
||||||
disabled={status !== 'CanLoadMore'}
|
disabled={status !== 'CanLoadMore'}
|
||||||
>
|
>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<>
|
<>
|
||||||
<SpinningLoader className='animate-spin w-5 h-5' />
|
<SpinningLoader className="animate-spin w-5 h-5" />
|
||||||
Loading...
|
Loading...
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
+45
-63
@@ -36,83 +36,74 @@ export default function Navbar() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav className='flex flex-col items-center gap-4 p-5 shadow-md dark:bg-secondary-gray md:flex-row md:justify-between'>
|
<nav className="flex flex-col items-center gap-4 p-5 shadow-md dark:bg-secondary-gray md:flex-row md:justify-between">
|
||||||
<div className='flex items-center justify-between w-full md:max-w-min'>
|
<div className="flex items-center justify-between w-full md:max-w-min">
|
||||||
<Link
|
<Link href="/" className="italic">
|
||||||
href='/'
|
|
||||||
className='italic'
|
|
||||||
>
|
|
||||||
conve
|
conve
|
||||||
<span className='font-bold text-4xl text-primary-accent'>X</span>
|
<span className="font-bold text-4xl text-primary-accent">X</span>
|
||||||
</Link>
|
</Link>
|
||||||
<button
|
<button
|
||||||
onClick={() => setNavOpen(!navOpen)}
|
onClick={() => setNavOpen(!navOpen)}
|
||||||
type='button'
|
type="button"
|
||||||
className='flex items-center justify-center md:hidden'
|
className="flex items-center justify-center md:hidden"
|
||||||
>
|
>
|
||||||
{navOpen ? <RiMenuUnfoldLine /> : <RiMenuFoldLine />}
|
{navOpen ? <RiMenuUnfoldLine /> : <RiMenuFoldLine />}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className='hidden flex-1 flex-col gap-4 w-full items-center md:flex md:flex-row md:justify-between'
|
className="hidden flex-1 flex-col gap-4 w-full items-center md:flex md:flex-row md:justify-between"
|
||||||
style={{ display: navOpen ? 'flex' : '' }}
|
style={{ display: navOpen ? 'flex' : '' }}
|
||||||
>
|
>
|
||||||
<ul className='flex flex-col w-full items-start gap-4 md:flex-row md:items-center md:max-w-min'>
|
<ul className="flex flex-col w-full items-start gap-4 md:flex-row md:items-center md:max-w-min">
|
||||||
<SignedIn>
|
<SignedIn>
|
||||||
<li className='flex w-full'>
|
<li className="flex w-full">
|
||||||
<form
|
<form
|
||||||
onSubmit={e => {
|
onSubmit={e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
router.push(`/search?term=${term}`);
|
router.push(`/search?term=${term}`);
|
||||||
}}
|
}}
|
||||||
className='flex w-full relative'
|
className="flex w-full relative"
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
onChange={e => setTerm(e.target.value)}
|
onChange={e => setTerm(e.target.value)}
|
||||||
value={term}
|
value={term}
|
||||||
type='text'
|
type="text"
|
||||||
placeholder='Search'
|
placeholder="Search"
|
||||||
className='w-full md:w-[unset] py-1 px-2 rounded-md border border-gray-600 dark:bg-primary-gray dark:border-0'
|
className="w-full md:w-[unset] py-1 px-2 rounded-md border border-gray-600 dark:bg-primary-gray dark:border-0"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
className='flex items-center justify-center absolute right-0 top-1/2 transform -translate-x-1/2 -translate-y-1/2'
|
className="flex items-center justify-center absolute right-0 top-1/2 transform -translate-x-1/2 -translate-y-1/2"
|
||||||
disabled={!term || !term.trim()}
|
disabled={!term || !term.trim()}
|
||||||
type='submit'
|
type="submit"
|
||||||
>
|
>
|
||||||
<BsSearch />
|
<BsSearch />
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div className='flex items-center gap-2'>
|
<div className="flex items-center gap-2">
|
||||||
<div className='p-1 md:hidden'>
|
<div className="p-1 md:hidden">
|
||||||
<AiFillHome className='w-6 h-6' />
|
<AiFillHome className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link onClick={() => setNavOpen(false)} href="/">
|
||||||
onClick={() => setNavOpen(false)}
|
|
||||||
href='/'
|
|
||||||
>
|
|
||||||
Home
|
Home
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div className='flex items-center gap-2'>
|
<div className="flex items-center gap-2">
|
||||||
<div className='p-1 md:hidden'>
|
<div className="p-1 md:hidden">
|
||||||
<RiUserFollowFill className='w-6 h-6' />
|
<RiUserFollowFill className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link onClick={() => setNavOpen(false)} href="/following">
|
||||||
onClick={() => setNavOpen(false)}
|
|
||||||
href='/following'
|
|
||||||
>
|
|
||||||
Following
|
Following
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div className='flex items-center gap-2'>
|
<div className="flex items-center gap-2">
|
||||||
<div className='p-1 md:hidden'>
|
<div className="p-1 md:hidden">
|
||||||
<ImProfile className='w-6 h-6' />
|
<ImProfile className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
onClick={() => setNavOpen(false)}
|
onClick={() => setNavOpen(false)}
|
||||||
@@ -122,55 +113,46 @@ export default function Navbar() {
|
|||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li className='flex items-center gap-2 max-w-min whitespace-nowrap'>
|
<li className="flex items-center gap-2 max-w-min whitespace-nowrap">
|
||||||
<div className='p-1 bg-primary-accent rounded-md rounded-bl-none'>
|
<div className="p-1 bg-primary-accent rounded-md rounded-bl-none">
|
||||||
<Link
|
<Link onClick={() => setNavOpen(false)} href="/posts/add">
|
||||||
onClick={() => setNavOpen(false)}
|
<BiPlus className="w-6 h-6 text-white" />
|
||||||
href='/posts/add'
|
|
||||||
>
|
|
||||||
<BiPlus className='w-6 h-6 text-white' />
|
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<span className='md:hidden'>Add Post</span>
|
<span className="md:hidden">Add Post</span>
|
||||||
</li>
|
</li>
|
||||||
</SignedIn>
|
</SignedIn>
|
||||||
</ul>
|
</ul>
|
||||||
<ul className='flex flex-col w-full items-start gap-4 md:flex-row md:items-center md:max-w-min'>
|
<ul className="flex flex-col w-full items-start gap-4 md:flex-row md:items-center md:max-w-min">
|
||||||
<li className='flex items-center gap-2'>
|
<li className="flex items-center gap-2">
|
||||||
<div className='p-1'>
|
<div className="p-1">
|
||||||
<ThemeButton />
|
<ThemeButton />
|
||||||
</div>
|
</div>
|
||||||
<span className='md:hidden'>Change Theme</span>
|
<span className="md:hidden">Change Theme</span>
|
||||||
</li>
|
</li>
|
||||||
<SignedIn>
|
<SignedIn>
|
||||||
<li className='flex items-center gap-2'>
|
<li className="flex items-center gap-2">
|
||||||
<UserButton />
|
<UserButton />
|
||||||
<span className='md:hidden'>Manage Account</span>
|
<span className="md:hidden">Manage Account</span>
|
||||||
</li>
|
</li>
|
||||||
</SignedIn>
|
</SignedIn>
|
||||||
<SignedOut>
|
<SignedOut>
|
||||||
<li>
|
<li>
|
||||||
<div className='flex items-center gap-2'>
|
<div className="flex items-center gap-2">
|
||||||
<div className='p-1 md:hidden'>
|
<div className="p-1 md:hidden">
|
||||||
<BiLogIn className='w-6 h-6' />
|
<BiLogIn className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link href="/login" className="whitespace-nowrap">
|
||||||
href='/login'
|
|
||||||
className='whitespace-nowrap'
|
|
||||||
>
|
|
||||||
Sign in
|
Sign in
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div className='flex items-center gap-2'>
|
<div className="flex items-center gap-2">
|
||||||
<div className='p-1 md:hidden'>
|
<div className="p-1 md:hidden">
|
||||||
<BsPersonPlusFill className='w-6 h-6' />
|
<BsPersonPlusFill className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link href="/signup" className="whitespace-nowrap">
|
||||||
href='/signup'
|
|
||||||
className='whitespace-nowrap'
|
|
||||||
>
|
|
||||||
Sign up
|
Sign up
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+13
-22
@@ -44,30 +44,27 @@ export default function Post({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex w-full gap-4 p-8 bg-white dark:bg-secondary-gray flex-wrap'>
|
<div className="flex w-full gap-4 p-8 bg-white dark:bg-secondary-gray flex-wrap">
|
||||||
<div className='flex-shrink-0'>
|
<div className="flex-shrink-0">
|
||||||
<Link href={`/profile/${post.user.clerkUserId}`}>
|
<Link href={`/profile/${post.user.clerkUserId}`}>
|
||||||
<Image
|
<Image
|
||||||
alt='user profile image'
|
alt="user profile image"
|
||||||
src={post.user.clerkImageUrl}
|
src={post.user.clerkImageUrl}
|
||||||
width={40}
|
width={40}
|
||||||
height={40}
|
height={40}
|
||||||
className='rounded-full object-cover border-4 border-primary-accent'
|
className="rounded-full object-cover border-4 border-primary-accent"
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-1 flex-col gap-2 min-w-0'>
|
<div className="flex flex-1 flex-col gap-2 min-w-0">
|
||||||
<div className='flex items-center justify-between gap-2'>
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div className='flex items-center gap-2 flex-wrap min-w-0'>
|
<div className="flex items-center gap-2 flex-wrap min-w-0">
|
||||||
<div
|
<div className="overflow-hidden text-ellipsis" title={username}>
|
||||||
className='overflow-hidden text-ellipsis'
|
|
||||||
title={username}
|
|
||||||
>
|
|
||||||
{username}
|
{username}
|
||||||
</div>
|
</div>
|
||||||
<div className='flex items-center gap-2'>
|
<div className="flex items-center gap-2">
|
||||||
<GoDotFill className='w-3 h-3' />
|
<GoDotFill className="w-3 h-3" />
|
||||||
<div className='text-xs'>
|
<div className="text-xs">
|
||||||
{`${postMonth} ${dayOfMonth}, ${postYear}`}
|
{`${postMonth} ${dayOfMonth}, ${postYear}`}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,18 +80,12 @@ export default function Post({
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{limit && post.content.length > 10 ? (
|
{limit && post.content.length > 10 ? (
|
||||||
<Link
|
<Link className="font-semibold text-primary-accent" href={postLink}>
|
||||||
className='font-semibold text-primary-accent'
|
|
||||||
href={postLink}
|
|
||||||
>
|
|
||||||
Show more
|
Show more
|
||||||
</Link>
|
</Link>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
<PostActionButton
|
<PostActionButton postId={post._id} showReply={showReply} />
|
||||||
postId={post._id}
|
|
||||||
showReply={showReply}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -29,14 +29,14 @@ export default function PostActionButton({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex items-center gap-4'>
|
<div className="flex items-center gap-4">
|
||||||
{showReply && replyCount !== undefined ? (
|
{showReply && replyCount !== undefined ? (
|
||||||
<Link
|
<Link
|
||||||
className='flex items-center justify-center gap-2 px-3 py-1 border border-gray-600 rounded-md hover:bg-primary-accent hover:text-white'
|
className="flex items-center justify-center gap-2 px-3 py-1 border border-gray-600 rounded-md hover:bg-primary-accent hover:text-white"
|
||||||
href={{ pathname: `/posts/${postId}`, query: { reply: true } }}
|
href={{ pathname: `/posts/${postId}`, query: { reply: true } }}
|
||||||
>
|
>
|
||||||
<BsFillReplyFill />
|
<BsFillReplyFill />
|
||||||
<div className='flex items-center justify-center h-6 w-6 rounded-full text-xs bg-primary-gray text-white'>
|
<div className="flex items-center justify-center h-6 w-6 rounded-full text-xs bg-primary-gray text-white">
|
||||||
{replyCount}
|
{replyCount}
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
@@ -44,13 +44,13 @@ export default function PostActionButton({
|
|||||||
{like !== undefined && likeCount !== undefined ? (
|
{like !== undefined && likeCount !== undefined ? (
|
||||||
<button
|
<button
|
||||||
onClick={handleLikeClick}
|
onClick={handleLikeClick}
|
||||||
type='button'
|
type="button"
|
||||||
className={`flex items-center justify-center gap-2 px-3 py-1 border border-gray-600 rounded-md ${
|
className={`flex items-center justify-center gap-2 px-3 py-1 border border-gray-600 rounded-md ${
|
||||||
isLiked ? 'text-primary-accent' : ''
|
isLiked ? 'text-primary-accent' : ''
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<BiSolidLike className='flex-shrink-0' />
|
<BiSolidLike className="flex-shrink-0" />
|
||||||
<div className='flex items-center justify-center h-6 w-6 rounded-full text-xs bg-primary-gray text-white'>
|
<div className="flex items-center justify-center h-6 w-6 rounded-full text-xs bg-primary-gray text-white">
|
||||||
{likeCount}
|
{likeCount}
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export default function PostActionModal({ postId }: { postId: Id<'posts'> }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='relative'>
|
<div className="relative">
|
||||||
<button onClick={() => setModalOpen(!modalOpen)}>
|
<button onClick={() => setModalOpen(!modalOpen)}>
|
||||||
<BiDotsHorizontalRounded />
|
<BiDotsHorizontalRounded />
|
||||||
</button>
|
</button>
|
||||||
@@ -55,11 +55,8 @@ export default function PostActionModal({ postId }: { postId: Id<'posts'> }) {
|
|||||||
Edit post
|
Edit post
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
<li className='text-red-600'>
|
<li className="text-red-600">
|
||||||
<button
|
<button onClick={handleDeleteButtonClick} type="button">
|
||||||
onClick={handleDeleteButtonClick}
|
|
||||||
type='button'
|
|
||||||
>
|
|
||||||
Delete post
|
Delete post
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import './MarkdownContent.css';
|
|||||||
|
|
||||||
export default function PostContent({ content }: { content: string }) {
|
export default function PostContent({ content }: { content: string }) {
|
||||||
return (
|
return (
|
||||||
<div className='markdown-content'>
|
<div className="markdown-content">
|
||||||
<ReactMarkdown
|
<ReactMarkdown
|
||||||
remarkPlugins={[remarkGfm, remarkEmoji]}
|
remarkPlugins={[remarkGfm, remarkEmoji]}
|
||||||
components={{
|
components={{
|
||||||
@@ -19,15 +19,12 @@ export default function PostContent({ content }: { content: string }) {
|
|||||||
{...props}
|
{...props}
|
||||||
style={oneDark}
|
style={oneDark}
|
||||||
language={match[1]}
|
language={match[1]}
|
||||||
PreTag='div'
|
PreTag="div"
|
||||||
>
|
>
|
||||||
{String(children).replace(/\n$/, '')}
|
{String(children).replace(/\n$/, '')}
|
||||||
</SyntaxHighlighter>
|
</SyntaxHighlighter>
|
||||||
) : (
|
) : (
|
||||||
<code
|
<code {...props} className={className}>
|
||||||
{...props}
|
|
||||||
className={className}
|
|
||||||
>
|
|
||||||
{children}
|
{children}
|
||||||
</code>
|
</code>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -21,13 +21,10 @@ export default function PostReplies({ parentId }: { parentId: Id<'posts'> }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col-reverse items-center w-full gap-4'>
|
<div className="flex flex-col-reverse items-center w-full gap-4">
|
||||||
<div className='flex flex-col-reverse items-center w-full gap-4'>
|
<div className="flex flex-col-reverse items-center w-full gap-4">
|
||||||
{pager.results.map(reply => (
|
{pager.results.map(reply => (
|
||||||
<div
|
<div key={reply._id} className="w-full">
|
||||||
key={reply._id}
|
|
||||||
className='w-full'
|
|
||||||
>
|
|
||||||
<Reply post={reply} />
|
<Reply post={reply} />
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|||||||
+12
-15
@@ -16,39 +16,36 @@ export default function Reply({ post }: { post: PostWithUserDto }) {
|
|||||||
const year = created.getFullYear();
|
const year = created.getFullYear();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex w-full gap-4'>
|
<div className="flex w-full gap-4">
|
||||||
<div>
|
<div>
|
||||||
<Link href={`/profile/${post.user.clerkUserId}`}>
|
<Link href={`/profile/${post.user.clerkUserId}`}>
|
||||||
<Image
|
<Image
|
||||||
alt='user profile image'
|
alt="user profile image"
|
||||||
src={post.user.clerkImageUrl}
|
src={post.user.clerkImageUrl}
|
||||||
width={40}
|
width={40}
|
||||||
height={40}
|
height={40}
|
||||||
className='rounded-full object-cover border-4 border-primary-accent'
|
className="rounded-full object-cover border-4 border-primary-accent"
|
||||||
/>
|
/>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-col flex-1 w-full border border-gray-600 rounded-md'>
|
<div className="flex flex-col flex-1 w-full border border-gray-600 rounded-md">
|
||||||
<div className='flex flex-col w-full p-1'>
|
<div className="flex flex-col w-full p-1">
|
||||||
<div className='flex justify-between dark:bg-primary-gray p-2'>
|
<div className="flex justify-between dark:bg-primary-gray p-2">
|
||||||
<div className='text-sm'>
|
<div className="text-sm">
|
||||||
{`${username} `}
|
{`${username} `}
|
||||||
<span className='text-[#7a838f]'>{`replied on ${month} ${day}, ${year}`}</span>
|
<span className="text-[#7a838f]">{`replied on ${month} ${day}, ${year}`}</span>
|
||||||
</div>
|
</div>
|
||||||
{isLoaded && isSignedIn && user.id === post.user.clerkUserId ? (
|
{isLoaded && isSignedIn && user.id === post.user.clerkUserId ? (
|
||||||
<PostActionModal postId={post._id} />
|
<PostActionModal postId={post._id} />
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
<div className='p-1'>
|
<div className="p-1">
|
||||||
<div className='p-2 rounded-md dark:bg-secondary-gray'>
|
<div className="p-2 rounded-md dark:bg-secondary-gray">
|
||||||
<PostContent content={Text.of(post.content).toString()} />
|
<PostContent content={Text.of(post.content).toString()} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='p-1'>
|
<div className="p-1">
|
||||||
<PostActionButton
|
<PostActionButton postId={post._id} showReply={false} />
|
||||||
postId={post._id}
|
|
||||||
showReply={false}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ type Pager<T> = UsePaginatedQueryReturnType<
|
|||||||
|
|
||||||
function NoResults() {
|
function NoResults() {
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col justify-center items-center gap-2'>
|
<div className="flex flex-col justify-center items-center gap-2">
|
||||||
<h2 className='text-xl'>
|
<h2 className="text-xl">
|
||||||
Hmmm it doesn't look like we could find anything.
|
Hmmm it doesn't look like we could find anything.
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
@@ -54,7 +54,7 @@ function UserSearchResults({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className='flex flex-col gap-2'>
|
<div className="flex flex-col gap-2">
|
||||||
{results.map(user => (
|
{results.map(user => (
|
||||||
<div key={user._id}>
|
<div key={user._id}>
|
||||||
<UserProfile user={user} />
|
<UserProfile user={user} />
|
||||||
@@ -84,12 +84,12 @@ function PostSearchResults({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
{results.map(post => (
|
{results.map(post => (
|
||||||
<div
|
<div
|
||||||
key={post._id}
|
key={post._id}
|
||||||
className='w-full border border-t-0 border-gray-600 first:border-t last:rounded-b-md p-1 last:mb-4'
|
className="w-full border border-t-0 border-gray-600 first:border-t last:rounded-b-md p-1 last:mb-4"
|
||||||
>
|
>
|
||||||
<Post post={post} />
|
<Post post={post} />
|
||||||
</div>
|
</div>
|
||||||
@@ -120,36 +120,30 @@ export default function SearchResults({ term }: { term: string }) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col gap-4'>
|
<div className="flex flex-col gap-4">
|
||||||
<div className='flex gap-2 border-b border-gray-600'>
|
<div className="flex gap-2 border-b border-gray-600">
|
||||||
<button
|
<button
|
||||||
onClick={() => setCurrent('posts')}
|
onClick={() => setCurrent('posts')}
|
||||||
disabled={current === 'posts'}
|
disabled={current === 'posts'}
|
||||||
type='button'
|
type="button"
|
||||||
className='py-1 px-2 border-b-4 border-transparent disabled:border-primary-accent'
|
className="py-1 px-2 border-b-4 border-transparent disabled:border-primary-accent"
|
||||||
>
|
>
|
||||||
Posts
|
Posts
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => setCurrent('users')}
|
onClick={() => setCurrent('users')}
|
||||||
disabled={current === 'users'}
|
disabled={current === 'users'}
|
||||||
type='button'
|
type="button"
|
||||||
className='py-1 px-2 border-b-4 border-transparent disabled:border-primary-accent'
|
className="py-1 px-2 border-b-4 border-transparent disabled:border-primary-accent"
|
||||||
>
|
>
|
||||||
Users
|
Users
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{current === 'posts' ? (
|
{current === 'posts' ? (
|
||||||
<PostSearchResults
|
<PostSearchResults pager={postsPager} pageSize={PAGE_SIZE} />
|
||||||
pager={postsPager}
|
|
||||||
pageSize={PAGE_SIZE}
|
|
||||||
/>
|
|
||||||
) : (
|
) : (
|
||||||
<UserSearchResults
|
<UserSearchResults pager={usersPager} pageSize={PAGE_SIZE} />
|
||||||
pager={usersPager}
|
|
||||||
pageSize={PAGE_SIZE}
|
|
||||||
/>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -13,15 +13,15 @@ export default function ThemeButton() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
className='flex items-center justify-center'
|
className="flex items-center justify-center"
|
||||||
onClick={() => setTheme(isDark ? 'light' : 'dark')}
|
onClick={() => setTheme(isDark ? 'light' : 'dark')}
|
||||||
>
|
>
|
||||||
{mounted === false ? (
|
{mounted === false ? (
|
||||||
<Loader className='animate-spin w-6 h-6' />
|
<Loader className="animate-spin w-6 h-6" />
|
||||||
) : isDark ? (
|
) : isDark ? (
|
||||||
<BsMoonStarsFill className='w-6 h-6' />
|
<BsMoonStarsFill className="w-6 h-6" />
|
||||||
) : (
|
) : (
|
||||||
<BsSunFill className='w-6 h-6' />
|
<BsSunFill className="w-6 h-6" />
|
||||||
)}
|
)}
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ export default function UserButton({ children }: { children?: ReactNode }) {
|
|||||||
'border-solid border-2 border-primary-accent focus:shadow-none',
|
'border-solid border-2 border-primary-accent focus:shadow-none',
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
userProfileMode='navigation'
|
userProfileMode="navigation"
|
||||||
userProfileUrl='/account'
|
userProfileUrl="/account"
|
||||||
signInUrl='/login'
|
signInUrl="/login"
|
||||||
afterSignOutUrl='/'
|
afterSignOutUrl="/"
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,14 +25,14 @@ export default function UserPosts({ user }: { user: UserDto }) {
|
|||||||
|
|
||||||
if (pager.isLoading === false && postsWithUser.length === 0) {
|
if (pager.isLoading === false && postsWithUser.length === 0) {
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col items-center justify-center border-t border-gray-600 w-full h-full'>
|
<div className="flex flex-col items-center justify-center border-t border-gray-600 w-full h-full">
|
||||||
<div className='flex flex-col items-center gap-2'>
|
<div className="flex flex-col items-center gap-2">
|
||||||
<h2 className='text-xl font-semibold'>
|
<h2 className="text-xl font-semibold">
|
||||||
Hmm...it doesn't look like you've posted anything.
|
Hmm...it doesn't look like you've posted anything.
|
||||||
</h2>
|
</h2>
|
||||||
<Link
|
<Link
|
||||||
href='/posts/add'
|
href="/posts/add"
|
||||||
className='inline-flex max-w-max items-center justify-center px-3 py-1 bg-primary-accent rounded-md text-white'
|
className="inline-flex max-w-max items-center justify-center px-3 py-1 bg-primary-accent rounded-md text-white"
|
||||||
>
|
>
|
||||||
Make a post
|
Make a post
|
||||||
</Link>
|
</Link>
|
||||||
@@ -42,12 +42,12 @@ export default function UserPosts({ user }: { user: UserDto }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
<div className='flex flex-col items-center w-full'>
|
<div className="flex flex-col items-center w-full">
|
||||||
{postsWithUser.map(post => (
|
{postsWithUser.map(post => (
|
||||||
<div
|
<div
|
||||||
key={post._id}
|
key={post._id}
|
||||||
className='w-full border border-t-0 border-gray-600 last:rounded-b-md p-1 last:mb-4'
|
className="w-full border border-t-0 border-gray-600 last:rounded-b-md p-1 last:mb-4"
|
||||||
>
|
>
|
||||||
<Post post={post} />
|
<Post post={post} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -49,28 +49,28 @@ export default function UserProfile({ user }: { user: UserDto }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='w-full'>
|
<div className="w-full">
|
||||||
<div className='shadow-md bg-gradient-to-r from-violet-600 via-violet-600 to-indigo-600 rounded-t-md pt-20 px-5'>
|
<div className="shadow-md bg-gradient-to-r from-violet-600 via-violet-600 to-indigo-600 rounded-t-md pt-20 px-5">
|
||||||
<div className='flex items-center gap-4 -mb-[25px]'>
|
<div className="flex items-center gap-4 -mb-[25px]">
|
||||||
<div className='flex-shrink-0'>
|
<div className="flex-shrink-0">
|
||||||
<Image
|
<Image
|
||||||
alt='user profile image'
|
alt="user profile image"
|
||||||
src={user.clerkImageUrl}
|
src={user.clerkImageUrl}
|
||||||
width={100}
|
width={100}
|
||||||
height={100}
|
height={100}
|
||||||
className='rounded-full object-cover border-4 border-primary-accent'
|
className="rounded-full object-cover border-4 border-primary-accent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-col-reverse mb-[25px] flex-1 min-w-0 gap-0.5 md:flex-row md:mb-0 md:gap-2'>
|
<div className="flex flex-col-reverse mb-[25px] flex-1 min-w-0 gap-0.5 md:flex-row md:mb-0 md:gap-2">
|
||||||
<div className='flex flex-col min-w-0 text-white'>
|
<div className="flex flex-col min-w-0 text-white">
|
||||||
<h1
|
<h1
|
||||||
className='font-bold overflow-hidden text-ellipsis'
|
className="font-bold overflow-hidden text-ellipsis"
|
||||||
title={username}
|
title={username}
|
||||||
>
|
>
|
||||||
{username}
|
{username}
|
||||||
</h1>
|
</h1>
|
||||||
<div className='flex gap-2 items-center text-sm'>
|
<div className="flex gap-2 items-center text-sm">
|
||||||
<AiFillCalendar className='w-4 h-4' />
|
<AiFillCalendar className="w-4 h-4" />
|
||||||
{`Joined ${monthJoined} ${yearJoined}`}
|
{`Joined ${monthJoined} ${yearJoined}`}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,7 +78,7 @@ export default function UserProfile({ user }: { user: UserDto }) {
|
|||||||
{isLoaded && isSignedIn && currentUser.id !== user.clerkUserId ? (
|
{isLoaded && isSignedIn && currentUser.id !== user.clerkUserId ? (
|
||||||
<button
|
<button
|
||||||
onClick={handleFollowButtonClick}
|
onClick={handleFollowButtonClick}
|
||||||
type='button'
|
type="button"
|
||||||
className={`py-0.5 px-3 rounded-full text-sm border border-white text-white ${
|
className={`py-0.5 px-3 rounded-full text-sm border border-white text-white ${
|
||||||
isFollowing ? 'bg-primary-accent' : 'o'
|
isFollowing ? 'bg-primary-accent' : 'o'
|
||||||
}`}
|
}`}
|
||||||
@@ -90,22 +90,22 @@ export default function UserProfile({ user }: { user: UserDto }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-1 bg-white dark:bg-primary-gray pl-5 border border-gray-600'>
|
<div className="flex flex-1 bg-white dark:bg-primary-gray pl-5 border border-gray-600">
|
||||||
<div className='flex flex-col min-h-[25px] items-start gap-1 py-1 pl-[116px] md:flex-row md:items-center md:gap-4'>
|
<div className="flex flex-col min-h-[25px] items-start gap-1 py-1 pl-[116px] md:flex-row md:items-center md:gap-4">
|
||||||
{countDataLoaded ? (
|
{countDataLoaded ? (
|
||||||
<>
|
<>
|
||||||
<div>
|
<div>
|
||||||
<span className='font-bold whitespace-nowrap'>{postCount}</span>{' '}
|
<span className="font-bold whitespace-nowrap">{postCount}</span>{' '}
|
||||||
posts
|
posts
|
||||||
</div>
|
</div>
|
||||||
<div className='min-w-0'>
|
<div className="min-w-0">
|
||||||
<span className='font-bold whitespace-nowrap'>
|
<span className="font-bold whitespace-nowrap">
|
||||||
{followerCount}
|
{followerCount}
|
||||||
</span>{' '}
|
</span>{' '}
|
||||||
followers
|
followers
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span className='font-bold whitespace-nowrap'>
|
<span className="font-bold whitespace-nowrap">
|
||||||
{followingCount}
|
{followingCount}
|
||||||
</span>{' '}
|
</span>{' '}
|
||||||
following
|
following
|
||||||
|
|||||||
@@ -16,10 +16,7 @@ const client = new ConvexReactClient(CONVEX_URL);
|
|||||||
|
|
||||||
export function ConvexProvider({ children }: { children: ReactNode }) {
|
export function ConvexProvider({ children }: { children: ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<ConvexProviderWithClerk
|
<ConvexProviderWithClerk client={client} useAuth={useAuth}>
|
||||||
client={client}
|
|
||||||
useAuth={useAuth}
|
|
||||||
>
|
|
||||||
{children}
|
{children}
|
||||||
</ConvexProviderWithClerk>
|
</ConvexProviderWithClerk>
|
||||||
);
|
);
|
||||||
@@ -27,11 +24,7 @@ export function ConvexProvider({ children }: { children: ReactNode }) {
|
|||||||
|
|
||||||
export function NextThemesProvider({ children }: { children: ReactNode }) {
|
export function NextThemesProvider({ children }: { children: ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<ThemeProvider
|
<ThemeProvider attribute="class" defaultTheme="light" enableSystem>
|
||||||
attribute='class'
|
|
||||||
defaultTheme='light'
|
|
||||||
enableSystem
|
|
||||||
>
|
|
||||||
{children}
|
{children}
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user