-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+ {supabase && (
+
+
+
+ )}
+
+
+
+
+ {users &&
}
- {users && }
-
-
-
+
+
+
>
)
}
@@ -141,10 +187,8 @@ export default function TicketHome({ users }: Props) {
export const getServerSideProps: GetServerSideProps = async ({ req, res }) => {
// fetch users for the TicketBrickWall
const { data: users } = await supabaseAdmin!
- .from('lw7_tickets_golden')
- .select('*')
- .order('createdAt', { ascending: false })
- .limit(17)
+ .from('lw8_tickets_golden')
+ .select('username, golden', { count: 'exact' })
return {
props: {
diff --git a/apps/www/pages/launch-week/launchWeek.css b/apps/www/pages/launch-week/launchWeek.css
index bfd8b1b9187..d07b25683f7 100644
--- a/apps/www/pages/launch-week/launchWeek.css
+++ b/apps/www/pages/launch-week/launchWeek.css
@@ -1,5 +1,4 @@
.bg-lw7 {
- /* background: radial-gradient(72.03% 66.03% at 50% 69.72%, #3fcf8e 0%, #9e44ef 100%); */
background: #9e44ef;
}
@@ -8,23 +7,13 @@
}
.bg-lw7-gradient {
- /* background: radial-gradient(72.03% 66.03% at 50% 69.72%, #3fcf8e 0%, transparent 100%); */
background: radial-gradient(80% 65% at 50% 95%, #dbb8bf 0%, transparent 100%);
}
-/* .bg-lw7-gradient.gold {
- background: radial-gradient(80% 65% at 50% 95%, #ffd132 0%, transparent 100%);
-} */
-
@media (min-width: 768px) {
.bg-lw7-gradient {
- /* background: radial-gradient(72.03% 66.03% at 50% 69.72%, #3fcf8e 0%, transparent 100%); */
background: radial-gradient(72.03% 66.03% at 50% 69.72%, #dbb8bf 0%, transparent 100%);
}
-
- /* .bg-lw7-gradient.gold {
- background: radial-gradient(72.03% 70% at 50% 75%, #ffd132 0%, transparent 100%);
- } */
}
.opacity-pulse {
diff --git a/apps/www/pages/launch-week/tickets/[username].tsx b/apps/www/pages/launch-week/tickets/[username].tsx
index 07061ff48fc..c246ce203c9 100644
--- a/apps/www/pages/launch-week/tickets/[username].tsx
+++ b/apps/www/pages/launch-week/tickets/[username].tsx
@@ -1,20 +1,23 @@
+import { useEffect, useState } from 'react'
import { NextSeo } from 'next-seo'
import { GetStaticProps, GetStaticPaths } from 'next'
+import Image from 'next/image'
import Error from 'next/error'
+import dynamic from 'next/dynamic'
+import { Session, SupabaseClient, createClient } from '@supabase/supabase-js'
+import { useTheme } from 'common/Providers'
+
import DefaultLayout from '~/components/Layouts/Default'
import SectionContainer from '~/components/Layouts/SectionContainer'
-import TicketContainer from '~/components/LaunchWeek/Ticket/TicketContainer'
-import { SITE_URL, SAMPLE_TICKET_NUMBER } from '~/lib/constants'
-import { createClient } from '@supabase/supabase-js'
-import { useEffect, useState } from 'react'
-import { IconArrowDown } from 'ui'
-import LaunchWeekPrizeSection from '~/components/LaunchWeek/LaunchSection/LaunchWeekPrizeSection'
-import { LaunchWeekLogoHeader } from '~/components/LaunchWeek/LaunchSection/LaunchWeekLogoHeader'
-import TicketBrickWall from '~/components/LaunchWeek/LaunchSection/TicketBrickWall'
-import { UserData } from '~/components/LaunchWeek/Ticket/hooks/use-conf-data'
-import LW7BgGraphic from '../../../components/LaunchWeek/LW7BgGraphic'
-import CTABanner from '../../../components/CTABanner'
-import { useTheme } from 'common/Providers'
+import TicketContainer from '~/components/LaunchWeek/8/Ticket/TicketContainer'
+import { SITE_URL } from '~/lib/constants'
+import { PageState, ConfDataContext, UserData } from '~/components/LaunchWeek/hooks/use-conf-data'
+
+const LaunchWeekPrizeSection = dynamic(
+ () => import('~/components/LaunchWeek/8/LaunchWeekPrizeSection')
+)
+const TicketBrickWall = dynamic(() => import('~/components/LaunchWeek/8/TicketBrickWall'))
+const CTABanner = dynamic(() => import('~/components/CTABanner'))
interface Props {
user: UserData
@@ -24,31 +27,47 @@ interface Props {
const supabaseAdmin = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL ?? 'http://localhost:54321',
+ // ANON KEY
process.env.SUPABASE_SERVICE_ROLE_SECRET ??
process.env.NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_SECRET ??
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9idWxkYW5ycHRsb2t0eGNmZnZuIiwicm9sZSI6ImFub24iLCJpYXQiOjE2Njk3MjcwMTIsImV4cCI6MTk4NTMwMzAxMn0.SZLqryz_-stF8dgzeVXmzZWPOqdOrBwqJROlFES8v3I'
)
export default function UsernamePage({ user, users, ogImageUrl }: Props) {
- const { isDarkMode } = useTheme()
- const { username, ticketNumber, name, golden, referrals, bg_image_id } = user
+ const { username, ticketNumber, name } = user
+
const TITLE = `${name ? name + '’s' : 'Get your'} #SupaLaunchWeek Ticket`
- const DESCRIPTION = 'Supabase Launch Week 7 | 10–14 April 2023 | Generate your ticket. Win swag.'
+ const DESCRIPTION =
+ 'Supabase Launch Week 8 | 7–11 August 2023 | Generate your ticket & win awesome swag.'
const OG_URL = `${SITE_URL}/tickets/${username}`
- const [supabase] = useState(() =>
- createClient(process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!)
- )
+ const [supabase, setSupabase] = useState
(null)
+ const [session, setSession] = useState(null)
+ const { isDarkMode, toggleTheme } = useTheme()
+
+ const [pageState, setPageState] = useState('ticket')
if (!ticketNumber) {
return
}
useEffect(() => {
- document.body.className = '!dark bg-[#1C1C1C]'
+ if (!supabase) {
+ setSupabase(
+ createClient(
+ process.env.NEXT_PUBLIC_SUPABASE_URL!,
+ process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
+ )
+ )
+ }
+ }, [])
+ useEffect(() => {
+ toggleTheme(true)
+ document.body.className = 'dark bg-[#020405]'
return () => {
- document.body.className = isDarkMode ? 'dark' : 'light'
+ document.body.className = ''
+ isDarkMode ? toggleTheme(true) : toggleTheme(false)
}
}, [])
@@ -69,86 +88,90 @@ export default function UsernamePage({ user, users, ogImageUrl }: Props) {
],
}}
/>
-
-
-
-
-
-
-
-
-
-
+
+
+
>
)
}
export const getStaticProps: GetStaticProps = async ({ params }) => {
const username = params?.username?.toString() || null
- let name: string | null | undefined
- let ticketNumber: number | null | undefined
- let golden = false
- let referrals = 0
- let bg_image_id
- let ogImageUrl
+ let user
// fetch users for the TicketBrickWall
- const { data: users } = await supabaseAdmin!.from('lw7_tickets_golden').select().limit(17)
+ const { data: users } = await supabaseAdmin!.from('lw8_tickets_golden').select().limit(17)
+
+ fetch(
+ `https://obuldanrptloktxcffvn.functions.supabase.co/lw8-ticket?username=${encodeURIComponent(
+ username ?? ''
+ )}`
+ ).catch((_) => {})
// fetch a specific user
if (username) {
- const { data: user } = await supabaseAdmin!
- .from('lw7_tickets_golden')
- .select('name, ticketNumber, golden, referrals, bg_image_id')
+ const { data } = await supabaseAdmin!
+ .from('lw8_tickets_golden')
+ .select('name, username, ticketNumber, metadata, golden')
.eq('username', username)
.single()
- name = user?.name
- ticketNumber = user?.ticketNumber
- golden = user?.golden ?? false
- bg_image_id = user?.bg_image_id ?? 1
- referrals = user?.referrals ?? 0
- ogImageUrl = `https://obuldanrptloktxcffvn.functions.supabase.co/lw7-ticket-og?username=${encodeURIComponent(
- username ?? ''
- )}${golden ? '&golden=true' : ''}`
+
+ user = data
}
+ const BUCKET_FOLDER_VERSION = 'v1'
+
+ const ogImageUrl = `https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/lw8/og/${
+ user?.golden ? 'golden' : 'regular'
+ }/${BUCKET_FOLDER_VERSION}/${username}.png`
+
return {
props: {
user: {
- username: ticketNumber ? username : null,
- usernameFromParams: username || null,
- name: ticketNumber ? name || username || null : null,
- ticketNumber: ticketNumber || SAMPLE_TICKET_NUMBER,
- golden,
- referrals,
- bg_image_id,
+ ...user,
+ username,
},
ogImageUrl,
users,
diff --git a/apps/www/pages/launch-week/tickets/index.tsx b/apps/www/pages/launch-week/tickets/index.tsx
index 84e7d8234d0..bd8b573b75b 100644
--- a/apps/www/pages/launch-week/tickets/index.tsx
+++ b/apps/www/pages/launch-week/tickets/index.tsx
@@ -1,21 +1,21 @@
-import { NextSeo } from 'next-seo'
-import { GetServerSideProps } from 'next'
-import DefaultLayout from '~/components/Layouts/Default'
-import SectionContainer from '~/components/Layouts/SectionContainer'
-import { SITE_ORIGIN, SITE_URL } from '~/lib/constants'
-import { createClient } from '@supabase/supabase-js'
import { useEffect, useRef, useState } from 'react'
-import { LaunchWeekLogoHeader } from '~/components/LaunchWeek/LaunchSection/LaunchWeekLogoHeader'
-import { motion } from 'framer-motion'
-import { UserData } from '~/components/LaunchWeek/Ticket/hooks/use-conf-data'
-import LW7BgGraphic from '../../../components/LaunchWeek/LW7BgGraphic'
-import CTABanner from '../../../components/CTABanner'
-import { debounce } from 'lodash'
-import TicketsGrid from '../../../components/LaunchWeek/Ticket/TicketsGrid'
+import { GetServerSideProps } from 'next'
+import { NextSeo } from 'next-seo'
+import Image from 'next/image'
import { Button } from 'ui'
import Link from 'next/link'
+import { motion } from 'framer-motion'
+import { createClient } from '@supabase/supabase-js'
+
+import { SITE_ORIGIN, SITE_URL } from '~/lib/constants'
import { useTheme } from 'common/Providers'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import { UserData } from '~/components/LaunchWeek/hooks/use-conf-data'
+import CTABanner from '~/components/CTABanner'
+import TicketsGrid from '~/components/LaunchWeek/8/TicketsGrid'
+
interface Props {
users: UserData[]
}
@@ -29,7 +29,7 @@ const supabaseAdmin = createClient(
const generateOgs = async (users: UserData[]) => {
users?.map(async (user) => {
- const ogImageUrl = `https://obuldanrptloktxcffvn.functions.supabase.co/lw7-ticket-og?username=${encodeURIComponent(
+ const ogImageUrl = `https://obuldanrptloktxcffvn.functions.supabase.co/lw8-ticket-og?username=${encodeURIComponent(
user.username ?? ''
)}${!!user.golden ? '&golden=true' : ''}`
return await fetch(ogImageUrl)
@@ -40,10 +40,10 @@ export default function TicketsPage({ users }: Props) {
const ref = useRef(null)
const PAGE_COUNT = 20
const TITLE = '#SupaLaunchWeek Tickets'
- const DESCRIPTION = 'Supabase Launch Week 7 | 10–14 April 2023'
- const OG_IMAGE = `${SITE_ORIGIN}/images/launchweek/seven/launch-week-7-teaser.jpg`
+ const DESCRIPTION = 'Supabase Launch Week 8 | 7–11 August 2023'
+ const OG_IMAGE = `${SITE_ORIGIN}/images/launchweek/8/lw8-og.jpg`
- const { isDarkMode } = useTheme()
+ const { isDarkMode, toggleTheme } = useTheme()
const [isLoading, setIsLoading] = useState(false)
const [offset, setOffset] = useState(1)
const [isLast, setIsLast] = useState(false)
@@ -57,7 +57,7 @@ export default function TicketsPage({ users }: Props) {
const loadUsers = async (offset: number) => {
const from = offset * PAGE_COUNT
return await supabaseAdmin!
- .from('lw7_tickets_golden')
+ .from('lw8_tickets_golden')
.select('*')
.range(from, from + PAGE_COUNT - 1)
.order('createdAt', { ascending: false })
@@ -82,14 +82,11 @@ export default function TicketsPage({ users }: Props) {
}
useEffect(() => {
- document.body.className = '!dark bg-[#1C1C1C]'
-
- const handleDebouncedScroll = debounce(() => !isLast && handleScroll(), 200)
- window.addEventListener('scroll', handleDebouncedScroll)
-
+ toggleTheme(true)
+ document.body.className = 'dark bg-[#020405]'
return () => {
- document.body.className = isDarkMode ? 'dark' : 'light'
- window.removeEventListener('scroll', handleDebouncedScroll)
+ document.body.className = ''
+ isDarkMode ? toggleTheme(true) : toggleTheme(false)
}
}, [])
@@ -109,17 +106,8 @@ export default function TicketsPage({ users }: Props) {
}}
/>
-
-
-
+
+
-
- Check out all the tickets
-
-
- Join us on April 16th for Launch Week 7's final day{' '}
+
Launch Week 8 tickets
+
+ Join us on August 11th for Launch Week 8's final day{' '}
and find out if you are one of the lucky
- winners. Get sharing!
+ winners.
+
+
+
-
+
>
)
@@ -165,7 +161,7 @@ export default function TicketsPage({ users }: Props) {
export const getServerSideProps: GetServerSideProps = async ({ req, res }) => {
const { data: users } = await supabaseAdmin!
- .from('lw7_tickets_golden')
+ .from('lw8_tickets_golden')
.select('*')
.order('createdAt', { ascending: false })
.limit(20)
diff --git a/apps/www/public/images/launchweek/8/LW8-gradient.png b/apps/www/public/images/launchweek/8/LW8-gradient.png
new file mode 100644
index 00000000000..5ac9a61d922
Binary files /dev/null and b/apps/www/public/images/launchweek/8/LW8-gradient.png differ
diff --git a/apps/www/public/images/launchweek/8/lw8-logo-gold.png b/apps/www/public/images/launchweek/8/lw8-logo-gold.png
new file mode 100644
index 00000000000..51f85e84265
Binary files /dev/null and b/apps/www/public/images/launchweek/8/lw8-logo-gold.png differ
diff --git a/apps/www/public/images/launchweek/8/lw8-logo.png b/apps/www/public/images/launchweek/8/lw8-logo.png
new file mode 100644
index 00000000000..8a6722e759f
Binary files /dev/null and b/apps/www/public/images/launchweek/8/lw8-logo.png differ
diff --git a/apps/www/public/images/launchweek/8/lw8-og.jpg b/apps/www/public/images/launchweek/8/lw8-og.jpg
new file mode 100644
index 00000000000..49cbefc13be
Binary files /dev/null and b/apps/www/public/images/launchweek/8/lw8-og.jpg differ
diff --git a/apps/www/public/images/launchweek/8/prize-icon.svg b/apps/www/public/images/launchweek/8/prize-icon.svg
new file mode 100644
index 00000000000..238b8c2c317
--- /dev/null
+++ b/apps/www/public/images/launchweek/8/prize-icon.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/www/public/images/launchweek/8/stars.svg b/apps/www/public/images/launchweek/8/stars.svg
new file mode 100644
index 00000000000..0f077672b56
--- /dev/null
+++ b/apps/www/public/images/launchweek/8/stars.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/www/public/images/launchweek/8/swag-bg.png b/apps/www/public/images/launchweek/8/swag-bg.png
new file mode 100644
index 00000000000..667a6b4479c
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag-bg.png differ
diff --git a/apps/www/public/images/launchweek/8/swag-illustration.png b/apps/www/public/images/launchweek/8/swag-illustration.png
new file mode 100644
index 00000000000..ad00d5c2ada
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag-illustration.png differ
diff --git a/apps/www/public/images/launchweek/8/swag/cap.jpg b/apps/www/public/images/launchweek/8/swag/cap.jpg
new file mode 100644
index 00000000000..81016d0a64b
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag/cap.jpg differ
diff --git a/apps/www/public/images/launchweek/8/swag/deskmat-lg.jpg b/apps/www/public/images/launchweek/8/swag/deskmat-lg.jpg
new file mode 100644
index 00000000000..d6e7819d404
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag/deskmat-lg.jpg differ
diff --git a/apps/www/public/images/launchweek/8/swag/deskmat.jpg b/apps/www/public/images/launchweek/8/swag/deskmat.jpg
new file mode 100644
index 00000000000..e0666bb9c57
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag/deskmat.jpg differ
diff --git a/apps/www/public/images/launchweek/8/swag/shirt.jpg b/apps/www/public/images/launchweek/8/swag/shirt.jpg
new file mode 100644
index 00000000000..e6c1cbba65a
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag/shirt.jpg differ
diff --git a/apps/www/public/images/launchweek/8/swag/stickers.jpg b/apps/www/public/images/launchweek/8/swag/stickers.jpg
new file mode 100644
index 00000000000..74882b4c2e2
Binary files /dev/null and b/apps/www/public/images/launchweek/8/swag/stickers.jpg differ
diff --git a/apps/www/public/images/launchweek/8/ticket-bg/golden.png b/apps/www/public/images/launchweek/8/ticket-bg/golden.png
new file mode 100644
index 00000000000..cfd151ca8b8
Binary files /dev/null and b/apps/www/public/images/launchweek/8/ticket-bg/golden.png differ
diff --git a/apps/www/public/images/launchweek/8/ticket-bg/regular.png b/apps/www/public/images/launchweek/8/ticket-bg/regular.png
new file mode 100644
index 00000000000..45bc0cac006
Binary files /dev/null and b/apps/www/public/images/launchweek/8/ticket-bg/regular.png differ
diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css
index 2b755d95c61..e0843c3b687 100644
--- a/apps/www/styles/index.css
+++ b/apps/www/styles/index.css
@@ -177,9 +177,6 @@ h6:not(.overwrite) {
.section-container {
position: relative;
- /* z-index: 1; */
- /* display: flex;
- justify-content: center; */
}
/* Database page */
@@ -188,10 +185,6 @@ h6:not(.overwrite) {
@apply border border-gray-50 dark:border-gray-700;
}
-/* a {
- @apply hover:text-black dark:hover:text-white;
-} */
-
.sbui-tabs--alt div[role='tablist'] .sbui-btn-primary {
@apply dark:bg-scale-300 bg-gray-800 text-white dark:text-white;
text-shadow: none;
@@ -213,20 +206,6 @@ h6:not(.overwrite) {
/* Auth page */
-/* .auth-container > div:nth-child(2) {
- width: 420px;
-} */
-
-/* .auth-container {
- @apply rounded;
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23edebf0' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
-}
-
-.dark .auth-container {
- background-color: #181818;
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23313131' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
-} */
-
.dark .header--light {
display: none;
}
@@ -303,6 +282,47 @@ table {
-webkit-box-orient: vertical;
}
+/**
+animations
+*/
+
+.fade-in-up-2ms {
+ opacity: 0;
+ transform: translate3d(0, 10px, 0);
+ animation: fadeInUp 0.2s cubic-bezier(0.25, 0.25, 0, 1) both;
+}
+
+.fade-in-up-4ms {
+ opacity: 0;
+ transform: translate3d(0, 10px, 0);
+ animation: fadeInUp 0.4s cubic-bezier(0.25, 0.25, 0, 1) both;
+}
+
+.fade-in-2ms {
+ opacity: 0;
+ transform: translate3d(0, 10px, 0);
+ animation: fadeIn 0.2s cubic-bezier(0.25, 0.25, 0, 1) both;
+}
+
+.fade-in-4ms {
+ opacity: 0;
+ transform: translate3d(0, 10px, 0);
+ animation: fadeIn 0.4s cubic-bezier(0.25, 0.25, 0, 1) both;
+}
+
+@keyframes fadeInUp {
+ to {
+ opacity: 1;
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes fadeIn {
+ to {
+ opacity: 1;
+ }
+}
+
/**
launch week
*/
@@ -491,13 +511,6 @@ launch week
left: 0;
right: 0;
overflow: hidden;
- /* background: radial-gradient(
- circle at 50% -150%,
- #39617d 0%,
- #00ded1 30%,
- #121212 80%,
- #121212 100%
- ); */
}
@media screen and (max-width: 769px) {
.gradient-container {
@@ -524,32 +537,10 @@ launch week
);
}
-.light .gradient-mask {
- background: radial-gradient(
- circle at 50% -35%,
- rgba(57, 97, 125, 0.32) 0%,
- rgba(57, 97, 125, 0.32) 5%,
- rgb(113 191 187 / 75%) 8%,
- #ffffff 65%,
- #ffffff 100%
- );
-}
-
@media screen and (max-width: 769px) {
.gradient-mask {
width: 100%;
}
-
- .light .gradient-mask {
- background: radial-gradient(
- circle at 50% -35%,
- rgba(57, 97, 125, 0.32) 0%,
- rgba(57, 97, 125, 0.32) 5%,
- rgb(155 246 241 / 75%) 8%,
- #90cebd 65%,
- #67eae8 100%
- );
- }
}
/* The bottom part below the stroke */
@@ -564,18 +555,10 @@ launch week
background: radial-gradient(circle at 50% -60%, rgba(255, 255, 255, 0) 0%, #121212 65%);
}
-.light .gradient-mask--masked {
- background: radial-gradient(circle at 50% -60%, rgba(255, 255, 255, 0) 0%, #fff 65%);
-}
-
@media screen and (max-width: 769px) {
.gradient-mask--masked {
background: radial-gradient(circle at 50% -40%, rgba(255, 255, 255, 0) 0%, #121212 65%);
}
-
- .light .gradient-mask--masked {
- background: radial-gradient(circle at 50% -40%, rgba(255, 255, 255, 0) 0%, #fff 65%);
- }
}
/* The stroke on the circle */
@@ -590,10 +573,6 @@ launch week
clip-path: ellipse(52% 213px at 50% -75px);
}
-.light .flair-mask-a {
- background-color: #d7d7d7;
-}
-
/* The inside of the circle */
.flair-mask-b {
position: absolute;
@@ -607,10 +586,6 @@ launch week
clip-path: ellipse(52% 213px at 50% -75px);
}
-.light .flair-mask-b {
- background-color: #fff;
-}
-
@media only screen and (min-width: 600px) {
.flair-mask-a {
top: 1px;
@@ -645,15 +620,6 @@ launch week
}
}
-/* @media only screen and (min-width: 1024px) {
- .flair-mask-a {
- width: 69.5%;
- }
- .flair-mask-b {
- width: 70%;
- }
-} */
-
.orbit {
width: 192px;
height: 192px;
@@ -698,23 +664,6 @@ launch week
}
.radial-mask {
- /* -webkit-mask-image: conic-gradient(
- from 0deg at 45% 47%,
- #ffffffff 0%,
- #000000ff 25%,
- #000000ff 50%,
- #000000ff 75%,
- #ffffffff 100%
- );
- mask-image: conic-gradient(
- from 0deg at 45% 47%,
- #ffffffff 0%,
- #000000ff 25%,
- #000000ff 50%,
- #000000ff 75%,
- #ffffffff 100%
- ); */
-
-webkit-mask-image: linear-gradient(rgba(0, 0, 0, 1), transparent);
}
@@ -789,3 +738,14 @@ launch week
.swiper-transition-linear .swiper-wrapper {
transition-timing-function: linear;
}
+
+/* .lw8-particle-handle {
+ @apply text-xs bg-black flex items-center justify-center rounded-full py-1 px-2 [&>div]:!relative;
+} */
+
+/* dat.GUI */
+
+.dg.ac {
+ z-index: 9999 !important;
+ margin-top: 65px !important;
+}
diff --git a/apps/www/supabase/functions/lw8-ticket-og/handler.tsx b/apps/www/supabase/functions/lw8-ticket-og/handler.tsx
new file mode 100644
index 00000000000..4794d65b5d7
--- /dev/null
+++ b/apps/www/supabase/functions/lw8-ticket-og/handler.tsx
@@ -0,0 +1,139 @@
+import React from 'https://esm.sh/react@18.2.0?deno-std=0.140.0'
+import { ImageResponse } from 'https://deno.land/x/og_edge@0.0.4/mod.ts'
+import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.7.1'
+import { corsHeaders } from '../_shared/cors.ts'
+
+const STORAGE_URL = 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/lw8'
+
+const BUCKET_FOLDER_VERSION = 'v1'
+
+export async function handler(req: Request) {
+ try {
+ if (req.method !== 'POST') throw new Error('method not supported')
+ const {
+ username = 'thorwebdev',
+ golden = false,
+ }: {
+ username?: string
+ golden?: boolean
+ } = await req.json()
+
+ // Else, generate image and upload to storage.
+ const timestamp = encodeURI(new Date().toISOString())
+ const ticketImg = `${STORAGE_URL}/tickets/${
+ golden ? 'golden' : 'regular'
+ }/${BUCKET_FOLDER_VERSION}/${username}.png?t=${timestamp}`
+
+ const bgImg = `${STORAGE_URL}/assets/backgrounds/og-${golden ? 'golden' : 'regular'}.png`
+ const ticketWidth = 1100
+ const ticketHeight = ticketWidth / 2
+ const boxOffset = 24
+ const boxWidth = `${ticketWidth + boxOffset}px`
+ const boxHeight = `${ticketHeight + boxOffset}px`
+ const leftOffset = `${(1200 - ticketWidth) / 2 - boxOffset / 2}px`
+ const topOffset = `${(628 - ticketHeight) / 2 - boxOffset / 2}px`
+
+ const geneartedOGImage = new ImageResponse(
+ (
+
+ {/* Background */}
+
+ {/* Ticket Box */}
+
+ {/* Ticket */}
+
+
+ ),
+ {
+ width: 1200,
+ height: 628,
+ headers: {
+ 'content-type': 'image/png',
+ 'cache-control': 'public, max-age=31536000, s-maxage=31536000, no-transform, immutable',
+ 'cdn-cache-control': 'max-age=31536000',
+ },
+ }
+ )
+
+ // Upload image to storage.
+ const supabaseAdminClient = createClient(
+ // Supabase API URL - env var exported by default when deployed.
+ Deno.env.get('SUPABASE_URL') ?? '',
+ // Supabase API SERVICE ROLE KEY - env var exported by default when deployed.
+ Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
+ )
+ const { error: storageError } = await supabaseAdminClient.storage
+ .from('images')
+ .upload(
+ `lw8/og/${golden ? 'golden' : 'regular'}/${BUCKET_FOLDER_VERSION}/${username}.png`,
+ geneartedOGImage.body!,
+ {
+ contentType: 'image/png',
+ cacheControl: '0',
+ upsert: true,
+ }
+ )
+ if (storageError) throw new Error(`storageError: ${storageError.message}`)
+ // return geneartedOGImage
+
+ return new Response(JSON.stringify({ success: true }), {
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ status: 200,
+ })
+ } catch (error) {
+ return new Response(JSON.stringify({ error: error.message }), {
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ status: 400,
+ })
+ }
+}
diff --git a/apps/www/supabase/functions/lw8-ticket-og/index.ts b/apps/www/supabase/functions/lw8-ticket-og/index.ts
new file mode 100644
index 00000000000..26986700825
--- /dev/null
+++ b/apps/www/supabase/functions/lw8-ticket-og/index.ts
@@ -0,0 +1,11 @@
+// Follow this setup guide to integrate the Deno language server with your editor:
+// https://deno.land/manual/getting_started/setup_your_environment
+// This enables autocomplete, go to definition, etc.
+
+import { serve } from 'https://deno.land/std@0.177.0/http/server.ts'
+
+import { handler } from './handler.tsx'
+
+console.log(`Function "lw8-ticket-og" up and running`)
+
+serve(handler)
diff --git a/apps/www/supabase/functions/lw8-ticket/README.md b/apps/www/supabase/functions/lw8-ticket/README.md
new file mode 100644
index 00000000000..9c5b3d4e49e
--- /dev/null
+++ b/apps/www/supabase/functions/lw8-ticket/README.md
@@ -0,0 +1,21 @@
+# Open Graph (OG) Image Generation with Supabase Storage CDN Caching
+
+Generate Open Graph images with Deno and Supabase Edge Functions and cache the generated image with Supabase Storage CDN.
+
+- Docs: https://deno.land/x/og_edge@0.0.2
+- Examples: https://vercel.com/docs/concepts/functions/edge-functions/og-image-examples
+- Demo: https://obuldanrptloktxcffvn.functions.supabase.co/lw8-ticket?username=thorwebdev
+
+## Run locally
+
+```bash
+supabase functions serve lw8-ticket --no-verify-jwt
+```
+
+Navigate to http://localhost:54321/functions/v1/lw8-ticket?username=thorwebdev
+
+## Deploy
+
+```bash
+supabase functions deploy lw8-ticket --no-verify-jwt
+```
diff --git a/apps/www/supabase/functions/lw8-ticket/handler.tsx b/apps/www/supabase/functions/lw8-ticket/handler.tsx
new file mode 100644
index 00000000000..cda66443332
--- /dev/null
+++ b/apps/www/supabase/functions/lw8-ticket/handler.tsx
@@ -0,0 +1,279 @@
+import React from 'https://esm.sh/react@18.2.0?deno-std=0.140.0'
+import { ImageResponse } from 'https://deno.land/x/og_edge@0.0.4/mod.ts'
+import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.7.1'
+import { corsHeaders } from '../_shared/cors.ts'
+
+const STORAGE_URL = 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/lw8'
+
+// Load custom font
+const FONT_URL = `${STORAGE_URL}/font/CircularStd-Book.otf`
+const MONO_FONT_URL = `${STORAGE_URL}/font/SourceCodePro-Regular.ttf?t=2023-07-18T13%3A03%3A29.474Z`
+const font = fetch(new URL(FONT_URL, import.meta.url)).then((res) => res.arrayBuffer())
+const mono_font = fetch(new URL(MONO_FONT_URL, import.meta.url)).then((res) => res.arrayBuffer())
+const BUCKET_FOLDER_VERSION = 'v1'
+
+const LW_TABLE = 'lw8_tickets_golden'
+
+export async function handler(req: Request) {
+ const url = new URL(req.url)
+ const username = url.searchParams.get('username') ?? url.searchParams.get('amp;username')
+ const assumeGolden = url.searchParams.get('golden') ?? url.searchParams.get('amp;golden')
+ const userAgent = req.headers.get('user-agent')
+
+ try {
+ if (!username) throw new Error('missing username param')
+
+ const supabaseAdminClient = createClient(
+ // Supabase API URL - env var exported by default when deployed.
+ Deno.env.get('SUPABASE_URL') ?? '',
+ // Supabase API SERVICE ROLE KEY - env var exported by default when deployed.
+ Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
+ )
+
+ // Track social shares
+ if (userAgent?.toLocaleLowerCase().includes('twitter')) {
+ await supabaseAdminClient
+ .from(LW_TABLE)
+ .update({ sharedOnTwitter: 'now' })
+ .eq('username', username)
+ .is('sharedOnTwitter', null)
+ } else if (userAgent?.toLocaleLowerCase().includes('linkedin')) {
+ await supabaseAdminClient
+ .from(LW_TABLE)
+ .update({ sharedOnLinkedIn: 'now' })
+ .eq('username', username)
+ .is('sharedOnLinkedIn', null)
+ }
+
+ // Get ticket data
+ const { data, error } = await supabaseAdminClient
+ .from(LW_TABLE)
+ .select('name, ticketNumber, sharedOnTwitter, sharedOnLinkedIn, metadata')
+ .eq('username', username)
+ .maybeSingle()
+
+ if (error) console.log(error.message)
+ if (!data) throw new Error(error?.message ?? 'user not found')
+ const { name, ticketNumber, metadata } = data
+
+ const golden = (!!data?.sharedOnTwitter && !!data?.sharedOnLinkedIn) ?? false
+ if (assumeGolden && !golden) return await fetch(`${STORAGE_URL}/golden_no_meme.png`)
+
+ // Else, generate image and upload to storage.
+ const BACKGROUND = {
+ REG: {
+ BG: `${STORAGE_URL}/assets/backgrounds/regular.png`,
+ LOGO: `${STORAGE_URL}/assets/lw8-logo-regular.png`,
+ },
+ GOLD: {
+ BG: `${STORAGE_URL}/assets/backgrounds/golden.png`,
+ LOGO: `${STORAGE_URL}/assets/lw8-logo-gold.png`,
+ },
+ }
+
+ const fontData = await font
+ const monoFontData = await mono_font
+ const numDigits = `${Number(ticketNumber)}`.length
+ const prefix = `00000000`.slice(numDigits)
+ const HAS_ROLE = !!metadata?.role
+ const HAS_COMPANY = !!metadata?.company
+ const HAS_LOCATION = !!metadata?.location
+ const HAS_NO_META = !HAS_ROLE && !HAS_COMPANY && !HAS_LOCATION
+
+ const generatedTicketImage = new ImageResponse(
+ (
+ <>
+
+ {/* Background */}
+
+
+
+
+
+ {/* Name & username */}
+
+
+
+ {name ?? username}
+
+
+
+ {/* Username */}
+
+ {HAS_NO_META && username && `@${username}`}
+ {HAS_ROLE && `${metadata.role}`}
+ {HAS_COMPANY && `${HAS_ROLE ? ' at ' : ''}${metadata.company} `}
+ {HAS_LOCATION && `${(HAS_ROLE || HAS_COMPANY) && ' —'} ${metadata.location}`}
+
+
+
+ August 7-11
+ supabase.com/launch-week
+
+
+ {/* Ticket No */}
+
+ {`NO ${prefix}${ticketNumber}`}
+
+ >
+ ),
+ {
+ width: 1200,
+ height: 628,
+ fonts: [
+ {
+ name: 'Circular',
+ data: fontData,
+ style: 'normal',
+ },
+ {
+ name: 'SourceCodePro',
+ data: monoFontData,
+ style: 'normal',
+ },
+ ],
+ headers: {
+ 'content-type': 'image/png',
+ 'cache-control': 'public, max-age=31536000, s-maxage=31536000, no-transform, immutable',
+ 'cdn-cache-control': 'max-age=31536000',
+ },
+ }
+ )
+
+ // Upload image to storage.
+ const { error: storageError } = await supabaseAdminClient.storage
+ .from('images')
+ .upload(
+ `lw8/tickets/${golden ? 'golden' : 'regular'}/${BUCKET_FOLDER_VERSION}/${username}.png`,
+ generatedTicketImage.body!,
+ {
+ contentType: 'image/png',
+ // cacheControl: `${60 * 60 * 24 * 7}`,
+ cacheControl: `0`,
+ // Update cached og image, people might need to update info
+ upsert: true,
+ }
+ )
+ if (storageError) throw new Error(`storageError: ${storageError.message}`)
+
+ // Generate og image
+ fetch('https://obuldanrptloktxcffvn.functions.supabase.co/lw8-ticket-og', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization:
+ 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9idWxkYW5ycHRsb2t0eGNmZnZuIiwicm9sZSI6ImFub24iLCJpYXQiOjE2Njk3MjcwMTIsImV4cCI6MTk4NTMwMzAxMn0.SZLqryz_-stF8dgzeVXmzZWPOqdOrBwqJROlFES8v3I',
+ },
+ body: JSON.stringify({
+ username,
+ golden,
+ }),
+ })
+
+ return await fetch(
+ `${STORAGE_URL}/tickets/${
+ golden ? 'golden' : 'regular'
+ }/${BUCKET_FOLDER_VERSION}/${username}.png`
+ )
+ } catch (error) {
+ return new Response(JSON.stringify({ error: error.message }), {
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ status: 400,
+ })
+ }
+}
diff --git a/apps/www/supabase/functions/lw8-ticket/index.ts b/apps/www/supabase/functions/lw8-ticket/index.ts
new file mode 100644
index 00000000000..84d78bdf295
--- /dev/null
+++ b/apps/www/supabase/functions/lw8-ticket/index.ts
@@ -0,0 +1,11 @@
+// Follow this setup guide to integrate the Deno language server with your editor:
+// https://deno.land/manual/getting_started/setup_your_environment
+// This enables autocomplete, go to definition, etc.
+
+import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
+
+import { handler } from './handler.tsx'
+
+console.log(`Function "lw8-ticket" up and running`)
+
+serve(handler)
diff --git a/apps/www/tailwind.config.js b/apps/www/tailwind.config.js
index 66c96328173..3d8cfeba688 100644
--- a/apps/www/tailwind.config.js
+++ b/apps/www/tailwind.config.js
@@ -17,10 +17,20 @@ module.exports = config({
'0%': { backgroundColor: 'rgba(63, 207, 142, 0.1)' },
'100%': { backgroundColor: 'transparent' },
},
+ slideIn: {
+ '0%, 100%': { transform: 'translate3d(0,0,0)' },
+ },
+ slideIn: {
+ '0%, 100%': { transform: 'translate3d(0,0,0)' },
+ },
+ spin: {
+ '0%, 100%': { transform: 'rotate(360deg)' },
+ },
},
animation: {
'flash-code': 'flash-code 1s forwards',
'flash-code-slow': 'flash-code 2s forwards',
+ spin: 'spin 1s both infinite',
},
},
},
diff --git a/package-lock.json b/package-lock.json
index 084b2d064df..a44f1c24ac3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -311,12 +311,15 @@
"@mdx-js/react": "^2.1.5",
"@next/bundle-analyzer": "^13.4.0",
"@next/mdx": "^12.3.2",
+ "@react-three/drei": "^8.20.2",
+ "@react-three/fiber": "^7.0.29",
"@supabase/auth-ui-react": "^0.1.6",
"@supabase/supabase-js": "^2.23.0",
"classnames": "^2.3.1",
"cobe": "^0.6.2",
"common": "*",
"config": "*",
+ "dat.gui": "^0.7.9",
"date-fns": "2.10.0",
"dayjs": "^1.11.7",
"framer-motion": "^6.5.1",
@@ -334,6 +337,7 @@
"parse-numeric-range": "^1.3.0",
"react": "^17.0.2",
"react-copy-to-clipboard": "^5.1.0",
+ "react-countdown": "^2.3.5",
"react-dom": "^17.0.2",
"react-ga": "^3.3.0",
"react-markdown": "^8.0.3",
@@ -349,6 +353,7 @@
"shared-data": "*",
"swiper": "^6.5.0",
"swr": "^0.5.4",
+ "three": "^0.154.0",
"typescript": "^5.0.4",
"ui": "*",
"use-debounce": "^7.0.1",
@@ -359,6 +364,7 @@
"devDependencies": {
"@tailwindcss/typography": "^0.5.9",
"@types/classnames": "^2.3.1",
+ "@types/dat.gui": "^0.7.10",
"@types/jest": "^27.4.0",
"@types/mdx-js__react": "^1.5.5",
"@types/node": "^17.0.24",
@@ -368,6 +374,7 @@
"@types/react-copy-to-clipboard": "^5.0.4",
"@types/react-dom": "^17.0.11",
"@types/react-syntax-highlighter": "^15.5.6",
+ "@types/three": "^0.154.0",
"autoprefixer": "^10.4.14",
"config": "*",
"file-loader": "^6.2.0",
@@ -2674,6 +2681,35 @@
"version": "6.0.2",
"license": "MIT"
},
+ "node_modules/@chevrotain/cst-dts-gen": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz",
+ "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==",
+ "dependencies": {
+ "@chevrotain/gast": "10.5.0",
+ "@chevrotain/types": "10.5.0",
+ "lodash": "4.17.21"
+ }
+ },
+ "node_modules/@chevrotain/gast": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz",
+ "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==",
+ "dependencies": {
+ "@chevrotain/types": "10.5.0",
+ "lodash": "4.17.21"
+ }
+ },
+ "node_modules/@chevrotain/types": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz",
+ "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A=="
+ },
+ "node_modules/@chevrotain/utils": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz",
+ "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ=="
+ },
"node_modules/@cnakazawa/watch": {
"version": "1.0.4",
"dev": true,
@@ -6646,6 +6682,130 @@
"version": "2.0.0",
"license": "MIT"
},
+ "node_modules/@react-spring/animated": {
+ "version": "9.7.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz",
+ "integrity": "sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==",
+ "dependencies": {
+ "@react-spring/shared": "~9.7.3",
+ "@react-spring/types": "~9.7.3"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/core": {
+ "version": "9.7.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.3.tgz",
+ "integrity": "sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==",
+ "dependencies": {
+ "@react-spring/animated": "~9.7.3",
+ "@react-spring/shared": "~9.7.3",
+ "@react-spring/types": "~9.7.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-spring/donate"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/shared": {
+ "version": "9.7.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz",
+ "integrity": "sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==",
+ "dependencies": {
+ "@react-spring/types": "~9.7.3"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/three": {
+ "version": "9.7.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.3.tgz",
+ "integrity": "sha512-Q1p512CqUlmMK8UMBF/Rj79qndhOWq4XUTayxMP9S892jiXzWQuj+xC3Xvm59DP/D4JXusXpxxqfgoH+hmOktA==",
+ "dependencies": {
+ "@react-spring/animated": "~9.7.3",
+ "@react-spring/core": "~9.7.3",
+ "@react-spring/shared": "~9.7.3",
+ "@react-spring/types": "~9.7.3"
+ },
+ "peerDependencies": {
+ "@react-three/fiber": ">=6.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "three": ">=0.126"
+ }
+ },
+ "node_modules/@react-spring/types": {
+ "version": "9.7.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz",
+ "integrity": "sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw=="
+ },
+ "node_modules/@react-three/drei": {
+ "version": "8.20.2",
+ "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-8.20.2.tgz",
+ "integrity": "sha512-V2P/YHYg2+N58eWtIqmOJf0t5nWGTcmpT+ci4tB5gt3CsWU2vuoeQFhvBmqEF+cXwZD5ZYKPfQDf/06NzTx/lw==",
+ "dependencies": {
+ "@babel/runtime": "^7.11.2",
+ "@react-spring/three": "^9.3.1",
+ "@use-gesture/react": "^10.2.0",
+ "detect-gpu": "^4.0.14",
+ "glsl-noise": "^0.0.0",
+ "lodash.omit": "^4.5.0",
+ "lodash.pick": "^4.4.0",
+ "meshline": "^2.0.4",
+ "react-composer": "^5.0.2",
+ "react-merge-refs": "^1.1.0",
+ "stats.js": "^0.17.0",
+ "suspend-react": "^0.0.8",
+ "three-mesh-bvh": "^0.5.7",
+ "three-stdlib": "^2.8.9",
+ "troika-three-text": "^0.46.3",
+ "utility-types": "^3.10.0",
+ "zustand": "^3.5.13"
+ },
+ "peerDependencies": {
+ "@react-three/fiber": ">=6.0",
+ "react": ">=17.0",
+ "react-dom": ">=17.0",
+ "three": ">=0.137"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-three/fiber": {
+ "version": "7.0.29",
+ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-7.0.29.tgz",
+ "integrity": "sha512-TE+/iaGrjluGsPwN2RkLXxKD4ak+unsh0YKIFKGcuAOW9jYcAyMGKAtgFO8MS7/HNCrZZQQSg23sJ8IPgtdkDg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@types/react-reconciler": "^0.26.2",
+ "react-merge-refs": "^1.1.0",
+ "react-reconciler": "^0.26.2",
+ "react-three-fiber": "0.0.0-deprecated",
+ "react-use-measure": "^2.1.1",
+ "resize-observer-polyfill": "^1.5.1",
+ "scheduler": "^0.20.2",
+ "use-asset": "^1.0.4",
+ "utility-types": "^3.10.0",
+ "zustand": "^3.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=17.0",
+ "react-dom": ">=17.0",
+ "three": ">=0.133"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@rushstack/eslint-patch": {
"version": "1.3.0",
"license": "MIT"
@@ -13941,6 +14101,12 @@
"devOptional": true,
"license": "MIT"
},
+ "node_modules/@tweenjs/tween.js": {
+ "version": "18.6.4",
+ "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz",
+ "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==",
+ "dev": true
+ },
"node_modules/@types/acorn": {
"version": "4.0.6",
"license": "MIT",
@@ -14084,6 +14250,12 @@
"version": "3.0.0",
"license": "MIT"
},
+ "node_modules/@types/dat.gui": {
+ "version": "0.7.10",
+ "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.10.tgz",
+ "integrity": "sha512-sLifoNrvs4lgJkAUZcTB28dbWy0AM05Yc0BzTqHheK0tRYRVsJHoFLocB5heDbb5amaFLEXna41GOM6IG06oqA==",
+ "dev": true
+ },
"node_modules/@types/debounce-promise": {
"version": "3.1.6",
"license": "MIT"
@@ -14105,6 +14277,11 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/draco3d": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.2.tgz",
+ "integrity": "sha512-goh23EGr6CLV6aKPwN1p8kBD/7tT5V/bLpToSbarKrwVejqNrspVrv8DhliteYkkhZYrlq/fwKZRRUzH4XN88w=="
+ },
"node_modules/@types/ejs": {
"version": "3.1.2",
"dev": true,
@@ -14358,6 +14535,11 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/offscreencanvas": {
+ "version": "2019.7.0",
+ "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz",
+ "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg=="
+ },
"node_modules/@types/papaparse": {
"version": "5.3.7",
"dev": true,
@@ -14468,6 +14650,14 @@
"@types/react": "*"
}
},
+ "node_modules/@types/react-reconciler": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz",
+ "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
"node_modules/@types/react-redux": {
"version": "7.1.25",
"license": "MIT",
@@ -14564,6 +14754,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/stats.js": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz",
+ "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==",
+ "dev": true
+ },
"node_modules/@types/strip-ansi": {
"version": "5.2.1",
"dev": true,
@@ -14587,6 +14783,20 @@
"@types/jest": "*"
}
},
+ "node_modules/@types/three": {
+ "version": "0.154.0",
+ "resolved": "https://registry.npmjs.org/@types/three/-/three-0.154.0.tgz",
+ "integrity": "sha512-IioqpGhch6FdLDh4zazRn3rXHj6Vn2nVOziJdXVbJFi9CaI65LtP9qqUtpzbsHK2Ezlox8NtsLNHSw3AQzucjA==",
+ "dev": true,
+ "dependencies": {
+ "@tweenjs/tween.js": "~18.6.4",
+ "@types/stats.js": "*",
+ "@types/webxr": "*",
+ "fflate": "~0.6.9",
+ "lil-gui": "~0.17.0",
+ "meshoptimizer": "~0.18.1"
+ }
+ },
"node_modules/@types/uglify-js": {
"version": "3.17.1",
"dev": true,
@@ -14665,6 +14875,11 @@
"@types/node": "*"
}
},
+ "node_modules/@types/webxr": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.2.tgz",
+ "integrity": "sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw=="
+ },
"node_modules/@types/yargs": {
"version": "15.0.15",
"dev": true,
@@ -14883,6 +15098,22 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@use-gesture/core": {
+ "version": "10.2.27",
+ "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz",
+ "integrity": "sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA=="
+ },
+ "node_modules/@use-gesture/react": {
+ "version": "10.2.27",
+ "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.27.tgz",
+ "integrity": "sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w==",
+ "dependencies": {
+ "@use-gesture/core": "10.2.27"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0"
+ }
+ },
"node_modules/@webassemblyjs/ast": {
"version": "1.9.0",
"license": "MIT",
@@ -16418,6 +16649,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/bidi-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.2.tgz",
+ "integrity": "sha512-rzSy/k7WdX5zOyeHHCOixGXbCHkyogkxPKL2r8QtzHmVQDiWCXUWa18bLdMWT9CYMLOYTjWpTHawuev2ouYJVw==",
+ "dependencies": {
+ "require-from-string": "^2.0.2"
+ }
+ },
"node_modules/big-integer": {
"version": "1.6.51",
"license": "Unlicense",
@@ -17236,6 +17475,19 @@
"node": "*"
}
},
+ "node_modules/chevrotain": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz",
+ "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==",
+ "dependencies": {
+ "@chevrotain/cst-dts-gen": "10.5.0",
+ "@chevrotain/gast": "10.5.0",
+ "@chevrotain/types": "10.5.0",
+ "@chevrotain/utils": "10.5.0",
+ "lodash": "4.17.21",
+ "regexp-to-ast": "0.5.0"
+ }
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"funding": [
@@ -19032,6 +19284,11 @@
"version": "1.0.8",
"license": "BSD-2-Clause"
},
+ "node_modules/dat.gui": {
+ "version": "0.7.9",
+ "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz",
+ "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ=="
+ },
"node_modules/data-uri-to-buffer": {
"version": "4.0.1",
"dev": true,
@@ -19075,6 +19332,11 @@
"node": ">=0.11.0"
}
},
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
+ },
"node_modules/debounce-promise": {
"version": "3.1.2",
"license": "MIT"
@@ -19485,6 +19747,14 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/detect-gpu": {
+ "version": "4.0.50",
+ "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-4.0.50.tgz",
+ "integrity": "sha512-T67HE5+ONONN8rPXCBJPupyCg2QT8+l2NUUMuPxAppsMJBDPG/Jg0URLs6GyDzLm2niUE+oncIHSuy3VinoPeQ==",
+ "dependencies": {
+ "webgl-constants": "^1.1.1"
+ }
+ },
"node_modules/detect-indent": {
"version": "6.1.0",
"dev": true,
@@ -19759,6 +20029,11 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/draco3d": {
+ "version": "1.5.6",
+ "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.6.tgz",
+ "integrity": "sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ=="
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"license": "MIT"
@@ -21368,6 +21643,11 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/fflate": {
+ "version": "0.6.10",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz",
+ "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="
+ },
"node_modules/figgy-pudding": {
"version": "3.5.2",
"license": "ISC"
@@ -22224,6 +22504,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/glsl-noise": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz",
+ "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="
+ },
"node_modules/goober": {
"version": "2.1.13",
"license": "MIT",
@@ -26077,6 +26362,11 @@
"node": ">= 8"
}
},
+ "node_modules/ktx-parse": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.4.5.tgz",
+ "integrity": "sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg=="
+ },
"node_modules/language-subtag-registry": {
"version": "0.3.22",
"license": "CC0-1.0"
@@ -26218,6 +26508,12 @@
"immediate": "~3.0.5"
}
},
+ "node_modules/lil-gui": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz",
+ "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==",
+ "dev": true
+ },
"node_modules/lilconfig": {
"version": "2.1.0",
"license": "MIT",
@@ -26372,6 +26668,16 @@
"version": "4.6.2",
"license": "MIT"
},
+ "node_modules/lodash.omit": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
+ "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg=="
+ },
+ "node_modules/lodash.pick": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q=="
+ },
"node_modules/lodash.template": {
"version": "4.5.0",
"license": "MIT",
@@ -27284,6 +27590,20 @@
}
}
},
+ "node_modules/meshline": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/meshline/-/meshline-2.0.4.tgz",
+ "integrity": "sha512-Jh6DJl/zLqA4xsKvGv5950jr2ukyXQE1wgxs8u94cImHrvL6soVIggqjP+2hVHZXGYaKnWszhtjuCbKNeQyYiw==",
+ "peerDependencies": {
+ "three": ">=0.137"
+ }
+ },
+ "node_modules/meshoptimizer": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz",
+ "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==",
+ "dev": true
+ },
"node_modules/methods": {
"version": "1.1.2",
"dev": true,
@@ -28259,6 +28579,11 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/mmd-parser": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mmd-parser/-/mmd-parser-1.0.4.tgz",
+ "integrity": "sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg=="
+ },
"node_modules/mobx": {
"version": "6.9.0",
"license": "MIT",
@@ -30295,6 +30620,21 @@
"opener": "bin/opener-bin.js"
}
},
+ "node_modules/opentype.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz",
+ "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==",
+ "dependencies": {
+ "string.prototype.codepointat": "^0.2.1",
+ "tiny-inflate": "^1.0.3"
+ },
+ "bin": {
+ "ot": "bin/ot"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.1",
"license": "MIT",
@@ -32382,6 +32722,11 @@
"node": ">=0.10.0"
}
},
+ "node_modules/potpack": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
+ "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="
+ },
"node_modules/preact": {
"version": "10.15.1",
"license": "MIT",
@@ -32890,6 +33235,17 @@
"react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/react-composer": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz",
+ "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==",
+ "dependencies": {
+ "prop-types": "^15.6.0"
+ },
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/react-contexify": {
"version": "5.0.0",
"license": "MIT",
@@ -33278,7 +33634,6 @@
},
"node_modules/react-merge-refs": {
"version": "1.1.0",
- "dev": true,
"license": "MIT",
"funding": {
"type": "github",
@@ -33314,6 +33669,22 @@
"version": "3.2.2",
"license": "MIT"
},
+ "node_modules/react-reconciler": {
+ "version": "0.26.2",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz",
+ "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "scheduler": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "react": "^17.0.2"
+ }
+ },
"node_modules/react-redux": {
"version": "7.2.9",
"license": "MIT",
@@ -33490,6 +33861,11 @@
"react": ">= 0.14.0"
}
},
+ "node_modules/react-three-fiber": {
+ "version": "0.0.0-deprecated",
+ "resolved": "https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-0.0.0-deprecated.tgz",
+ "integrity": "sha512-EblIqTAsIpkYeM8bZtC4lcpTE0A2zCEGipFB52RgcQq/q+0oryrk7Sxt+sqhIjUu6xMNEVywV8dr74lz5yWO6A=="
+ },
"node_modules/react-tooltip": {
"version": "4.5.1",
"license": "MIT",
@@ -33597,6 +33973,18 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/react-use-measure": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz",
+ "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==",
+ "dependencies": {
+ "debounce": "^1.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.13",
+ "react-dom": ">=16.13"
+ }
+ },
"node_modules/react-virtualized-auto-sizer": {
"version": "1.0.18",
"license": "MIT",
@@ -34002,6 +34390,11 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/regexp-to-ast": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
+ "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw=="
+ },
"node_modules/regexp.prototype.flags": {
"version": "1.5.0",
"license": "MIT",
@@ -35979,6 +36372,11 @@
"node": ">=0.10.0"
}
},
+ "node_modules/stats.js": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
+ "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="
+ },
"node_modules/statuses": {
"version": "2.0.1",
"dev": true,
@@ -36351,6 +36749,11 @@
"version": "8.0.0",
"license": "MIT"
},
+ "node_modules/string.prototype.codepointat": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
+ "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
+ },
"node_modules/string.prototype.matchall": {
"version": "4.0.8",
"license": "MIT",
@@ -36722,6 +37125,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/suspend-react": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.0.8.tgz",
+ "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==",
+ "peerDependencies": {
+ "react": ">=17.0"
+ }
+ },
"node_modules/swiper": {
"version": "6.8.4",
"funding": [
@@ -37097,6 +37508,40 @@
"node": ">=0.8"
}
},
+ "node_modules/three": {
+ "version": "0.154.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.154.0.tgz",
+ "integrity": "sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug=="
+ },
+ "node_modules/three-mesh-bvh": {
+ "version": "0.5.24",
+ "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.5.24.tgz",
+ "integrity": "sha512-VTIgfjz8aFoPKTQoMIQQv9jJD4ybFRZuKKE1/kqy78FQcuHQ0+iIWv7C5cSb2inlvs7bNMVY3yRx3RXGZfrvzQ==",
+ "peerDependencies": {
+ "three": ">= 0.123.0"
+ }
+ },
+ "node_modules/three-stdlib": {
+ "version": "2.23.13",
+ "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.23.13.tgz",
+ "integrity": "sha512-WU4XHs4E6szAyoREzTs5bUAc1WFadiz5jRjNlA7aIIqf+raT4jfA320P0XmlyZz/wJwmpZnOuki4kAFsmadkTQ==",
+ "dependencies": {
+ "@types/draco3d": "^1.4.0",
+ "@types/offscreencanvas": "^2019.6.4",
+ "@types/webxr": "^0.5.2",
+ "chevrotain": "^10.1.2",
+ "draco3d": "^1.4.1",
+ "fflate": "^0.6.9",
+ "ktx-parse": "^0.4.5",
+ "mmd-parser": "^1.0.4",
+ "opentype.js": "^1.3.3",
+ "potpack": "^1.0.1",
+ "zstddec": "^0.0.2"
+ },
+ "peerDependencies": {
+ "three": ">=0.128.0"
+ }
+ },
"node_modules/throat": {
"version": "6.0.2",
"dev": true,
@@ -37131,6 +37576,11 @@
"version": "2.1.0",
"license": "MIT"
},
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+ },
"node_modules/tiny-invariant": {
"version": "1.3.1",
"license": "MIT"
@@ -37330,6 +37780,33 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/troika-three-text": {
+ "version": "0.46.4",
+ "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.46.4.tgz",
+ "integrity": "sha512-Qsv0HhUKTZgSmAJs5wvO7YlBoJSP9TGPLmrg+K9pbQq4lseQdcevbno/WI38bwJBZ/qS56hvfqEzY0zUEFzDIw==",
+ "dependencies": {
+ "bidi-js": "^1.0.2",
+ "troika-three-utils": "^0.46.0",
+ "troika-worker-utils": "^0.46.0",
+ "webgl-sdf-generator": "1.1.1"
+ },
+ "peerDependencies": {
+ "three": ">=0.103.0"
+ }
+ },
+ "node_modules/troika-three-utils": {
+ "version": "0.46.0",
+ "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.46.0.tgz",
+ "integrity": "sha512-llHyrXAcwzr0bpg80GxsIp73N7FuImm4WCrKDJkAqcAsWmE5pfP9+Qzw+oMWK1P/AdHQ79eOrOl9NjyW4aOw0w==",
+ "peerDependencies": {
+ "three": ">=0.103.0"
+ }
+ },
+ "node_modules/troika-worker-utils": {
+ "version": "0.46.0",
+ "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.46.0.tgz",
+ "integrity": "sha512-bzOx5f2ZBxkFhXtIvDJlLn2AI3bzCkGVbCndl/2dL5QZrwHEKl45OEIilCxYQQWJG1rEbOD9O80tMjoYjw19OA=="
+ },
"node_modules/trough": {
"version": "1.0.5",
"license": "MIT",
@@ -38370,6 +38847,17 @@
"node": ">=0.10.0"
}
},
+ "node_modules/use-asset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/use-asset/-/use-asset-1.0.4.tgz",
+ "integrity": "sha512-7/hqDrWa0iMnCoET9W1T07EmD4Eg/Wmoj/X8TGBc++ECRK4m5yTsjP4O6s0yagbxfqIOuUkIxe2/sA+VR2GxZA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "react": ">=17.0"
+ }
+ },
"node_modules/use-callback-ref": {
"version": "1.3.0",
"license": "MIT",
@@ -38477,6 +38965,14 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/utility-types": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
+ "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/utils-merge": {
"version": "1.0.1",
"dev": true,
@@ -39109,6 +39605,16 @@
"version": "1.2.0",
"license": "Apache-2.0"
},
+ "node_modules/webgl-constants": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz",
+ "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="
+ },
+ "node_modules/webgl-sdf-generator": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz",
+ "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="
+ },
"node_modules/webidl-conversions": {
"version": "6.1.0",
"dev": true,
@@ -39895,6 +40401,27 @@
"url": "https://github.com/sponsors/colinhacks"
}
},
+ "node_modules/zstddec": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.0.2.tgz",
+ "integrity": "sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA=="
+ },
+ "node_modules/zustand": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
+ "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/zwitch": {
"version": "2.0.4",
"license": "MIT",
diff --git a/packages/common/hooks/index.ts b/packages/common/hooks/index.ts
index 65b5a76ec98..12b0a79170f 100644
--- a/packages/common/hooks/index.ts
+++ b/packages/common/hooks/index.ts
@@ -1,3 +1,4 @@
export * from './useBreakpoint'
+export * from './useDebounce'
export * from './useParams'
export * from './useTelemetryProps'
diff --git a/packages/common/hooks/useDebounce.tsx b/packages/common/hooks/useDebounce.tsx
new file mode 100644
index 00000000000..9f70e50df7f
--- /dev/null
+++ b/packages/common/hooks/useDebounce.tsx
@@ -0,0 +1,20 @@
+import { useEffect, useMemo, useRef } from 'react'
+import { debounce } from 'lodash'
+
+export const useDebounce = (callback: () => void, delay: number = 1000) => {
+ const ref = useRef()
+
+ useEffect(() => {
+ ref.current = callback
+ }, [callback])
+
+ const debouncedCallback = useMemo(() => {
+ const func = () => {
+ ref.current?.()
+ }
+
+ return debounce(func, delay)
+ }, [])
+
+ return debouncedCallback
+}
diff --git a/packages/config/ui.config.js b/packages/config/ui.config.js
index 1683f2178a5..be34a9cf667 100644
--- a/packages/config/ui.config.js
+++ b/packages/config/ui.config.js
@@ -257,8 +257,8 @@ const uiConfig = {
},
},
animation: {
- 'fade-in': 'fadeIn 300ms',
- 'fade-out': 'fadeOut 300ms',
+ 'fade-in': 'fadeIn 300ms both',
+ 'fade-out': 'fadeOut 300ms both',
'dropdown-content-show': 'overlayContentShow 100ms cubic-bezier(0.16, 1, 0.3, 1)',
'dropdown-content-hide': 'overlayContentHide 100ms cubic-bezier(0.16, 1, 0.3, 1)',
diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx
index ae5581d03ea..88f5d9b0ef5 100644
--- a/packages/ui/index.tsx
+++ b/packages/ui/index.tsx
@@ -62,6 +62,9 @@ export * from './src/components/Form'
// CMD+K
export * from './src/components/Command'
+// Widgets
+export * from './src/components/CountdownWidget'
+
// layout
export * from './src/components/LoadingLine'
diff --git a/packages/ui/src/components/CountdownWidget/CountdownStep.tsx b/packages/ui/src/components/CountdownWidget/CountdownStep.tsx
new file mode 100644
index 00000000000..b1521b5ff24
--- /dev/null
+++ b/packages/ui/src/components/CountdownWidget/CountdownStep.tsx
@@ -0,0 +1,17 @@
+interface CountdownStepProps {
+ value: string | number
+ unit: string
+}
+
+function CountdownStep({ value, unit }: CountdownStepProps) {
+ return (
+
+ )
+}
+
+export default CountdownStep
diff --git a/packages/ui/src/components/CountdownWidget/CountdownWidget.tsx b/packages/ui/src/components/CountdownWidget/CountdownWidget.tsx
new file mode 100644
index 00000000000..ed61492064b
--- /dev/null
+++ b/packages/ui/src/components/CountdownWidget/CountdownWidget.tsx
@@ -0,0 +1,34 @@
+import CountdownStep from './CountdownStep'
+
+interface CountdownWidgetProps {
+ days?: string
+ hours?: string
+ minutes?: string
+ seconds?: string
+}
+
+function CountdownWidget({ days, hours, minutes, seconds }: CountdownWidgetProps) {
+ return (
+
+ {days !== undefined && (
+ <>
+ :
+ >
+ )}
+ {hours !== undefined && (
+ <>
+ :
+ >
+ )}
+ {minutes !== undefined && (
+ <>
+
+ {seconds !== undefined && ' :'}
+ >
+ )}
+ {seconds !== undefined && }
+
+ )
+}
+
+export default CountdownWidget
diff --git a/packages/ui/src/components/CountdownWidget/index.ts b/packages/ui/src/components/CountdownWidget/index.ts
new file mode 100644
index 00000000000..0c677d46517
--- /dev/null
+++ b/packages/ui/src/components/CountdownWidget/index.ts
@@ -0,0 +1 @@
+export { default as CountdownWidget } from './CountdownWidget'
diff --git a/packages/ui/src/layout/banners/Announcement.tsx b/packages/ui/src/layout/banners/Announcement.tsx
index 505c20b36bc..6613c5f4aee 100644
--- a/packages/ui/src/layout/banners/Announcement.tsx
+++ b/packages/ui/src/layout/banners/Announcement.tsx
@@ -58,11 +58,11 @@ const Announcement = ({
return (
window.location.assign(announcement.link)}
- className={['relative w-full cursor-pointer', className].join(' ')}
+ className={['relative z-40 w-full cursor-pointer', className].join(' ')}
>
{!isLaunchWeekSection && (
diff --git a/packages/ui/src/layout/banners/Announcement.Countdown.tsx b/packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx
similarity index 52%
rename from packages/ui/src/layout/banners/Announcement.Countdown.tsx
rename to packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx
index 8031b9ab36d..e1b9a590ff1 100644
--- a/packages/ui/src/layout/banners/Announcement.Countdown.tsx
+++ b/packages/ui/src/layout/banners/LW8CountdownBanner/LW8CountdownBanner.tsx
@@ -1,13 +1,10 @@
import { useRouter } from 'next/router'
import { PropsWithChildren } from 'react'
import Countdown from 'react-countdown'
-import { AnnouncementProps } from './Announcement'
-import _announcement from './data/Announcement.json'
-
-interface CountdownStepProps {
- value: string | number
- unit: string
-}
+import { AnnouncementProps } from '../Announcement'
+import _announcement from '../data/Announcement.json'
+import CountdownWidget from '../../../components/CountdownWidget/CountdownWidget'
+import Lw8BannerBg from './Lw8BannerBg'
interface CountdownButtonProps {
dest: string
@@ -15,41 +12,32 @@ interface CountdownButtonProps {
const announcement = _announcement as AnnouncementProps
-function CountdownStep({ value, unit }: CountdownStepProps) {
- return (
-
- )
-}
-
function CountdownButton({ children, dest }: PropsWithChildren
) {
return (
{children}
)
}
-function CountdownBanner() {
+export function LW8CountdownBanner() {
const { pathname } = useRouter()
const isLaunchWeekPage = pathname === '/launch-week'
const isLaunchWeekSection = pathname.includes('launch-week')
+ if (isLaunchWeekPage) return null
+
const renderer = ({ days, hours, minutes, seconds, completed }: any) => {
if (completed) {
// Render a completed state
return (
-
Supabase Launch Week 7
+
Supabase Launch Week 8
- Explore
+ Live now
)
@@ -63,17 +51,16 @@ function CountdownBanner() {
].join(' ')}
>
- Supabase Launch Week 7
+ Supabase Launch Week 8
- :
- :
- :
-
+
{!isLaunchWeekPage && (
- Get your ticket
+
+ Get your ticket
+
)}
@@ -82,10 +69,19 @@ function CountdownBanner() {
}
return (
-
-
+
)
}
-export default CountdownBanner
+export default LW8CountdownBanner
diff --git a/packages/ui/src/layout/banners/LW8CountdownBanner/Lw8BannerBg.tsx b/packages/ui/src/layout/banners/LW8CountdownBanner/Lw8BannerBg.tsx
new file mode 100644
index 00000000000..72fc431e99c
--- /dev/null
+++ b/packages/ui/src/layout/banners/LW8CountdownBanner/Lw8BannerBg.tsx
@@ -0,0 +1,224 @@
+export default function Lw8BannerBg({ className }: { className?: string }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/packages/ui/src/layout/banners/LW8CountdownBanner/index.ts b/packages/ui/src/layout/banners/LW8CountdownBanner/index.ts
new file mode 100644
index 00000000000..f87f7ca1cb9
--- /dev/null
+++ b/packages/ui/src/layout/banners/LW8CountdownBanner/index.ts
@@ -0,0 +1 @@
+export { LW8CountdownBanner } from './LW8CountdownBanner'
diff --git a/packages/ui/src/layout/banners/data/Announcement.json b/packages/ui/src/layout/banners/data/Announcement.json
index f8a5db4f13e..abb5cec8362 100644
--- a/packages/ui/src/layout/banners/data/Announcement.json
+++ b/packages/ui/src/layout/banners/data/Announcement.json
@@ -1,7 +1,7 @@
{
"show": true,
- "text": "Supabase Launch Week 7",
- "launchDate": "2023-04-10T07:00:00.000-07:00",
+ "text": "Supabase Launch Week 8",
+ "launchDate": "2023-08-07T09:00:00.000-07:00",
"link": "https://supabase.com/launch-week",
"badge": "Get your ticket"
}
diff --git a/packages/ui/src/layout/banners/index.tsx b/packages/ui/src/layout/banners/index.tsx
index 88c3f4190ac..49a7d6ec582 100644
--- a/packages/ui/src/layout/banners/index.tsx
+++ b/packages/ui/src/layout/banners/index.tsx
@@ -1,2 +1,2 @@
export { default as Announcement } from './Announcement'
-export { default as AnnouncementCountdown } from './Announcement.Countdown'
+export { default as LW8CountdownBanner } from './LW8CountdownBanner/LW8CountdownBanner'