diff --git a/.vscode/nextjssnippet.code-snippets b/.vscode/nextjssnippet.code-snippets new file mode 100644 index 00000000..56c9c990 --- /dev/null +++ b/.vscode/nextjssnippet.code-snippets @@ -0,0 +1,75 @@ +{ + "fcc": { + "prefix": "fcc", + "body": [ + "import './${TM_FILENAME_BASE/^(.)/${1:/downcase}/}.css'", + "", + "const ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}} = () => {", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create an arrow component with css" + }, + "fcs": { + "prefix": "fcs", + "body": [ + "import './${TM_FILENAME_BASE/^(.)/${1:/downcase}/}.scss'", + "", + "function ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}(){", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create a functional component with Sass" + }, + "acs": { + "prefix": "acs", + "body": [ + "import './${TM_FILENAME_BASE/^(.)/${1:/downcase}/}.scss'", + "", + "const ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}} = () => {", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create an arrow component with Sass" + }, +"comp": { + "prefix": "comp", + "body": [ + "const ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}} = () => {", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create a component" + }, +"compt": { + "prefix": "compt", + "body": [ + "const ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}} = () => {", + " return (", + "
${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}
", + " )", + "}", + "", + "export default ${1:${TM_FILENAME_BASE/(.)(.*)/${1:/capitalize}${2}/}}" + ], + "description": "Create a component with tailwind classname" + } + + +} \ No newline at end of file diff --git a/next.config.mjs b/next.config.mjs index 7ef6aac0..7c58535f 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -4,6 +4,14 @@ const nextConfig = { reactCompiler: true, ppr: 'incremental' }, + images:{ + remotePatterns:[ + { + protocol:"https", + hostname:"images.pexels.com" + }, + ], +}, }; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index c9cc8cb7..c24f78d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "soci-start", "version": "0.1.0", "dependencies": { + "@clerk/nextjs": "^5.7.5", "babel-plugin-react-compiler": "^0.0.0-experimental-938cd9a-20240601", "next": "15.0.0-rc.0", "react": "19.0.0-rc-f994737d14-20240522", @@ -95,6 +96,150 @@ "node": ">=6.9.0" } }, + "node_modules/@clerk/backend": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-1.14.1.tgz", + "integrity": "sha512-YlKMpiVo4UITw3sgA+9QrAFRILVOz5hgB1Zw180Y2LEZ5a+MdpX668vJKGh7riSweMN7JQvU2jlsKGRO+1bXDw==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "2.9.2", + "@clerk/types": "4.26.0", + "cookie": "0.7.0", + "snakecase-keys": "5.4.4", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "node_modules/@clerk/backend/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@clerk/clerk-react": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@clerk/clerk-react/-/clerk-react-5.12.0.tgz", + "integrity": "sha512-3Lr2QazCm5R6ZLbu7wM+d5YwCElrAoX00OBWcKqjPYaWDJCCmEYN6LJbLzOTYQ8QT1J1ZIed85/lKa+q2aD1aA==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "2.9.2", + "@clerk/types": "4.26.0", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" + } + }, + "node_modules/@clerk/clerk-react/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@clerk/nextjs": { + "version": "5.7.5", + "resolved": "https://registry.npmjs.org/@clerk/nextjs/-/nextjs-5.7.5.tgz", + "integrity": "sha512-hfH4IiKcDT9LlqSOlNHZoYfX6iF4lBqPXf/KwnILCX/0+MVYaotb30FwWXkcHI2jZgcvumlQTOq8Gv5KugnihA==", + "license": "MIT", + "dependencies": { + "@clerk/backend": "1.14.1", + "@clerk/clerk-react": "5.12.0", + "@clerk/shared": "2.9.2", + "@clerk/types": "4.26.0", + "crypto-js": "4.2.0", + "server-only": "0.0.1", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "next": "^13.5.4 || ^14.0.3 || >=15.0.0-rc", + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" + } + }, + "node_modules/@clerk/nextjs/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@clerk/shared": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-2.9.2.tgz", + "integrity": "sha512-vRMDj13Pv9n8Pf+f8P40AvqJ8QEq348qUxUVIf17vn9R3/toicrQOY/Q6qsrAS8KXY9+ZnyTafJa+VFK+6iEFA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@clerk/types": "4.26.0", + "glob-to-regexp": "0.4.1", + "js-cookie": "3.0.5", + "std-env": "^3.7.0", + "swr": "^2.2.0" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@clerk/shared/node_modules/swr": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", + "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", + "license": "MIT", + "dependencies": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@clerk/shared/node_modules/swr/node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@clerk/types": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.26.0.tgz", + "integrity": "sha512-VGcrQz/XpCiGbpIIzKVwWw4nLorzKnIP1IAemj1xt/80ULcdEZCncwhas6PoYBBsl1W55A1SwP9B/pEs0nmkCw==", + "license": "MIT", + "dependencies": { + "csstype": "3.1.1" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "node_modules/@clerk/types/node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "license": "MIT" + }, "node_modules/@emnapi/runtime": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", @@ -1802,6 +1947,15 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.0.tgz", + "integrity": "sha512-qCf+V4dtlNhSRXGAZatc1TasyFO6GjohcOul807YOb5ik3+kQSnb4d7iajeCL8QHaJ4uZEjCgiCJerKXwdRVlQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1817,6 +1971,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2019,6 +2179,16 @@ "node": ">=6.0.0" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2963,6 +3133,12 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -3695,6 +3871,15 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3878,6 +4063,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", @@ -3888,6 +4082,18 @@ "node": "14 || >=16.14" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -4072,6 +4278,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4939,6 +5155,12 @@ "node": ">=10" } }, + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -5089,6 +5311,42 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snakecase-keys": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz", + "integrity": "sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==", + "license": "MIT", + "dependencies": { + "map-obj": "^4.1.0", + "snake-case": "^3.0.4", + "type-fest": "^2.5.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/snakecase-keys/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -5107,6 +5365,12 @@ "node": ">=0.10.0" } }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", diff --git a/package.json b/package.json index 9cb8d864..e5ecd73c 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@clerk/nextjs": "^5.7.5", "babel-plugin-react-compiler": "^0.0.0-experimental-938cd9a-20240601", "next": "15.0.0-rc.0", "react": "19.0.0-rc-f994737d14-20240522", diff --git a/src/app/components/Ad.tsx b/src/app/components/Ad.tsx new file mode 100644 index 00000000..1e5d1a95 --- /dev/null +++ b/src/app/components/Ad.tsx @@ -0,0 +1,29 @@ +import Link from "next/link" +import Image from "next/image" + +const Ad = ({ size }: { size: "sm" | "md" | "lg" }) => { + return ( +
+ {/* TOP */} +
+ Sponsored Ads + more image +
+ {/* BOTTOM */} +
+
+ ads image +
+
+ ads profile + Big Chef's Lounge +
+

+ {size === "sm" ? "Integer finibus dolor felis, eu placerat sapien dictum sit amet." : size === "md" ? "Integer finibus dolor felis, eu placerat sapien dictum sit amet. Vestibulum quis eros sed massa mollis feugiat. Integer pulvinar enim nec ultricies convallis." : "Integer finibus dolor felis, eu placerat sapien dictum sit amet. Vestibulum quis eros sed massa mollis feugiat. Integer pulvinar enim nec ultricies convallis."} +

+ +
+
+ ) +} + export default Ad \ No newline at end of file diff --git a/src/app/components/AddPost.tsx b/src/app/components/AddPost.tsx new file mode 100644 index 00000000..4d92de49 --- /dev/null +++ b/src/app/components/AddPost.tsx @@ -0,0 +1,60 @@ +import Image from "next/image" + +const AddPost = () => { + return ( +
+ {/* Avatar */} + avatar + + {/* post */} +
+ {/* text input */} +
+ + avatar + +
+ + {/* post option */} +
+ {/* add image */} +
+ addPhoto + + Photo +
+ {/* add video */} +
+ addVideo + + Videos +
+ {/* add poll */} +
+ poll + + Poll +
+ {/* add event */} +
+ addevent + + Event +
+ +
+
+ +
+ ) + + +} + +export default AddPost \ No newline at end of file diff --git a/src/app/components/Birthdays.tsx b/src/app/components/Birthdays.tsx new file mode 100644 index 00000000..7f81ab4b --- /dev/null +++ b/src/app/components/Birthdays.tsx @@ -0,0 +1,33 @@ +import Link from "next/link" +import Image from "next/image" + +const Birthdays = () => { + return ( +
+ {/* TOP */} +
+ Birthdays +
+ {/* USER */} +
+
+ image + Wayne Burton +
+
+ +
+
+ {/* UPCOMING */} +
+ gift image + + Upcoming Birtdays + See other 12 upcoming birtdays + +
+
+ ) +} + +export default Birthdays \ No newline at end of file diff --git a/src/app/components/Comments.tsx b/src/app/components/Comments.tsx new file mode 100644 index 00000000..45acf03f --- /dev/null +++ b/src/app/components/Comments.tsx @@ -0,0 +1,43 @@ +import Image from "next/image" +const Comments = () => { + return ( +
+ {/* WRITE */} +
+ user +
+ + emoji +
+
+ {/* COMMENTS */} +
+ {/* COMMENT */} +
+ {/* AVATAR */} + user + + {/* DESC */} +
+ testuser +

Coffee is a beverage brewed from roasted coffee beans. Darkly colored, bitter, and slightly acidic, coffee has a stimulating effect on humans, primarily due to its caffeine content and i love them so much

+
+
+ more image + | + 123 Likes +
+
Reply
+
+
+ {/* ICON */} + more image +
+
+
+ ) +} + +export default Comments \ No newline at end of file diff --git a/src/app/components/Feed.tsx b/src/app/components/Feed.tsx new file mode 100644 index 00000000..68f4b179 --- /dev/null +++ b/src/app/components/Feed.tsx @@ -0,0 +1,12 @@ +import Image from "next/image" +import Post from "./Post" + +const Feed = () => { + return ( +
+ +
+ ) +} + +export default Feed \ No newline at end of file diff --git a/src/app/components/FriendRequests.tsx b/src/app/components/FriendRequests.tsx new file mode 100644 index 00000000..ace0dfbd --- /dev/null +++ b/src/app/components/FriendRequests.tsx @@ -0,0 +1,49 @@ +import Link from "next/link" +import Image from "next/image" + +const FriendRequests = () => { + return ( +
+ {/* TOP */} +
+ Friend Requests + See all +
+ {/* USER */} +
+
+ image + Wayne Burton +
+
+ accept + reject +
+
+ +
+
+ image + Wayne Burton +
+
+ accept + reject +
+
+ +
+
+ image + Wayne Burton +
+
+ accept + reject +
+
+
+ ) +} + +export default FriendRequests \ No newline at end of file diff --git a/src/app/components/LeftMenu.tsx b/src/app/components/LeftMenu.tsx new file mode 100644 index 00000000..2c1bc9d6 --- /dev/null +++ b/src/app/components/LeftMenu.tsx @@ -0,0 +1,77 @@ +import ProfileCard from "./ProfileCard" +import Link from "next/link" +import Image from "next/image" +import Ad from "./Ad" + +const LeftMenu = ({ type }: { type: "home" | "profile" }) => { + return ( +
+ {type === "home" && } +
+ + + + My Posts + +
+ + + + Activity + +
+ + + + Marketplace + +
+ + + + Events + +
+ + + + Albums + +
+ + + + Videos + +
+ + + + News + +
+ + + + Courses + +
+ + + + Lists + +
+ + + + Settings + +
+
+ +
+ ) +} + +export default LeftMenu \ No newline at end of file diff --git a/src/app/components/MobileMenu.tsx b/src/app/components/MobileMenu.tsx new file mode 100644 index 00000000..42ce9f4a --- /dev/null +++ b/src/app/components/MobileMenu.tsx @@ -0,0 +1,32 @@ +"use client" +import Link from "next/link"; + +import { useState } from "react"; + +const MobileMenu = () => { + const [isOpen, setIsOpen] = useState(false); + return ( +
+
setIsOpen((prev) => !prev)}> +
+
+
+
+ {isOpen &&( +
+ Home + Friends + Group + Stories + Login +
+ )} +
+
+
+ + + ) +} + +export default MobileMenu \ No newline at end of file diff --git a/src/app/components/Navbar.tsx b/src/app/components/Navbar.tsx new file mode 100644 index 00000000..cb5ddbe6 --- /dev/null +++ b/src/app/components/Navbar.tsx @@ -0,0 +1,82 @@ +import Link from "next/link"; +import MobileMenu from "./MobileMenu"; +import Image from "next/image"; +import { + ClerkProvider, + SignInButton, + SignedIn, + SignedOut, + UserButton, + ClerkLoading +} from '@clerk/nextjs' +const Navbar = () => { + return ( +
+ + {/* Left nav */} +
+ LamaSocial +
+ + {/* Center nav */} +
+
+ + Homepage + Homepage + + + Friends + Friends + + + Stories + Stories + +
+
+ + +
+
+ + {/* Right nav */} +
+ +
+ + Loading... +
+
+ +
+ People +
+
+ messages +
+
+ notifications +
+ +
+ + +
+ login + Login/Register +
+
+ +
+
+ + + + ) +} + +export default Navbar \ No newline at end of file diff --git a/src/app/components/Post.tsx b/src/app/components/Post.tsx new file mode 100644 index 00000000..5a818d69 --- /dev/null +++ b/src/app/components/Post.tsx @@ -0,0 +1,62 @@ +"use user" +import Image from "next/image" +import Comments from "./Comments" +const Post = () => { + return ( +
+ {/* USER */} +
+
+ user + Feilin +
+ user +
+ + {/* DESC */} +
+
+ user +
+

Coffee is a beverage brewed from roasted coffee beans. Darkly colored, bitter, and slightly acidic, coffee has a stimulating effect on humans, primarily due to its caffeine content

+
+ {/* INTERACTION */} +
+ {/* Likes */} +
+
+ liked + | + 500 Likes +
+
+ {/* Comment */} +
+
+ comment + | + 500 Comments +
+
+
+
+
+ share + | + 500 Shares +
+
+
+
+ +
+ ) +} + +export default Post \ No newline at end of file diff --git a/src/app/components/ProfileCard.tsx b/src/app/components/ProfileCard.tsx new file mode 100644 index 00000000..8b7ee3ce --- /dev/null +++ b/src/app/components/ProfileCard.tsx @@ -0,0 +1,26 @@ +import Image from "next/image" + +const ProfileCard = () => { + return ( +
+
+ + +
+
+ Edward Gabriel May +
+
+ + + +
+ 500 Followers +
+ +
+
+ ) +} + +export default ProfileCard \ No newline at end of file diff --git a/src/app/components/RightMenu.tsx b/src/app/components/RightMenu.tsx new file mode 100644 index 00000000..9a9c1aa6 --- /dev/null +++ b/src/app/components/RightMenu.tsx @@ -0,0 +1,20 @@ +import FriendRequests from "./FriendRequests" +import Birthdays from "./Birthdays" +import Ad from "./Ad" +import UserInfoCard from "./UserInfoCard" +import UserMediaCard from "./UserMediaCard" +const RightMenu = ({userId}: {userId?:string}) => { + return ( +
+ {userId ? (<> + + + ) : null} + + + +
+ ) +} + +export default RightMenu \ No newline at end of file diff --git a/src/app/components/Stories.tsx b/src/app/components/Stories.tsx new file mode 100644 index 00000000..2f294047 --- /dev/null +++ b/src/app/components/Stories.tsx @@ -0,0 +1,16 @@ +import Image from "next/image" +const Stories = () => { + return ( +
+
+ {/* Stories */} +
+ profile + Feilin +
+
+
+ ) +} + +export default Stories \ No newline at end of file diff --git a/src/app/components/UserInfoCard.tsx b/src/app/components/UserInfoCard.tsx new file mode 100644 index 00000000..92dbcf0f --- /dev/null +++ b/src/app/components/UserInfoCard.tsx @@ -0,0 +1,53 @@ +import Link from "next/link" +import Image from "next/image" + +const UserInfoCard = ({ userId }: { userId?: string }) => { + return ( +
+ {/* TOP */} +
+ User Info + See all +
+ {/* BOTTOM */} +
+
+ Lyod Flemming + @jonathan +
+

Integer finibus dolor felis, eu placerat sapien dictum sit amet. Vestibulum quis eros sed massa mollis feugiat. Integer pulvinar enim nec ultricies convallis.

+ +
+ map image + Living in Denver +
+ +
+ map image + Went to Sunny Highschool +
+ +
+ map image + Work at Astra +
+ +
+
+ link image + ali.dev +
+
+ date image + Joined November 2024 +
+ +
+ + Block User +
+
+ ) +} + +export default UserInfoCard \ No newline at end of file diff --git a/src/app/components/UserMediaCard.tsx b/src/app/components/UserMediaCard.tsx new file mode 100644 index 00000000..5ba1608f --- /dev/null +++ b/src/app/components/UserMediaCard.tsx @@ -0,0 +1,50 @@ +import Link from "next/link" +import Image from "next/image" + +const UserMediaCard = ({ userId }: { userId?: string }) => { + return ( +
+ {/* TOP */} +
+ User Media + See all +
+ {/* BOTTOM */} +
+
+ image +
+ +
+ image +
+ +
+ image +
+ +
+ image +
+ +
+ image +
+ +
+ image +
+ +
+ image +
+ +
+ image +
+
+
+ ) +} + +export default UserMediaCard \ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css index bd6213e1..3e4cb23d 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,3 +1,12 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +/* globals.css or equivalent file */ +.scrollbar-hide { + -ms-overflow-style: none; +} + +.scrollbar-hide::-webkit-scrollbar { + display: none; /* For Chrome, Safari, and Opera */ +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 04269735..1595a87f 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,7 +1,14 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; - +import Navbar from "./components/Navbar"; +import { + ClerkProvider, + // SignInButton, + // SignedIn, + // SignedOut, + // UserButton +} from '@clerk/nextjs' const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -15,8 +22,17 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - {children} - + + + +
+ +
+
+ {children} +
+ + +
); } \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 3d365a49..ec0a034c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,30 @@ +import LeftMenu from "./components/LeftMenu"; +import RightMenu from "./components/RightMenu"; +import Feed from "./components/Feed"; +import AddPost from "./components/AddPost"; +import Stories from "./components/Stories"; const Homepage = () => { return ( -
Homepage
+
+ {/* Left components */} +
+ +
+ + {/* Center components */} +
+
+ + + +
+
+ + {/* Right components */} +
+ +
+
) } diff --git a/src/app/profile/[id]/page.tsx b/src/app/profile/[id]/page.tsx new file mode 100644 index 00000000..93a2e2e4 --- /dev/null +++ b/src/app/profile/[id]/page.tsx @@ -0,0 +1,50 @@ +import LeftMenu from "../../components/LeftMenu"; +import RightMenu from "../../components/RightMenu"; +import Feed from "../../components/Feed"; +import Image from "next/image" + +const ProfilePage = () => { + return ( +
+ {/* Left components */} +
+ +
+ + {/* Center components */} +
+
+
+
+ + +
+

Justinian

+
+
+ 123 + Posts +
+
+ 2k + Followers +
+
+ 1k + Following +
+
+
+ +
+
+ + {/* Right components */} +
+ +
+
+ ) +} + +export default ProfilePage \ No newline at end of file diff --git a/src/app/profile/[id]page.tsx b/src/app/profile/[id]page.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/app/sign-in/[[...sign-in]]/page.tsx b/src/app/sign-in/[[...sign-in]]/page.tsx new file mode 100644 index 00000000..5f2bae3f --- /dev/null +++ b/src/app/sign-in/[[...sign-in]]/page.tsx @@ -0,0 +1,7 @@ +import { SignIn } from "@clerk/nextjs"; + +export default function Page() { + return (
+ +
); +} \ No newline at end of file diff --git a/src/app/sign-up/[[...sign-up]]/page.tsx b/src/app/sign-up/[[...sign-up]]/page.tsx new file mode 100644 index 00000000..db206dbc --- /dev/null +++ b/src/app/sign-up/[[...sign-up]]/page.tsx @@ -0,0 +1,7 @@ +import { SignUp } from "@clerk/nextjs"; + +export default function Page() { + return(
+ +
); +} \ No newline at end of file diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 00000000..b4970260 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,16 @@ +import { auth, clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server"; + + +const isProtectedRoute = createRouteMatcher(["/settings(.*)"]) +export default clerkMiddleware((auth,req)=>{ + if(isProtectedRoute(req)) auth().protect(); +}); + +export const config = { + matcher: [ + // Skip Next.js internals and all static files, unless found in search params + '/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)', + // Always run for API routes + '/(api|trpc)(.*)', + ], +}; \ No newline at end of file