From 231d8bbc22c2646b0c972cc072884b7bc21a559c Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 17 Aug 2022 18:25:39 +0800 Subject: [PATCH 01/79] Midway starting on realtime landing page --- apps/www/data/Solutions.json | 8 + .../data/products/realtime/api-examples.js | 83 +++++++++ .../data/products/realtime/app-examples.js | 62 +++++++ apps/www/pages/realtime/Realtime.module.css | 7 + apps/www/pages/realtime/Realtime.tsx | 175 ++++++++++++++++++ apps/www/pages/realtime/index.tsx | 3 + 6 files changed, 338 insertions(+) create mode 100644 apps/www/data/products/realtime/api-examples.js create mode 100644 apps/www/data/products/realtime/app-examples.js create mode 100644 apps/www/pages/realtime/Realtime.module.css create mode 100644 apps/www/pages/realtime/Realtime.tsx create mode 100644 apps/www/pages/realtime/index.tsx diff --git a/apps/www/data/Solutions.json b/apps/www/data/Solutions.json index 7e9131da046..e6abd655e13 100644 --- a/apps/www/data/Solutions.json +++ b/apps/www/data/Solutions.json @@ -30,5 +30,13 @@ "description_short": "", "label": "", "url": "/edge-functions" + }, + "realtime": { + "name": "Realtime", + "icon": "M13 10V3L4 14h7v7l9-11h-7z", + "description": "Listen to changes in a Postgres Database and broadcast them over web sockets", + "description_short": "", + "label": "", + "url": "/realtime" } } diff --git a/apps/www/data/products/realtime/api-examples.js b/apps/www/data/products/realtime/api-examples.js new file mode 100644 index 00000000000..3519bdba82e --- /dev/null +++ b/apps/www/data/products/realtime/api-examples.js @@ -0,0 +1,83 @@ +export default [ + { + lang: 'js', + title: 'Subscribing to events', + description: '', + code: ` +import { RealtimeClient } from '@supabase/realtime-js' +const client = new RealtimeClient(process.env.REALTIME_URL) + +// Listen to events on the entire database. +const databaseChanges = client.channel('realtime:*') +databaseChanges.on('*', (e) => console.log(e)) +databaseChanges.subscribe() + + + + + + + + + + + + + + + + `, + }, + { + lang: 'js', + title: 'Presence', + description: '', + code: ` +import { RealtimeClient } from '@supabase/realtime-js' +const client = new RealtimeClient(process.env.REALTIME_URL) + +const channel = client.channel('room:*') +channel.on('presence', { event: 'SYNC' }, () => { + console.log('Presence synced') +}) +channel.subscribe().receive('ok', () => console.log('Subscribed!)) + + + + + + + + + + + + + `, + }, + { + lang: 'js', + title: 'Broadcast', + description: '', + code: ` + // Sign in with magic links + const { user, error } = await supabase.auth.signIn({ + email: 'example@email.com' + }) + + + + + + + + + + + + + + + `, + }, +] diff --git a/apps/www/data/products/realtime/app-examples.js b/apps/www/data/products/realtime/app-examples.js new file mode 100644 index 00000000000..c9b7bcc93b5 --- /dev/null +++ b/apps/www/data/products/realtime/app-examples.js @@ -0,0 +1,62 @@ +export default [ + { + image: '', + title: 'Leaderboard', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Shared code editor', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Shared text editor', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Stock market', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Share whiteboard', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Multiplayer', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Charts', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Location', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'Notifications', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, + { + image: '', + title: 'In app chat', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + }, +] diff --git a/apps/www/pages/realtime/Realtime.module.css b/apps/www/pages/realtime/Realtime.module.css new file mode 100644 index 00000000000..3dd7008e1bd --- /dev/null +++ b/apps/www/pages/realtime/Realtime.module.css @@ -0,0 +1,7 @@ +/* .github-icon svg { + fill: currentColor; +} */ + +.github-icon { + @apply text-white; +} diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx new file mode 100644 index 00000000000..0cfd3b81ca3 --- /dev/null +++ b/apps/www/pages/realtime/Realtime.tsx @@ -0,0 +1,175 @@ +import { + Button, + IconArrowUpRight, + IconBriefcase, + IconEye, + IconLink, + IconShield, +} from '@supabase/ui' + +// [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" +import ApiExamples from 'data/products/realtime/api-examples' +import AppExamples from 'data/products/realtime/app-examples' + +import AuthSqlRulesExamples from 'data/products/auth/auth-sql-rules-examples' +import Solutions from 'data/Solutions.json' +import { NextSeo } from 'next-seo' +import Image from 'next/image' +import Link from 'next/link' +import { useRouter } from 'next/router' +import SplitCodeBlockCarousel from '~/components/Carousels/SplitCodeBlockCarousel' +import CTABanner from '~/components/CTABanner' +import FeatureColumn from '~/components/FeatureColumn' +import FloatingIcons from '~/components/FloatingIcons' +import DefaultLayout from '~/components/Layouts/Default' +import SectionContainer from '~/components/Layouts/SectionContainer' +import APISection from '~/components/Sections/APISection' +import GithubExamples from '~/components/Sections/GithubExamples' +import ProductHeader from '~/components/Sections/ProductHeader' +import AuthProviders from '~/data/auth.json' + +const Cursor = (color: string = 'none') => { + return ( + + ) +} + +function AuthPage() { + // base path for images + const { basePath } = useRouter() + const meta_title = 'Realtime | Sync your data in real time' + const meta_description = + 'Listens to changes in a PostgreSQL Database and broadcasts them over WebSockets' + + return ( + <> + + + Build reactive web and mobile applications]} + subheader={[ + 'Sync data across clients by listening to changes in your Database and broadcasting them over web sockets', + ]} + image={[ +
+ +
, + //
+ // auth header + //
, + //
+ // auth header + //
, + ]} + // [TODO] Point to the correct docs URL + documentation_url={'/docs/guides/auth'} + /> + + + + {/* [TODO] Update copy */} +

+ APIs that you can understand. With powerful libraries that work on client and + server-side applications. +

+

, + ]} + // [TODO] Point to the correct docs URL + documentation_link={'/docs/guides/auth'} + /> +
+ +
+
+
+
+
+
+ +
+ + + +
+
+
+
+ + +
+
+

What you can build with Realtime

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. +

