From c2c6f37399a819670ffedcaf71181c2bdd6a7a80 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 22 Dec 2023 23:08:27 +0000 Subject: [PATCH 1/6] IPK-65 Added basic scene --- src/components/Features.tsx | 6 ++++-- src/components/Scene.tsx | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/components/Scene.tsx diff --git a/src/components/Features.tsx b/src/components/Features.tsx index e054e67..4928177 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -3,7 +3,8 @@ import { stylesWithCssVar } from "@/utils/motion"; import { useScroll, useTransform, motion } from "framer-motion"; import React from "react"; import { Suspense, useRef } from "react"; -const Spline = React.lazy(() => import("@splinetool/react-spline")); +import Scene from "./Scene"; +/* const Spline = React.lazy(() => import("@splinetool/react-spline")); */ export const Features = () => { const targetRef = useRef(null); @@ -27,7 +28,8 @@ export const Features = () => {
- + {/* */} + + + + + + + + ); +} + +export default Scene; From 10cce2b3e9f02f00588ed6e3275feabb73d3d916 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 23 Dec 2023 16:54:28 +0000 Subject: [PATCH 2/6] IPK-65 Changed 3d technology completely --- .gitignore | 3 +- bun.lockb | Bin 196949 -> 197715 bytes package.json | 10 +- src/app/3dtest/page.tsx | 8 ++ src/assets/globals.scss | 4 + src/components/3d/Scene.tsx | 15 ++ src/components/3d/Sphere.tsx | 90 ++++++++++++ src/components/3d/fragmentShader.js | 73 ++++++++++ src/components/3d/vertexShader.js | 212 ++++++++++++++++++++++++++++ src/components/Features.tsx | 2 +- src/components/Scene.tsx | 24 ---- src/types/index.d.ts | 11 ++ 12 files changed, 422 insertions(+), 30 deletions(-) create mode 100644 src/app/3dtest/page.tsx create mode 100644 src/components/3d/Scene.tsx create mode 100644 src/components/3d/Sphere.tsx create mode 100644 src/components/3d/fragmentShader.js create mode 100644 src/components/3d/vertexShader.js delete mode 100644 src/components/Scene.tsx create mode 100644 src/types/index.d.ts diff --git a/.gitignore b/.gitignore index 4d4bf6a..4cae14d 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ yarn-error.log* *.tsbuildinfo next-env.d.ts -bun.lockb \ No newline at end of file +/bun.lockb +bun.lockb diff --git a/bun.lockb b/bun.lockb index b9c4b897d41978e8fb1890b78aaa3a955e703f78..64b91c2b873ac89ee35f82215a78603f439ac763 100755 GIT binary patch delta 36679 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 a?9rQV`|Jt*mJD~iMO@IEZL7FI%Kry1lWfxf delta 36108 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 +} + +export default page; diff --git a/src/assets/globals.scss b/src/assets/globals.scss index d3b2435..8996cc1 100644 --- a/src/assets/globals.scss +++ b/src/assets/globals.scss @@ -26,6 +26,10 @@ section { max-width: 100%; } +canvas { + min-height: 100vh; +} + .landingGradient { width: 70vh; height: 70vh; diff --git a/src/components/3d/Scene.tsx b/src/components/3d/Scene.tsx new file mode 100644 index 0000000..f8931c5 --- /dev/null +++ b/src/components/3d/Scene.tsx @@ -0,0 +1,15 @@ +"use client"; +import { Canvas } from "@react-three/fiber"; +import Sphere from "./Sphere"; + +function Scene() { + return ( + + + + + + ); +} + +export default Scene; diff --git a/src/components/3d/Sphere.tsx b/src/components/3d/Sphere.tsx new file mode 100644 index 0000000..62dd559 --- /dev/null +++ b/src/components/3d/Sphere.tsx @@ -0,0 +1,90 @@ +import { shaderMaterial } from "@react-three/drei"; +import { extend, useFrame, useThree } from "@react-three/fiber"; +import React, { useEffect } from "react"; +import * as THREE from "three"; +import { fragmentShader } from "./fragmentShader"; +import { vertexShader } from "./vertexShader"; +import TWEEN from "@tweenjs/tween.js"; + +function Sphere() { + const meshRef = React.useRef(); + const start = React.useRef(Date.now()); + const uniforms = React.useRef( + THREE.UniformsUtils.merge([THREE.UniformsLib["lights"], THREE.ShaderLib.phong.uniforms, { time: { value: 0 } }]) + ); + const { camera, size } = useThree(); + camera.position.setZ(42); + camera.position.setX(40); + camera.position.setY(25); + + useFrame(() => { + const elapsed = Date.now() - start.current; + uniforms.current.time.value = 0.00005 * elapsed; + meshRef.current.rotation.z += 0.001; + TWEEN.update(); + }); + + React.useEffect(() => { + const handleResize = () => { + const windowWidth = window.innerWidth; + camera.updateProjectionMatrix(); + + if (windowWidth <= 696) { + meshRef.current?.position.set(14, 10, 0); + } else if (windowWidth <= 1024) { + meshRef.current?.position.set(18, 14, 0); + } else { + meshRef.current?.position.set(22, 16, 0); + } + }; + + window.addEventListener("resize", handleResize); + handleResize(); + + return () => { + TWEEN.removeAll(); + window.removeEventListener("resize", handleResize); + }; + }, [camera, size]); + + useEffect(() => { + const onCanvasMouseMove = (event: MouseEvent) => { + const position = { + x: event.clientX / size.width, + y: event.clientY / size.height + }; + + const targetRotation = { + x: position.y / 2, + y: position.x / 2 + }; + + // Tween update for smooth transition + if (meshRef.current) { + TWEEN.removeAll(); + new TWEEN.Tween(meshRef.current.rotation) + .to({ x: targetRotation.x, y: targetRotation.y }, 2000) + .easing(TWEEN.Easing.Quartic.Out) + .start(); + } + }; + + window.addEventListener("mousemove", onCanvasMouseMove); + + return () => { + window.removeEventListener("mousemove", onCanvasMouseMove); + }; + }, [size]); + + const CustomShaderMaterial = shaderMaterial(uniforms.current, vertexShader, fragmentShader); + + extend({ CustomShaderMaterial }); + return ( + + + + + ); +} + +export default Sphere; diff --git a/src/components/3d/fragmentShader.js b/src/components/3d/fragmentShader.js new file mode 100644 index 0000000..8cbea52 --- /dev/null +++ b/src/components/3d/fragmentShader.js @@ -0,0 +1,73 @@ +export const fragmentShader = ` +#define PHONG + +uniform vec3 diffuse; +uniform vec3 emissive; +uniform vec3 specular; +uniform float shininess; +uniform float opacity; +uniform float time; +varying vec2 vUv; +varying vec3 newPosition; +varying float noise; +varying vec3 vNormal; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void main() { + #include + + vec3 color = vec3(vUv * (0.3 - 2.0 * noise), 1); + vec3 targetColor = vec3(69.0/255.0, 134.0/255.0, 230.0/255.0); + vec4 diffuseColor = vec4(targetColor, 1.0); // Use targetColor for the RGB components + vec3 finalColors = vec3(color.b * 2.0, color.r, color.r); + ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); + vec3 totalEmissiveRadiance = emissive; + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; + + #include + #include + #include + #include + #include + + gl_FragColor = vec4(outgoingLight, diffuseColor.a); +} +`; diff --git a/src/components/3d/vertexShader.js b/src/components/3d/vertexShader.js new file mode 100644 index 0000000..7b47db9 --- /dev/null +++ b/src/components/3d/vertexShader.js @@ -0,0 +1,212 @@ +export const vertexShader = ` + vec3 mod289(vec3 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + vec4 mod289(vec4 x) + { + return x - floor(x * (1.0 / 289.0)) * 289.0; + } + vec4 permute(vec4 x) + { + return mod289(((x * 34.0) + 1.0) * x); + } + vec4 taylorInvSqrt(vec4 r) + { + return 1.79284291400159 - 0.85373472095314 * r; + } + vec3 fade(vec3 t) { + return t*t*t*(t*(t*6.0-15.0)+10.0); + } + + // Classic Perlin noise + float cnoise(vec3 P) + { + vec3 Pi0 = floor(P); // Integer part for indexing + vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1 + Pi0 = mod289(Pi0); + Pi1 = mod289(Pi1); + vec3 Pf0 = fract(P); // Fractional part for interpolation + vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0 + vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec4 iy = vec4(Pi0.yy, Pi1.yy); + vec4 iz0 = Pi0.zzzz; + vec4 iz1 = Pi1.zzzz; + vec4 ixy = permute(permute(ix) + iy); + vec4 ixy0 = permute(ixy + iz0); + vec4 ixy1 = permute(ixy + iz1); + vec4 gx0 = ixy0 * (1.0 / 7.0); + vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5; + gx0 = fract(gx0); + vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0); + vec4 sz0 = step(gz0, vec4(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - 0.5); + gy0 -= sz0 * (step(0.0, gy0) - 0.5); + vec4 gx1 = ixy1 * (1.0 / 7.0); + vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5; + gx1 = fract(gx1); + vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1); + vec4 sz1 = step(gz1, vec4(0.0)); + gx1 -= sz1 * (step(0.0, gx1) - 0.5); + gy1 -= sz1 * (step(0.0, gy1) - 0.5); + vec3 g000 = vec3(gx0.x,gy0.x,gz0.x); + vec3 g100 = vec3(gx0.y,gy0.y,gz0.y); + vec3 g010 = vec3(gx0.z,gy0.z,gz0.z); + vec3 g110 = vec3(gx0.w,gy0.w,gz0.w); + vec3 g001 = vec3(gx1.x,gy1.x,gz1.x); + vec3 g101 = vec3(gx1.y,gy1.y,gz1.y); + vec3 g011 = vec3(gx1.z,gy1.z,gz1.z); + vec3 g111 = vec3(gx1.w,gy1.w,gz1.w); + vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + float n000 = dot(g000, Pf0); + float n100 = dot(g100, vec3(Pf1.x, Pf0.yz)); + float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)); + float n110 = dot(g110, vec3(Pf1.xy, Pf0.z)); + float n001 = dot(g001, vec3(Pf0.xy, Pf1.z)); + float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)); + float n011 = dot(g011, vec3(Pf0.x, Pf1.yz)); + float n111 = dot(g111, Pf1); + vec3 fade_xyz = fade(Pf0); + vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y); + float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return 2.2 * n_xyz; + } + + // Classic Perlin noise, periodic variant + float pnoise(vec3 P, vec3 rep) + { + vec3 Pi0 = mod(floor(P), rep); // Integer part, modulo period + vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); // Integer part + 1, mod period + Pi0 = mod289(Pi0); + Pi1 = mod289(Pi1); + vec3 Pf0 = fract(P); // Fractional part for interpolation + vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0 + vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec4 iy = vec4(Pi0.yy, Pi1.yy); + vec4 iz0 = Pi0.zzzz; + vec4 iz1 = Pi1.zzzz; + vec4 ixy = permute(permute(ix) + iy); + vec4 ixy0 = permute(ixy + iz0); + vec4 ixy1 = permute(ixy + iz1); + vec4 gx0 = ixy0 * (1.0 / 7.0); + vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5; + gx0 = fract(gx0); + vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0); + vec4 sz0 = step(gz0, vec4(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - 0.5); + gy0 -= sz0 * (step(0.0, gy0) - 0.5); + vec4 gx1 = ixy1 * (1.0 / 7.0); + vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5; + gx1 = fract(gx1); + vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1); + vec4 sz1 = step(gz1, vec4(0.0)); + gx1 -= sz1 * (step(0.0, gx1) - 0.5); + gy1 -= sz1 * (step(0.0, gy1) - 0.5); + vec3 g000 = vec3(gx0.x,gy0.x,gz0.x); + vec3 g100 = vec3(gx0.y,gy0.y,gz0.y); + vec3 g010 = vec3(gx0.z,gy0.z,gz0.z); + vec3 g110 = vec3(gx0.w,gy0.w,gz0.w); + vec3 g001 = vec3(gx1.x,gy1.x,gz1.x); + vec3 g101 = vec3(gx1.y,gy1.y,gz1.y); + vec3 g011 = vec3(gx1.z,gy1.z,gz1.z); + vec3 g111 = vec3(gx1.w,gy1.w,gz1.w); + vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + float n000 = dot(g000, Pf0); + float n100 = dot(g100, vec3(Pf1.x, Pf0.yz)); + float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)); + float n110 = dot(g110, vec3(Pf1.xy, Pf0.z)); + float n001 = dot(g001, vec3(Pf0.xy, Pf1.z)); + float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)); + float n011 = dot(g011, vec3(Pf0.x, Pf1.yz)); + float n111 = dot(g111, Pf1); + vec3 fade_xyz = fade(Pf0); + vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y); + float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return 2.2 * n_xyz; + } + + float turbulence(vec3 p) { + float w = 100.0; + float t = -.5; + for (float f = 1.0 ; f <= 10.0 ; f++) { + float power = pow(2.0, f); + t += abs(pnoise(vec3(power * p), vec3(10.0, 10.0, 10.0)) / power); + } + return t; + } + + // START + uniform float time; + varying vec2 vUv; + varying vec3 vNormal; + varying float noise; + + #define PHONG + + varying vec3 vViewPosition; + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + void main() { + #include + #include + #include + #include + #include + #include + #include + #ifndef FLAT_SHADED // Normal computed with derivatives when FLAT_SHADED + vNormal = normal; + #endif + #include + #include + #include + #include + #include + #include + #include + + vViewPosition = - mvPosition.xyz; + + #include + #include + #include + #include + + vUv = uv; + + noise = turbulence(0.01 * position + normal + time * 0.8); + vec3 displacement = vec3((position.x) * noise, position.y * noise, position.z * noise); + gl_Position = projectionMatrix * modelViewMatrix * vec4((position + normal) + displacement, 1.0); + } +`; diff --git a/src/components/Features.tsx b/src/components/Features.tsx index 4928177..116de6b 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -3,7 +3,7 @@ import { stylesWithCssVar } from "@/utils/motion"; import { useScroll, useTransform, motion } from "framer-motion"; import React from "react"; import { Suspense, useRef } from "react"; -import Scene from "./Scene"; +import Scene from "./3d/Scene"; /* const Spline = React.lazy(() => import("@splinetool/react-spline")); */ export const Features = () => { diff --git a/src/components/Scene.tsx b/src/components/Scene.tsx deleted file mode 100644 index d31beb7..0000000 --- a/src/components/Scene.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Canvas } from "@react-three/fiber"; - -function Scene() { - return ( - - - - - - - - ); -} - -export default Scene; diff --git a/src/types/index.d.ts b/src/types/index.d.ts new file mode 100644 index 0000000..c8cbcb1 --- /dev/null +++ b/src/types/index.d.ts @@ -0,0 +1,11 @@ +import { ReactThreeFiber } from "@react-three/fiber"; +import { ShaderMaterialParameters } from "three"; +import { shaderMaterial } from "@react-three/drei"; + +declare global { + namespace JSX { + interface IntrinsicElements { + customShaderMaterial: ReactThreeFiber.Node; + } + } +} From c41bfa3108b558cb1b58a667145e6c7ee91c9cfd Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 23 Dec 2023 17:06:03 +0000 Subject: [PATCH 3/6] IPK-65 sphere import fix --- src/components/3d/Sphere.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/3d/Sphere.tsx b/src/components/3d/Sphere.tsx index 62dd559..7323f40 100644 --- a/src/components/3d/Sphere.tsx +++ b/src/components/3d/Sphere.tsx @@ -4,7 +4,8 @@ import React, { useEffect } from "react"; import * as THREE from "three"; import { fragmentShader } from "./fragmentShader"; import { vertexShader } from "./vertexShader"; -import TWEEN from "@tweenjs/tween.js"; +// @ts-ignore +import * as TWEEN from "@tweenjs/tween.js"; function Sphere() { const meshRef = React.useRef(); From 605cb78d471c2fb3893be9c3c60afdbece9c0a55 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 23 Dec 2023 17:08:01 +0000 Subject: [PATCH 4/6] IPK-65 state type fix --- src/components/3d/Sphere.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/3d/Sphere.tsx b/src/components/3d/Sphere.tsx index 7323f40..63abc8c 100644 --- a/src/components/3d/Sphere.tsx +++ b/src/components/3d/Sphere.tsx @@ -8,7 +8,7 @@ import { vertexShader } from "./vertexShader"; import * as TWEEN from "@tweenjs/tween.js"; function Sphere() { - const meshRef = React.useRef(); + const meshRef = React.useRef(); const start = React.useRef(Date.now()); const uniforms = React.useRef( THREE.UniformsUtils.merge([THREE.UniformsLib["lights"], THREE.ShaderLib.phong.uniforms, { time: { value: 0 } }]) From 05ff5eed744d09123dc5f07ba9635a40e437e432 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 23 Dec 2023 17:14:28 +0000 Subject: [PATCH 5/6] IPK-58 added reset,setup,(signup) --- src/app/reset/page.tsx | 7 +++++++ src/app/setup/page.tsx | 7 +++++++ src/app/signup/page.tsx | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 src/app/reset/page.tsx create mode 100644 src/app/setup/page.tsx create mode 100644 src/app/signup/page.tsx diff --git a/src/app/reset/page.tsx b/src/app/reset/page.tsx new file mode 100644 index 0000000..3531826 --- /dev/null +++ b/src/app/reset/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function Reset() { + return
Reset Password
; +} + +export default Reset; diff --git a/src/app/setup/page.tsx b/src/app/setup/page.tsx new file mode 100644 index 0000000..e1f8697 --- /dev/null +++ b/src/app/setup/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function Setup() { + return
Setup
; +} + +export default Setup; diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx new file mode 100644 index 0000000..0284c87 --- /dev/null +++ b/src/app/signup/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function Signup() { + return
Signup
; +} + +export default Signup; From b9639f36bc70d87cb95f68246ac732e88cb16698 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 23 Dec 2023 17:17:52 +0000 Subject: [PATCH 6/6] IPK-58 Added company routes --- src/app/[companyId]/dashboard/page.tsx | 7 +++++++ src/app/[companyId]/login/page.tsx | 7 +++++++ src/app/[companyId]/settings/page.tsx | 7 +++++++ src/app/[companyId]/signup/page.tsx | 7 +++++++ 4 files changed, 28 insertions(+) create mode 100644 src/app/[companyId]/dashboard/page.tsx create mode 100644 src/app/[companyId]/login/page.tsx create mode 100644 src/app/[companyId]/settings/page.tsx create mode 100644 src/app/[companyId]/signup/page.tsx diff --git a/src/app/[companyId]/dashboard/page.tsx b/src/app/[companyId]/dashboard/page.tsx new file mode 100644 index 0000000..d4d1955 --- /dev/null +++ b/src/app/[companyId]/dashboard/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function page() { + return
Dashbaord
; +} + +export default page; diff --git a/src/app/[companyId]/login/page.tsx b/src/app/[companyId]/login/page.tsx new file mode 100644 index 0000000..aae4c9a --- /dev/null +++ b/src/app/[companyId]/login/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function page() { + return
Login
; +} + +export default page; diff --git a/src/app/[companyId]/settings/page.tsx b/src/app/[companyId]/settings/page.tsx new file mode 100644 index 0000000..453e0f0 --- /dev/null +++ b/src/app/[companyId]/settings/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function page() { + return
Settings
; +} + +export default page; diff --git a/src/app/[companyId]/signup/page.tsx b/src/app/[companyId]/signup/page.tsx new file mode 100644 index 0000000..66874b2 --- /dev/null +++ b/src/app/[companyId]/signup/page.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function page() { + return
Signup
; +} + +export default page;