Merge branch 'main' of https://github.com/Irev-Dev/cadhub into profile-page

This commit is contained in:
Frank Johnson
2021-09-12 12:41:27 -04:00
17 changed files with 6730 additions and 34912 deletions

View File

@@ -47,7 +47,7 @@ yarn rw dev
Your browser should open automatically to `http://localhost:8910` to see the web app. Lambda functions run on `http://localhost:8911` and are also proxied to `http://localhost:8910/.redwood/functions/*`. Your browser should open automatically to `http://localhost:8910` to see the web app. Lambda functions run on `http://localhost:8911` and are also proxied to `http://localhost:8910/.redwood/functions/*`.
If you want to access the websight on your phone use `yarn redwood dev --fwd="--host <ip-address-on-your-network-i.e.-192.168.0.5">"` If you want to access the websight on your phone use `yarn redwood dev --fwd="--host <ip-address-on-your-network-i.e.-192.168.0.5>"`
you can sign in to the following accounts locally you can sign in to the following accounts locally

View File

@@ -0,0 +1,2 @@
-- AlterEnum
ALTER TYPE "CadPackage" ADD VALUE 'jscad';

View File

@@ -14,10 +14,6 @@ generator client {
// ADMIN // ADMIN
// } // }
// enum ProjectType {
// JSCAD
// }
model User { model User {
id String @id @default(uuid()) id String @id @default(uuid())
userName String @unique // reffered to as userId in @relations userName String @unique // reffered to as userId in @relations
@@ -41,7 +37,7 @@ model User {
enum CadPackage { enum CadPackage {
openscad openscad
cadquery cadquery
// jscad // TODO #422, add jscad to db schema when were ready to enable saving of jscad projects jscad // TODO #422, add jscad to db schema when were ready to enable saving of jscad projects
} }
model Project { model Project {

View File

@@ -19,6 +19,7 @@ export const schema = gql`
enum CadPackage { enum CadPackage {
openscad openscad
cadquery cadquery
jscad
} }
type Query { type Query {

View File

@@ -43,6 +43,7 @@
"react-helmet": "^6.1.0", "react-helmet": "^6.1.0",
"react-hotkeys-hook": "^3.4.0", "react-hotkeys-hook": "^3.4.0",
"react-image-crop": "^8.6.6", "react-image-crop": "^8.6.6",
"react-intersection-observer": "^8.32.1",
"react-mosaic-component": "^5.0.0", "react-mosaic-component": "^5.0.0",
"react-tabs": "^3.2.2", "react-tabs": "^3.2.2",
"rich-markdown-editor": "^11.0.2", "rich-markdown-editor": "^11.0.2",

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@@ -4,8 +4,8 @@ import GoTrue from 'gotrue-js'
import { FatalErrorBoundary, RedwoodProvider } from '@redwoodjs/web' import { FatalErrorBoundary, RedwoodProvider } from '@redwoodjs/web'
import { RedwoodApolloProvider } from '@redwoodjs/web/apollo' import { RedwoodApolloProvider } from '@redwoodjs/web/apollo'
import FatalErrorPage from 'src/pages/FatalErrorPage' import FatalErrorPage from 'src/pages/FatalErrorPage'
import { createMuiTheme } from '@material-ui/core/styles'; import { createMuiTheme } from '@material-ui/core/styles'
import { ThemeProvider } from '@material-ui/styles'; import { ThemeProvider } from '@material-ui/styles'
import ReactGA from 'react-ga' import ReactGA from 'react-ga'
ReactGA.initialize(process.env.GOOGLE_ANALYTICS_ID) ReactGA.initialize(process.env.GOOGLE_ANALYTICS_ID)
@@ -28,7 +28,7 @@ const theme = createMuiTheme({
light: '#C99DFF', light: '#C99DFF',
main: '#A663FA', main: '#A663FA',
dark: '#3B0480', dark: '#3B0480',
} },
}, },
}) })

View File

@@ -4,23 +4,16 @@ import { useLoader, useThree, useFrame } from '@react-three/fiber'
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader' import { STLLoader } from 'three/examples/jsm/loaders/STLLoader'
import { useEdgeSplit } from 'src/helpers/hooks/useEdgeSplit' import { useEdgeSplit } from 'src/helpers/hooks/useEdgeSplit'
import texture from 'src/components/IdeViewer/dullFrontLitMetal.png' import texture from 'src/components/IdeViewer/dullFrontLitMetal.png'
import { import { useTexture, MeshDistortMaterial, Sphere } from '@react-three/drei'
useTexture,
Environment,
MeshDistortMaterial,
Sphere,
} from '@react-three/drei'
const thresholdAngle = 10 const thresholdAngle = 10
export default function AssetWithGooey({ export default function AssetWithGooey({
assetUrl, assetUrl,
offset, offset,
preset,
scale, scale,
}: { }: {
assetUrl: string assetUrl: string
offset: number[] offset: number[]
preset?: string
scale: number scale: number
}) { }) {
const geo = useLoader(STLLoader, assetUrl) const geo = useLoader(STLLoader, assetUrl)
@@ -32,27 +25,31 @@ export default function AssetWithGooey({
const position = [offset[0], offset[1], 5] const position = [offset[0], offset[1], 5]
const scaleArr = Array.from({ length: 3 }).map(() => scale) const scaleArr = Array.from({ length: 3 }).map(() => scale)
const { mouse } = useThree() const { mouse } = useThree()
const [rEuler, rQuaternion] = useMemo(
() => [new THREE.Euler(), new THREE.Quaternion()],
[]
)
useFrame((state, delta) => { useFrame((state, delta) => {
if (edgeRef.current) { if (edgeRef.current) {
edgeRef.current.rotation.y += 0.01 edgeRef.current.rotation.y += 0.01
}
coffeeRef.current.rotation.x = (-mouse.y * Math.PI) / 6 if (coffeeRef.current) {
coffeeRef.current.rotation.y = (mouse.x * Math.PI) / 6 rEuler.set((-mouse.y * Math.PI) / 4, (mouse.x * Math.PI) / 2, 0)
coffeeRef.current.quaternion.slerp(rQuaternion.setFromEuler(rEuler), 0.1)
} }
}) })
return ( return (
<group dispose={null} ref={edgeRef} position={position}> <group dispose={null} ref={edgeRef} position={position}>
<group ref={coffeeRef}> <group ref={coffeeRef}>
<Environment preset={preset || 'warehouse'} />
<mesh ref={mesh} scale={scaleArr} geometry={geo}> <mesh ref={mesh} scale={scaleArr} geometry={geo}>
<meshPhysicalMaterial <meshPhysicalMaterial
envMapIntensity={2} envMapIntensity={2}
color="#F472B6" color="#F472B6"
map={colorMap} map={colorMap}
clearcoat={0.2} clearcoat={0.5}
clearcoatRoughness={0.01} clearcoatRoughness={0.01}
roughness={1} roughness={0}
metalness={0.9} metalness={0.7}
smoothShading smoothShading
/> />
</mesh> </mesh>
@@ -60,12 +57,7 @@ export default function AssetWithGooey({
<lineBasicMaterial color="#aaaaff" /> <lineBasicMaterial color="#aaaaff" />
</lineSegments> </lineSegments>
</group> </group>
<pointLight <ambientLight intensity={2} />
position={[-1000, -1000, 1000]}
color="#5555FF"
intensity={1}
/>
<ambientLight intensity={0.3} />
<Gooey /> <Gooey />
</group> </group>
) )
@@ -77,7 +69,7 @@ function randomSign(num: number): number {
function Gooey() { function Gooey() {
const blobsData = useMemo(() => { const blobsData = useMemo(() => {
const firstSet = Array.from({ length: 10 }).map((_, index) => { const firstSet = Array.from({ length: 5 }).map((_, index) => {
const dist = Math.random() * 3 + 2.5 const dist = Math.random() * 3 + 2.5
const x = randomSign(Math.random() * dist) const x = randomSign(Math.random() * dist)
const y = randomSign(Math.sqrt(dist * dist - x * x)) const y = randomSign(Math.sqrt(dist * dist - x * x))
@@ -88,7 +80,7 @@ function Gooey() {
const speed = (Math.random() * 0.8) / size / size + 0.1 const speed = (Math.random() * 0.8) / size / size + 0.1
return { position, size, distort, speed } return { position, size, distort, speed }
}) })
const secondSet = Array.from({ length: 10 }).map((_, index) => { const secondSet = Array.from({ length: 5 }).map((_, index) => {
const dist = Math.random() * 3 + 1.5 const dist = Math.random() * 3 + 1.5
const x = randomSign(Math.random() * dist) const x = randomSign(Math.random() * dist)
const y = randomSign(Math.sqrt(dist * dist - x * x)) const y = randomSign(Math.sqrt(dist * dist - x * x))
@@ -106,11 +98,11 @@ function Gooey() {
{blobsData.map(({ position, size, distort, speed }, index) => ( {blobsData.map(({ position, size, distort, speed }, index) => (
<Sphere key={index} visible position={position} args={[size, 16, 200]}> <Sphere key={index} visible position={position} args={[size, 16, 200]}>
<MeshDistortMaterial <MeshDistortMaterial
color="#5098F1" color="#173E6F"
attach="material" attach="material"
distort={distort} // Strength, 0 disables the effect (default=1) distort={distort} // Strength, 0 disables the effect (default=1)
speed={speed} // Speed (default=1) speed={speed} // Speed (default=1)
roughness={0} roughness={0.2}
opacity={0.6} opacity={0.6}
transparent transparent
/> />

View File

@@ -1,10 +1,11 @@
import { Canvas, useLoader, useFrame } from '@react-three/fiber' import { Canvas, useLoader, useFrame } from '@react-three/fiber'
import { Suspense } from 'react' import { Suspense } from 'react'
import { Html } from '@react-three/drei' import { Html, Stats } from '@react-three/drei'
import CadPackage, { import CadPackage, {
CadPackageType, CadPackageType,
} from 'src/components/CadPackage/CadPackage' } from 'src/components/CadPackage/CadPackage'
import { navigate, routes } from '@redwoodjs/router' import { navigate, routes, Link } from '@redwoodjs/router'
import { useInView } from 'react-intersection-observer'
import Svg, { SvgNames } from 'src/components/Svg/Svg' import Svg, { SvgNames } from 'src/components/Svg/Svg'
import Gravatar from 'src/components/Gravatar/Gravatar' import Gravatar from 'src/components/Gravatar/Gravatar'
@@ -45,25 +46,32 @@ export const Hero = () => {
<ModelSection assetUrl="/coffee-lid.stl" offset={heroOffset} scale={0.06}> <ModelSection assetUrl="/coffee-lid.stl" offset={heroOffset} scale={0.06}>
<div className="grid lg:grid-cols-2 py-32"> <div className="grid lg:grid-cols-2 py-32">
<div className="flex items-end justify-center row-start-2 lg:row-start-1 pt-96 lg:pt-0 pr-12 pl-6"> <div className="flex items-end justify-center row-start-2 lg:row-start-1 pt-96 lg:pt-0 pr-12 pl-6">
<div className="grid grid-flow-col gap-4 items-center bg-ch-gray-760 bg-opacity-95 text-ch-gray-300 rounded-md p-2 font-fira-sans relative z-10 shadow-ch"> <Link
<div className="pl-4"> to={routes.project({
<Gravatar userName: 'irevdev',
image="CadHub/xvrnxvarkv8tdzo4n65u" projectTitle: 'coffee-lid',
className="w-12 h-12 mr-4" })}
size={60} >
/> <div className="grid grid-flow-col gap-2 sm:gap-4 items-center bg-ch-gray-760 bg-opacity-95 text-ch-gray-300 rounded-md p-2 font-fira-sans relative z-10 shadow-ch">
<div className="pl-1 sm:pl-4">
<Gravatar
image="CadHub/xvrnxvarkv8tdzo4n65u"
className="w-12 h-12 mr-4"
size={60}
/>
</div>
<div>
<div className="text-xl sm:text-3xl">Coffee Lid</div>
<div>IrevDev</div>
</div>
<div className="flex self-start">
<CadPackage
cadPackage="cadquery"
className="px-3 py-1 sm:text-xl rounded transform translate-x-4 sm:translate-x-10"
/>
</div>
</div> </div>
<div> </Link>
<div className="text-3xl">Coffee Lid</div>
<div>IrevDev</div>
</div>
<div className="flex self-start">
<CadPackage
cadPackage="cadquery"
className="px-3 py-1 text-xl rounded transform translate-x-10"
/>
</div>
</div>
</div> </div>
<div className="col-start-1 lg:col-start-2 px-4"> <div className="col-start-1 lg:col-start-2 px-4">
@@ -100,12 +108,7 @@ export const Hero = () => {
</ModelSection> </ModelSection>
<ChooseYourCharacter /> <ChooseYourCharacter />
<Community /> <Community />
<ModelSection <ModelSection assetUrl="/hinge.stl" offset={tutOffset} scale={0.12}>
assetUrl="/hinge.stl"
offset={tutOffset}
scale={0.12}
preset="lobby"
>
<div className="max-w-7xl mx-auto grid py-16 overflow-hidden"> <div className="max-w-7xl mx-auto grid py-16 overflow-hidden">
<div className="py-0 pb-32 lg:py-32 ml-4 col-start-1 lg:col-start-1 pr-12 pl-6"> <div className="py-0 pb-32 lg:py-32 ml-4 col-start-1 lg:col-start-1 pr-12 pl-6">
<div className="text-4xl mb-6 text-ch-gray-300">Learn Code-CAD</div> <div className="text-4xl mb-6 text-ch-gray-300">Learn Code-CAD</div>
@@ -126,25 +129,34 @@ export const Hero = () => {
</div> </div>
<div className="flex items-end justify-center row-start-2 lg:row-start-1 lg:col-start-2 pt-96 lg:pt-0 lg:pr-10"> <div className="flex items-end justify-center row-start-2 lg:row-start-1 lg:col-start-2 pt-96 lg:pt-0 lg:pr-10">
<div className="grid grid-flow-col gap-2 items-center bg-ch-gray-760 bg-opacity-95 text-ch-gray-300 rounded-md p-2 font-fira-sans relative z-10 shadow-ch"> <Link
<div className="pl-4"> to={routes.project({
<Gravatar userName: 'irevdev',
image="CadHub/xvrnxvarkv8tdzo4n65u" projectTitle: 'tutorial-hinge',
className="w-12 h-12 mr-4" })}
size={60} >
/> <div className="grid grid-flow-col sm:gap-2 items-center bg-ch-gray-760 bg-opacity-95 text-ch-gray-300 rounded-md py-2 pl-2 font-fira-sans relative z-10 shadow-ch">
<div className="pl-1 sm:pl-4">
<Gravatar
image="CadHub/xvrnxvarkv8tdzo4n65u"
className="w-12 h-12 mr-4"
size={60}
/>
</div>
<div>
<div className="text-lg sm:text-2xl w-28 sm:w-auto">
Print in Place Hinge
</div>
<div>IrevDev</div>
</div>
<div className="flex self-start">
<CadPackage
cadPackage="openscad"
className="px-3 py-1 sm:text-xl rounded transform translate-x-4 sm:translate-x-10"
/>
</div>
</div> </div>
<div> </Link>
<div className="text-2xl">Print in Place Hinge</div>
<div>IrevDev</div>
</div>
<div className="flex self-start">
<CadPackage
cadPackage="openscad"
className="px-3 py-1 text-xl rounded transform translate-x-10"
/>
</div>
</div>
</div> </div>
</div> </div>
</ModelSection> </ModelSection>
@@ -155,39 +167,47 @@ export const Hero = () => {
) )
} }
const DisableRender = () => useFrame(() => null, 1000)
function ModelSection({ function ModelSection({
assetUrl, assetUrl,
offset, offset,
children, children,
preset,
scale, scale,
}: { }: {
assetUrl: string assetUrl: string
offset: number[] offset: number[]
children: React.ReactNode children: React.ReactNode
preset?: string
scale: number scale: number
}) { }) {
const { ref, inView } = useInView()
return ( return (
<div className="relative"> <div className="relative">
{children} {children}
<div className="absolute inset-0"> <div className="absolute inset-0" ref={ref}>
<Canvas <Canvas
linear linear
dpr={[1, 2]} dpr={[1, 2]}
orthographic orthographic
camera={{ zoom: 75, position: [0, 0, 500] }} camera={{ zoom: 75, position: [0, 0, 500] }}
> >
{!inView && <DisableRender />}
<pointLight position={[2, 3, 5]} color="#FFFFFF" intensity={2} />
<pointLight position={[2, 3, -5]} color="#FFFFFF" intensity={2} />
<pointLight position={[-6, 3, -5]} color="#FFFFFF" intensity={2} />
<pointLight position={[-6, 3, 5]} color="#FFFFFF" intensity={2} />
<pointLight position={[2, 1.5, 0]} color="#0000FF" intensity={2} />
<pointLight position={[2, 1.5, 0]} color="#FF0000" intensity={2} />
<Suspense <Suspense
fallback={<Html center className="loading" children="Loading..." />} fallback={<Html center className="loading" children="Loading..." />}
> >
<Coffee <Coffee assetUrl={assetUrl} offset={offset} scale={scale} />
assetUrl={assetUrl}
offset={offset}
preset={preset}
scale={scale}
/>
</Suspense> </Suspense>
{/* uncomment for framerate and render time */}
{/* <Stats showPanel={0} className="three-debug-panel-1" /> */}
{/* <Stats showPanel={1} className="three-debug-panel-2" /> */}
</Canvas> </Canvas>
</div> </div>
</div> </div>
@@ -229,7 +249,7 @@ function ChooseYourCharacter() {
desc: string desc: string
}) => ( }) => (
<li key={cadPackage} className="flex items-center"> <li key={cadPackage} className="flex items-center">
<div className="mr-12"> <div className="mr-4 sm:mr-12">
<button <button
onClick={() => navigate(routes.draftProject({ cadPackage }))} onClick={() => navigate(routes.draftProject({ cadPackage }))}
className="flex-shrink-0 cursor-pointer" className="flex-shrink-0 cursor-pointer"
@@ -464,9 +484,12 @@ function Footer() {
</p> </p>
</div> </div>
<div className="grid grid-cols-4 gap-4 flex-grow pl-20 row-start-2 lg:col-start-2 lg:row-start-1 mt-20 lg:mt-0"> <div className="grid sm:grid-cols-4 gap-4 flex-grow pl-20 row-start-2 lg:col-start-2 lg:row-start-1 mt-20 lg:mt-0">
{section.map(({ header, links }) => ( {section.map(({ header, links }) => (
<ul className="text-ch-gray-300 font-fira-sans" key={header}> <ul
className="text-ch-gray-300 font-fira-sans pt-8 sm:pt-0"
key={header}
>
<li className="text-xl font-bold">{header}</li> <li className="text-xl font-bold">{header}</li>
{links.map(({ name, url }) => ( {links.map(({ name, url }) => (
<li className="text-lg mt-6 font-light" key={url}> <li className="text-lg mt-6 font-light" key={url}>

View File

@@ -63,7 +63,8 @@ const LoginModal = ({ open, onClose, shouldStartWithSignup = false }) => {
style: { style: {
backgroundColor: 'transparent', backgroundColor: 'transparent',
}, },
}}> }}
>
<div className="bg-ch-gray-700 max-w-2xl rounded-lg shadow-lg text-ch-gray-300"> <div className="bg-ch-gray-700 max-w-2xl rounded-lg shadow-lg text-ch-gray-300">
<Tabs <Tabs
value={tab} value={tab}
@@ -190,7 +191,10 @@ const SignUpForm = ({ onSubmitSignUp, checkBox, setCheckBox, onClose }) => (
checked={checkBox} checked={checkBox}
onChange={() => setCheckBox(!checkBox)} onChange={() => setCheckBox(!checkBox)}
/>{' '} />{' '}
<label htmlFor="signup-toc" className="text-ch-gray-400 text-sm mt-4 cursor-pointer"> <label
htmlFor="signup-toc"
className="text-ch-gray-400 text-sm mt-4 cursor-pointer"
>
Stay up-to-date with CadHub's progress with the founder's ( Stay up-to-date with CadHub's progress with the founder's (
<OutBound className="underline" to="https://twitter.com/IrevDev"> <OutBound className="underline" to="https://twitter.com/IrevDev">
Kurt's Kurt's

View File

@@ -1,9 +1,7 @@
import { Link, routes } from '@redwoodjs/router' import { Link, routes } from '@redwoodjs/router'
import Svg from 'src/components/Svg/Svg' import Svg from 'src/components/Svg/Svg'
import { Popover } from '@headlessui/react' import { Popover } from '@headlessui/react'
import CadPackage, { import { CadPackageType } from 'src/components/CadPackage/CadPackage'
CadPackageType,
} from 'src/components/CadPackage/CadPackage'
const menuOptions: { const menuOptions: {
name: string name: string
@@ -24,9 +22,15 @@ const menuOptions: {
sub: 'beta', sub: 'beta',
bgClasses: 'bg-ch-blue-700', bgClasses: 'bg-ch-blue-700',
dotClasses: 'bg-blue-800', dotClasses: 'bg-blue-800',
ideType: 'cadquery' ideType: 'cadquery',
},
{
name: 'JSCAD',
sub: 'beta',
bgClasses: 'bg-ch-purple-500',
dotClasses: 'bg-yellow-300',
ideType: 'jscad',
}, },
// { name: 'JSCAD', sub: 'alpha', ideType: 'jscad' }, // TODO #422, add jscad to db schema when were ready to enable saving of jscad projects
] ]
const NavPlusButton: React.FC = () => { const NavPlusButton: React.FC = () => {
@@ -43,7 +47,10 @@ const NavPlusButton: React.FC = () => {
{menuOptions.map(({ name, sub, ideType, bgClasses, dotClasses }) => ( {menuOptions.map(({ name, sub, ideType, bgClasses, dotClasses }) => (
<li <li
key={name} key={name}
className={bgClasses+" px-4 py-1 my-4 bg-opacity-30 hover:bg-opacity-70 grid grid-flow-col-dense items-center gap-2"} className={
bgClasses +
' px-4 py-1 my-4 bg-opacity-30 hover:bg-opacity-70 grid grid-flow-col-dense items-center gap-2'
}
> >
<div className={dotClasses + " justify-self-center w-5 h-5 rounded-full"}></div> <div className={dotClasses + " justify-self-center w-5 h-5 rounded-full"}></div>
<Link to={routes.draftProject({ cadPackage: ideType })}> <Link to={routes.draftProject({ cadPackage: ideType })}>

View File

@@ -32,6 +32,15 @@
} }
} }
.three-debug-panel-1 {
position: fixed;
padding-top: 300px;
}
.three-debug-panel-2 {
position: fixed;
padding-top: 300px;
padding-left: 100px;
}
.markdown-overrides h4 { .markdown-overrides h4 {
@apply text-lg font-bold; @apply text-lg font-bold;

View File

@@ -93,7 +93,7 @@ const MainLayout = ({ children, shouldRemoveFooterInIde }) => {
return ( return (
<div className="min-h-screen flex flex-col ch-scrollbar"> <div className="min-h-screen flex flex-col ch-scrollbar">
<header id="cadhub-main-header"> <header id="cadhub-main-header">
<nav className="flex justify-between h-16 px-4 bg-ch-gray-900"> <nav className="flex justify-between h-16 sm:px-4 bg-ch-gray-900">
<ul className="flex items-center"> <ul className="flex items-center">
<li> <li>
<Link to={routes.home()}> <Link to={routes.home()}>
@@ -125,7 +125,7 @@ const MainLayout = ({ children, shouldRemoveFooterInIde }) => {
<ul className="flex items-center"> <ul className="flex items-center">
<li <li
className={getActiveClasses( className={getActiveClasses(
'mr-4 md:mr-8 h-8 w-8 md:h-10 md:w-10 flex items-center justify-center' 'mr-1 sm:mr-4 md:mr-8 h-8 w-8 md:h-10 md:w-10 flex items-center justify-center'
)} )}
> >
<NavPlusButton /> <NavPlusButton />
@@ -169,7 +169,7 @@ const MainLayout = ({ children, shouldRemoveFooterInIde }) => {
<li> <li>
<a <a
href="#" href="#"
className="text-ch-gray-300 mr-2 px-4 py-2 border-2 border-ch-gray-400 rounded-full hover:bg-ch-gray-600" className="text-ch-gray-300 mr-1 sm:mr-2 px-2 sm:px-4 py-2 border-2 border-ch-gray-400 rounded-full hover:bg-ch-gray-600"
onClick={recordedLogin} onClick={recordedLogin}
> >
Sign In/Up Sign In/Up

View File

@@ -9,6 +9,7 @@ const ProjectsPage = () => {
title="Home page" title="Home page"
description="Learn about Code CAD and the CadHub community" description="Learn about Code CAD and the CadHub community"
lang="en-US" lang="en-US"
socialImageUrl="https://cadhub.xyz/default-social-image.jpg"
/> />
<Hero /> <Hero />
</MainLayout> </MainLayout>

View File

@@ -8,6 +8,7 @@ const ProjectsPage = () => {
<Seo <Seo
title="Projects page" title="Projects page"
description="Cadhub Projects page" description="Cadhub Projects page"
socialImageUrl="https://cadhub.xyz/default-social-image.jpg"
lang="en-US" lang="en-US"
/> />
<div className="bg-ch-gray-800 pb-64"> <div className="bg-ch-gray-800 pb-64">

View File

@@ -15639,6 +15639,11 @@ react-image-crop@^8.6.6:
clsx "^1.1.1" clsx "^1.1.1"
prop-types "^15.7.2" prop-types "^15.7.2"
react-intersection-observer@^8.32.1:
version "8.32.1"
resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-8.32.1.tgz#9b949871eb35eb1fc730732bbf8fcfaaaf3f5b02"
integrity sha512-FOmMkMw7MeJ8FkuADpU8TRcvGuTvPB+DRkaikS1QXcWArYLCWC3mjRorq2XeRGBuqmaueOBd27PUazTu9AgInw==
react-is@^16.7.0, react-is@^16.8.1: react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1" version "16.13.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"