+
+ {AppExamples.map((example) => { + return ( +
+
+

{example.title}

+

{example.description}

+
+ ) + })} +
+
+
+ + + + + + ) +} + +export default AuthPage diff --git a/apps/www/pages/realtime/index.tsx b/apps/www/pages/realtime/index.tsx new file mode 100644 index 00000000000..a8eea95247e --- /dev/null +++ b/apps/www/pages/realtime/index.tsx @@ -0,0 +1,3 @@ +import Realtime from './Realtime' + +export default Realtime From 7612f6725c300384b613c4f937b8309cf132b3cc Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 17 Aug 2022 20:18:26 +0800 Subject: [PATCH 02/79] Playing around with hero image --- apps/www/pages/realtime/Realtime.module.css | 100 +++++++++++++++++++- apps/www/pages/realtime/Realtime.tsx | 34 ++++++- 2 files changed, 125 insertions(+), 9 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.module.css b/apps/www/pages/realtime/Realtime.module.css index 3dd7008e1bd..dab399b724c 100644 --- a/apps/www/pages/realtime/Realtime.module.css +++ b/apps/www/pages/realtime/Realtime.module.css @@ -1,7 +1,97 @@ -/* .github-icon svg { - fill: currentColor; -} */ +.element { + animation: element 8s infinite; +} -.github-icon { - @apply text-white; +@keyframes element { + 39% { + border-color: hsla(153, 60%, 28%, 1) + } + 40% { + border-color: #FFF; + } + 75% { + border-color: #FFF; + } + 80% { + border-color: hsla(153, 60%, 28%, 1) + } +} + +.cursor-1 { + transform-origin: left; + animation: cursor-1 8s cubic-bezier(0, 0, 0.2, 1) infinite; +} + +@keyframes cursor-1 { + 20%{ + transform: scale(1) translate(0) + } + 25% { + transform: scale(1) translate(-50px, -20px) + } + 39% { + transform: scale(1) translate(-50px, -20px) + } + 40% { + transform: scale(0.9) translate(-50px, -20px) + } + 41% { + transform: scale(1) translate(-50px, -20px) + } + 75% { + transform: scale(1) translate(-50px, -20px) + } + 80% { + transform: scale(1) translate(0) + } +} + +.cursor-2 { + animation: cursor-2 6s cubic-bezier(0, 0, 0.2, 1) infinite; +} + +@keyframes cursor-2 { + 15% { + transform: translate(0px, 0px) + } + 20% { + transform: translate(70px, -40px) + } + 70% { + transform: translate(70px, -40px) + } + 75% { + transform: translate(0px, 0px) + } +} + +.comment-bubble { + animation: chat 6s cubic-bezier(0, 0, 0.2, 1) infinite; +} + +@keyframes chat { + 0% { + opacity: 0; + transform: translateY(5px); + } + 25% { + opacity: 0; + transform: translateY(5px); + } + 30% { + opacity: 1; + transform: translateY(0); + } + 65% { + opacity: 1; + transform: translateY(0); + } + 70% { + opacity: 0; + transform: translateY(5px); + } + 100% { + opacity: 0; + transform: translateY(5px); + } } diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 0cfd3b81ca3..b464526d617 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -10,6 +10,7 @@ import { // [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" import ApiExamples from 'data/products/realtime/api-examples' import AppExamples from 'data/products/realtime/app-examples' +import RealtimeStyles from './Realtime.module.css' import AuthSqlRulesExamples from 'data/products/auth/auth-sql-rules-examples' import Solutions from 'data/Solutions.json' @@ -28,14 +29,14 @@ import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' import AuthProviders from '~/data/auth.json' -const Cursor = (color: string = 'none') => { +const Cursor = ({ className = '', color = 'none' }) => { return (
+
+ + +
+
+
+
+
, //
// Date: Wed, 17 Aug 2022 20:29:01 +0800 Subject: [PATCH 03/79] Fix odd issue --- apps/www/pages/realtime/Realtime.tsx | 34 +++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index b464526d617..b37cc3d95fe 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -48,7 +48,7 @@ const Cursor = ({ className = '', color = 'none' }) => { ) } -function AuthPage() { +function RealtimePage() { // base path for images const { basePath } = useRouter() const meta_title = 'Realtime | Sync your data in real time' @@ -141,7 +141,6 @@ function AuthPage() { size="large" text={[

- {/* [TODO] Update copy */}

APIs that you can understand. With powerful libraries that work on client and server-side applications. @@ -192,10 +191,39 @@ function AuthPage() {

+ +
+
+

User permissions without the middleware

+ +

+ Supabase Auth works without any additional servers. Build Authorization rules with + Postgres' Row Level Security, controlling who can create, edit and delete specific + rows in your database. +

+

Policies can be written in SQL or using the dashboard online.

+ + + + + + +
+
+ +
+
+
+ ) } -export default AuthPage +export default RealtimePage From 098674b7a86424d141a0533de69c8e657b35ac38 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 17 Aug 2022 20:31:09 +0800 Subject: [PATCH 04/79] leave comment --- apps/www/pages/realtime/Realtime.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index b37cc3d95fe..6c99726660a 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -191,6 +191,7 @@ function RealtimePage() {
+ {/* Somehow removing this section messes up all the alignment? */}
From f7f241325258065d72d2521b0ebeeb65f20c7a05 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 17 Aug 2022 20:33:30 +0800 Subject: [PATCH 05/79] leave comment --- apps/www/pages/realtime/Realtime.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 6c99726660a..a6a9b36e77c 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -84,6 +84,7 @@ function RealtimePage() { image={[ // [TODO] Just playing around with some ideas
+

Just playing around with some ideas

Date: Wed, 17 Aug 2022 18:36:50 -0500 Subject: [PATCH 06/79] chore: add images in light/dark mode for realtime lp --- apps/www/pages/realtime/Realtime.tsx | 84 +++++++++++++++++-- .../example-apps/dark/in-app-chat.svg | 20 +++++ .../example-apps/dark/leaderboard.svg | 34 ++++++++ .../example-apps/dark/live-avatars.svg | 38 +++++++++ .../example-apps/dark/live-cursors.svg | 7 ++ .../realtime/example-apps/dark/location.svg | 18 ++++ .../example-apps/dark/multiplayer-game.svg | 59 +++++++++++++ .../example-apps/dark/notification.svg | 10 +++ .../example-apps/dark/notifications.svg | 10 +++ .../example-apps/dark/stock-market.svg | 25 ++++++ .../example-apps/dark/text-editor.svg | 41 +++++++++ .../realtime/example-apps/dark/whiteboard.svg | 10 +++ .../example-apps/light/in-app-chat.svg | 20 +++++ .../example-apps/light/leaderboard.svg | 34 ++++++++ .../example-apps/light/live-avatars.svg | 38 +++++++++ .../example-apps/light/live-cursors.svg | 7 ++ .../realtime/example-apps/light/location.svg | 18 ++++ .../example-apps/light/multiplayer-game.svg | 59 +++++++++++++ .../example-apps/light/notifications.svg | 10 +++ .../example-apps/light/stock-market.svg | 25 ++++++ .../example-apps/light/text-editor.svg | 41 +++++++++ .../example-apps/light/whiteboard.svg | 10 +++ .../realtime-image/shared-editor.svg | 16 ++++ 23 files changed, 629 insertions(+), 5 deletions(-) create mode 100644 apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/leaderboard.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/live-avatars.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/live-cursors.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/location.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/multiplayer-game.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/notification.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/notifications.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/stock-market.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/text-editor.svg create mode 100644 apps/www/public/images/realtime/example-apps/dark/whiteboard.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/in-app-chat.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/leaderboard.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/live-avatars.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/live-cursors.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/location.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/multiplayer-game.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/notifications.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/stock-market.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/text-editor.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/whiteboard.svg create mode 100644 apps/www/public/images/realtime/example-apps/realtime-image/shared-editor.svg diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index a6a9b36e77c..8614de4ddeb 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -48,6 +48,51 @@ const Cursor = ({ className = '', color = 'none' }) => { ) } +const exampleApps = [ + { + img: 'notifications.svg', + title: 'Notifications', + description: 'sadcsdas sad asds dsdas asdas as', + }, + { + img: 'live-avatars.svg', + title: 'Live avatars', + description: 'sadcsdas sad asds dsdas asdas as', + }, + { + img: 'live-cursors.svg', + title: 'Live cursors', + description: 'sadcsdas sad asds dsdas asdas as', + }, + { + img: 'leaderboard.svg', + title: 'Leaderboards', + description: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna.', + }, + { + img: 'stock-market.svg', + title: 'Live charts', + description: + 'Keep charts updated in realtime. Supabase can detect changes in your database and then update the client immediately.', + }, + { img: 'in-app-chat.svg', title: 'In app chat', description: 'sadcsdas sad asds dsdas asdas as' }, + // { + // img: 'shared-docs.svg', + // title: 'Shared text editor', + // description: 'sadcsdas sad asds dsdas asdas as', + // }, + { + img: 'text-editor.svg', + title: 'Shared code editor editor', + description: 'sadcsdas sad asds dsdas asdas as', + }, + + { img: 'whiteboard.svg', title: 'Shared whiteboard', description: 'bbb' }, + { img: 'location.svg', title: 'Location', description: 'bbb' }, + { img: 'multiplayer-game.svg', title: 'Multiplayer games', description: 'bbb' }, +] + function RealtimePage() { // base path for images const { basePath } = useRouter() @@ -75,8 +120,8 @@ function RealtimePage() { /> Build reactive web and mobile applications]} subheader={[ 'Sync data across clients by listening to changes in your Database and broadcasting them over web sockets', @@ -134,6 +179,38 @@ function RealtimePage() { documentation_url={'/docs/guides/auth'} /> + +
+

What you can build with Realtime

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. +

+
+
+ {exampleApps.map((example) => { + return ( +
+ {example.title} + {example.title} +
+

{example.title}

+

{example.description}

+
+
+ ) + })} +
+
+ -
@@ -168,7 +244,6 @@ function RealtimePage() {
-
@@ -191,7 +266,6 @@ function RealtimePage() {
- {/* Somehow removing this section messes up all the alignment? */}
diff --git a/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg b/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg new file mode 100644 index 00000000000..3d116da97c8 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/leaderboard.svg b/apps/www/public/images/realtime/example-apps/dark/leaderboard.svg new file mode 100644 index 00000000000..989d84ec5df --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/leaderboard.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/live-avatars.svg b/apps/www/public/images/realtime/example-apps/dark/live-avatars.svg new file mode 100644 index 00000000000..134d99c41e1 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/live-avatars.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/live-cursors.svg b/apps/www/public/images/realtime/example-apps/dark/live-cursors.svg new file mode 100644 index 00000000000..0beec0dee72 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/live-cursors.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/location.svg b/apps/www/public/images/realtime/example-apps/dark/location.svg new file mode 100644 index 00000000000..f0172738126 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/location.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/multiplayer-game.svg b/apps/www/public/images/realtime/example-apps/dark/multiplayer-game.svg new file mode 100644 index 00000000000..ff8fb406daf --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/multiplayer-game.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/notification.svg b/apps/www/public/images/realtime/example-apps/dark/notification.svg new file mode 100644 index 00000000000..74302e0a18a --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/notification.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/notifications.svg b/apps/www/public/images/realtime/example-apps/dark/notifications.svg new file mode 100644 index 00000000000..74302e0a18a --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/notifications.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/stock-market.svg b/apps/www/public/images/realtime/example-apps/dark/stock-market.svg new file mode 100644 index 00000000000..6dcdab1c311 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/stock-market.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/text-editor.svg b/apps/www/public/images/realtime/example-apps/dark/text-editor.svg new file mode 100644 index 00000000000..03896ea0d50 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/text-editor.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/whiteboard.svg b/apps/www/public/images/realtime/example-apps/dark/whiteboard.svg new file mode 100644 index 00000000000..b8cfe3d70a8 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/whiteboard.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg b/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg new file mode 100644 index 00000000000..dd36da4fc17 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/leaderboard.svg b/apps/www/public/images/realtime/example-apps/light/leaderboard.svg new file mode 100644 index 00000000000..32f949db971 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/leaderboard.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/live-avatars.svg b/apps/www/public/images/realtime/example-apps/light/live-avatars.svg new file mode 100644 index 00000000000..42b1765ba08 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/live-avatars.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/live-cursors.svg b/apps/www/public/images/realtime/example-apps/light/live-cursors.svg new file mode 100644 index 00000000000..f523dc19706 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/live-cursors.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/location.svg b/apps/www/public/images/realtime/example-apps/light/location.svg new file mode 100644 index 00000000000..b7b213fbd4f --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/location.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/multiplayer-game.svg b/apps/www/public/images/realtime/example-apps/light/multiplayer-game.svg new file mode 100644 index 00000000000..4b27cbdf8c3 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/multiplayer-game.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/notifications.svg b/apps/www/public/images/realtime/example-apps/light/notifications.svg new file mode 100644 index 00000000000..fd911748d6c --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/notifications.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/stock-market.svg b/apps/www/public/images/realtime/example-apps/light/stock-market.svg new file mode 100644 index 00000000000..0fc9750b2fa --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/stock-market.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/text-editor.svg b/apps/www/public/images/realtime/example-apps/light/text-editor.svg new file mode 100644 index 00000000000..867c4900681 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/text-editor.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/whiteboard.svg b/apps/www/public/images/realtime/example-apps/light/whiteboard.svg new file mode 100644 index 00000000000..afd19a6cc4a --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/whiteboard.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/realtime-image/shared-editor.svg b/apps/www/public/images/realtime/example-apps/realtime-image/shared-editor.svg new file mode 100644 index 00000000000..56b513c2858 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/realtime-image/shared-editor.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + From 3b7284a547b4f35cabe57e6f730e2c1507b43309 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 00:35:50 -0500 Subject: [PATCH 07/79] add more new images --- apps/www/pages/realtime/Realtime.tsx | 86 +++++++++++++++---- .../example-apps/dark/in-app-chat.svg | 39 ++++++--- .../example-apps/dark/toast-messages.svg | 10 +++ .../example-apps/light/in-app-chat.svg | 35 ++++++-- .../example-apps/light/toast-messages.svg | 10 +++ .../images/realtime/icons/broadcast-alt.svg | 60 +++++++++++++ .../images/realtime/icons/broadcast.svg | 49 +++++++++++ .../realtime/icons/database-changes.svg | 36 ++++++++ .../public/images/realtime/icons/presence.svg | 45 ++++++++++ 9 files changed, 334 insertions(+), 36 deletions(-) create mode 100644 apps/www/public/images/realtime/example-apps/dark/toast-messages.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/toast-messages.svg create mode 100644 apps/www/public/images/realtime/icons/broadcast-alt.svg create mode 100644 apps/www/public/images/realtime/icons/broadcast.svg create mode 100644 apps/www/public/images/realtime/icons/database-changes.svg create mode 100644 apps/www/public/images/realtime/icons/presence.svg diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 8614de4ddeb..bdce6f67d90 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -1,11 +1,4 @@ -import { - Button, - IconArrowUpRight, - IconBriefcase, - IconEye, - IconLink, - IconShield, -} from '@supabase/ui' +import { Button, IconArrowUpRight, IconLink } from '@supabase/ui' // [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" import ApiExamples from 'data/products/realtime/api-examples' @@ -15,19 +8,18 @@ import RealtimeStyles from './Realtime.module.css' import AuthSqlRulesExamples from 'data/products/auth/auth-sql-rules-examples' import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' -import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import SplitCodeBlockCarousel from '~/components/Carousels/SplitCodeBlockCarousel' import CTABanner from '~/components/CTABanner' -import FeatureColumn from '~/components/FeatureColumn' import FloatingIcons from '~/components/FloatingIcons' import DefaultLayout from '~/components/Layouts/Default' import SectionContainer from '~/components/Layouts/SectionContainer' import APISection from '~/components/Sections/APISection' import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' -import AuthProviders from '~/data/auth.json' +import { CursorClickIcon } from '@heroicons/react/outline' +import CodeBlock from '~/components/CodeBlock/CodeBlock' const Cursor = ({ className = '', color = 'none' }) => { return ( @@ -50,8 +42,8 @@ const Cursor = ({ className = '', color = 'none' }) => { const exampleApps = [ { - img: 'notifications.svg', - title: 'Notifications', + img: 'toast-messages.svg', + title: 'Toast messages', description: 'sadcsdas sad asds dsdas asdas as', }, { @@ -77,11 +69,6 @@ const exampleApps = [ 'Keep charts updated in realtime. Supabase can detect changes in your database and then update the client immediately.', }, { img: 'in-app-chat.svg', title: 'In app chat', description: 'sadcsdas sad asds dsdas asdas as' }, - // { - // img: 'shared-docs.svg', - // title: 'Shared text editor', - // description: 'sadcsdas sad asds dsdas asdas as', - // }, { img: 'text-editor.svg', title: 'Shared code editor editor', @@ -179,6 +166,69 @@ function RealtimePage() { documentation_url={'/docs/guides/auth'} /> + {/* + {` + function hello() { + + return ( +
+
+
+
+
+
+ ) +} + `} +
*/} + + +
+
+
+ realtime broadcast +
+

Database changes

+

+ Enable social logins with the click of a button. Google, Facebook, GitHub, Azure, + Gitlab, Twitter, Discord, and many more. +

+
+
+
+ realtime broadcast +
+

Presence

+

+ Incredibly simple Auth, without a single external authentication service. Built-in + Authentication, Authorization, and User Management. +

+
+
+
+ realtime broadcast +
+

Broadcast

+

+ User data stored in your Supabase database so you never have to worry about 3rd + party privacy issues. Host your data in 8 different locations. +

+
+
+
+

What you can build with Realtime

diff --git a/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg b/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg index 3d116da97c8..988501f136b 100644 --- a/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg +++ b/apps/www/public/images/realtime/example-apps/dark/in-app-chat.svg @@ -1,20 +1,39 @@ - - + + - - - - - - - + + + + + + + + + + + + + + + + + + - + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/dark/toast-messages.svg b/apps/www/public/images/realtime/example-apps/dark/toast-messages.svg new file mode 100644 index 00000000000..8cc429ca0d7 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/toast-messages.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg b/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg index dd36da4fc17..1c3b4c7b5a3 100644 --- a/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg +++ b/apps/www/public/images/realtime/example-apps/light/in-app-chat.svg @@ -1,20 +1,39 @@ - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/toast-messages.svg b/apps/www/public/images/realtime/example-apps/light/toast-messages.svg new file mode 100644 index 00000000000..eb3afc9b412 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/toast-messages.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/www/public/images/realtime/icons/broadcast-alt.svg b/apps/www/public/images/realtime/icons/broadcast-alt.svg new file mode 100644 index 00000000000..f2cf5aabd48 --- /dev/null +++ b/apps/www/public/images/realtime/icons/broadcast-alt.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/www/public/images/realtime/icons/broadcast.svg b/apps/www/public/images/realtime/icons/broadcast.svg new file mode 100644 index 00000000000..27674464239 --- /dev/null +++ b/apps/www/public/images/realtime/icons/broadcast.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/www/public/images/realtime/icons/database-changes.svg b/apps/www/public/images/realtime/icons/database-changes.svg new file mode 100644 index 00000000000..d4c03209f7a --- /dev/null +++ b/apps/www/public/images/realtime/icons/database-changes.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/www/public/images/realtime/icons/presence.svg b/apps/www/public/images/realtime/icons/presence.svg new file mode 100644 index 00000000000..03638b0885f --- /dev/null +++ b/apps/www/public/images/realtime/icons/presence.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file From 117805487c81c6ba9bf05e506cc8665db5a288f1 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 01:02:43 -0500 Subject: [PATCH 08/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 60 ++++++++++------------------ 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index bdce6f67d90..14bfe9f3122 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -184,46 +184,51 @@ function RealtimePage() {
-
+
realtime broadcast
-

Database changes

-

+

Database changes

+

Enable social logins with the click of a button. Google, Facebook, GitHub, Azure, Gitlab, Twitter, Discord, and many more.

-
+
realtime broadcast
-

Presence

-

- Incredibly simple Auth, without a single external authentication service. Built-in - Authentication, Authorization, and User Management. +

Presence

+

+ Store and synchronize shared state across clients in a consistent manner, and have + that consolidated state sent back to the clients. +

+

+ Some of the common use cases of Presence include tracking which clients are + currently online.

-
+
realtime broadcast
-

Broadcast

-

- User data stored in your Supabase database so you never have to worry about 3rd - party privacy issues. Host your data in 8 different locations. +

Broadcast

+

Enables a client to send any data to all clients connected the same channel.

+

+ Other clients can decide to want messages based on that topic, spin up a Channel + with that topic name, and receive messages.

@@ -294,28 +299,7 @@ function RealtimePage() {
- -
-
-

What you can build with Realtime

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. -

-
- {AppExamples.map((example) => { - return ( -
-
-

{example.title}

-

{example.description}

-
- ) - })} -
-
-
- + {/* Somehow removing this section messes up all the alignment? */}
From ba9c37817d85e003907b4efe77848f02b6a70f22 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 18 Aug 2022 17:17:40 +0800 Subject: [PATCH 09/79] Attempt to make hero for realtime landing page --- apps/www/pages/realtime/Realtime.module.css | 253 ++++++++++++++------ apps/www/pages/realtime/Realtime.tsx | 100 ++++---- 2 files changed, 234 insertions(+), 119 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.module.css b/apps/www/pages/realtime/Realtime.module.css index dab399b724c..51edc165c48 100644 --- a/apps/www/pages/realtime/Realtime.module.css +++ b/apps/www/pages/realtime/Realtime.module.css @@ -1,97 +1,214 @@ -.element { - animation: element 8s infinite; +.shape { + transform-origin: top left; + animation: shape 20s infinite; } -@keyframes element { - 39% { - border-color: hsla(153, 60%, 28%, 1) +@keyframes shape { + 0%, 5% { + opacity: 1; + transform: scale(0, 0); + border-radius: 0; + border-color: hsla(153, 60%, 28%, 1); + box-shadow: none; + border-width: 3px; } - 40% { - border-color: #FFF; + 10%, 37.3% { + opacity: 1; + transform: scale(1, 1); + border-radius: 0; + border-color: hsla(153, 60%, 28%, 1); + box-shadow: none; + border-width: 3px; } - 75% { - border-color: #FFF; + 38%, 42% { + opacity: 1; + transform: scale(1, 1); + border-radius: 0px; + border-color: #FFFFFF; + box-shadow: none; + border-width: 3px; } - 80% { - border-color: hsla(153, 60%, 28%, 1) + 45%, 48.2% { + opacity: 1; + transform: scale(1, 1); + border-radius: 10px; + border-color: #FFFFFF; + box-shadow: none; + border-width: 3px; + } + 49%, 71.2% { + opacity: 1; + transform: scale(1, 1); + border-radius: 10px; + border-color: hsla(153, 60%, 28%, 1); + box-shadow: none; + border-width: 3px; + } + 72%, 74% { + opacity: 1; + transform: scale(1, 1); + border-radius: 10px; + border-color: #FFFFFF; + box-shadow: none; + border-width: 3px; + } + 76%, 92% { + opacity: 1; + transform: scale(1, 1); + border-radius: 10px; + border-color: #FFFFFF; + box-shadow: 0px 7px 20px 0px rgba(0,0,0,0.2); + border-width: 1.5px; + } + 94%, 100% { + opacity: 1; + transform: scale(1, 1); + border-radius: 10px; + border-color: hsla(153, 60%, 28%, 1); + box-shadow: 0px 7px 20px 0px rgba(0,0,0,0.2); + border-width: 1.5px; } } -.cursor-1 { - transform-origin: left; - animation: cursor-1 8s cubic-bezier(0, 0, 0.2, 1) infinite; +.button-text { + animation: button-text 20s infinite; } -@keyframes cursor-1 { - 20%{ - transform: scale(1) translate(0) +@keyframes button-text { + 0%, 78.5% { + opacity: 0; + font-family: 'Arial'; + background-color: transparent; } - 25% { - transform: scale(1) translate(-50px, -20px) + 79%, 84% { + opacity: 1; + font-family: 'Arial'; + background-color: transparent; } - 39% { - transform: scale(1) translate(-50px, -20px) + 84.5%, 88% { + opacity: 1; + font-family: 'Arial'; + background-color: rgba(0,0,0,0.4); } - 40% { - transform: scale(0.9) translate(-50px, -20px) - } - 41% { - transform: scale(1) translate(-50px, -20px) - } - 75% { - transform: scale(1) translate(-50px, -20px) - } - 80% { - transform: scale(1) translate(0) + 88.1%, 100% { + opacity: 1; + font-family: 'custom-font'; + background-color: transparent; } } -.cursor-2 { - animation: cursor-2 6s cubic-bezier(0, 0, 0.2, 1) infinite; +.cursor-one { + animation: cursor-one 20s infinite; } -@keyframes cursor-2 { - 15% { - transform: translate(0px, 0px) - } - 20% { - transform: translate(70px, -40px) - } - 70% { - transform: translate(70px, -40px) - } - 75% { - transform: translate(0px, 0px) - } -} - -.comment-bubble { - animation: chat 6s cubic-bezier(0, 0, 0.2, 1) infinite; -} - -@keyframes chat { +@keyframes cursor-one { 0% { - opacity: 0; - transform: translateY(5px); + transform: translate(0px, 0px); } - 25% { - opacity: 0; - transform: translateY(5px); + 2%, 5% { + transform: translate(-202px, -63px); } - 30% { - opacity: 1; - transform: translateY(0); + 10%, 11% { + transform: translate(-16px, -15px); } - 65% { + 13%, 100% { + transform: translate(0, 0); + } +} + +.cursor-two { + animation: cursor-two 20s infinite; +} + +@keyframes cursor-two { + 0%, 17% { + transform: scale(1) translate(-200px, 300px); + } + 20%, 32% { + transform: scale(1) translate(-85px, 89px); + } + 34%, 37.1% { + transform: scale(1) translate(0px, 0px); + } + 37.4%, 37.7% { + transform: scale(0.95) translate(0px, 0px); + } + 38%, 46% { + transform: scale(1) translate(0px, 0px); + } + 49%, 100% { + transform: scale(1) translate(-50px, 100px); + } +} + +.cursor-two-comment { + animation: cursor-two-comment 20s infinite; +} + +@keyframes cursor-two-comment { + 0%, 22% { + opacity: 0; + transform: scale(0.95) translate(0px, 5px); + } + 24%, 30% { opacity: 1; - transform: translateY(0); + transform: scale(1.0) translate(0px, 0px); + } + 32%, 100% { + opacity: 0; + transform: scale(0.95) translate(0px, 5px); } - 70% { +} + +.cursor-three { + animation: cursor-three 20s infinite; +} + +@keyframes cursor-three { + 0%, 50% { + transform: scale(1) translate(50px, -250px); + } + 53%, 66% { + transform: scale(1) translate(-40px, -120px); + } + 68%, 71% { + transform: scale(1) translate(0px, 0px); + } + 71.3%, 71.6% { + transform: scale(0.95) translate(0px, 0px); + } + 71.9%, 80% { + transform: scale(1) translate(0px, 0px); + } + 82%, 84% { + transform: scale(1) translate(-20px, 10px); + } + 84.5%, 85% { + transform: scale(0.95) translate(-20px, 10px); + } + 85.5%, 91% { + transform: scale(1) translate(-20px, 10px); + } + 93%, 100% { + transform: scale(1) translate(0px, -80px) + } +} + +.cursor-three-comment { + animation: cursor-three-comment 20s infinite; +} + +@keyframes cursor-three-comment { + 0%, 56% { opacity: 0; - transform: translateY(5px); + transform: scale(0.95) translate(0px, 5px); + } + 58%, 64% { + opacity: 1; + transform: scale(1.0) translate(0px, 0px); } - 100% { + 66%, 100% { opacity: 0; - transform: translateY(5px); + transform: scale(0.95) translate(0px, 5px); } } diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 14bfe9f3122..6435a681f2c 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -1,4 +1,4 @@ -import { Button, IconArrowUpRight, IconLink } from '@supabase/ui' +import { Button, IconArrowUpRight, IconGrid, IconLayers, IconLink, IconMenu } from '@supabase/ui' // [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" import ApiExamples from 'data/products/realtime/api-examples' @@ -18,8 +18,6 @@ import SectionContainer from '~/components/Layouts/SectionContainer' import APISection from '~/components/Sections/APISection' import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' -import { CursorClickIcon } from '@heroicons/react/outline' -import CodeBlock from '~/components/CodeBlock/CodeBlock' const Cursor = ({ className = '', color = 'none' }) => { return ( @@ -28,7 +26,7 @@ const Cursor = ({ className = '', color = 'none' }) => { fill={color} viewBox="0 0 24 24" aria-hidden="true" - className={`h-12 w-12 stroke-black dark:stroke-white ${className}`} + className={`h-10 w-10 stroke-black dark:stroke-white ${className}`} > -

Just playing around with some ideas

+
+ > +

+ Start a project +

+
-
-
-
+

🤔

+ +
+

😄

+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+

Just playing around with some ideas

, - //
- // auth header - //
, - //
- // auth header - //
, ]} // [TODO] Point to the correct docs URL documentation_url={'/docs/guides/auth'} /> - {/* - {` - function hello() { - - return ( -
-
-
-
-
-
- ) -} - `} -
*/} -
From 7e250b6b357f665bd9fb036f8bea7c36cd83adec Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 08:17:06 -0500 Subject: [PATCH 10/79] re --- apps/www/pages/realtime/Realtime.tsx | 32 ++-------------------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 6435a681f2c..e1781b65f28 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -76,6 +76,7 @@ const exampleApps = [ { img: 'whiteboard.svg', title: 'Shared whiteboard', description: 'bbb' }, { img: 'location.svg', title: 'Location', description: 'bbb' }, { img: 'multiplayer-game.svg', title: 'Multiplayer games', description: 'bbb' }, + { img: 'form-presence.svg', title: 'Form presence', description: 'bbb' }, ] function RealtimePage() { @@ -282,6 +283,7 @@ function RealtimePage() { documentation_link={'/docs/guides/auth'} /> +
@@ -298,36 +300,6 @@ function RealtimePage() {
- {/* Somehow removing this section messes up all the alignment? */} - -
-
-

User permissions without the middleware

- -

- Supabase Auth works without any additional servers. Build Authorization rules with - Postgres' Row Level Security, controlling who can create, edit and delete specific - rows in your database. -

-

Policies can be written in SQL or using the dashboard online.

- - - - - - -
-
- -
-
-
- From 68e99eb032676641751a675c4c7c09a441b52df5 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 08:17:12 -0500 Subject: [PATCH 11/79] new section --- .../example-apps/dark/form-presence.svg | 22 +++++++++++++++++++ .../example-apps/light/form-presence.svg | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 apps/www/public/images/realtime/example-apps/dark/form-presence.svg create mode 100644 apps/www/public/images/realtime/example-apps/light/form-presence.svg diff --git a/apps/www/public/images/realtime/example-apps/dark/form-presence.svg b/apps/www/public/images/realtime/example-apps/dark/form-presence.svg new file mode 100644 index 00000000000..06193ad427f --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/dark/form-presence.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/realtime/example-apps/light/form-presence.svg b/apps/www/public/images/realtime/example-apps/light/form-presence.svg new file mode 100644 index 00000000000..5964931e312 --- /dev/null +++ b/apps/www/public/images/realtime/example-apps/light/form-presence.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + From 564637ff4d47a439d2a032e3564aa74bd852f7b3 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 08:27:39 -0500 Subject: [PATCH 12/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 52 ++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index e1781b65f28..15a0075a174 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -42,41 +42,63 @@ const exampleApps = [ { img: 'toast-messages.svg', title: 'Toast messages', - description: 'sadcsdas sad asds dsdas asdas as', + description: 'Listen to changes in the database and show users a toast message.', }, { img: 'live-avatars.svg', title: 'Live avatars', - description: 'sadcsdas sad asds dsdas asdas as', + description: 'Share the status of users across multiple clients.', }, { img: 'live-cursors.svg', title: 'Live cursors', - description: 'sadcsdas sad asds dsdas asdas as', + description: 'Share the position and status of multiple cursors across multiple clients.', }, { img: 'leaderboard.svg', title: 'Leaderboards', description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna.', + 'Listen to changes in your database regarding the scores of your users and display them live.', }, { img: 'stock-market.svg', title: 'Live charts', description: - 'Keep charts updated in realtime. Supabase can detect changes in your database and then update the client immediately.', + 'Keep charts updated in relatime by listening to changes in the database rather than polling at intervals.', + }, + { + img: 'in-app-chat.svg', + title: 'In app chat', + description: 'Listen to changes in the database to display up to date text messages.', }, - { img: 'in-app-chat.svg', title: 'In app chat', description: 'sadcsdas sad asds dsdas asdas as' }, { img: 'text-editor.svg', - title: 'Shared code editor editor', - description: 'sadcsdas sad asds dsdas asdas as', + title: 'Shared text editor', + description: 'Users can colloborate with text documents or even code editors.', }, - { img: 'whiteboard.svg', title: 'Shared whiteboard', description: 'bbb' }, - { img: 'location.svg', title: 'Location', description: 'bbb' }, - { img: 'multiplayer-game.svg', title: 'Multiplayer games', description: 'bbb' }, - { img: 'form-presence.svg', title: 'Form presence', description: 'bbb' }, + { + img: 'whiteboard.svg', + title: 'Shared whiteboard', + description: + 'Allow users to collaorate on a shared whiteboard, sharing positions and states of any kind of object in realtime.', + }, + { + img: 'location.svg', + title: 'Location', + description: 'Listen to changes in the database regarding the position of a moving coordinate.', + }, + { + img: 'multiplayer-game.svg', + title: 'Multiplayer games', + description: + "Keep track of how long a player has been playing, who's turn it is and even share to other clients what the pllayer is doing.", + }, + { + img: 'form-presence.svg', + title: 'Form presence', + description: 'Display the active selection of different users throughout an interactive form.', + }, ] function RealtimePage() { @@ -255,9 +277,9 @@ function RealtimePage() { src={`/images/realtime/example-apps/light/${example.img}`} alt={example.title} /> -
-

{example.title}

-

{example.description}

+
+

{example.title}

+

{example.description}

) From e2c48b5c54a555f602b1754815c2fbf1f6dc1ba8 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 08:33:30 -0500 Subject: [PATCH 13/79] fix: import swiper styles to page. --- apps/www/pages/realtime/Realtime.tsx | 35 ++++++++++++++++------------ 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 15a0075a174..2160c490c7a 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -19,6 +19,9 @@ import APISection from '~/components/Sections/APISection' import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' +// Import Swiper styles +import 'swiper/swiper.min.css' + const Cursor = ({ className = '', color = 'none' }) => { return ( {exampleApps.map((example) => { return ( -
- {example.title} - {example.title} -
-

{example.title}

-

{example.description}

+ <> +
+ {example.title} + {example.title} +
+

{example.title}

+

{example.description}

+
-
+ ) })}
From 3902adc8e0b9481840efd543c0aad4d0c9a87142 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:00:18 -0500 Subject: [PATCH 14/79] Remove Realtime from homepage as it looks broken --- apps/www/components/Features/index.tsx | 1 + apps/www/pages/realtime/Realtime.tsx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/components/Features/index.tsx b/apps/www/components/Features/index.tsx index 3687e6bb269..f00d9b50523 100644 --- a/apps/www/components/Features/index.tsx +++ b/apps/www/components/Features/index.tsx @@ -9,6 +9,7 @@ import TextLink from '../TextLink' const Features = () => { const IconSections = Object.values(Solutions).map((solution: any) => { const { name, description, icon, label, url } = solution + if (solution.name === 'Realtime') return null return (
diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 2160c490c7a..7433e6ecc55 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -199,7 +199,6 @@ function RealtimePage() {
-

Just playing around with some ideas

, ]} // [TODO] Point to the correct docs URL From 71300f6f59046256c0937e820f7e4cb09adae2bb Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:06:10 -0500 Subject: [PATCH 15/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 7433e6ecc55..25def373872 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -261,8 +261,7 @@ function RealtimePage() {

What you can build with Realtime

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. + Build any kind of Realtime application with ease, including any of these scenarios.

From 96aac04a7f6890106598d280f07a7ed565b05877 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:07:41 -0500 Subject: [PATCH 16/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 25def373872..3277c216188 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -1,16 +1,12 @@ -import { Button, IconArrowUpRight, IconGrid, IconLayers, IconLink, IconMenu } from '@supabase/ui' +import { IconGrid, IconLayers, IconMenu } from '@supabase/ui' // [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" import ApiExamples from 'data/products/realtime/api-examples' -import AppExamples from 'data/products/realtime/app-examples' import RealtimeStyles from './Realtime.module.css' -import AuthSqlRulesExamples from 'data/products/auth/auth-sql-rules-examples' import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' -import Link from 'next/link' import { useRouter } from 'next/router' -import SplitCodeBlockCarousel from '~/components/Carousels/SplitCodeBlockCarousel' import CTABanner from '~/components/CTABanner' import FloatingIcons from '~/components/FloatingIcons' import DefaultLayout from '~/components/Layouts/Default' @@ -67,24 +63,24 @@ const exampleApps = [ img: 'stock-market.svg', title: 'Live charts', description: - 'Keep charts updated in relatime by listening to changes in the database rather than polling at intervals.', + 'Keep charts updated in Realtime by listening to changes in the database rather than polling at intervals.', }, { img: 'in-app-chat.svg', title: 'In app chat', - description: 'Listen to changes in the database to display up to date text messages.', + description: 'Listen to changes in the database to display up-to-date text messages.', }, { img: 'text-editor.svg', title: 'Shared text editor', - description: 'Users can colloborate with text documents or even code editors.', + description: 'Users can collaborate with text documents or even code editors.', }, { img: 'whiteboard.svg', title: 'Shared whiteboard', description: - 'Allow users to collaorate on a shared whiteboard, sharing positions and states of any kind of object in realtime.', + 'Allow users to collaorate on a shared whiteboard, sharing positions and states of any kind of object in Realtime.', }, { img: 'location.svg', From 56d67d6007bce8866d33c3e34d617a0322d94e67 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:09:17 -0500 Subject: [PATCH 17/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 3277c216188..eca42e15f47 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -230,10 +230,10 @@ function RealtimePage() { Store and synchronize shared state across clients in a consistent manner, and have that consolidated state sent back to the clients.

-

+ Some of the common use cases of Presence include tracking which clients are currently online. -

+
@@ -245,10 +245,10 @@ function RealtimePage() {

Broadcast

Enables a client to send any data to all clients connected the same channel.

-

+ Other clients can decide to want messages based on that topic, spin up a Channel with that topic name, and receive messages. -

+
From 5ace5d79d0012e1e28e5b850d3ffde39aab7e48b Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 18 Aug 2022 22:14:53 +0800 Subject: [PATCH 18/79] Update code snippets --- .../data/products/realtime/api-examples.js | 66 ++++++++++++------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/apps/www/data/products/realtime/api-examples.js b/apps/www/data/products/realtime/api-examples.js index 3519bdba82e..677567d0419 100644 --- a/apps/www/data/products/realtime/api-examples.js +++ b/apps/www/data/products/realtime/api-examples.js @@ -1,16 +1,20 @@ export default [ { lang: 'js', - title: 'Subscribing to events', + title: 'Database changes', description: '', code: ` -import { RealtimeClient } from '@supabase/realtime-js' -const client = new RealtimeClient(process.env.REALTIME_URL) + import { createClient } from '@supabase/supabase-js' -// Listen to events on the entire database. -const databaseChanges = client.channel('realtime:*') -databaseChanges.on('*', (e) => console.log(e)) -databaseChanges.subscribe() + const supabaseClient = createClient('URL', 'ANON') + const channel = supabaseClient + .channel('postgresChangesChannel') + .on('postgres_changes', { + event: 'INSERT', + schema: 'public', + table: 'messages' + }, payload => console.log(payload)) + .subscribe() @@ -33,14 +37,21 @@ databaseChanges.subscribe() title: 'Presence', description: '', code: ` -import { RealtimeClient } from '@supabase/realtime-js' -const client = new RealtimeClient(process.env.REALTIME_URL) + import { createClient } from '@supabase/supabase-js' -const channel = client.channel('room:*') -channel.on('presence', { event: 'SYNC' }, () => { - console.log('Presence synced') -}) -channel.subscribe().receive('ok', () => console.log('Subscribed!)) + const supabaseClient = createClient('URL', 'ANON') + const channel = supabaseClient.channel('presenceChannel', { configs: { presence: 'id123' } }) + + channel + .on('presence', { event: 'sync' }, () => console.log(channel.presenceState())) + .on('presence', { event: 'join' }, ({ key, currentPresences, newPresences }) => console.log(key, currentPresences, newPresences)) + .on('presence', { event: 'leave' }, ({ key, currentPresences, leftPresences }) => console.log(key, currentPresences, leftPresences)) + .subscribe((status) => { + if (status === 'SUBSCRIBED') { + channel.track({ user_name: 'user123' }) + channel.track({ user_name: 'user345' }) + } + }) @@ -60,21 +71,30 @@ channel.subscribe().receive('ok', () => console.log('Subscribed!)) title: 'Broadcast', description: '', code: ` - // Sign in with magic links - const { user, error } = await supabase.auth.signIn({ - email: 'example@email.com' - }) + import { createClient } from '@supabase/supabase-js' + const supabaseClient = createClient('URL', 'ANON') + const channel = supabaseClient.channel('broadcastChannel', { configs: { broadcast: { self: true, ack: true } } }) - - - - - + channel + .on('broadcast', { event: 'pos' }, payload => console.log(payload)) + .subscribe((status) => { + if (status === 'SUBSCRIBED') { + channel + .send({ type: 'broadcast', event: 'pos', payload: { x: 0, y: 0 }}) + .then(status => { + if (status === 'ok') console.log('ok') + + // if ack is false then channel.send will always return 'ok' + if (status === 'timed out') console.log('timed out') + }) + } + }) + From 69ffdda89c8dbdcc56134042c196de6ba0c5f634 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 18 Aug 2022 22:18:37 +0800 Subject: [PATCH 19/79] Fix code snippet padding --- apps/www/data/products/realtime/api-examples.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/apps/www/data/products/realtime/api-examples.js b/apps/www/data/products/realtime/api-examples.js index 677567d0419..862e4cd4152 100644 --- a/apps/www/data/products/realtime/api-examples.js +++ b/apps/www/data/products/realtime/api-examples.js @@ -25,11 +25,6 @@ export default [ - - - - - `, }, { @@ -57,13 +52,6 @@ export default [ - - - - - - - `, }, { @@ -91,13 +79,9 @@ export default [ } }) - - - - `, }, ] From 5dae6c38822e3860ed5bd2fcd1adb50059d6e4c1 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:24:49 -0500 Subject: [PATCH 20/79] update data file --- .../data/products/realtime/app-examples.js | 90 +++++++++---------- apps/www/pages/realtime/Realtime.tsx | 66 +------------- 2 files changed, 47 insertions(+), 109 deletions(-) diff --git a/apps/www/data/products/realtime/app-examples.js b/apps/www/data/products/realtime/app-examples.js index c9b7bcc93b5..2dc91209c55 100644 --- a/apps/www/data/products/realtime/app-examples.js +++ b/apps/www/data/products/realtime/app-examples.js @@ -1,62 +1,62 @@ -export default [ +export default = [ { - image: '', - title: 'Leaderboard', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + img: 'toast-messages.svg', + title: 'Toast messages', + description: 'Listen to changes in the database and show users a toast message.', }, { - image: '', - title: 'Shared code editor', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + img: 'live-avatars.svg', + title: 'Live avatars', + description: 'Share the status of users across multiple clients.', }, { - image: '', - title: 'Shared text editor', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + img: 'live-cursors.svg', + title: 'Live cursors', + description: 'Share the position and status of multiple cursors across multiple clients.', }, { - image: '', - title: 'Stock market', + img: 'leaderboard.svg', + title: 'Leaderboards', description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + 'Listen to changes in your database regarding the scores of your users and display them live.', }, { - image: '', - title: 'Share whiteboard', + img: 'stock-market.svg', + title: 'Live charts', description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + 'Keep charts updated in Realtime by listening to changes in the database rather than polling at intervals.', }, { - image: '', - title: 'Multiplayer', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', - }, - { - image: '', - title: 'Charts', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', - }, - { - image: '', - title: 'Location', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', - }, - { - image: '', - title: 'Notifications', - description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', - }, - { - image: '', + img: 'in-app-chat.svg', title: 'In app chat', + description: 'Listen to changes in the database to display up-to-date text messages.', + }, + { + img: 'text-editor.svg', + title: 'Shared text editor', + description: 'Users can collaborate with text documents or even code editors.', + }, + + { + img: 'whiteboard.svg', + title: 'Shared whiteboard', description: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ', + 'Allow users to collaorate on a shared whiteboard, sharing positions and states of any kind of object in Realtime.', + }, + { + img: 'location.svg', + title: 'Location', + description: 'Listen to changes in the database regarding the position of a moving coordinate.', + }, + { + img: 'multiplayer-game.svg', + title: 'Multiplayer games', + description: + "Keep track of how long a player has been playing, who's turn it is and even share to other clients what the pllayer is doing.", + }, + { + img: 'form-presence.svg', + title: 'Form presence', + description: 'Display the active selection of different users throughout an interactive form.', }, ] diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index eca42e15f47..b0a67075f3b 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -2,6 +2,7 @@ import { IconGrid, IconLayers, IconMenu } from '@supabase/ui' // [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" import ApiExamples from 'data/products/realtime/api-examples' +import AppExamples from 'data/products/realtime/app-examples' import RealtimeStyles from './Realtime.module.css' import Solutions from 'data/Solutions.json' @@ -37,69 +38,6 @@ const Cursor = ({ className = '', color = 'none' }) => { ) } -const exampleApps = [ - { - img: 'toast-messages.svg', - title: 'Toast messages', - description: 'Listen to changes in the database and show users a toast message.', - }, - { - img: 'live-avatars.svg', - title: 'Live avatars', - description: 'Share the status of users across multiple clients.', - }, - { - img: 'live-cursors.svg', - title: 'Live cursors', - description: 'Share the position and status of multiple cursors across multiple clients.', - }, - { - img: 'leaderboard.svg', - title: 'Leaderboards', - description: - 'Listen to changes in your database regarding the scores of your users and display them live.', - }, - { - img: 'stock-market.svg', - title: 'Live charts', - description: - 'Keep charts updated in Realtime by listening to changes in the database rather than polling at intervals.', - }, - { - img: 'in-app-chat.svg', - title: 'In app chat', - description: 'Listen to changes in the database to display up-to-date text messages.', - }, - { - img: 'text-editor.svg', - title: 'Shared text editor', - description: 'Users can collaborate with text documents or even code editors.', - }, - - { - img: 'whiteboard.svg', - title: 'Shared whiteboard', - description: - 'Allow users to collaorate on a shared whiteboard, sharing positions and states of any kind of object in Realtime.', - }, - { - img: 'location.svg', - title: 'Location', - description: 'Listen to changes in the database regarding the position of a moving coordinate.', - }, - { - img: 'multiplayer-game.svg', - title: 'Multiplayer games', - description: - "Keep track of how long a player has been playing, who's turn it is and even share to other clients what the pllayer is doing.", - }, - { - img: 'form-presence.svg', - title: 'Form presence', - description: 'Display the active selection of different users throughout an interactive form.', - }, -] - function RealtimePage() { // base path for images const { basePath } = useRouter() @@ -261,7 +199,7 @@ function RealtimePage() {

- {exampleApps.map((example) => { + {AppExamples.map((example) => { return ( <>
From 4fc6f2de8c16bc9868de03c725d3cf437097c536 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:28:08 -0500 Subject: [PATCH 21/79] Update Solutions.json --- apps/www/data/Solutions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/data/Solutions.json b/apps/www/data/Solutions.json index e6abd655e13..ff6d1afa1b5 100644 --- a/apps/www/data/Solutions.json +++ b/apps/www/data/Solutions.json @@ -34,7 +34,7 @@ "realtime": { "name": "Realtime", "icon": "M13 10V3L4 14h7v7l9-11h-7z", - "description": "Listen to changes in a Postgres Database and broadcast them over web sockets", + "description": "Create multiplayer experiences by sharing, broadcasting, and listenning to changes from other clients or the Database", "description_short": "", "label": "", "url": "/realtime" From c6f2c7f864971f45432559b4d09912039f1612b7 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:31:27 -0500 Subject: [PATCH 22/79] add og image --- apps/www/data/products/realtime/app-examples.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/data/products/realtime/app-examples.js b/apps/www/data/products/realtime/app-examples.js index 2dc91209c55..fce413d450a 100644 --- a/apps/www/data/products/realtime/app-examples.js +++ b/apps/www/data/products/realtime/app-examples.js @@ -1,4 +1,4 @@ -export default = [ +export default [ { img: 'toast-messages.svg', title: 'Toast messages', From fd8d601704a20bf6c16e1a04a246dd7f4cac5a4d Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:31:37 -0500 Subject: [PATCH 23/79] replace og --- apps/www/pages/realtime/Realtime.tsx | 2 +- apps/www/public/images/realtime/og.jpg | Bin 0 -> 73503 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 apps/www/public/images/realtime/og.jpg diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index b0a67075f3b..76f9a563aa6 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -58,7 +58,7 @@ function RealtimePage() { { // [TODO] Update OG image // [TODO] Update to use an appropriate icon for realtime in Solutions.json - url: `https://supabase.com${basePath}/images/product/auth/auth-og.jpg`, + url: `https://supabase.com${basePath}/images/realtime/og.jpg`, }, ], }} diff --git a/apps/www/public/images/realtime/og.jpg b/apps/www/public/images/realtime/og.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56c1348eb1a653350b0220aa635a5d8a32dc3fec GIT binary patch literal 73503 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%0DW*uX1 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

KJF%0$v%0Hb^sG+!lj20r8-?2Ykj& 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 T%zuSD|7_j=D?=mYPs0BL+_AWd literal 0 HcmV?d00001 From 76dff17f14d16608ecc1ee150bddf235d57f72c9 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:32:40 -0500 Subject: [PATCH 24/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 76f9a563aa6..dd2b7019bdf 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -56,8 +56,6 @@ function RealtimePage() { url: `https://supabase.com/realtime`, images: [ { - // [TODO] Update OG image - // [TODO] Update to use an appropriate icon for realtime in Solutions.json url: `https://supabase.com${basePath}/images/realtime/og.jpg`, }, ], @@ -135,8 +133,7 @@ function RealtimePage() {

, ]} - // [TODO] Point to the correct docs URL - documentation_url={'/docs/guides/auth'} + documentation_url={'/docs/guides/realtime/broadcast'} /> @@ -239,7 +236,7 @@ function RealtimePage() {

, ]} // [TODO] Point to the correct docs URL - documentation_link={'/docs/guides/auth'} + documentation_link={'/docs/guides//docs/guides/realtime/broadcast'} />
From 72a8371a3c2c47e10c242f94453b526744dcb2cb Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:32:55 -0500 Subject: [PATCH 25/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index dd2b7019bdf..7d2ea0e1a54 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -1,10 +1,6 @@ import { IconGrid, IconLayers, IconMenu } from '@supabase/ui' - -// [TODO] These need to be relooked - I'm using multiplayer.dev as a "docs" import ApiExamples from 'data/products/realtime/api-examples' import AppExamples from 'data/products/realtime/app-examples' -import RealtimeStyles from './Realtime.module.css' - import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' import { useRouter } from 'next/router' @@ -15,6 +11,7 @@ import SectionContainer from '~/components/Layouts/SectionContainer' import APISection from '~/components/Sections/APISection' import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' +import RealtimeStyles from './Realtime.module.css' // Import Swiper styles import 'swiper/swiper.min.css' From b2189fa347024cf22340e6e434f6d259e09eb73e Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:33:04 -0500 Subject: [PATCH 26/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 7d2ea0e1a54..42a089959a0 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -12,8 +12,6 @@ import APISection from '~/components/Sections/APISection' import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' import RealtimeStyles from './Realtime.module.css' - -// Import Swiper styles import 'swiper/swiper.min.css' const Cursor = ({ className = '', color = 'none' }) => { From 63f16ea86790c3968ed824fbb57073b00efda7ea Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:35:49 -0500 Subject: [PATCH 27/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 42a089959a0..57f90110a82 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -142,10 +142,7 @@ function RealtimePage() { />

Database changes

-

- Enable social logins with the click of a button. Google, Facebook, GitHub, Azure, - Gitlab, Twitter, Discord, and many more. -

+

Listen to changes in the Database, such as new inserts, updates, and deletes.

From d22ad1fe14ca24ac1fa33159f5099de293a2f67f Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:38:40 -0500 Subject: [PATCH 28/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 57f90110a82..0029bac548e 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -1,4 +1,4 @@ -import { IconGrid, IconLayers, IconMenu } from '@supabase/ui' +import { Button, IconGrid, IconLayers, IconMenu } from '@supabase/ui' import ApiExamples from 'data/products/realtime/api-examples' import AppExamples from 'data/products/realtime/app-examples' import Solutions from 'data/Solutions.json' @@ -13,6 +13,7 @@ import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' import RealtimeStyles from './Realtime.module.css' import 'swiper/swiper.min.css' +import Link from 'next/link' const Cursor = ({ className = '', color = 'none' }) => { return ( @@ -161,6 +162,13 @@ function RealtimePage() { Some of the common use cases of Presence include tracking which clients are currently online. +
+ + + +
@@ -176,6 +184,13 @@ function RealtimePage() { Other clients can decide to want messages based on that topic, spin up a Channel with that topic name, and receive messages. +
+ + + +
From 2abd9fac64f4632bb89346d572b9feb03af157ac Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:38:53 -0500 Subject: [PATCH 29/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index 0029bac548e..f006357f96c 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -3,7 +3,9 @@ import ApiExamples from 'data/products/realtime/api-examples' import AppExamples from 'data/products/realtime/app-examples' import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' +import Link from 'next/link' import { useRouter } from 'next/router' +import 'swiper/swiper.min.css' import CTABanner from '~/components/CTABanner' import FloatingIcons from '~/components/FloatingIcons' import DefaultLayout from '~/components/Layouts/Default' @@ -12,8 +14,6 @@ import APISection from '~/components/Sections/APISection' import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' import RealtimeStyles from './Realtime.module.css' -import 'swiper/swiper.min.css' -import Link from 'next/link' const Cursor = ({ className = '', color = 'none' }) => { return ( From fa5f80491176f38b821c4f5b231f0935c25602a5 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 09:39:01 -0500 Subject: [PATCH 30/79] Update Realtime.tsx --- apps/www/pages/realtime/Realtime.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/www/pages/realtime/Realtime.tsx b/apps/www/pages/realtime/Realtime.tsx index f006357f96c..5e44f9324f3 100644 --- a/apps/www/pages/realtime/Realtime.tsx +++ b/apps/www/pages/realtime/Realtime.tsx @@ -5,7 +5,6 @@ import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' import Link from 'next/link' import { useRouter } from 'next/router' -import 'swiper/swiper.min.css' import CTABanner from '~/components/CTABanner' import FloatingIcons from '~/components/FloatingIcons' import DefaultLayout from '~/components/Layouts/Default' @@ -15,6 +14,8 @@ import GithubExamples from '~/components/Sections/GithubExamples' import ProductHeader from '~/components/Sections/ProductHeader' import RealtimeStyles from './Realtime.module.css' +import 'swiper/swiper.min.css' + const Cursor = ({ className = '', color = 'none' }) => { return ( Date: Thu, 18 Aug 2022 09:59:19 -0500 Subject: [PATCH 31/79] prettier fix --- apps/www/pages/realtime/Realtime.module.css | 128 +++++++++++++------- apps/www/styles/index.css | 2 +- 2 files changed, 83 insertions(+), 47 deletions(-) diff --git a/apps/www/pages/realtime/Realtime.module.css b/apps/www/pages/realtime/Realtime.module.css index 51edc165c48..a58d8edb4ea 100644 --- a/apps/www/pages/realtime/Realtime.module.css +++ b/apps/www/pages/realtime/Realtime.module.css @@ -4,7 +4,8 @@ } @keyframes shape { - 0%, 5% { + 0%, + 5% { opacity: 1; transform: scale(0, 0); border-radius: 0; @@ -12,7 +13,8 @@ box-shadow: none; border-width: 3px; } - 10%, 37.3% { + 10%, + 37.3% { opacity: 1; transform: scale(1, 1); border-radius: 0; @@ -20,23 +22,26 @@ box-shadow: none; border-width: 3px; } - 38%, 42% { + 38%, + 42% { opacity: 1; transform: scale(1, 1); border-radius: 0px; - border-color: #FFFFFF; + border-color: #ffffff; box-shadow: none; border-width: 3px; } - 45%, 48.2% { + 45%, + 48.2% { opacity: 1; transform: scale(1, 1); border-radius: 10px; - border-color: #FFFFFF; + border-color: #ffffff; box-shadow: none; border-width: 3px; } - 49%, 71.2% { + 49%, + 71.2% { opacity: 1; transform: scale(1, 1); border-radius: 10px; @@ -44,28 +49,31 @@ box-shadow: none; border-width: 3px; } - 72%, 74% { + 72%, + 74% { opacity: 1; transform: scale(1, 1); border-radius: 10px; - border-color: #FFFFFF; + border-color: #ffffff; box-shadow: none; border-width: 3px; } - 76%, 92% { + 76%, + 92% { opacity: 1; transform: scale(1, 1); border-radius: 10px; - border-color: #FFFFFF; - box-shadow: 0px 7px 20px 0px rgba(0,0,0,0.2); + border-color: #ffffff; + box-shadow: 0px 7px 20px 0px rgba(0, 0, 0, 0.2); border-width: 1.5px; } - 94%, 100% { + 94%, + 100% { opacity: 1; transform: scale(1, 1); border-radius: 10px; border-color: hsla(153, 60%, 28%, 1); - box-shadow: 0px 7px 20px 0px rgba(0,0,0,0.2); + box-shadow: 0px 7px 20px 0px rgba(0, 0, 0, 0.2); border-width: 1.5px; } } @@ -75,22 +83,26 @@ } @keyframes button-text { - 0%, 78.5% { + 0%, + 78.5% { opacity: 0; font-family: 'Arial'; background-color: transparent; } - 79%, 84% { + 79%, + 84% { opacity: 1; font-family: 'Arial'; background-color: transparent; } - 84.5%, 88% { + 84.5%, + 88% { opacity: 1; font-family: 'Arial'; - background-color: rgba(0,0,0,0.4); + background-color: rgba(0, 0, 0, 0.4); } - 88.1%, 100% { + 88.1%, + 100% { opacity: 1; font-family: 'custom-font'; background-color: transparent; @@ -105,13 +117,16 @@ 0% { transform: translate(0px, 0px); } - 2%, 5% { + 2%, + 5% { transform: translate(-202px, -63px); } - 10%, 11% { + 10%, + 11% { transform: translate(-16px, -15px); } - 13%, 100% { + 13%, + 100% { transform: translate(0, 0); } } @@ -121,22 +136,28 @@ } @keyframes cursor-two { - 0%, 17% { + 0%, + 17% { transform: scale(1) translate(-200px, 300px); } - 20%, 32% { + 20%, + 32% { transform: scale(1) translate(-85px, 89px); } - 34%, 37.1% { + 34%, + 37.1% { transform: scale(1) translate(0px, 0px); } - 37.4%, 37.7% { + 37.4%, + 37.7% { transform: scale(0.95) translate(0px, 0px); } - 38%, 46% { + 38%, + 46% { transform: scale(1) translate(0px, 0px); } - 49%, 100% { + 49%, + 100% { transform: scale(1) translate(-50px, 100px); } } @@ -146,15 +167,18 @@ } @keyframes cursor-two-comment { - 0%, 22% { + 0%, + 22% { opacity: 0; transform: scale(0.95) translate(0px, 5px); } - 24%, 30% { + 24%, + 30% { opacity: 1; - transform: scale(1.0) translate(0px, 0px); + transform: scale(1) translate(0px, 0px); } - 32%, 100% { + 32%, + 100% { opacity: 0; transform: scale(0.95) translate(0px, 5px); } @@ -165,32 +189,41 @@ } @keyframes cursor-three { - 0%, 50% { + 0%, + 50% { transform: scale(1) translate(50px, -250px); } - 53%, 66% { + 53%, + 66% { transform: scale(1) translate(-40px, -120px); } - 68%, 71% { + 68%, + 71% { transform: scale(1) translate(0px, 0px); } - 71.3%, 71.6% { + 71.3%, + 71.6% { transform: scale(0.95) translate(0px, 0px); } - 71.9%, 80% { + 71.9%, + 80% { transform: scale(1) translate(0px, 0px); } - 82%, 84% { + 82%, + 84% { transform: scale(1) translate(-20px, 10px); } - 84.5%, 85% { + 84.5%, + 85% { transform: scale(0.95) translate(-20px, 10px); } - 85.5%, 91% { + 85.5%, + 91% { transform: scale(1) translate(-20px, 10px); } - 93%, 100% { - transform: scale(1) translate(0px, -80px) + 93%, + 100% { + transform: scale(1) translate(0px, -80px); } } @@ -199,15 +232,18 @@ } @keyframes cursor-three-comment { - 0%, 56% { + 0%, + 56% { opacity: 0; transform: scale(0.95) translate(0px, 5px); } - 58%, 64% { + 58%, + 64% { opacity: 1; - transform: scale(1.0) translate(0px, 0px); + transform: scale(1) translate(0px, 0px); } - 66%, 100% { + 66%, + 100% { opacity: 0; transform: scale(0.95) translate(0px, 5px); } diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index e24be00f755..28ccf03b0cd 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -308,7 +308,7 @@ launch week } .video-container { - @apply border rounded-xl overflow-hidden; + @apply overflow-hidden rounded-xl border; position: relative; width: 100%; padding-bottom: 56.25%; From c39dc1dd045a7630142b057153f8d6a6c5d9fd72 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 18 Aug 2022 10:03:17 -0500 Subject: [PATCH 32/79] Update Solutions.json --- apps/www/data/Solutions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/data/Solutions.json b/apps/www/data/Solutions.json index ff6d1afa1b5..03620a8771f 100644 --- a/apps/www/data/Solutions.json +++ b/apps/www/data/Solutions.json @@ -34,7 +34,7 @@ "realtime": { "name": "Realtime", "icon": "M13 10V3L4 14h7v7l9-11h-7z", - "description": "Create multiplayer experiences by sharing, broadcasting, and listenning to changes from other clients or the Database", + "description": "Create multiplayer experiences by sharing, broadcasting, and listenning to changes from other clients or the Database.", "description_short": "", "label": "", "url": "/realtime" From d32a29cacc3b3e0fc6bed86c365ba6cec39253d6 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 27 Oct 2022 11:38:50 +0800 Subject: [PATCH 33/79] chore: update pricing --- apps/www/data/Pricing.json | 155 +++++++++++++++++++-------- apps/www/data/PricingAddOn.json | 10 +- apps/www/data/Solutions.json | 8 ++ apps/www/pages/pricing/CHANGELOG.txt | 24 +++++ apps/www/pages/pricing/index.tsx | 38 +++++++ 5 files changed, 183 insertions(+), 52 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 41e8ff932c3..8a5f58e70b9 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -41,8 +41,8 @@ "tooltip": "Backups are entire copies of your database that can be restored in the future.", "tiers": { "free": false, - "pro": "7 days of backup", - "enterprise": "30 days Point in Time backup" + "pro": "7 days of backup* (* if > 1TB, contact enterprise)", + "enterprise": "Custom" } }, { @@ -92,7 +92,7 @@ "tiers": { "free": "Up to 50,000 MAUs", "pro": "100,000 included, then $0.00325 per MAU", - "enterprise": "1,000,000 included, then $0.00325 per MAU" + "enterprise": "Unlimited" } }, { @@ -151,6 +151,14 @@ "pro": "100 / hour", "enterprise": "Contact Us" } + }, + { + "title": "Advanced security features", + "tiers": { + "free": false, + "pro": false, + "enterprise": "Contact Us" + } } ] }, @@ -198,14 +206,6 @@ "title": "Edge Functions", "icon": "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4", "features": [ - { - "title": "Runtime hours", - "tiers": { - "free": "100 hours per month", - "pro": "1,000 hours per month", - "enterprise": "Unlimited" - } - }, { "title": "Invocations", "tiers": { @@ -226,12 +226,42 @@ "title": "Number of functions", "tiers": { "free": "10", - "pro": "100", + "pro": "100, then $10 per additional 100 functions", "enterprise": "Unlimited" } } ] }, + "realtime": { + "title": "Realtime", + "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4", + "features": [ + { + "title": "Concurrent Peak Connections", + "tiers": { + "free": "Up to 200", + "pro": "Up to 500, then $10 per 1000", + "enterprise": "Unlimited concurrent connections and volume discount" + } + }, + { + "title": "Max Messages Per Month", + "tiers": { + "free": "2 Million (including database)", + "pro": "5 Million", + "enterprise": "Volume discounts on messages" + } + }, + { + "title": "Max Message Size", + "tiers": { + "free": "250 Kb", + "pro": "3 Mb", + "enterprise": "Custom" + } + } + ] + }, "dashboard": { "title": "Dashboard", "icon": "M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4", @@ -262,42 +292,10 @@ } ] }, - "support": { - "title": "Support and Compliance", - "icon": "M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z", + "security": { + "title": "Platform Security and Compliance", + "icon": "M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z", "features": [ - { - "title": "Community support", - "tiers": { - "free": true, - "pro": true, - "enterprise": true - } - }, - { - "title": "Email support", - "tiers": { - "free": false, - "pro": true, - "enterprise": true - } - }, - { - "title": "Email support SLA", - "tiers": { - "free": false, - "pro": false, - "enterprise": true - } - }, - { - "title": "Designated support", - "tiers": { - "free": false, - "pro": false, - "enterprise": true - } - }, { "title": "On Premises / BYO cloud", "tiers": { @@ -354,6 +352,69 @@ "enterprise": true } }, + { + "title": "Access Roles", + "tiers": { + "free": "Owner, Developer", + "pro": "Owner, Developer", + "enterprise": "Additional owner(s), admin, read-only, billing admin, custom" + } + }, + { + "title": "Vanity URLs", + "tiers": { + "free": false, + "pro": "$10 per custom domain", + "enterprise": "$10 per custom domain" + } + }, + { + "title": "Custom Domains", + "tooltip": "Contact us to access this feature", + "tiers": { + "free": false, + "pro": true, + "enterprise": true + } + } + ] + }, + "support": { + "title": "Support", + "icon": "M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z", + "features": [ + { + "title": "Community support", + "tiers": { + "free": true, + "pro": true, + "enterprise": true + } + }, + { + "title": "Email support", + "tiers": { + "free": false, + "pro": true, + "enterprise": true + } + }, + { + "title": "Email support SLA", + "tiers": { + "free": false, + "pro": false, + "enterprise": true + } + }, + { + "title": "Designated support", + "tiers": { + "free": false, + "pro": false, + "enterprise": true + } + }, { "title": "On Boarding Support", "tiers": { diff --git a/apps/www/data/PricingAddOn.json b/apps/www/data/PricingAddOn.json index 3de96ea0e20..2d597446001 100644 --- a/apps/www/data/PricingAddOn.json +++ b/apps/www/data/PricingAddOn.json @@ -1,11 +1,11 @@ { "database": { - "title": "Database", + "title": "Optimized Compute", "features": [ - "Fully Managed PostgreSQL", - "Dedicated Postgres Database", - "Optimized Database Instances", - "Realtime Functionality" + "For projects that need dedicated compute", + "For scaling number of connections", + "Additional CPU & RAM options", + "Additional Disk IO Bandwidth" ], "rows": [ { diff --git a/apps/www/data/Solutions.json b/apps/www/data/Solutions.json index 7e9131da046..67a3dcba732 100644 --- a/apps/www/data/Solutions.json +++ b/apps/www/data/Solutions.json @@ -23,6 +23,14 @@ "label": "", "url": "/storage" }, + "realtime": { + "name": "Realtime", + "icon": "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4", + "description": "Store, organize, and serve large files. Any media, including videos and images.", + "description_short": "", + "label": "", + "url": "/storage" + }, "edge-functions": { "name": "Edge Functions", "icon": "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4", diff --git a/apps/www/pages/pricing/CHANGELOG.txt b/apps/www/pages/pricing/CHANGELOG.txt index e3f3c76d83d..69e3422fc4c 100644 --- a/apps/www/pages/pricing/CHANGELOG.txt +++ b/apps/www/pages/pricing/CHANGELOG.txt @@ -1,5 +1,29 @@ Pricing Changelog +### 27 Oct 2022 +---- + +Database +- guidance on backups > 1TB in size +Auth +- added “advanced security features” +- MAUs changed to unlimited for Enterprise +Realtime +— Added new realtime section and pricing +Edge Functions +- Added extra functions cost for Pro tier +- Runtime hours removed +Support +- Security features moved to own section +Platform Security and Compliance +- New section made +- added Access roles +- added Custom Domains +- added Vanity URLs added +Database Compute Add ons +- New label “Optimized Compute” + + ### 16 June 2022 ---- diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index bdd62e6518a..9b805d29116 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -343,6 +343,11 @@ export default function IndexPage() { tier={'free'} icon={Solutions['storage'].icon} /> + + + + + + + + From 11832b5aa009348ba39997f2cad0cb11bb2c1b67 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 27 Oct 2022 11:57:33 +0800 Subject: [PATCH 34/79] update --- apps/www/data/Pricing.json | 6 +++--- apps/www/data/Solutions.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 8a5f58e70b9..f7f681382d5 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -234,7 +234,7 @@ }, "realtime": { "title": "Realtime", - "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4", + "icon": "M15.042 21.672L13.684 16.6m0 0l-2.51 2.225.569-9.47 5.227 7.917-3.286-.672zM12 2.25V4.5m5.834.166l-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243l-1.59-1.59", "features": [ { "title": "Concurrent Peak Connections", @@ -373,8 +373,8 @@ "tooltip": "Contact us to access this feature", "tiers": { "free": false, - "pro": true, - "enterprise": true + "pro": "$10 per domain per month per project add on", + "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available. " } } ] diff --git a/apps/www/data/Solutions.json b/apps/www/data/Solutions.json index 67a3dcba732..ec856ac9633 100644 --- a/apps/www/data/Solutions.json +++ b/apps/www/data/Solutions.json @@ -25,7 +25,7 @@ }, "realtime": { "name": "Realtime", - "icon": "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4", + "icon": "M15.042 21.672L13.684 16.6m0 0l-2.51 2.225.569-9.47 5.227 7.917-3.286-.672zM12 2.25V4.5m5.834.166l-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243l-1.59-1.59", "description": "Store, organize, and serve large files. Any media, including videos and images.", "description_short": "", "label": "", From 4b5a4337e21e6d0a48382725732c3fe067254eab Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 27 Oct 2022 11:59:48 +0800 Subject: [PATCH 35/79] Update PricingAddOnTable.tsx --- apps/www/components/PricingAddOnTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/components/PricingAddOnTable.tsx b/apps/www/components/PricingAddOnTable.tsx index 72ba7c583b6..5b5f3cdf849 100644 --- a/apps/www/components/PricingAddOnTable.tsx +++ b/apps/www/components/PricingAddOnTable.tsx @@ -41,7 +41,7 @@ const PricingAddOnTable = ({ icon, pricing }: PricingAddOnTableProps) => { type="button" >
-
+
{icon} From 8575b11b2a3b0e36028c588160d5e2b5bb79c2a9 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 27 Oct 2022 13:16:59 +0800 Subject: [PATCH 36/79] updates --- apps/www/data/Pricing.json | 11 ++--------- apps/www/pages/pricing/CHANGELOG.txt | 9 +++++++-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index f7f681382d5..10faa546f71 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -20,14 +20,6 @@ "enterprise": true } }, - { - "title": "Realtime functionality", - "tiers": { - "free": true, - "pro": true, - "enterprise": true - } - }, { "title": "Database space", "tiers": { @@ -210,7 +202,7 @@ "title": "Invocations", "tiers": { "free": "500K per month", - "pro": "2 Million per month", + "pro": "2 Million per month, then $2 per 1 million invocations", "enterprise": "Unlimited" } }, @@ -362,6 +354,7 @@ }, { "title": "Vanity URLs", + "tooltip": "We currently screen vanity URLs to ensure they are non-offensive. Please email growth@supabase.io with your project details to request your vanity URL. We process requests in batches once every 14 days.", "tiers": { "free": false, "pro": "$10 per custom domain", diff --git a/apps/www/pages/pricing/CHANGELOG.txt b/apps/www/pages/pricing/CHANGELOG.txt index 69e3422fc4c..c99c8713c09 100644 --- a/apps/www/pages/pricing/CHANGELOG.txt +++ b/apps/www/pages/pricing/CHANGELOG.txt @@ -5,14 +5,19 @@ Pricing Changelog Database - guidance on backups > 1TB in size +- Removed "Realtime functionality" as it is redundant with new realtime section Auth - added “advanced security features” - MAUs changed to unlimited for Enterprise Realtime -— Added new realtime section and pricing +— Added new realtime section +- Concurrent Peak Connections +- Max Messages Per Month +- Max Message Size Edge Functions -- Added extra functions cost for Pro tier - Runtime hours removed +- Number of functions, usage pricing added after limit on Pro +- Invocations, usage pricing added after limit on Pro Support - Security features moved to own section Platform Security and Compliance From ca03d385288d9cedaa8b8c2fc8a53e20a95d3999 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 27 Oct 2022 15:05:15 +0800 Subject: [PATCH 37/79] fix rows --- apps/www/data/Pricing.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 10faa546f71..71f5cb17f6c 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -357,8 +357,8 @@ "tooltip": "We currently screen vanity URLs to ensure they are non-offensive. Please email growth@supabase.io with your project details to request your vanity URL. We process requests in batches once every 14 days.", "tiers": { "free": false, - "pro": "$10 per custom domain", - "enterprise": "$10 per custom domain" + "pro": true, + "enterprise": true } }, { @@ -367,7 +367,7 @@ "tiers": { "free": false, "pro": "$10 per domain per month per project add on", - "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available. " + "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available." } } ] From 43a913461db819cb8653409dd8a097327a68e52a Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Mon, 31 Oct 2022 21:44:04 +0800 Subject: [PATCH 38/79] Update Pricing.json --- apps/www/data/Pricing.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 71f5cb17f6c..3d39f3173ea 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -354,7 +354,6 @@ }, { "title": "Vanity URLs", - "tooltip": "We currently screen vanity URLs to ensure they are non-offensive. Please email growth@supabase.io with your project details to request your vanity URL. We process requests in batches once every 14 days.", "tiers": { "free": false, "pro": true, From 2ebdc0e5d56a495bd5dee49f1cee0b1c080ff828 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Mon, 31 Oct 2022 21:44:18 +0800 Subject: [PATCH 39/79] Update Pricing.json --- apps/www/data/Pricing.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 3d39f3173ea..33a37a692bd 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -228,6 +228,14 @@ "title": "Realtime", "icon": "M15.042 21.672L13.684 16.6m0 0l-2.51 2.225.569-9.47 5.227 7.917-3.286-.672zM12 2.25V4.5m5.834.166l-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243l-1.59-1.59", "features": [ + { + "title": "Change Data Capture (CDC)", + "tiers": { + "free": true, + "pro": true, + "enterprise": true + } + }, { "title": "Concurrent Peak Connections", "tiers": { @@ -325,7 +333,7 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Coming soon" + "enterprise": true } }, { From 165534e6a266a8989bfbe816bf1808d2b004e92a Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 1 Nov 2022 14:45:16 -0230 Subject: [PATCH 40/79] Fix anchor text formatting --- apps/temp-docs/components/CustomMDX/CustomMDX.utils.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/temp-docs/components/CustomMDX/CustomMDX.utils.ts b/apps/temp-docs/components/CustomMDX/CustomMDX.utils.ts index f768c93215d..2ad270cae5a 100644 --- a/apps/temp-docs/components/CustomMDX/CustomMDX.utils.ts +++ b/apps/temp-docs/components/CustomMDX/CustomMDX.utils.ts @@ -2,8 +2,10 @@ export const getAnchor = (text: any): string | undefined => { if (typeof text !== 'string') { return undefined } else { - const [anchor] = text.match(/{#[a-z-]*}/g) || [] - return anchor !== undefined ? anchor.slice(2, anchor.length - 1) : undefined + return text + .toLowerCase() + .replace(/[^a-z0-9 ]/g, '') + .replace(/[ ]/g, '-') } } From 5e6094799ee54bde7ef642410116eb64322401e0 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 1 Nov 2022 14:45:27 -0230 Subject: [PATCH 41/79] Fix typography in Alert component --- apps/temp-docs/components/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/temp-docs/components/index.tsx b/apps/temp-docs/components/index.tsx index 7705cbe1efa..9eaf671a9f9 100644 --- a/apps/temp-docs/components/index.tsx +++ b/apps/temp-docs/components/index.tsx @@ -7,7 +7,11 @@ import AuthProviders from './AuthProviders' import { H3, H4 } from './CustomMDX' const components = { - Alert, + Alert: (props: any) => ( + + {props.children} + + ), ButtonCard, CodeBlock, Frameworks, From cbf5d5117a98752b8753677c5cdbc3c72a54fe41 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 1 Nov 2022 14:46:48 -0230 Subject: [PATCH 42/79] Fix link formatting in toc --- apps/temp-docs/layouts/Default.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/temp-docs/layouts/Default.tsx b/apps/temp-docs/layouts/Default.tsx index 39ad3364d5b..4bfc5f54a43 100644 --- a/apps/temp-docs/layouts/Default.tsx +++ b/apps/temp-docs/layouts/Default.tsx @@ -23,7 +23,6 @@ const Layout: FC = ({ meta, children, toc, menuItems, currentPage }) => { document.documentElement.className = key === 'true' ? 'dark' : '' } }, []) - return ( <> @@ -58,13 +57,17 @@ const Layout: FC = ({ meta, children, toc, menuItems, currentPage }) => {
{toc && !meta?.hide_table_of_contents && ( -
-
On this page
-