homepage
This commit is contained in:
@@ -17,7 +17,6 @@ export default function Home() {
|
||||
<Communicate />
|
||||
<Collaborate />
|
||||
<Build />
|
||||
<Speakers />
|
||||
<Schedule />
|
||||
<Newsletter />
|
||||
</>
|
||||
|
@@ -11,6 +11,7 @@ import {
|
||||
ShieldCheckIcon,
|
||||
FilmIcon,
|
||||
GlobeAltIcon,
|
||||
RocketLaunchIcon,
|
||||
} from '@heroicons/react/20/solid'
|
||||
|
||||
const features = [
|
||||
@@ -50,10 +51,10 @@ import {
|
||||
return (
|
||||
<div className="bg-white lg:py-20 py-24">
|
||||
<div className="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<div className="mx-auto max-w-2xl sm:text-center">
|
||||
<div className="mx-auto max-w-4xl sm:text-center">
|
||||
<h2 className="text-base font-medium font-mono leading-7 text-blue-600">Get Started</h2>
|
||||
<p className="mt-2 lg:text-5xl font-semibold tracking-tight text-blue-700 text-3xl">Build Your Own Verse</p>
|
||||
<p className="mt-6 text-lg leading-8 text-blue-900">
|
||||
<p className="mt-2 font-display text-4xl font-medium tracking-tighter text-blue-600 sm:text-5xl">Build Your Own Verse</p>
|
||||
<p className="mt-6 font-display text-2xl tracking-tight text-blue-900">
|
||||
Create and customize your virtual world with powerful tools and resources that make building and managing your digital space easy and intuitive.
|
||||
</p>
|
||||
</div>
|
||||
@@ -88,6 +89,14 @@ import {
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
<div className="mt-16 flex items-center justify-center gap-x-6">
|
||||
<a
|
||||
href="#"
|
||||
className="rounded-xl bg-blue-700 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
|
||||
>
|
||||
Build Your Own Verse Now <RocketLaunchIcon className="h-4 w-4 inline-block -mt-0.5" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
@@ -26,7 +26,7 @@ export function Header() {
|
||||
<div className="hidden lg:flex lg:items-center lg:gap-8 lg:grow lg:basis-0">
|
||||
<div className="flex gap-8 mx-auto">
|
||||
{navigationItems.map((item) => (
|
||||
<a key={item.name} href={item.href} className="text-blue-600 hover:text-blue-800">
|
||||
<a key={item.name} href={item.href} className="text-blue-700 font-semibold hover:text-blue-900">
|
||||
{item.name}
|
||||
</a>
|
||||
))}
|
||||
|
@@ -27,11 +27,19 @@ export function Homepage() {
|
||||
where you can express yourself freely, build meaningful relationships,
|
||||
and explore endless possibilities in an environment that celebrates diversity and authenticity.</p>
|
||||
</div>
|
||||
<Button href="#" className="mt-2 mb-10 w-30">
|
||||
Join OurVerse
|
||||
</Button>
|
||||
<div className="mt-10 pb-8 flex items-center gap-x-6">
|
||||
<a
|
||||
href="#"
|
||||
className="rounded-xl bg-blue-700 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-blue-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600"
|
||||
>
|
||||
Join OurVerse
|
||||
</a>
|
||||
<a href="#" className="text-sm font-semibold leading-6 text-blue-900 hover:text-blue-700">
|
||||
Learn more <span aria-hidden="true">→</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</Container>
|
||||
</Container>
|
||||
</Gradient>
|
||||
);
|
||||
}
|
||||
|
233
src/components/Schedule copy.jsx
Normal file
233
src/components/Schedule copy.jsx
Normal file
@@ -0,0 +1,233 @@
|
||||
'use client'
|
||||
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react'
|
||||
import clsx from 'clsx'
|
||||
|
||||
import { BackgroundImage } from '@/components/BackgroundImage'
|
||||
import { Container } from '@/components/Container'
|
||||
|
||||
const schedule = [
|
||||
{
|
||||
date: 'Enhancing Education',
|
||||
summary:
|
||||
'Transform traditional education with distant learning opportunities.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Virtual Classrooms',
|
||||
description: 'Create engaging and interactive learning environments where students can collaborate and participate in real-time.',
|
||||
},
|
||||
{
|
||||
name: 'Distance Learning',
|
||||
description: 'Provide accessible education to students around the world with flexible and remote learning solutions.',
|
||||
},
|
||||
{
|
||||
name: 'Professional Training',
|
||||
description: 'Equip professionals with advanced skills through immersive, hands-on training experiences.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
date: 'Supporting Healthcare',
|
||||
summary:
|
||||
' Innovate healthcare by integrating virtual tools for a holistic approach to well-being.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Virtual Health Consultations',
|
||||
description: 'Offer remote medical consultations in secure and accessible virtual environments.',
|
||||
},
|
||||
{
|
||||
name: 'Mental Health Support',
|
||||
description: 'Provide confidential and supportive virtual spaces for mental health counseling and therapy.',
|
||||
},
|
||||
{
|
||||
name: 'Promoting Social Good',
|
||||
description: 'Utilize virtual platforms for fundraising events and community engagement, driving positive change globally.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
date: 'Empowering Africa',
|
||||
summary:
|
||||
'Foster cultural preservation, economic growth, and educational access across Africa.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Cultural Preservation',
|
||||
description: 'Protect and celebrate Africa’s rich cultural heritage through virtual exhibits and experiences.',
|
||||
},
|
||||
{
|
||||
name: 'Economic Development',
|
||||
description: 'Drive economic growth by creating virtual marketplaces and entrepreneurial opportunities.',
|
||||
},
|
||||
{
|
||||
name: 'Educational Access',
|
||||
description: ' Expand educational opportunities by delivering learning resources to underserved communities.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
date: 'Advocate for environmental conservation through virtual eco-tours, green initiatives',
|
||||
summary:
|
||||
'Foster cultural preservation, economic growth, and educational access across Africa.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Cultural Preservation',
|
||||
description: 'Protect and celebrate Africa’s rich cultural heritage through virtual exhibits and experiences.',
|
||||
},
|
||||
{
|
||||
name: 'Economic Development',
|
||||
description: 'Drive economic growth by creating virtual marketplaces and entrepreneurial opportunities.',
|
||||
},
|
||||
{
|
||||
name: 'Educational Access',
|
||||
description: ' Expand educational opportunities by delivering learning resources to underserved communities.',
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
function ScheduleTabbed() {
|
||||
let [tabOrientation, setTabOrientation] = useState('horizontal')
|
||||
|
||||
useEffect(() => {
|
||||
let smMediaQuery = window.matchMedia('(min-width: 640px)')
|
||||
|
||||
function onMediaQueryChange({ matches }) {
|
||||
setTabOrientation(matches ? 'vertical' : 'horizontal')
|
||||
}
|
||||
|
||||
onMediaQueryChange(smMediaQuery)
|
||||
smMediaQuery.addEventListener('change', onMediaQueryChange)
|
||||
|
||||
return () => {
|
||||
smMediaQuery.removeEventListener('change', onMediaQueryChange)
|
||||
}
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<TabGroup
|
||||
className="mx-auto grid max-w-2xl grid-cols-1 gap-y-6 sm:grid-cols-2 lg:hidden"
|
||||
vertical={tabOrientation === 'vertical'}
|
||||
>
|
||||
<TabList className="-mx-4 flex gap-x-4 gap-y-10 overflow-x-auto pb-4 pl-4 sm:mx-0 sm:flex-col sm:pb-0 sm:pl-0 sm:pr-8">
|
||||
{({ selectedIndex }) => (
|
||||
<>
|
||||
{schedule.map((day, dayIndex) => (
|
||||
<div
|
||||
key={day.dateTime}
|
||||
className={clsx(
|
||||
'relative w-3/4 flex-none pr-4 sm:w-auto sm:pr-0',
|
||||
dayIndex !== selectedIndex && 'opacity-70',
|
||||
)}
|
||||
>
|
||||
<DaySummary
|
||||
day={{
|
||||
...day,
|
||||
date: (
|
||||
<Tab className="ui-not-focus-visible:outline-none">
|
||||
<span className="absolute inset-0" />
|
||||
{day.date}
|
||||
</Tab>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</>
|
||||
)}
|
||||
</TabList>
|
||||
<TabPanels>
|
||||
{schedule.map((day) => (
|
||||
<TabPanel
|
||||
key={day.dateTime}
|
||||
className="ui-not-focus-visible:outline-none"
|
||||
>
|
||||
<TimeSlots day={day} />
|
||||
</TabPanel>
|
||||
))}
|
||||
</TabPanels>
|
||||
</TabGroup>
|
||||
)
|
||||
}
|
||||
|
||||
function DaySummary({ day }) {
|
||||
return (
|
||||
<>
|
||||
<h3 className="text-2xl font-semibold tracking-tight text-blue-900 mt-16">
|
||||
<time dateTime={day.dateTime}>{day.date}</time>
|
||||
</h3>
|
||||
<p className="mt-1.5 text-base tracking-tight text-blue-900">
|
||||
{day.summary}
|
||||
</p>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function TimeSlots({ day, className }) {
|
||||
return (
|
||||
<ol
|
||||
role="list"
|
||||
className={clsx(
|
||||
className,
|
||||
'space-y-8 bg-white/60 px-10 py-14 text-center shadow-xl shadow-blue-900/5 backdrop-blur',
|
||||
)}
|
||||
>
|
||||
{day.timeSlots.map((timeSlot, timeSlotIndex) => (
|
||||
<li
|
||||
key={timeSlot.start}
|
||||
aria-label={`${timeSlot.name} talking about ${timeSlot.description} at ${timeSlot.start} - ${timeSlot.end} PST`}
|
||||
>
|
||||
{timeSlotIndex > 0 && (
|
||||
<div className="mx-auto mb-8 h-px w-48 bg-indigo-500/10" />
|
||||
)}
|
||||
<h4 className="text-lg font-semibold tracking-tight text-blue-900">
|
||||
{timeSlot.name}
|
||||
</h4>
|
||||
{timeSlot.description && (
|
||||
<p className="mt-1 tracking-tight text-blue-900">
|
||||
{timeSlot.description}
|
||||
</p>
|
||||
)}
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
)
|
||||
}
|
||||
|
||||
function ScheduleStatic() {
|
||||
return (
|
||||
<div className="hidden lg:grid lg:grid-cols-3 lg:gap-x-8">
|
||||
{schedule.map((day) => (
|
||||
<section key={day.dateTime}>
|
||||
<DaySummary day={day} />
|
||||
<TimeSlots day={day} className="mt-10" />
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function Schedule() {
|
||||
return (
|
||||
<section id="schedule" aria-label="Schedule" className="py-20 sm:py-32">
|
||||
<Container className="relative z-10">
|
||||
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-4xl lg:pr-24">
|
||||
<h2 className="font-display text-4xl font-medium tracking-tighter text-blue-600 sm:text-5xl">
|
||||
Transforming Possibilities Across Industries Digitally
|
||||
</h2>
|
||||
<p className="mt-4 font-display text-2xl tracking-tight text-blue-900">
|
||||
Explore diverse scenarios where our platform empowers users to create, collaborate,
|
||||
and innovate in immersive virtual environments, unlocking new potentials across industries and communities.
|
||||
</p>
|
||||
</div>
|
||||
</Container>
|
||||
<div className="relative mt-14 sm:mt-24">
|
||||
<BackgroundImage position="right" className="-bottom-32 -top-40" />
|
||||
<Container className="relative">
|
||||
<ScheduleTabbed />
|
||||
<ScheduleStatic />
|
||||
</Container>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
@@ -7,311 +7,81 @@ import clsx from 'clsx'
|
||||
import { BackgroundImage } from '@/components/BackgroundImage'
|
||||
import { Container } from '@/components/Container'
|
||||
|
||||
const schedule = [
|
||||
const products = [
|
||||
{
|
||||
date: 'April 4',
|
||||
dateTime: '2022-04-04',
|
||||
summary:
|
||||
'The first day of the conference is focused on dark patterns for ecommerce.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Steven McHail',
|
||||
description: 'Not so one-time payments',
|
||||
start: '9:00AM',
|
||||
end: '10:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Jaquelin Isch',
|
||||
description: 'The finer print',
|
||||
start: '10:00AM',
|
||||
end: '11:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Dianne Guilianelli',
|
||||
description: 'Post-purchase blackmail',
|
||||
start: '11:00AM',
|
||||
end: '12:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Lunch',
|
||||
description: null,
|
||||
start: '12:00PM',
|
||||
end: '1:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Ronni Cantadore',
|
||||
description: 'Buy or die',
|
||||
start: '1:00PM',
|
||||
end: '2:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Erhart Cockrin',
|
||||
description: 'In-person cancellation',
|
||||
start: '2:00PM',
|
||||
end: '3:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Parker Johnson',
|
||||
description: 'The pay/cancel switcheroo',
|
||||
start: '3:00PM',
|
||||
end: '4:00PM',
|
||||
},
|
||||
],
|
||||
id: 1,
|
||||
name: 'Enhancing Education',
|
||||
color: 'Transform traditional education with immersive distance learning opportunities',
|
||||
href: '#',
|
||||
imageSrc: '/images/education.jpg',
|
||||
imageAlt: 'classroom',
|
||||
},
|
||||
{
|
||||
date: 'April 5',
|
||||
dateTime: '2022-04-05',
|
||||
summary:
|
||||
'Next we spend the day talking about deceiving people with technology.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Damaris Kimura',
|
||||
description: 'The invisible card reader',
|
||||
start: '9:00AM',
|
||||
end: '10:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Ibrahim Frasch',
|
||||
description: 'Stealing fingerprints',
|
||||
start: '10:00AM',
|
||||
end: '11:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Cathlene Burrage',
|
||||
description: 'Voting machines',
|
||||
start: '11:00AM',
|
||||
end: '12:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Lunch',
|
||||
description: null,
|
||||
start: '12:00PM',
|
||||
end: '1:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Rinaldo Beynon',
|
||||
description: 'Blackhat SEO that works',
|
||||
start: '1:00PM',
|
||||
end: '2:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Waylon Hyden',
|
||||
description: 'Turning your audience into a botnet',
|
||||
start: '2:00PM',
|
||||
end: '3:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Giordano Sagucio',
|
||||
description: 'Fly phishing',
|
||||
start: '3:00PM',
|
||||
end: '4:00PM',
|
||||
},
|
||||
],
|
||||
id: 2,
|
||||
name: 'Environmental Awareness',
|
||||
color: 'Advocate for environmental conservation through virtual eco-tours & initiatives.',
|
||||
href: '#',
|
||||
imageSrc: '/images/education.jpg',
|
||||
imageAlt: 'classroom',
|
||||
},
|
||||
{
|
||||
date: 'April 6',
|
||||
dateTime: '2022-04-06',
|
||||
summary:
|
||||
'We close out the event previewing new techniques that are still in development.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Andrew Greene',
|
||||
description: 'Neuralink dark patterns',
|
||||
start: '9:00AM',
|
||||
end: '10:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Heather Terry',
|
||||
description: 'DALL-E for passports',
|
||||
start: '10:00AM',
|
||||
end: '11:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Piers Wilkins',
|
||||
description: 'Quantum password cracking',
|
||||
start: '11:00AM',
|
||||
end: '12:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Lunch',
|
||||
description: null,
|
||||
start: '12:00PM',
|
||||
end: '1:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Gordon Sanderson',
|
||||
description: 'SkyNet is coming',
|
||||
start: '1:00PM',
|
||||
end: '2:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Kimberly Parsons',
|
||||
description: 'Dark patterns for the metaverse',
|
||||
start: '2:00PM',
|
||||
end: '3:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Richard Astley',
|
||||
description: 'Knowing the game and playing it',
|
||||
start: '3:00PM',
|
||||
end: '4:00PM',
|
||||
},
|
||||
],
|
||||
id: 3,
|
||||
name: 'Supporting Healthcare',
|
||||
color: 'Innovate healthcare delivery by integrating virtual consultations & tools.',
|
||||
href: '#',
|
||||
imageSrc: '/images/education.jpg',
|
||||
imageAlt: 'classroom',
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
name: 'Empowering Africa',
|
||||
color: 'Foster cultural and economic growth across Africa through virtual solutions.',
|
||||
href: '#',
|
||||
imageSrc: '/images/education.jpg',
|
||||
imageAlt: 'classroom',
|
||||
},
|
||||
]
|
||||
|
||||
function ScheduleTabbed() {
|
||||
let [tabOrientation, setTabOrientation] = useState('horizontal')
|
||||
|
||||
useEffect(() => {
|
||||
let smMediaQuery = window.matchMedia('(min-width: 640px)')
|
||||
|
||||
function onMediaQueryChange({ matches }) {
|
||||
setTabOrientation(matches ? 'vertical' : 'horizontal')
|
||||
}
|
||||
|
||||
onMediaQueryChange(smMediaQuery)
|
||||
smMediaQuery.addEventListener('change', onMediaQueryChange)
|
||||
|
||||
return () => {
|
||||
smMediaQuery.removeEventListener('change', onMediaQueryChange)
|
||||
}
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<TabGroup
|
||||
className="mx-auto grid max-w-2xl grid-cols-1 gap-y-6 sm:grid-cols-2 lg:hidden"
|
||||
vertical={tabOrientation === 'vertical'}
|
||||
>
|
||||
<TabList className="-mx-4 flex gap-x-4 gap-y-10 overflow-x-auto pb-4 pl-4 sm:mx-0 sm:flex-col sm:pb-0 sm:pl-0 sm:pr-8">
|
||||
{({ selectedIndex }) => (
|
||||
<>
|
||||
{schedule.map((day, dayIndex) => (
|
||||
<div
|
||||
key={day.dateTime}
|
||||
className={clsx(
|
||||
'relative w-3/4 flex-none pr-4 sm:w-auto sm:pr-0',
|
||||
dayIndex !== selectedIndex && 'opacity-70',
|
||||
)}
|
||||
>
|
||||
<DaySummary
|
||||
day={{
|
||||
...day,
|
||||
date: (
|
||||
<Tab className="ui-not-focus-visible:outline-none">
|
||||
<span className="absolute inset-0" />
|
||||
{day.date}
|
||||
</Tab>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</>
|
||||
)}
|
||||
</TabList>
|
||||
<TabPanels>
|
||||
{schedule.map((day) => (
|
||||
<TabPanel
|
||||
key={day.dateTime}
|
||||
className="ui-not-focus-visible:outline-none"
|
||||
>
|
||||
<TimeSlots day={day} />
|
||||
</TabPanel>
|
||||
))}
|
||||
</TabPanels>
|
||||
</TabGroup>
|
||||
)
|
||||
}
|
||||
|
||||
function DaySummary({ day }) {
|
||||
return (
|
||||
<>
|
||||
<h3 className="text-2xl font-semibold tracking-tight text-blue-900">
|
||||
<time dateTime={day.dateTime}>{day.date}</time>
|
||||
</h3>
|
||||
<p className="mt-1.5 text-base tracking-tight text-blue-900">
|
||||
{day.summary}
|
||||
</p>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function TimeSlots({ day, className }) {
|
||||
return (
|
||||
<ol
|
||||
role="list"
|
||||
className={clsx(
|
||||
className,
|
||||
'space-y-8 bg-white/60 px-10 py-14 text-center shadow-xl shadow-blue-900/5 backdrop-blur',
|
||||
)}
|
||||
>
|
||||
{day.timeSlots.map((timeSlot, timeSlotIndex) => (
|
||||
<li
|
||||
key={timeSlot.start}
|
||||
aria-label={`${timeSlot.name} talking about ${timeSlot.description} at ${timeSlot.start} - ${timeSlot.end} PST`}
|
||||
>
|
||||
{timeSlotIndex > 0 && (
|
||||
<div className="mx-auto mb-8 h-px w-48 bg-indigo-500/10" />
|
||||
)}
|
||||
<h4 className="text-lg font-semibold tracking-tight text-blue-900">
|
||||
{timeSlot.name}
|
||||
</h4>
|
||||
{timeSlot.description && (
|
||||
<p className="mt-1 tracking-tight text-blue-900">
|
||||
{timeSlot.description}
|
||||
</p>
|
||||
)}
|
||||
<p className="mt-1 font-mono text-sm text-slate-500">
|
||||
<time dateTime={`${day.dateTime}T${timeSlot.start}-08:00`}>
|
||||
{timeSlot.start}
|
||||
</time>{' '}
|
||||
-{' '}
|
||||
<time dateTime={`${day.dateTime}T${timeSlot.end}-08:00`}>
|
||||
{timeSlot.end}
|
||||
</time>{' '}
|
||||
PST
|
||||
</p>
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
)
|
||||
}
|
||||
|
||||
function ScheduleStatic() {
|
||||
return (
|
||||
<div className="hidden lg:grid lg:grid-cols-3 lg:gap-x-8">
|
||||
{schedule.map((day) => (
|
||||
<section key={day.dateTime}>
|
||||
<DaySummary day={day} />
|
||||
<TimeSlots day={day} className="mt-10" />
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function Schedule() {
|
||||
return (
|
||||
<section id="schedule" aria-label="Schedule" className="py-20 sm:py-32">
|
||||
<section id="schedule" aria-label="Schedule" className="py-8 lg:py-24 mb-12">
|
||||
<Container className="relative z-10">
|
||||
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-4xl lg:pr-24">
|
||||
<h2 className="font-display text-4xl font-medium tracking-tighter text-blue-600 sm:text-5xl">
|
||||
Our three day schedule is jam-packed with brilliant, creative, evil
|
||||
geniuses.
|
||||
<h2 className="text-base font-medium font-mono leading-7 text-blue-600">Usecases</h2>
|
||||
<h2 className="mt-2 font-display text-4xl font-medium tracking-tighter text-blue-600 sm:text-5xl">
|
||||
Transforming Possibilities Across Industries Digitally
|
||||
</h2>
|
||||
<p className="mt-4 font-display text-2xl tracking-tight text-blue-900">
|
||||
The worst people in our industry giving the best talks you’ve ever
|
||||
seen. Nothing will be recorded and every attendee has to sign an NDA
|
||||
to watch the talks.
|
||||
Explore diverse scenarios where our platform empowers users to create, collaborate,
|
||||
and innovate in immersive virtual environments, unlocking new potentials across industries and communities.
|
||||
</p>
|
||||
</div>
|
||||
</Container>
|
||||
<div className="relative mt-14 sm:mt-24">
|
||||
<div className="relative lg:mt-14 mt-16">
|
||||
<BackgroundImage position="right" className="-bottom-32 -top-40" />
|
||||
<Container className="relative">
|
||||
<ScheduleTabbed />
|
||||
<ScheduleStatic />
|
||||
<div className="mt-4 grid grid-cols-1 gap-y-12 sm:grid-cols-2 sm:gap-x-6 lg:grid-cols-4 xl:gap-x-8">
|
||||
{products.map((product) => (
|
||||
<div key={product.id}>
|
||||
<div className="relative">
|
||||
<div className="relative h-full w-full overflow-hidden rounded-sm">
|
||||
<img
|
||||
alt={product.imageAlt}
|
||||
src={product.imageSrc}
|
||||
className="h-full w-full object-cover object-center"
|
||||
/>
|
||||
</div>
|
||||
<div className="relative mt-4">
|
||||
<h3 className="lg:text-base text-lg font-medium text-blue-700">{product.name}</h3>
|
||||
<p className="mt-1 mb-2 lg:text-sm text-base text-blue-900">{product.color}</p>
|
||||
<a href={product.href} className="lg:text-xs text-sm font-mono text-blue-700 hover:text-blue-900">
|
||||
Read Usecase <span aria-hidden="true">→</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</Container>
|
||||
</div>
|
||||
</section>
|
||||
|
319
src/components/Schedulecopy.jsx
Normal file
319
src/components/Schedulecopy.jsx
Normal file
@@ -0,0 +1,319 @@
|
||||
'use client'
|
||||
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react'
|
||||
import clsx from 'clsx'
|
||||
|
||||
import { BackgroundImage } from '@/components/BackgroundImage'
|
||||
import { Container } from '@/components/Container'
|
||||
|
||||
const schedule = [
|
||||
{
|
||||
date: 'April 4',
|
||||
dateTime: '2022-04-04',
|
||||
summary:
|
||||
'The first day of the conference is focused on dark patterns for ecommerce.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Steven McHail',
|
||||
description: 'Not so one-time payments',
|
||||
start: '9:00AM',
|
||||
end: '10:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Jaquelin Isch',
|
||||
description: 'The finer print',
|
||||
start: '10:00AM',
|
||||
end: '11:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Dianne Guilianelli',
|
||||
description: 'Post-purchase blackmail',
|
||||
start: '11:00AM',
|
||||
end: '12:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Lunch',
|
||||
description: null,
|
||||
start: '12:00PM',
|
||||
end: '1:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Ronni Cantadore',
|
||||
description: 'Buy or die',
|
||||
start: '1:00PM',
|
||||
end: '2:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Erhart Cockrin',
|
||||
description: 'In-person cancellation',
|
||||
start: '2:00PM',
|
||||
end: '3:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Parker Johnson',
|
||||
description: 'The pay/cancel switcheroo',
|
||||
start: '3:00PM',
|
||||
end: '4:00PM',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
date: 'April 5',
|
||||
dateTime: '2022-04-05',
|
||||
summary:
|
||||
'Next we spend the day talking about deceiving people with technology.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Damaris Kimura',
|
||||
description: 'The invisible card reader',
|
||||
start: '9:00AM',
|
||||
end: '10:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Ibrahim Frasch',
|
||||
description: 'Stealing fingerprints',
|
||||
start: '10:00AM',
|
||||
end: '11:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Cathlene Burrage',
|
||||
description: 'Voting machines',
|
||||
start: '11:00AM',
|
||||
end: '12:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Lunch',
|
||||
description: null,
|
||||
start: '12:00PM',
|
||||
end: '1:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Rinaldo Beynon',
|
||||
description: 'Blackhat SEO that works',
|
||||
start: '1:00PM',
|
||||
end: '2:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Waylon Hyden',
|
||||
description: 'Turning your audience into a botnet',
|
||||
start: '2:00PM',
|
||||
end: '3:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Giordano Sagucio',
|
||||
description: 'Fly phishing',
|
||||
start: '3:00PM',
|
||||
end: '4:00PM',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
date: 'April 6',
|
||||
dateTime: '2022-04-06',
|
||||
summary:
|
||||
'We close out the event previewing new techniques that are still in development.',
|
||||
timeSlots: [
|
||||
{
|
||||
name: 'Andrew Greene',
|
||||
description: 'Neuralink dark patterns',
|
||||
start: '9:00AM',
|
||||
end: '10:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Heather Terry',
|
||||
description: 'DALL-E for passports',
|
||||
start: '10:00AM',
|
||||
end: '11:00AM',
|
||||
},
|
||||
{
|
||||
name: 'Piers Wilkins',
|
||||
description: 'Quantum password cracking',
|
||||
start: '11:00AM',
|
||||
end: '12:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Lunch',
|
||||
description: null,
|
||||
start: '12:00PM',
|
||||
end: '1:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Gordon Sanderson',
|
||||
description: 'SkyNet is coming',
|
||||
start: '1:00PM',
|
||||
end: '2:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Kimberly Parsons',
|
||||
description: 'Dark patterns for the metaverse',
|
||||
start: '2:00PM',
|
||||
end: '3:00PM',
|
||||
},
|
||||
{
|
||||
name: 'Richard Astley',
|
||||
description: 'Knowing the game and playing it',
|
||||
start: '3:00PM',
|
||||
end: '4:00PM',
|
||||
},
|
||||
],
|
||||
},
|
||||
]
|
||||
|
||||
function ScheduleTabbed() {
|
||||
let [tabOrientation, setTabOrientation] = useState('horizontal')
|
||||
|
||||
useEffect(() => {
|
||||
let smMediaQuery = window.matchMedia('(min-width: 640px)')
|
||||
|
||||
function onMediaQueryChange({ matches }) {
|
||||
setTabOrientation(matches ? 'vertical' : 'horizontal')
|
||||
}
|
||||
|
||||
onMediaQueryChange(smMediaQuery)
|
||||
smMediaQuery.addEventListener('change', onMediaQueryChange)
|
||||
|
||||
return () => {
|
||||
smMediaQuery.removeEventListener('change', onMediaQueryChange)
|
||||
}
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<TabGroup
|
||||
className="mx-auto grid max-w-2xl grid-cols-1 gap-y-6 sm:grid-cols-2 lg:hidden"
|
||||
vertical={tabOrientation === 'vertical'}
|
||||
>
|
||||
<TabList className="-mx-4 flex gap-x-4 gap-y-10 overflow-x-auto pb-4 pl-4 sm:mx-0 sm:flex-col sm:pb-0 sm:pl-0 sm:pr-8">
|
||||
{({ selectedIndex }) => (
|
||||
<>
|
||||
{schedule.map((day, dayIndex) => (
|
||||
<div
|
||||
key={day.dateTime}
|
||||
className={clsx(
|
||||
'relative w-3/4 flex-none pr-4 sm:w-auto sm:pr-0',
|
||||
dayIndex !== selectedIndex && 'opacity-70',
|
||||
)}
|
||||
>
|
||||
<DaySummary
|
||||
day={{
|
||||
...day,
|
||||
date: (
|
||||
<Tab className="ui-not-focus-visible:outline-none">
|
||||
<span className="absolute inset-0" />
|
||||
{day.date}
|
||||
</Tab>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</>
|
||||
)}
|
||||
</TabList>
|
||||
<TabPanels>
|
||||
{schedule.map((day) => (
|
||||
<TabPanel
|
||||
key={day.dateTime}
|
||||
className="ui-not-focus-visible:outline-none"
|
||||
>
|
||||
<TimeSlots day={day} />
|
||||
</TabPanel>
|
||||
))}
|
||||
</TabPanels>
|
||||
</TabGroup>
|
||||
)
|
||||
}
|
||||
|
||||
function DaySummary({ day }) {
|
||||
return (
|
||||
<>
|
||||
<h3 className="text-2xl font-semibold tracking-tight text-blue-900">
|
||||
<time dateTime={day.dateTime}>{day.date}</time>
|
||||
</h3>
|
||||
<p className="mt-1.5 text-base tracking-tight text-blue-900">
|
||||
{day.summary}
|
||||
</p>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function TimeSlots({ day, className }) {
|
||||
return (
|
||||
<ol
|
||||
role="list"
|
||||
className={clsx(
|
||||
className,
|
||||
'space-y-8 bg-white/60 px-10 py-14 text-center shadow-xl shadow-blue-900/5 backdrop-blur',
|
||||
)}
|
||||
>
|
||||
{day.timeSlots.map((timeSlot, timeSlotIndex) => (
|
||||
<li
|
||||
key={timeSlot.start}
|
||||
aria-label={`${timeSlot.name} talking about ${timeSlot.description} at ${timeSlot.start} - ${timeSlot.end} PST`}
|
||||
>
|
||||
{timeSlotIndex > 0 && (
|
||||
<div className="mx-auto mb-8 h-px w-48 bg-indigo-500/10" />
|
||||
)}
|
||||
<h4 className="text-lg font-semibold tracking-tight text-blue-900">
|
||||
{timeSlot.name}
|
||||
</h4>
|
||||
{timeSlot.description && (
|
||||
<p className="mt-1 tracking-tight text-blue-900">
|
||||
{timeSlot.description}
|
||||
</p>
|
||||
)}
|
||||
<p className="mt-1 font-mono text-sm text-slate-500">
|
||||
<time dateTime={`${day.dateTime}T${timeSlot.start}-08:00`}>
|
||||
{timeSlot.start}
|
||||
</time>{' '}
|
||||
-{' '}
|
||||
<time dateTime={`${day.dateTime}T${timeSlot.end}-08:00`}>
|
||||
{timeSlot.end}
|
||||
</time>{' '}
|
||||
PST
|
||||
</p>
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
)
|
||||
}
|
||||
|
||||
function ScheduleStatic() {
|
||||
return (
|
||||
<div className="hidden lg:grid lg:grid-cols-3 lg:gap-x-8">
|
||||
{schedule.map((day) => (
|
||||
<section key={day.dateTime}>
|
||||
<DaySummary day={day} />
|
||||
<TimeSlots day={day} className="mt-10" />
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export function Schedule() {
|
||||
return (
|
||||
<section id="schedule" aria-label="Schedule" className="py-20 sm:py-32">
|
||||
<Container className="relative z-10">
|
||||
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-4xl lg:pr-24">
|
||||
<h2 className="font-display text-4xl font-medium tracking-tighter text-blue-600 sm:text-5xl">
|
||||
Our three day schedule is jam-packed with brilliant, creative, evil
|
||||
geniuses.
|
||||
</h2>
|
||||
<p className="mt-4 font-display text-2xl tracking-tight text-blue-900">
|
||||
The worst people in our industry giving the best talks you’ve ever
|
||||
seen. Nothing will be recorded and every attendee has to sign an NDA
|
||||
to watch the talks.
|
||||
</p>
|
||||
</div>
|
||||
</Container>
|
||||
<div className="relative mt-14 sm:mt-24">
|
||||
<BackgroundImage position="right" className="-bottom-32 -top-40" />
|
||||
<Container className="relative">
|
||||
<ScheduleTabbed />
|
||||
<ScheduleStatic />
|
||||
</Container>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user