Merge branch 'master' into feat/auth-config-refactor

This commit is contained in:
Jonathan Summers-Muir committed 2022-05-26 19:10:17 +08:00
commit 2abb224fb9
348 files changed
+7844 -5268

No files matched your search

+4
View File
@@ -12,6 +12,10 @@ jobs:
steps:
- uses: actions/checkout@v2
# remove ./studio/pages/api folder before deploying to vercel
- uses: JesseTG/rm@v1.0.2
with:
path: ./studio/pages/api
- uses: amondnet/vercel-action@v19
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
@@ -12,6 +12,10 @@ jobs:
steps:
- uses: actions/checkout@v2
# remove ./studio/pages/api folder before deploying to vercel
- uses: JesseTG/rm@v1.0.2
with:
path: ./studio/pages/api
- uses: amondnet/vercel-action@v19
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
+2 -1
View File
@@ -73,7 +73,7 @@ jobs:
keep_reports: 50
- name: Deploy report to Github Pages
if: always()
if: ${{ !github.event.pull_request.head.repo.fork }}
uses: peaceiris/actions-gh-pages@v2
env:
EXTERNAL_REPOSITORY: supabase/test-reports
@@ -82,6 +82,7 @@ jobs:
PUBLISH_DIR: allure-history
- name: Post the link to the report
if: ${{ !github.event.pull_request.head.repo.fork }}
uses: Sibz/github-status-action@v1
with:
authToken: ${{ secrets.GITHUB_TOKEN }}
+32
View File
@@ -0,0 +1,32 @@
name: Studio Build
on:
pull_request:
branches:
- master
- studio
paths:
- 'studio/**'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install deps
run: npm i
working-directory: ./studio
- name: Run build
run: npm run build
working-directory: ./studio
+1 -1
View File
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2021 Supabase
Copyright 2022 Supabase
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+2 -1
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
+3 -3
View File
@@ -11,11 +11,11 @@ export default function AuthProviders() {
<Card>
<div className="flex justify-between gap-10">
<p>{x.name}</p>
<p className="text-tiny flex items-center font-normal uppercase text-white">
<p className="flex items-center text-xs font-normal uppercase text-white">
{x.official ? (
<span className="rounded bg-green-600 py-1 px-2">Official</span>
<span className="bg-brand-800 rounded py-1 px-2">Official</span>
) : (
<span className="rounded bg-gray-500 p-1">Unofficial</span>
<span className="bg-scale-500 rounded p-1">Unofficial</span>
)}
</p>
</div>
+18 -12
View File
@@ -8,7 +8,7 @@ const Footer = () => {
return (
<footer
className="border-t border-gray-100 bg-white p-10 dark:border-gray-600 dark:bg-gray-800"
className="border-scale-400 dark:bg-scale-200 border-t bg-white p-10"
aria-labelledby="footerHeading"
>
<h2 id="footerHeading" className="sr-only">
@@ -20,20 +20,20 @@ const Footer = () => {
<a>
<img
className="w-40"
src={isDarkMode ? `/docs/supabase-dark.svg` : `/docs/supabase-light.svg`}
src={isDarkMode ? `/supabase-dark.svg` : `/supabase-light.svg`}
alt="Supabase"
/>
</a>
</Link>
<div className="flex space-x-5">
<a href="https://twitter.com/supabase" className="text-gray-300 hover:text-gray-400">
<a href="https://twitter.com/supabase" className="text-scale-900 hover:text-scale-1100">
<span className="sr-only">Twitter</span>
<svg className="h-6 w-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" />
</svg>
</a>
<a href="https://github.com/supabase" className="text-gray-300 hover:text-gray-400">
<a href="https://github.com/supabase" className="text-scale-900 hover:text-scale-1100">
<span className="sr-only">GitHub</span>
<svg className="h-6 w-6" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
@@ -44,7 +44,10 @@ const Footer = () => {
</svg>
</a>
<a href="https://discord.supabase.com/" className="text-gray-300 hover:text-gray-400">
<a
href="https://discord.supabase.com/"
className="text-scale-900 hover:text-scale-1100"
>
<span className="sr-only">Discord</span>
<svg className="h-6 w-6" fill="currentColor" viewBox="0 0 71 55" aria-hidden="true">
<path
@@ -55,7 +58,10 @@ const Footer = () => {
</svg>
</a>
<a href="https://youtube.com/c/supabase" className="text-gray-300 hover:text-gray-400">
<a
href="https://youtube.com/c/supabase"
className="text-scale-900 hover:text-scale-1100"
>
<span className="sr-only">Youtube</span>
<svg className="h-6 w-6" fill="currentColor" viewBox="0 0 576 512" aria-hidden="true">
<path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z" />
@@ -68,7 +74,7 @@ const Footer = () => {
{footer.map((segment: any) => {
return (
<div key={`footer_${segment.title}`}>
<h3 className="text-sm text-gray-600 dark:text-gray-200">{segment.title}</h3>
<h3 className="text-scale-900 dark:text-scale-800 text-sm">{segment.title}</h3>
<ul className="mt-4 space-y-2">
{segment.links.map((link: any, idx: number) => (
<li key={`${segment.title}_link_${idx}`}>
@@ -76,9 +82,9 @@ const Footer = () => {
href={link.url}
className={`text-sm ${
link.url
? 'text-gray-400 dark:text-gray-400'
: 'text-gray-300 dark:text-gray-300'
} hover:text-gray-900 dark:hover:text-gray-300`}
? 'text-scale-1000 dark:text-scale-1000'
: 'text-scale-300 dark:text-scale-300'
} hover:text-scale-900 dark:hover:text-scale-500`}
>
{link.text}
{!link.url && (
@@ -96,8 +102,8 @@ const Footer = () => {
</div>
</div>
</div>
<div className="dark:border-dark mt-32 flex justify-between border-t pt-8">
<p className="dark:text-dark-400 mb-0 self-center text-base text-gray-400">
<div className="dark:border-scale-400 mt-32 flex justify-between border-t pt-8">
<p className="dark:text-dark-400 text-scale-800 mb-0 self-center text-sm">
&copy; {new Date().getFullYear()} Supabase.
</p>
</div>
+1 -1
View File
@@ -10,7 +10,7 @@ export default function LinkCard({
icon: ReactElement
}) {
return (
<div className="hover:border-brand-600 m-4 w-full cursor-pointer rounded-md border border-black px-4 shadow-sm hover:border-2 hover:shadow-2xl dark:bg-gray-900 lg:w-2/5">
<div className="border-scale-200 hover:border-brand-900 dark:bg-scale-400 m-4 w-full cursor-pointer rounded-md border px-4 shadow-sm hover:shadow-2xl lg:w-2/5">
{description ? (
<>
<h4 className="my-0 p-0">{title}</h4>
+2 -2
View File
@@ -43,10 +43,10 @@ const DocsLayout = ({
<div className="flex flex-row">
<SideBar menuItems={menuItems} />
<div className="mx-auto grid w-full max-w-7xl grid-cols-12">
<article className="prose dark:prose-dark col-span-8 max-w-none p-8">
<article className="prose dark:prose-dark dark:bg-scale-200 col-span-8 max-w-none p-8">
{children}
</article>
<div className="prose dark:prose-dark col-span-4 max-w-none p-8">
<div className="prose dark:bg-scale-200 col-span-4 max-w-none p-8">
<h5>On this page</h5>
{toc
? toc.json.map((item: any) => {
+6 -8
View File
@@ -33,7 +33,7 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
return (
<nav
className={`dark:border-dark sticky top-0 z-10 flex h-[72px] justify-between border-b bg-white p-4 backdrop-blur backdrop-filter dark:bg-gray-800`}
className={`dark:border-scale-400 dark:bg-scale-200 sticky top-0 z-10 flex h-[72px] justify-between border-b bg-white p-4 backdrop-blur backdrop-filter`}
>
<div className="flex items-center">
<button className="mr-2 block lg:hidden">
@@ -44,7 +44,7 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
<a>
<Image
className="cursor-pointer"
src={isDarkMode ? `/docs/supabase-dark.svg` : `/docs/supabase-light.svg`}
src={isDarkMode ? `/supabase-dark.svg` : `/supabase-light.svg`}
width={200}
height={32}
alt="Supabase Logo"
@@ -57,9 +57,7 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
{pageLinks.map((p) => (
<li key={`${p.text}-${p.link}`}>
<Link href={p.link}>
<a
className={`${p.active ? 'text-gray-800 dark:text-gray-200' : 'text-brand-600'}`}
>
<a className={`text-sm ${p.active ? 'text-brand-900' : 'text-scale-1100'}`}>
{p.text}
</a>
</Link>
@@ -67,7 +65,7 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
))}
<li>
<Link href="https://app.supabase.io">
<a className={`text-brand-600`}>Login</a>
<a className={`text-scale-1100 text-sm`}>Login</a>
</Link>
</li>
</ul>
@@ -75,12 +73,12 @@ const NavBar = ({ currentPage }: { currentPage: string }) => {
<div className={`${styles.navRight} flex items-center`}>
<Link href="https://github.com/supabase/supabase">
<a>
<IconGitHub className="text-brand-600" />
<IconGitHub className="text-scale-1100" />
</a>
</Link>
<Link href="https://twitter.com/supabase">
<a>
<IconTwitter className="text-brand-600" />
<IconTwitter className="text-scale-1100" />
</a>
</Link>
<Input
+3 -1
View File
@@ -7,7 +7,9 @@ import ThemeToggle from '../ThemeToggle'
const SideBar = ({ menuItems }: { menuItems: any }) => {
const { asPath } = useRouter()
return (
<div className={`${styles.sidebar} dark:border-dark fixed relative h-full border-r py-4`}>
<div
className={`${styles.sidebar} dark:bg-scale-200 dark:border-scale-400 relative h-full border-r py-4`}
>
<Menu>
<div>
{Object.keys(menuItems).map((key) => {
+7 -7
View File
@@ -11,22 +11,22 @@ We have a [set of examples](https://github.com/supabase/supabase/tree/master/exa
Build a basic Todo List with Supabase and your favorite frontend framework:
- [Expo Todo List.](https://github.com/supabase/supabase/tree/master/examples/expo-todo-list)
- [Next.js Todo List.](https://github.com/supabase/supabase/tree/master/examples/nextjs-todo-list)
- [React Todo List.](https://github.com/supabase/supabase/tree/master/examples/react-todo-list)
- [Svelte Todo List.](https://github.com/supabase/supabase/tree/master/examples/sveltejs-todo-list)
- [Vue 3 Todo List (Typescript).](https://github.com/supabase/supabase/tree/master/examples/vue3-ts-todo-list)
- [Expo Todo List.](https://github.com/supabase/supabase/tree/master/examples/todo-list/expo-todo-list)
- [Next.js Todo List.](https://github.com/supabase/supabase/tree/master/examples/todo-list/nextjs-todo-list)
- [React Todo List.](https://github.com/supabase/supabase/tree/master/examples/todo-list/react-todo-list)
- [Svelte Todo List.](https://github.com/supabase/supabase/tree/master/examples/todo-list/sveltejs-todo-list)
- [Vue 3 Todo List (Typescript).](https://github.com/supabase/supabase/tree/master/examples/todo-list/vue3-ts-todo-list)
- [Angular Todo List.](https://github.com/supabase/supabase/tree/master/examples/angular-todo-list)
## Auth examples#
- [Supabase Auth with vanilla Javascript..](https://github.com/supabase/supabase/tree/master/examples/javascript-auth) Use Supabase without any frontend frameworks.
- [Supabase Auth with vanilla Javascript..](https://github.com/supabase/supabase/tree/master/examples/auth/javascript-auth) Use Supabase without any frontend frameworks.
- [Supabase Auth with Next.js SSR.](https://github.com/supabase/supabase/tree/master/examples/nextjs-with-supabase-auth) Uses cookies to persist auth between the server and the client.
- [Supabase Auth with RedwoodJS.](https://redwood-playground-auth.netlify.app/supabase) Try out Supabase authentication in the [RedwoodJS](https://redwoodjs.com/) Authentication Playground complete with OAuth support and code samples.
## Collaborative
- [Next.js Slack Clone.](https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone)
- [Next.js Slack Clone.](https://github.com/supabase/supabase/tree/master/examples/slack-clone/nextjs-slack-clone)
## Community
+1 -1
View File
@@ -12,7 +12,7 @@
"@mdx-js/loader": "^1.6.22",
"@mdx-js/react": "^1.6.22",
"@next/mdx": "^12.0.4",
"@supabase/ui": "^0.36.2",
"@supabase/ui": "v0.37.0-alpha.50",
"@tailwindcss/typography": "^0.4.1",
"common": "*",
"gray-matter": "^4.0.3",
+9
View File
@@ -1,3 +1,12 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
body {
@apply bg-white dark:bg-[#1c1c1c] !important;
}
::selection {
background-color: #6ee7b7;
color: #333 !important;
}
@@ -100,7 +100,7 @@ Check out the new [Remix Auth example](https://github.com/supabase/supabase/tree
### Expo Todo List
Our React Native example has been correctly updated to be an Expo example.
[Check it out here](https://github.com/supabase/supabase/tree/master/examples/expo-todo-list).
[Check it out here](https://github.com/supabase/supabase/tree/master/examples/todo-list/expo-todo-list).
## Video: API requests with Function Hooks
+31 -12
View File
@@ -5,7 +5,8 @@ import supabase from '~/lib/supabase'
const INITIAL_VALUES = {
companyName: '',
contactName: '',
contactFirstName: '',
contactLastName: '',
contactEmail: '',
contactPhone: '',
companySize: '',
@@ -20,8 +21,12 @@ const validate = (values: any) => {
errors.companyName = 'Required'
}
if (!values.contactName) {
errors.contactName = 'Required'
if (!values.contactFirstName) {
errors.contactFirstName = 'Required'
}
if (!values.contactLastName) {
errors.contactLastName = 'Required'
}
if (!values.contactEmail) {
@@ -41,7 +46,9 @@ const EnterpriseContactForm = () => {
[
{
company_name: values.companyName,
contact_name: values.contactName,
contact_name: `${values.contactFirstName} ${values.contactLastName}`,
contact_first_name: values.contactFirstName,
contact_last_name: values.contactLastName,
contact_email: values.contactEmail,
contact_phone: values.contactPhone,
company_size: values.companySize,
@@ -76,14 +83,26 @@ const EnterpriseContactForm = () => {
/>
</div>
<div>
<Input
label="Your Name *"
id="contactName"
name="contactName"
layout="vertical"
placeholder="Jane Doe"
/>
<div className="flex space-x-4">
<div className="flex-1">
<Input
label="Your First Name *"
id="contactFirstName"
name="contactFirstName"
layout="vertical"
placeholder="Jane"
/>
</div>
<div className="flex-1">
<Input
label="Your Last Name *"
id="contactLastName"
name="contactLastName"
layout="vertical"
placeholder="Doe"
/>
</div>
</div>
<div>
+12 -7
View File
@@ -16,14 +16,14 @@ const Hero = () => {
<div className="md:mx-auto md:max-w-2xl lg:col-span-6 lg:flex lg:items-center lg:text-left">
<div
className="
space-y-12 sm:mx-auto md:w-3/4 lg:mx-0
space-y-12 sm:mx-auto md:w-3/4 lg:mx-0
lg:w-full"
>
<div>
<h1
className="
text-scale-1200
text-xl sm:leading-none lg:text-4xl
text-2xl sm:text-3xl sm:leading-none lg:text-4xl
xl:text-5xl
"
>
@@ -31,7 +31,7 @@ const Hero = () => {
<span className="text-brand-900 block md:ml-0">Scale to millions.</span>
</h1>
<div>
<p className="p text-base sm:mt-5 lg:text-lg ">
<p className="p mt-1.5 text-sm sm:mt-5 sm:text-base lg:text-lg ">
Supabase is an open source Firebase alternative. Start your project with a
Postgres Database, Authentication, instant APIs, Realtime subscriptions
and Storage.
@@ -53,22 +53,27 @@ const Hero = () => {
<div className="flex flex-col gap-4">
<small className="small text-xs">backed by</small>
<div className="w-full sm:max-w-lg lg:ml-0">
<div className="flex flex-wrap items-center justify-start">
<div className="flex flex-wrap sm:flex-nowrap items-center justify-start gap-y-8">
<img
className="mb-5 h-8 pr-5 sm:h-10 md:pr-10"
className="h-8 pr-5 sm:h-8 md:pr-10"
src={`${basePath}/images/logos/yc--grey.png`}
alt="Y Combinator"
/>
<img
className="relative mb-5 h-5 pr-5 sm:h-7 md:pr-10"
className="relative h-5 pr-5 sm:h-5 md:pr-10"
src={`${basePath}/images/logos/mozilla--grey.png`}
alt="Mozilla"
/>
<img
className="relative mb-5 h-5 pr-5 sm:h-7 md:pr-10"
className="relative h-5 pr-5 sm:h-5 md:pr-10"
src={`${basePath}/images/logos/coatue.png`}
alt="Coatue"
/>
<img
className="relative h-6 pr-5 sm:h-6 md:pr-10"
src={`${basePath}/images/logos/felicis.png`}
alt="Felicis"
/>
</div>
</div>
</div>
+24 -26
View File
@@ -3,6 +3,7 @@ import DevelopersData from 'data/Developers.json'
import AnnouncementsData from 'data/Announcements.json'
import { useRouter } from 'next/router'
import Image from 'next/image'
import Link from 'next/link'
type Props = {
text: string
@@ -37,13 +38,11 @@ const Developers = () => {
</div>
)
return url ? (
<a
key={text}
href={url}
className="dark:hover:bg-scale-500 col-span-6 rounded p-3 transition hover:bg-gray-50"
>
{content}
</a>
<Link href={url} key={text}>
<a className="dark:hover:bg-scale-500 col-span-6 rounded p-3 transition hover:bg-gray-50">
{content}
</a>
</Link>
) : (
<div
key={text}
@@ -65,25 +64,24 @@ const Developers = () => {
<ul className="mt-6 space-y-3 pb-6">
{AnnouncementsData.map((caseStudy: any, idx: number) => (
<li className="flow-root" key={`flyout_case_${idx}`}>
<a
href={caseStudy.url}
className="dark:hover:bg-dark-700 flex items-center rounded-lg border p-3 transition duration-150 ease-in-out hover:bg-gray-100"
>
<div className="relative hidden h-20 w-32 flex-shrink-0 overflow-auto rounded-md sm:block">
<Image
src={`${basePath}/${caseStudy.imgUrl}`}
alt="caseStudyThumb"
layout="fill"
objectFit="cover"
/>
</div>
<div className="min-w-0 flex-1 sm:ml-4">
<h4 className="text-scale-1200 text-normal mb-0 text-base">
{caseStudy.title}
</h4>
<p className="p text-sm">{caseStudy.description}</p>
</div>
</a>
<Link href={caseStudy.url}>
<a className="dark:hover:bg-dark-700 flex items-center rounded-lg border p-3 transition duration-150 ease-in-out hover:bg-gray-100">
<div className="relative hidden h-20 w-32 flex-shrink-0 overflow-auto rounded-md sm:block">
<Image
src={`${basePath}/${caseStudy.imgUrl}`}
alt="caseStudyThumb"
layout="fill"
objectFit="cover"
/>
</div>
<div className="min-w-0 flex-1 sm:ml-4">
<h4 className="text-scale-1200 text-normal mb-0 text-base">
{caseStudy.title}
</h4>
<p className="p text-sm">{caseStudy.description}</p>
</div>
</a>
</Link>
</li>
))}
</ul>
+24 -26
View File
@@ -5,6 +5,7 @@ import { useRouter } from 'next/router'
import ProductIcon from '../ProductIcon'
import { Badge } from '@supabase/ui'
import Image from 'next/image'
import Link from 'next/link'
const Product = () => {
const { basePath } = useRouter()
@@ -30,13 +31,11 @@ const Product = () => {
)
return (
url && (
<a
key={name}
href={url}
className="hover:bg-scale-300 dark:hover:bg-scale-500 col-span-6 rounded p-3 transition"
>
{content}
</a>
<Link href={url} key={name}>
<a className="hover:bg-scale-300 dark:hover:bg-scale-500 col-span-6 rounded p-3 transition">
{content}
</a>
</Link>
)
)
})
@@ -56,25 +55,24 @@ const Product = () => {
}
return (
<li className="flow-root" key={`flyout_case_${idx}`}>
<a
href={caseStudy.url}
className="dark:hover:bg-dark-700 flex items-center rounded-lg border p-3 transition duration-150 ease-in-out hover:bg-gray-100"
>
<div className="relative hidden h-20 w-32 flex-shrink-0 overflow-auto rounded-md sm:block">
<Image
src={`${basePath}/${caseStudy.imgUrl}`}
alt="caseStudyThumb"
layout="fill"
objectFit="cover"
/>
</div>
<div className="min-w-0 flex-1 sm:ml-4">
<h4 className="text-scale-1200 text-normal mb-0 text-base">
{caseStudy.title}
</h4>
<p className="p text-sm">{caseStudy.description}</p>
</div>
</a>
<Link href={caseStudy.url}>
<a className="dark:hover:bg-dark-700 flex items-center rounded-lg border p-3 transition duration-150 ease-in-out hover:bg-gray-100">
<div className="relative hidden h-20 w-32 flex-shrink-0 overflow-auto rounded-md sm:block">
<Image
src={`${basePath}/${caseStudy.imgUrl}`}
alt="caseStudyThumb"
layout="fill"
objectFit="cover"
/>
</div>
<div className="min-w-0 flex-1 sm:ml-4">
<h4 className="text-scale-1200 text-normal mb-0 text-base">
{caseStudy.title}
</h4>
<p className="p text-sm">{caseStudy.description}</p>
</div>
</a>
</Link>
</li>
)
})}
+77 -74
View File
@@ -84,13 +84,11 @@ const Nav = () => {
</div>
)
return url ? (
<a
key={`solution_${idx}`}
href={url}
className="dark:hover:bg-scale-600 -m-3 my-2 flex flex-col justify-between rounded-lg p-3 transition duration-150 ease-in-out hover:bg-gray-50"
>
{content}
</a>
<Link href={url} key={`solution_${idx}`}>
<a className="dark:hover:bg-scale-600 -m-3 my-2 flex flex-col justify-between rounded-lg p-3 transition duration-150 ease-in-out hover:bg-gray-50">
{content}
</a>
</Link>
) : (
<div
key={`solution_${idx}`}
@@ -202,7 +200,7 @@ const Nav = () => {
}
width={124}
height={24}
alt="Logo"
alt="Supabase Logo"
/>
</a>
</Link>
@@ -218,26 +216,28 @@ const Nav = () => {
onClick={() => handleToggle(() => setOpenDevelopers(!openDevelopers))}
active={openDevelopers}
/>
<a
href="/pricing"
className={`
text-scale-1200 hover:text-brand-900 hover:border-brand-900 dark:text-dark-100 dark:hover:border-dark-100 inline-flex items-center
border-b-2 border-transparent p-5 px-1
text-sm font-medium
`}
>
Pricing
</a>
<a
href="/blog"
className={`
text-scale-1200 hover:text-brand-900 hover:border-brand-900 dark:text-dark-100 dark:hover:border-dark-100 inline-flex items-center
border-b-2 border-transparent p-5 px-1
text-sm font-medium
`}
>
Blog
</a>
<Link href="/pricing">
<a
className={`
text-scale-1200 hover:text-brand-900 hover:border-brand-900 dark:text-dark-100 dark:hover:border-dark-100 inline-flex items-center
border-b-2 border-transparent p-5 px-1
text-sm font-medium
`}
>
Pricing
</a>
</Link>
<Link href="/blog">
<a
className={`
text-scale-1200 hover:text-brand-900 hover:border-brand-900 dark:text-dark-100 dark:hover:border-dark-100 inline-flex items-center
border-b-2 border-transparent p-5 px-1
text-sm font-medium
`}
>
Blog
</a>
</Link>
</div>
</div>
<div className="flex items-center gap-2">
@@ -270,14 +270,18 @@ const Nav = () => {
Star us on GitHub
</Button>
<a href="https://app.supabase.io/">
<Button type="default" className="hidden lg:block">
Sign in
</Button>
</a>
<a href="https://app.supabase.io/">
<Button className="hidden text-white lg:block">Start your project</Button>
</a>
<Link href="https://app.supabase.io/">
<a>
<Button type="default" className="hidden lg:block">
Sign in
</Button>
</a>
</Link>
<Link href="https://app.supabase.io/">
<a>
<Button className="hidden text-white lg:block">Start your project</Button>
</a>
</Link>
</div>
</div>
{/* <div className="absolute inset-y-0 right-0 flex items-center pr-2 sm:static sm:inset-auto sm:ml-6 sm:pr-0"></div> */}
@@ -324,46 +328,45 @@ const Nav = () => {
{/* </div> */}
<div className="mt-6 mb-12">
<div className="space-y-1 pt-2 pb-4">
<a
href="https://app.supabase.io/"
className="text-scale-900 block pl-3 pr-4 text-base font-medium dark:text-white"
>
Sign in
</a>
<Link href="https://app.supabase.io/">
<a className="text-scale-900 block pl-3 pr-4 text-base font-medium dark:text-white">
Sign in
</a>
</Link>
</div>
<div className="space-y-1 pt-2 pb-4">
<a
href="/docs"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
Developers
</a>
<a
href="/company"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
Company
</a>
<a
href="/pricing"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
Pricing
</a>
<a
href="https://github.com/supabase/supabase"
target="_blank"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
GitHub
</a>
<a
href="/blog"
target="_blank"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
Blog
</a>
<Link href="/docs">
<a className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white">
Developers
</a>
</Link>
<Link href="/company">
<a className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white">
Company
</a>
</Link>
<Link href="/pricing">
<a className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white">
Pricing
</a>
</Link>
<Link href="https://github.com/supabase/supabase">
<a
target="_blank"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
GitHub
</a>
</Link>
<Link href="/blog">
<a
target="_blank"
className="text-scale-900 dark:hover:bg-scale-600 block rounded-md py-2 pl-3 pr-4 text-base font-medium hover:border-gray-300 hover:bg-gray-50 dark:text-white"
>
Blog
</a>
</Link>
</div>
<div className="p-3">
<p className="text-scale-900 mb-6 text-sm">Products available:</p>
@@ -64,7 +64,7 @@ function TwitterSocialProof() {
</div>
</div>
<div className="mt-6">
<div className={'lg:-mr-32 lg:-ml-32'}>
<div className="cursor-move lg:-mr-32 lg:-ml-32">
<Swiper
initialSlide={3}
spaceBetween={0}
@@ -102,27 +102,27 @@ function TwitterSocialProof() {
{Examples.map((tweet: any, i: number) => {
return (
<SwiperSlide key={i}>
<div className="mr-3 ml-3 cursor-move">
<TweetCard
key={i}
handle={`@${tweet.handle}`}
quote={tweet.text}
img_url={`${basePath}${tweet.img_url}`}
/>
<div className="mr-3 ml-3">
<Link href={tweet.url}>
<a target="_blank" className="cursor-pointer">
<TweetCard
key={i}
handle={`@${tweet.handle}`}
quote={tweet.text}
img_url={`${basePath}${tweet.img_url}`}
/>
</a>
</Link>
</div>
</SwiperSlide>
)
})}
<div className="container mx-auto mt-3 hidden flex-row justify-between md:flex">
<div ref={prevRef} className="ml-4 cursor-pointer">
<p>
<IconArrowLeft />
</p>
<div ref={prevRef} className="p ml-4 cursor-pointer">
<IconArrowLeft />
</div>
<div ref={nextRef} className="mr-4 cursor-pointer">
<p>
<IconArrowRight />
</p>
<div ref={nextRef} className="p mr-4 cursor-pointer">
<IconArrowRight />
</div>
</div>
</Swiper>
+3 -3
View File
@@ -1,6 +1,6 @@
{
"show": true,
"text": "Supabase Launch Week IV",
"cta": "Functions, GraphQL, Enterprise, and more",
"link": "/blog/2022/03/25/supabase-launch-week-four"
"text": "Supabase raises $80M Series B",
"cta": "Read the TechCrunch article",
"link": "https://techcrunch.com/2022/05/10/supabase-raises-80m-series-b-for-its-open-source-firebase-alternative/"
}
+17 -18
View File
@@ -1,34 +1,33 @@
[
{
"type": "Announcement",
"title": "Supabase Launch Week III: Holiday Special",
"description": "Santa's little hackers have been hard at work because we've got another five days of launches ready to go.",
"imgUrl": "images/blog/launch-week-three/launch-week-three-og.jpg",
"logoUrl": "images/blog/launch-week-three/launch-week-three-og.jpg",
"title": "Works With Supabase - announcing our Partner Gallery",
"description": "Introducing our Partner Gallery - open source and made with Supabase.",
"imgUrl": "images/blog/partner-gallery/partner-showcase-thumb.png",
"logoUrl": "images/blog/partner-gallery/partner-showcase-thumb.png",
"organization": "Supabase",
"url": "/blog/2021/11/26/supabase-launch-week-the-trilogy",
"url": "/blog/2022/04/20/partner-gallery-works-with-supabase",
"postMeta": {
"name": "Paul Copplestone",
"avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
"publishDate": "Nov 26, 2021",
"readLength": 2
"name": "Thor Shcaeff, Alaister Young, Shane Rice",
"publishDate": "Apr 20, 2022",
"readLength": 5
},
"ctaText": "View case study"
"ctaText": "Read blog post"
},
{
"type": "Announcement",
"title": "Supabase $30m Series A",
"description": "Supabase just raised $30M, bringing our total funding to $36M. How will we spend this? Read on to find out.",
"imgUrl": "images/blog/series-a/supabase-series-a.png",
"logoUrl": "images/blog/series-a/supabase-series-a.png",
"title": "Supabase Launch Week IV",
"description": "Launch Week IV had something for everybody: Community Day, GraphQL support, Edge Functions, and more.",
"imgUrl": "images/blog/launch-week-4/friday-before/launchweek-4-promo-cal.png",
"logoUrl": "images/blog/launch-week-4/friday-before/launchweek-4-promo.png",
"organization": "Supabase",
"url": "/blog/2021/10/28/supabase-series-a",
"url": "/blog/2022/03/25/supabase-launch-week-four",
"postMeta": {
"name": "Paul Copplestone",
"avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
"publishDate": "Oct 28, 2021",
"readLength": 28
"publishDate": "Mar 25, 2022",
"readLength": 4
},
"ctaText": "View case study"
"ctaText": "Read blog post"
}
]
+3 -3
View File
@@ -12,7 +12,7 @@ type CommunityItem = {
const data: CommunityItem[] = [
{
title: 'Developers',
stat: '50,000+',
stat: '80,000+',
statLabel: 'Registered developers',
img: 'supabase.png',
detail: () => (
@@ -30,7 +30,7 @@ const data: CommunityItem[] = [
},
{
title: 'GitHub',
stat: '30,000+',
stat: '32,000+',
statLabel: 'GitHub stars',
img: 'github.png',
invertImgDarkMode: true,
@@ -42,7 +42,7 @@ const data: CommunityItem[] = [
},
{
title: 'Twitter',
stat: '26,000+',
stat: '30,000+',
statLabel: 'Followers',
img: 'twitter.png',
detail: () => (
+9 -9
View File
@@ -15,13 +15,13 @@
{
"type": "example",
"products": ["database"],
"title": "NextJS Realtime chat app",
"description": "NextJS Slack clone app using Supabase realtime subscriptions",
"title": "Next.js Realtime chat app",
"description": "Next.js Slack clone app using Supabase realtime subscriptions",
"author": "supabase",
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "nextjs-slack-clone",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/slack-clone/nextjs-slack-clone",
"vercel_deploy_url": "",
"demo_url": ""
},
@@ -86,7 +86,7 @@
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "javascript-auth",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/javascript-auth",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/auth/javascript-auth",
"vercel_deploy_url": "",
"demo_url": "https://auth-vanilla-js.vercel.app/"
},
@@ -99,7 +99,7 @@
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "expo-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/expo-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/todo-list/expo-todo-list",
"vercel_deploy_url": "",
"demo_url": ""
},
@@ -112,7 +112,7 @@
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "nextjs-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/nextjs-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/todo-list/nextjs-todo-list",
"vercel_deploy_url": "",
"demo_url": "https://supabase-nextjs-todo-list.vercel.app/"
},
@@ -125,7 +125,7 @@
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "react-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/react-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/todo-list/react-todo-list",
"vercel_deploy_url": "",
"demo_url": ""
},
@@ -138,7 +138,7 @@
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "sveltejs-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/sveltejs-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/todo-list/sveltejs-todo-list",
"vercel_deploy_url": "",
"demo_url": ""
},
@@ -151,7 +151,7 @@
"author_url": "https://github.com/supabase",
"author_img": "https://avatars.githubusercontent.com/u/54469796",
"repo_name": "vue3-ts-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/vue3-ts-todo-list",
"repo_url": "https://github.com/supabase/supabase/tree/master/examples/todo-list/vue3-ts-todo-list",
"vercel_deploy_url": "",
"demo_url": ""
},
+1 -1
View File
@@ -70,7 +70,7 @@
},
{
"text": "API Reference",
"url": "/docs/client/supabase-client"
"url": "/docs/guides/api"
},
{
"text": "Guides",
+2 -2
View File
@@ -23,7 +23,7 @@
{
"imgUrl": "images/slack-clone.jpg",
"title": "Chat app with Next.js",
"url": "https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone",
"url": "https://github.com/supabase/supabase/tree/master/examples/slack-clone/nextjs-slack-clone",
"description": "Build a full-stack Slack clone using Next.js and Supabase.",
"icons": [
{
@@ -40,7 +40,7 @@
{
"imgUrl": "images/to-do-app.jpg",
"title": "Todo list with Vue.js",
"url": "https://github.com/supabase/supabase/tree/master/examples/vue3-ts-todo-list",
"url": "https://github.com/supabase/supabase/tree/master/examples/todo-list/vue3-ts-todo-list",
"description": "Build a simple todo list with Vue and Supabase.",
"icons": [
{
+86 -86
View File
@@ -1,69 +1,69 @@
[
{
"text": "DB/Backend: @supabase_io Reason: Takes care of Auth, DB hosting, API. Open source, easy to eject into something else. I love SQL. Cloud IDE is incredible for productivity.",
"url": "https://twitter.com/JessetheSibley/status/1369678185508593673",
"handle": "JessetheSibley",
"img_url": "/images/twitter-profiles/aNx9O0lH_400x400.jpg"
"text": "Working with @supabase has been one of the best dev experiences I've had lately. Incredibly easy to set up, great documentation, and so many fewer hoops to jump through than the competition. I definitely plan to use it on any and all future projects.",
"url": "https://twitter.com/thatguy_tex/status/1497602628410388480",
"handle": "thatguy_tex",
"img_url": "/images/twitter-profiles/09HouOSt_400x400.jpg"
},
{
"text": "Been trying out this new stack. Loving it so far. Next.js (Frontend) + Stitches.js (Styling) + Radix (Primitives & Icons) + Supabase (Backend) + Vercel (Deployment) 😍 Thank you @vercel @Modulz @supabase_io for this amazing DX.",
"url": "https://twitter.com/VaibhavAcharya_/status/1369499616794660864",
"handle": "VaibhavAcharya_",
"img_url": "/images/twitter-profiles/mZAIoZM1_400x400.jpg"
"text": "@supabase is just 🤯 Now I see why a lot of people love using it as a backend for their applications. I am really impressed with how easy it is to set up an Auth and then just code it together for the frontend. @IngoKpp now I see your joy with Supabase #coding #fullstackwebdev",
"url": "https://twitter.com/IxoyeDesign/status/1497473731777728512",
"handle": "IxoyeDesign",
"img_url": "/images/twitter-profiles/C8opIL-g_400x400.jpg"
},
{
"text": "OKAY OKAY FINE I'LL LOOK AT SUPABASE PROPERLY",
"url": "https://twitter.com/benbarbersmith/status/1369758528764776453",
"handle": "benbarbersmith",
"img_url": "/images/twitter-profiles/Jqle_tE6_400x400.jpg"
"text": "I've been using @supabase for two personal projects and it has been amazing being able to use the power of Postgres and don't have to worry about the backend",
"url": "https://twitter.com/varlenneto/status/1496595780475535366",
"handle": "varlenneto",
"img_url": "/images/twitter-profiles/wkXN0t_F_400x400.jpg"
},
{
"text": "@supabase_io is amazing, super easy to get up and running quickly + they have multiple examples with various frameworks (chat app, auth, etc)",
"url": "https://twitter.com/ssw1ss/status/1366515168260337671",
"handle": "ssw1ss",
"img_url": "/images/twitter-profiles/4mD0C5Wk_400x400.jpg"
"text": "Y'all @supabase + @nextjs is amazing! 🙌 Barely an hour into a proof-of-concept and already have most of the functionality in place. 🤯🤯🤯",
"url": "https://twitter.com/justinjunodev/status/1500264302749622273",
"handle": "justinjunodev",
"img_url": "/images/twitter-profiles/9k_ZB9OO_400x400.jpg"
},
{
"text": "Been playing with @supabase_io and so far I'm liking it. I ❤️ you get full access to the database. It's very quick to get up and running, seems a nice fit for prototypes or smaller apps",
"url": "https://twitter.com/mattegreer/status/1341765395133415425",
"handle": "mattegreer",
"img_url": "/images/twitter-profiles/IgXniSVk_400x400.jpg"
"text": "And thanks to @supabase, I was able to go from idea to launched feature in a matter of hours. Absolutely amazing!",
"url": "https://twitter.com/BraydonCoyer/status/1511071369731137537",
"handle": "BraydonCoyer",
"img_url": "/images/twitter-profiles/8YxkpW8f_400x400.jpg"
},
{
"text": "Using @supabase_io with SWR by @vercel is something else 🔥",
"url": "https://twitter.com/eunjae_lee/status/1369788285317419009",
"handle": "eunjae_lee",
"img_url": "/images/twitter-profiles/eGjSYbQd_400x400.jpg"
"text": "Contributing to open-source projects and seeing merged PRs gives enormous happiness! Special thanks to @supabase, for giving this opportunity by staying open-source and being junior-friendly✌🏼",
"url": "https://twitter.com/damlakoksal/status/1511436907984662539",
"handle": "damlakoksal",
"img_url": "/images/twitter-profiles/N8EfTFs7_400x400.jpg"
},
{
"text": "big props to the @supabase_io team - open source is a two way street and they’re super responsive & community oriented",
"url": "https://twitter.com/_mateomorris/status/1369661833557196800",
"handle": "_mateomorris",
"img_url": "/images/twitter-profiles/1FyEWRE8_400x400.jpg"
"text": "Holy crap. @supabase is absolutely incredible. Most elegant backend as a service I've ever used. This is a dream.",
"url": "https://twitter.com/kentherogers/status/1512609587110719488",
"handle": "KenTheRogers",
"img_url": "/images/twitter-profiles/9l9Td-Fz_400x400.jpg"
},
{
"text": "Enjoying building on @supabase_io for a project with @lasnindrek - allows incredible development speed when bashing together an MVP",
"url": "https://twitter.com/geordidearns/status/1344433863804788737",
"handle": "geordidearns",
"img_url": "/images/twitter-profiles/vppimY3M_400x400.jpg"
"text": "Over the course of a few weeks, we migrated 125.000 users (email/pw, Gmail, Facebook, Apple logins) from Auth0 to @supabase and have now completed the migration. I'm just glad the migration is done 😅 Went well, besides a few edge cases (duplicate emails/linked accounts)",
"url": "https://twitter.com/kevcodez/status/1518548401587204096",
"handle": "kevcodez",
"img_url": "/images/twitter-profiles/t6lpcRcn_400x400.jpg"
},
{
"text": "Been actively working on Quill. It's been rapid, thanks to @supabase_io and @tailwindui",
"url": "https://twitter.com/quill_web/status/1369061125157961734",
"handle": "quill_web",
"img_url": "/images/twitter-profiles/F_8WdZbZ_400x400.jpg"
"text": "Using @supabase I'm really pleased on the power of postgres (and sql in general). Despite being a bit dubious about the whole backend as a service thing I have to say I really don't miss anything. The whole experience feel very robust and secure.",
"url": "https://twitter.com/paoloricciuti/status/1497691838597066752",
"handle": "PaoloRicciuti",
"img_url": "/images/twitter-profiles/OCDKFUOp_400x400.jpg"
},
{
"text": "@supabase_io not only is it Firebase alternative, but it has SQL and it uses #elixirlang for handling realtime 😍😍😍 @josevalim did you know that? That's power of your creation 😎",
"url": "https://twitter.com/MartinOrszulik/status/1369252918570983424",
"handle": "MartinOrszulik",
"img_url": "/images/twitter-profiles/ext7ggBo_400x400.jpg"
"text": "@supabase is lit. It took me less than 10 minutes to setup, the DX is just amazing.",
"url": "https://twitter.com/saxxone/status/1500812171063828486",
"handle": "saxxone",
"img_url": "/images/twitter-profiles/BXi6z1M7_400x400.jpg"
},
{
"text": "Another month, another impressive @supabase_io release. It’s rare to see a startup ship in public so consistently.",
"url": "https://twitter.com/yuris/status/1366770633401491456",
"handle": "yuris",
"img_url": "/images/twitter-profiles/2ilFPL2Z_400x400.jpg"
"text": "I’m not sure what magic @supabase is using but we’ve migrated @happyteamsdotio database to @supabase from @heroku and it’s much much faster at half the cost.",
"url": "https://twitter.com/michaelcdever/status/1524753565599690754",
"handle": "michaelcdever",
"img_url": "/images/twitter-profiles/rWX8Jzp5_400x400.jpg"
},
{
"text": "There are a lot of indie hackers building in public, but it’s rare to see a startup shipping as consistently and transparently as Supabase. Their upcoming March releases look to be 🔥 Def worth a follow! also opened my eyes as to how to value add in open source.",
@@ -72,103 +72,103 @@
"img_url": "/images/twitter-profiles/qhvO9V6x_400x400.jpg"
},
{
"text": "This weekend I made a personal record 🥇 on the less time spent creating an application with social login / permissions, database, cdn, infinite scaling, git push to deploy and for free. Thanks to @supabase_io and @vercel",
"text": "This weekend I made a personal record 🥇 on the less time spent creating an application with social login / permissions, database, cdn, infinite scaling, git push to deploy and for free. Thanks to @supabase and @vercel",
"url": "https://twitter.com/jperelli/status/1366195769657720834",
"handle": "jperelli",
"img_url": "/images/twitter-profiles/_ki30kYo_400x400.jpg"
},
{
"text": "I'm excited to know that there's a Firebase alternative OSS project, @supabase_io. It's not a mere copy, you can use Postgre. I like Firebase but always miss the power of SQL.",
"url": "https://twitter.com/kouariga/status/1366192045648347138",
"handle": "kouariga",
"img_url": "/images/twitter-profiles/IhXPN_CQ_400x400.jpg"
"text": "Badass Supabase is amazing, literally saves our small team a while engineer’s worth of work constantly Founders and everyone I’ve chatted with at supabase are just awesome people as well :)",
"url": "https://twitter.com/KennethCassel/status/1524359528619384834",
"handle": "KennethCassel",
"img_url": "/images/twitter-profiles/pmQj3TX-_400x400.jpg"
},
{
"text": "That’s the best part of @supabase_io! No vendor lock 😎",
"url": "https://twitter.com/jim_bisenius/status/1366094388816928770",
"handle": "jim_bisenius",
"img_url": "/images/twitter-profiles/rLgwUZSB_400x400.jpg"
"text": "Working with Supabase is just fun. It makes working with a DB so much easier.",
"url": "https://twitter.com/the_BrianB/status/1524716498442276864",
"handle": "the_BrianB",
"img_url": "/images/twitter-profiles/7NITI8Z3_400x400.jpg"
},
{
"text": "Just span up a @supabase_io app for my new side project. Honestly thinking the tagline \"Firebase Alternative\" should really be \"A Far Superior Firebase Alternative\". Love writing SQL in the cloud! Big love ❤️",
"url": "https://twitter.com/JessetheSibley/status/1365634006608457729",
"handle": "JessetheSibley",
"img_url": "/images/twitter-profiles/aNx9O0lH_400x400.jpg"
"text": "This community is STRONG and will continue to be the reason why developers flock to @supabase over an alternative. Keep up the good work! ⚡️",
"url": "https://twitter.com/_wilhelm__/status/1524074865107488769",
"handle": "_wilhelm__",
"img_url": "/images/twitter-profiles/CvqDy6YF_400x400.jpg"
},
{
"text": "Lack of count in firebase/firestore is such a nightmare and workaround solutions are crappy. I experienced it while implementing http://HelloEle.com good job Supabase 👍",
"url": "https://twitter.com/prakis/status/1365201855849009155",
"handle": "prakis",
"img_url": "/images/twitter-profiles/eRvqp-t0_400x400.jpg"
"text": "Working on my next SaaS app and I want this to be my whole job because I'm just straight out vibing putting it together. @supabase and chill, if you will",
"url": "https://twitter.com/drewclemcr8/status/1523843155484942340",
"handle": "drewclemcr8",
"img_url": "/images/twitter-profiles/bJlKtSxz_400x400.jpg"
},
{
"text": "Looking for a Firebase alternative? Consider using the open-source @supabase_io. It's as simple as Firebase but I found the dashboard UX more intuitive and hey it's OSS! It's in beta so you can use it for free rn.",
"url": "https://twitter.com/mneelansh15/status/1368171468153118721",
"handle": "mneelansh15",
"img_url": "/images/twitter-profiles/6XKH3Rm6_400x400.jpg"
"text": "@supabase Putting a ton of well-explained example API queries in a self-building documentation is just a classy move all around. I also love having GraphQL-style nested queries with traditional SQL filtering. This is pure DX delight. A+++. #backend",
"url": "https://twitter.com/CodiferousCoder/status/1522233113207836675",
"handle": "CodiferousCoder",
"img_url": "/images/twitter-profiles/t37cVLwy_400x400.jpg"
},
{
"text": "Me using @supabase_io for the first time right now 🤯",
"text": "Me using @supabase for the first time right now 🤯",
"url": "https://twitter.com/nasiscoe/status/1365140856035024902",
"handle": "nasiscoe",
"img_url": "/images/twitter-profiles/nc2Ms5hH_400x400.jpg"
},
{
"text": "I'm trying @supabase_io, Firebase alternative that uses PostgreSQL (and you can use GraphQL too) in the cloud. It's incredible 😍",
"text": "I'm trying @supabase, Firebase alternative that uses PostgreSQL (and you can use GraphQL too) in the cloud. It's incredible 😍",
"url": "https://twitter.com/JP__Gallegos/status/1365699468109242374",
"handle": "JP__Gallegos",
"img_url": "/images/twitter-profiles/1PH2mt6v_400x400.jpg"
},
{
"text": "Check out this amazing product @supabase_io. A must give try #newidea #opportunity",
"text": "Check out this amazing product @supabase. A must give try #newidea #opportunity",
"url": "https://twitter.com/digitaldaswani/status/1364447219642814464",
"handle": "digitaldaswani",
"img_url": "/images/twitter-profiles/w8HLdlC7_400x400.jpg"
},
{
"text": "I gave @supabase_io a try this weekend and I was able to create a quick dashboard to visualize the data from the PostgreSQL instance. It's super easy to use Supabase's API or the direct DB connection. Check out the tutorial 📖",
"text": "I gave @supabase a try this weekend and I was able to create a quick dashboard to visualize the data from the PostgreSQL instance. It's super easy to use Supabase's API or the direct DB connection. Check out the tutorial 📖",
"url": "https://twitter.com/razvanilin/status/1363770020581412867",
"handle": "razvanilin",
"img_url": "/images/twitter-profiles/AiaH9vJ2_400x400.jpg"
},
{
"text": "Tried @supabase_io for the first time yesterday. Amazing tool! I was able to get my Posgres DB up in no time and their documentation on operating on the DB is super easy! 👏 Can't wait for Cloud functions to arrive! It's gonna be a great Firebase alternative!",
"text": "Tried @supabase for the first time yesterday. Amazing tool! I was able to get my Posgres DB up in no time and their documentation on operating on the DB is super easy! 👏 Can't wait for Cloud functions to arrive! It's gonna be a great Firebase alternative!",
"url": "https://twitter.com/chinchang457/status/1363347740793524227",
"handle": "chinchang457",
"img_url": "/images/twitter-profiles/LTw5OCnv_400x400.jpg"
},
{
"text": "10/100 All day i was migrating my project from firebase to @supabase_io Because it is perfect and simple!!! I like design and API for understandable. There are in BETA now. Just try!🧪",
"text": "10/100 All day i was migrating my project from firebase to @supabase Because it is perfect and simple!!! I like design and API for understandable. There are in BETA now. Just try!🧪",
"url": "https://twitter.com/roomahhka/status/1363155396391763971",
"handle": "roomahhka",
"img_url": "/images/twitter-profiles/e_2eQt6C_400x400.jpg"
},
{
"text": "I gave @supabase_io a try today and I was positively impressed! Very quick setup to get a working remote database with API access and documentation generated automatically for you 👌 10/10 will play more",
"text": "I gave @supabase a try today and I was positively impressed! Very quick setup to get a working remote database with API access and documentation generated automatically for you 👌 10/10 will play more",
"url": "https://twitter.com/razvanilin/status/1363002398738800640",
"handle": "razvanilin",
"img_url": "/images/twitter-profiles/AiaH9vJ2_400x400.jpg"
},
{
"text": "Wait. Is it so easy to write queries for @supabase_io ? It's like simple SQL stuff!",
"text": "Wait. Is it so easy to write queries for @supabase ? It's like simple SQL stuff!",
"url": "https://twitter.com/T0ny_Boy/status/1362911838908911617",
"handle": "T0ny_Boy",
"img_url": "/images/twitter-profiles/UCBhUBZl_400x400.jpg"
},
{
"text": "Jeez, and @supabase_io have native support for magic link login?! I was going to use http://magic.link for this But if I can get my whole DB + auth + magic link support in one... Awesome",
"text": "Jeez, and @supabase have native support for magic link login?! I was going to use http://magic.link for this But if I can get my whole DB + auth + magic link support in one... Awesome",
"url": "https://twitter.com/louisbarclay/status/1362016666868154371",
"handle": "louisbarclay",
"img_url": "/images/twitter-profiles/6f1O8ZOW_400x400.jpg"
},
{
"text": "@MongoDB or @MySQL?!?! Please, let me introduce you to @supabase_io and the wonderful world of @PostgreSQL before it's too late!!",
"text": "@MongoDB or @MySQL?!?! Please, let me introduce you to @supabase and the wonderful world of @PostgreSQL before it's too late!!",
"url": "https://twitter.com/jim_bisenius/status/1361772978841788416",
"handle": "jim_bisenius",
"img_url": "/images/twitter-profiles/rLgwUZSB_400x400.jpg"
},
{
"text": "Where has @supabase_io been all my life? 😍",
"text": "Where has @supabase been all my life? 😍",
"url": "https://twitter.com/Elsolo244/status/1360257201911320579",
"handle": "Elsolo244",
"img_url": "/images/twitter-profiles/v6citnk33y2wpeyzrq05_400x400.jpeg"
@@ -180,19 +180,19 @@
"img_url": "/images/twitter-profiles/eYP6YXr7_400x400.jpg"
},
{
"text": "I think you'll love @supabase_io :-) Open-source, PostgreSQL-based & zero magic.",
"text": "I think you'll love @supabase :-) Open-source, PostgreSQL-based & zero magic.",
"url": "https://twitter.com/zippoxer/status/1360021315852328961",
"handle": "zippoxer",
"img_url": "/images/twitter-profiles/6rd3xub9_400x400.png"
},
{
"text": "@supabase_io is the answer to all of firebase’s problems imo",
"text": "@supabase is the answer to all of firebase’s problems imo",
"url": "https://twitter.com/jim_bisenius/status/1358590362953142278",
"handle": "jim_bisenius",
"img_url": "/images/twitter-profiles/rLgwUZSB_400x400.jpg"
},
{
"text": "@supabase_io is insane.",
"text": "@supabase is insane.",
"url": "https://twitter.com/codewithbhargav/status/1357647840911126528",
"handle": "codewithbhargav",
"img_url": "/images/twitter-profiles/LQYfHXBp_400x400.jpg"
@@ -210,19 +210,19 @@
"img_url": "/images/twitter-profiles/6zCnwpvi_400x400.jpg"
},
{
"text": "Now things are starting to get interesting! Firebase has long been the obvious choice for many #flutter devs for the ease of use. But their databases are NoSQL, which has its downsides... Seems like @supabase_io is working on something interesting here!",
"text": "Now things are starting to get interesting! Firebase has long been the obvious choice for many #flutter devs for the ease of use. But their databases are NoSQL, which has its downsides... Seems like @supabase is working on something interesting here!",
"url": "https://twitter.com/RobertBrunhage/status/1356973695865085953",
"handle": "RobertBrunhage",
"img_url": "/images/twitter-profiles/5LMWEACf_400x400.jpg"
},
{
"text": "Honestly, I really love what @supabase_io is doing, you don't need to own a complete backend, just write your logic within your app and you'll get a powerful Postgresql at your disposal.",
"text": "Honestly, I really love what @supabase is doing, you don't need to own a complete backend, just write your logic within your app and you'll get a powerful Postgresql at your disposal.",
"url": "https://twitter.com/NavicsteinR/status/1356927229217959941",
"handle": "NavicsteinR",
"img_url": "/images/twitter-profiles/w_zNZAs7_400x400.jpg"
},
{
"text": "Next.js, @supabase_io, @stripe, and @vercel. Supastack™",
"text": "Next.js, @supabase, @stripe, and @vercel. Supastack™",
"url": "https://twitter.com/jasonbarone/status/1356765411832922115",
"handle": "jasonbarone",
"img_url": "/images/twitter-profiles/6zCnwpvi_400x400.jpg"
@@ -234,25 +234,25 @@
"img_url": "/images/twitter-profiles/Os4nhKIr_400x400.jpg"
},
{
"text": "Supabase team is doing some awesome stuff #supabase #facts @supabase_io",
"text": "Supabase team is doing some awesome stuff #supabase #facts @supabase",
"url": "https://twitter.com/_strawbird/status/1372607500499841025",
"handle": "_strawbird",
"img_url": "/images/twitter-profiles/iMBvvQdn_400x400.jpg"
},
{
"text": "Did a website with @supabase_io last week with no prior experience with it. Up and running in 20 minutes. It's awesome to use. Thumbs up",
"text": "Did a website with @supabase last week with no prior experience with it. Up and running in 20 minutes. It's awesome to use. Thumbs up",
"url": "https://twitter.com/michael_webdev/status/1352885366928404481?s=20",
"handle": "michael_webdev",
"img_url": "/images/twitter-profiles/SvAyLaWV_400x400.jpg"
},
{
"text": "Next.js, @supabase_io, @stripe, and @vercel. Supastack™",
"text": "Next.js, @supabase, @stripe, and @vercel. Supastack™",
"url": "https://twitter.com/jasonbarone/status/1356765411832922115?s=20",
"handle": "jasonbarone",
"img_url": "/images/twitter-profiles/6zCnwpvi_400x400.jpg"
},
{
"text": "I just learned about @supabase_io and im in love 😍 Supabase is an open source Firebase alternative! EarListen (& react) to database changes 💁 Manage users & permissions 🔧 Simple UI for database interaction",
"text": "I just learned about @supabase and im in love 😍 Supabase is an open source Firebase alternative! EarListen (& react) to database changes 💁 Manage users & permissions 🔧 Simple UI for database interaction",
"url": "https://twitter.com/0xBanana/status/1373677301905362948",
"handle": "0xBanana",
"img_url": "/images/twitter-profiles/pgHIGqZ0_400x400.jpg"
+5
View File
@@ -649,6 +649,11 @@ module.exports = withMDX({
source: '/partners',
destination: '/partners/integrations',
},
{
permanent: false,
source: '/learn-more',
destination: '/?utm_source=event&utm_medium=billboard&utm_campaign=aws-atlanta',
},
]
},
})
+39 -19
View File
@@ -104,7 +104,7 @@ function Partner({ partner }: { partner: Partner }) {
</Swiper>
</div>
<div className="grid gap-3 space-y-16 lg:grid-cols-4 lg:space-y-0">
<div className="grid gap-3 space-y-16 lg:grid-cols-4 lg:space-y-0 lg:space-x-3">
<div className="lg:col-span-3">
<h2
className="text-scale-1200"
@@ -113,6 +113,22 @@ function Partner({ partner }: { partner: Partner }) {
Overview
</h2>
{partner.video && (
<div
className="bg-scale-1000 relative w-full rounded-b-md shadow-lg"
style={{ padding: '56.25% 0 0 0', marginBottom: '1rem' }}
>
<iframe
title="Demo video showcasing Supabase"
className="absolute h-full w-full rounded-b-md"
src={`https://www.youtube-nocookie.com/embed/${partner.video}?autoplay=0&loop=0&controls=1&modestbranding=1&rel=0&disablekb=1`}
style={{ top: 0, left: 0 }}
frameBorder="0"
allow="autoplay; modestbranding; encrypted-media"
/>
</div>
)}
<div className="prose" dangerouslySetInnerHTML={{ __html: partner.overview }} />
</div>
@@ -125,10 +141,12 @@ function Partner({ partner }: { partner: Partner }) {
</h2>
<div className="text-scale-1200 divide-y">
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Developer</span>
<span className="text-scale-1200">{partner.developer}</span>
</div>
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Developer</span>
<span className="text-scale-1200">{partner.developer}</span>
</div>
)}
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Category</span>
@@ -155,20 +173,22 @@ function Partner({ partner }: { partner: Partner }) {
</a>
</div>
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Documentation</span>
<a
href={partner.docs}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
<span className="flex items-center space-x-1">
<span>Learn</span>
<IconExternalLink size="small" />
</span>
</a>
</div>
{partner.type === 'technology' && (
<div className="flex items-center justify-between py-2">
<span className="text-scale-900">Documentation</span>
<a
href={partner.docs}
target="_blank"
rel="noreferrer"
className="text-brand-900 hover:text-brand-800 transition-colors"
>
<span className="flex items-center space-x-1">
<span>Learn</span>
<IconExternalLink size="small" />
</span>
</a>
</div>
)}
</div>
</div>
</div>
+49 -47
View File
@@ -62,61 +62,63 @@ function ExpertPartnersPage(props: Props) {
<h1 className="h1">{meta_title}</h1>
<h2 className="text-scale-900 text-xl">{meta_description}</h2>
</div>
<div className="grid grid-cols-12 lg:gap-16 xl:gap-32">
<div className="col-span-3">
<div className="grid space-y-12 md:gap-8 lg:grid-cols-12 lg:gap-16 lg:space-y-0 xl:gap-32">
<div className="lg:col-span-4 xl:col-span-3">
{/* Horizontal link menu */}
<div className="space-y-6">
{/* Search Bar */}
<div className="space-y-4">
<div className="text-scale-900 mb-2 text-sm">Explore more</div>
<PartnerLinkBox
title="Integrations"
color="blue"
description="Extend and automate your workflow by using integrations for your favorite tools."
href={`/partners/integrations`}
icon={
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="1"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"
/>
</svg>
}
/>
<PartnerLinkBox
title="Become a partner"
color="brand"
description="Fill out a quick 30 second form to apply to become a partner"
href={`/partners/integrations#become-a-partner`}
icon={
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="1"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"
/>
</svg>
}
/>
<div className="grid grid-cols-2 gap-4 lg:grid-cols-1">
<PartnerLinkBox
title="Integrations"
color="blue"
description="Extend and automate your workflow by using integrations for your favorite tools."
href={`/partners/integrations`}
icon={
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="1"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"
/>
</svg>
}
/>
<PartnerLinkBox
title="Become a partner"
color="brand"
description="Fill out a quick 30 second form to apply to become a partner"
href={`/partners/integrations#become-a-partner`}
icon={
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="1"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"
/>
</svg>
}
/>
</div>
</div>
</div>
</div>
<div className="col-span-9">
<div className="lg:col-span-8 xl:col-span-9">
{/* Partner Tiles */}
<div className="grid">
{partners.length ? (
+1 -1
View File
@@ -636,7 +636,7 @@ export default function IndexPage() {
</Link>
<Link href="https://github.com/supabase/supabase/discussions">
<a>
<Button type="default" size="small" className="text-white">
<Button type="default" size="small">
GitHub
</Button>
</a>
+2 -2
View File
@@ -155,10 +155,10 @@ function StoragePage() {
author_img={'https://avatars.githubusercontent.com/u/54469796'}
repo_name={'nextjs-ts-user-management'}
repo_url={
'https://github.com/supabase/supabase/tree/master/examples/nextjs-ts-user-management'
'https://github.com/supabase/supabase/tree/master/examples/user-management/nextjs-ts-user-management'
}
vercel_deploy_url={
'https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fnextjs-ts-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-nextjs-ts-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management'
'https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fuser-mangement%2Fnextjs-ts-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-nextjs-ts-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management'
}
demo_url={''}
/>
+4 -4
View File
@@ -165,10 +165,10 @@ const Index = ({}: Props) => {
<div>
<div
className="
bbg-white dark:bg-scale-400
flex flex-col justify-between rounded rounded-t-none
border-b border-r
border-l border-gray-100 p-5
dark:bg-scale-400 flex
flex-col justify-between rounded rounded-t-none border-b
border-r border-l
border-gray-100 bg-white p-5
pt-10 dark:border-gray-600"
>
<a href="mailto:support@supabase.io">
Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@@ -0,0 +1,177 @@
import { serve } from 'https://deno.land/std@0.131.0/http/server.ts'
const FUNCTION_SECRET = Deno.env.get('FUNCTION_SECRET')
const HUBSPOT_API_KEY = Deno.env.get('HUBSPOT_API_KEY')
const OWNER_ID = Deno.env.get('OWNER_ID')
const ENTERPRISE_PIPELINE = Deno.env.get('ENTERPRISE_PIPELINE')
const PARTNERS_PIPELINE = Deno.env.get('PARTNERS_PIPELINE')
const ENTERPRISE_DEAL_STAGE = Deno.env.get('ENTERPRISE_DEAL_STAGE')
const PARTNERS_DEAL_STAGE = Deno.env.get('PARTNERS_DEAL_STAGE')
serve(async (req) => {
const requestSecret = req.headers.get('x-function-secret')
if (FUNCTION_SECRET !== requestSecret) {
return new Response('Unauthorized', { status: 401 })
}
const input = await req.json()
const firstName = input.record.contact_first_name || input.record.first
const lastName = input.record.contact_last_name || input.record.last
const company = input.record.company_name || input.record.company
const email = input.record.contact_email || input.record.email
const phone = input.record.contact_phone || input.record.phone
const contactResponse = await fetch(
`https://api.hubapi.com/crm/v3/objects/contacts?hapikey=${HUBSPOT_API_KEY}`,
{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
properties: {
company,
email,
firstname: firstName,
lastname: lastName,
phone,
},
}),
}
)
const body = await contactResponse.json()
let contactId: string | null = null
if (contactResponse.ok) {
contactId = body.id
} else {
if (body.status === 'error' && body.category === 'CONFLICT') {
// fetch existing contact
const contactAssociateResponse = await fetch(
`https://api.hubapi.com/crm/v3/objects/contacts/${email}?idProperty=email&hapikey=${HUBSPOT_API_KEY}`
)
const body = await contactAssociateResponse.json()
if (contactAssociateResponse.ok) {
contactId = body.id
} else {
console.log(`Failed to fetch contact`, body)
return new Response(`Failed to fetch contact`, { status: 500 })
}
} else {
console.log(`Failed to create contact`, body)
return new Response(`Failed to create contact`, { status: 500 })
}
}
const noteContent = Object.entries(input.record).reduce(
(acc, [key, value]) => acc + `${key}: ${value || 'NOT_PROVIDED'}<br />`,
''
)
// Add note
const noteResponse = await fetch(
`https://api.hubapi.com/crm/v3/objects/notes?hapikey=${HUBSPOT_API_KEY}`,
{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
properties: {
hs_timestamp: Date.now(),
hs_note_body: noteContent,
hubspot_owner_id: OWNER_ID,
},
}),
}
)
const noteBody = await noteResponse.json()
if (!noteResponse.ok) {
console.log(`Failed to add note`, noteBody)
return new Response(`Failed to add note`, { status: 500 })
}
const noteId = noteBody.id
// Associate note with contact
const noteAssociateResponse = await fetch(
`https://api.hubapi.com/crm/v3/objects/notes/${noteId}/associations/contacts/${contactId}/note_to_contact?hapikey=${HUBSPOT_API_KEY}`,
{
method: 'PUT',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
}
)
if (!noteAssociateResponse.ok) {
console.log(`Failed to associate note`, await noteAssociateResponse.json())
return new Response(`Failed to associate note`, { status: 500 })
}
// Create deal
const dealCloseDate = new Date()
dealCloseDate.setDate(dealCloseDate.getDate() + 28) // 28 days
const dealResponse = await fetch(
`https://api.hubapi.com/crm/v3/objects/deals?hapikey=${HUBSPOT_API_KEY}`,
{
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
properties: {
closedate: dealCloseDate.toISOString(),
dealname: company || `${firstName} ${lastName}`,
dealstage:
input.table === 'enterprise_contacts' ? ENTERPRISE_DEAL_STAGE : PARTNERS_DEAL_STAGE,
hubspot_owner_id: OWNER_ID,
pipeline: input.table === 'enterprise_contacts' ? ENTERPRISE_PIPELINE : PARTNERS_PIPELINE,
},
}),
}
)
const dealBody = await dealResponse.json()
if (!dealResponse.ok) {
console.log(`Failed to create deal`, dealBody)
return new Response(`Failed to create deal: ` + dealBody.message, { status: 500 })
}
const dealId = dealBody.id
// Associate contact with a deal
const dealAssociateResponse = await fetch(
`https://api.hubapi.com/crm/v3/objects/contacts/${contactId}/associations/deals/${dealId}/contact_to_deal?hapikey=${HUBSPOT_API_KEY}`,
{
method: 'PUT',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
}
)
if (!dealAssociateResponse.ok) {
console.log(`Failed to associate contact with deal`, await dealAssociateResponse.json())
return new Response(`Failed to associate contact with deal`, { status: 500 })
}
return new Response(JSON.stringify({ done: true }), {
headers: { 'Content-Type': 'application/json' },
})
})
+1
View File
@@ -8,6 +8,7 @@ export interface Partner {
description: string
logo: string
images: string[]
video: string
overview: string
website: string
docs: string
+1 -1
View File
@@ -13,7 +13,7 @@
<h1>Supabase Auth Example</h1>
</div>
<div class='section'>
<a href="https://github.com/supabase/supabase/tree/master/examples/javascript-auth">View the code on GitHub</a>
<a href="https://github.com/supabase/supabase/tree/master/examples/auth/javascript-auth">View the code on GitHub</a>
</div>
<div class='section'>
<form id='sign-up'>
+5 -5
View File
@@ -68,7 +68,7 @@ function Auth(props) {
<>
<h4>Sign in</h4>
<form onSubmit={(e) => handleSignIn(e)}>
<label for="sign-in__email">Email</label>
<label htmlFor="sign-in__email">Email</label>
<input
id="sign-in__email"
label="Email address"
@@ -77,7 +77,7 @@ function Auth(props) {
defaultValue={email}
onChange={(e) => setEmail(e.target.value)}
/>
<label for="sign-in__password">Password</label>
<label htmlFor="sign-in__password">Password</label>
<input
id="sign-in__password"
label="Password"
@@ -98,7 +98,7 @@ function Auth(props) {
<>
<h4>Sign up</h4>
<form onSubmit={(e) => handleSignUp(e)}>
<label for="sign-up__email">Email</label>
<label htmlFor="sign-up__email">Email</label>
<input
id="sign-up__email"
label="Email address"
@@ -107,7 +107,7 @@ function Auth(props) {
defaultValue={email}
onChange={(e) => setEmail(e.target.value)}
/>
<label for="sign-up__password">Password</label>
<label htmlFor="sign-up__password">Password</label>
<input
id="sign-up__password"
label="Password"
@@ -128,7 +128,7 @@ function Auth(props) {
<>
<h4>Forgotten password</h4>
<form onSubmit={handlePasswordReset}>
<label for="forgotten_password__email">Email</label>
<label htmlFor="forgotten_password__email">Email</label>
<input
id="forgotten_password__email"
label="Email address"
+2
View File
@@ -10,6 +10,8 @@ The function examples are located in [`./supabase/functions`](./supabase/functio
- [`browser-with-cors`](./supabase/functions/browser-with-cors/index.ts): Handle CORS headers for function invocations from browser environments.
- [`select-from-table-with-auth-rls`](./supabase/functions/select-from-table-with-auth-rls/index.ts): Retrieve data from an authenticated user via RLS.
- [`send-email-smtp`](./supabase/functions/send-email-smtp/index.ts): Send an email using SMTP credentials.
- [`telegram-bot`](./supabase/functions/telegram-bot/index.ts): Webhook handler for Telegram bots using [grammY](https://grammy.dev/).
## Develop locally
@@ -1,5 +1,6 @@
export const functionsList = [
'local: Whatever function is currently served by the CLI',
'browser-with-cors',
'select-from-table-with-auth-rls',
'select-from-table-with-auth-rls',
'send-email-smtp',
]
@@ -0,0 +1,10 @@
# send-email-smtp
SMTP_HOSTNAME="your.hostname.com"
SMTP_PORT="2587"
SMTP_USERNAME="your_username"
SMTP_PASSWORD="your_password"
SMTP_FROM="no-reply@example.com"
# telegram-bot
TELEGRAM_BOT_TOKEN="get it from https://t.me/BotFather"
FUNCTION_SECRET="random secret"
@@ -0,0 +1,16 @@
# send-email-smtp
## Deploy
```
supabase link --project-ref your-project-ref
supabase secrets set SMTP_HOSTNAME="your.hostname.com" SMTP_PORT="2587" SMTP_USERNAME="your_username" SMTP_PASSWORD="your_password" SMTP_FROM="no-reply@example.com"
supabase functions deploy send-email-smtp
```
Note: `SMTP_PORT` must be a port other than `25`, `465`, and `587` as Deno Deploy does not support outgoing connections to ports. AWS SES (port 2587) is recommended.
## Test locally
- `cp ./supabase/.env.local.example ./supabase/.env.local`
- `supabase functions serve send-email-smtp --env-file ./supabase/.env.local`
@@ -0,0 +1,47 @@
// Follow this setup guide to integrate the Deno language server with your editor:
// https://deno.land/manual/getting_started/setup_your_environment
// This enables autocomplete, go to definition, etc.
import { serve } from 'https://deno.land/std@0.131.0/http/server.ts'
import { SmtpClient } from 'https://deno.land/x/denomailer@0.12.0/mod.ts'
const smtp = new SmtpClient()
console.log(`Function "send-email-smtp" up and running!`)
serve(async (req) => {
await smtp.connect({
hostname: Deno.env.get('SMTP_HOSTNAME')!,
port: Number(Deno.env.get('SMTP_PORT')!),
username: Deno.env.get('SMTP_USERNAME')!,
password: Deno.env.get('SMTP_PASSWORD')!,
})
try {
await smtp.send({
from: Deno.env.get('SMTP_FROM')!,
to: 'testr@test.de',
subject: `Hello from Supabase Edge Functions`,
content: `Hello Functions \o/`,
})
} catch (error: any) {
return new Response(error.message, { status: 500 })
}
await smtp.close()
return new Response(
JSON.stringify({
done: true,
}),
{
headers: { 'Content-Type': 'application/json' },
}
)
})
// To invoke:
// curl -i --location --request POST 'http://localhost:54321/functions/v1/' \
// --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24ifQ.625_WdcF3KHqz5amU0x2X5WWHP-OEs_4qj0ssLNHzTs' \
// --header 'Content-Type: application/json' \
// --data '{"name":"Functions"}'
@@ -0,0 +1,13 @@
# telegram-bot
Try it out: https://t.me/supabase_example_bot
![demo](./demo.gif)
## Deploy
1. Run `supabase functions deploy --no-verify-jwt telegram-bot`
2. Get your Telegram token from https://t.me/BotFather
3. Run `supabase secrets set TELEGRAM_BOT_TOKEN=your_token FUNCTION_SECRET=random_secret`
4. Set your bot's webhook url to `https://<PROJECT_NAME>.functions.supabase.co/telegram-bot` (Replacing `<...>` with respective values). In order to do that, run this url (in your browser, for example): `https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/setWebhook?url=https://<PROJECT_NAME>.functions.supabase.co/telegram-bot?secret=<FUNCTION_SECRET>`
5. That's it, go ahead and chat with your bot 🤖💬
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 MiB

@@ -0,0 +1,35 @@
// Follow this setup guide to integrate the Deno language server with your editor:
// https://deno.land/manual/getting_started/setup_your_environment
// This enables autocomplete, go to definition, etc.
import { serve } from "https://deno.land/std@0.131.0/http/server.ts"
console.log(`Function "telegram-bot" up and running!`)
import { Bot, webhookCallback } from "https://deno.land/x/grammy@v1.8.3/mod.ts";
const bot = new Bot(Deno.env.get('TELEGRAM_BOT_TOKEN') || '');
bot.command("start", (ctx) => ctx.reply("Welcome! Up and running."));
bot.command('ping', (ctx) => ctx.reply(`Pong! ${new Date()} ${Date.now()}`))
const handleUpdate = webhookCallback(bot, "std/http");
serve(async (req) => {
try {
const url = new URL(req.url);
if (url.searchParams.get('secret') !== Deno.env.get('FUNCTION_SECRET'))
return new Response('not allowed', { status: 405 })
return await handleUpdate(req);
} catch (err) {
console.error(err);
}
})
// To invoke:
// curl -i --location --request POST 'http://localhost:54321/functions/v1/' \
// --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24ifQ.625_WdcF3KHqz5amU0x2X5WWHP-OEs_4qj0ssLNHzTs' \
// --header 'Content-Type: application/json' \
// --data '{"name":"Functions"}'
@@ -138,7 +138,7 @@ Full schema here with role-based access control:
```sql
--
-- For use with https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone
-- For use with https://github.com/supabase/supabase/tree/master/examples/slack-clone/nextjs-slack-clone
--
-- Custom types
@@ -1,5 +1,5 @@
--
-- For use with https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone
-- For use with https://github.com/supabase/supabase/tree/master/examples/slack-clone/nextjs-slack-clone
--
-- Custom types
+29 -29
View File
@@ -9,7 +9,7 @@
"version": "0.1.1",
"license": "MIT",
"dependencies": {
"@supabase/supabase-js": "^1.34.1",
"@supabase/supabase-js": "^1.35.3",
"next": "latest",
"react": "^18.0.0",
"react-dom": "^18.0.0",
@@ -304,9 +304,9 @@
}
},
"node_modules/@supabase/gotrue-js": {
"version": "1.22.12",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.22.12.tgz",
"integrity": "sha512-/baPkNiumE2B+OLSpvZquDsTqnOTAsG/07GBq5rXU8/e0rSyjljAFf8gnawGPezjlDGTFr2fjRYs0BYMz4LD/A==",
"version": "1.22.15",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.22.15.tgz",
"integrity": "sha512-7/mwnd1hR/bpkCmbDvjnwPfWyRcE2B1ZnfxthqgVaZ5oJHS/CQibyuLBL8DA75fxmgY9nIfednDZSydSm6zK0w==",
"dependencies": {
"cross-fetch": "^3.0.6"
}
@@ -320,9 +320,9 @@
}
},
"node_modules/@supabase/realtime-js": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.7.1.tgz",
"integrity": "sha512-ovp9UXzi3ibA/AOyL4CXW7hjbrR+ZQoxbJZ8rfZTSMpqYhT8Jl8/sLUozMobIzSV6gsZYuHR3QnzJmemzvBQhg==",
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.7.2.tgz",
"integrity": "sha512-DMUaFIKj7KszGtWTTQbhMmUzZf7UnwYqySsmY+G8HgYxvY3ZaVa+DZD0I6ofgr4OLNr0po/ODM2a4lf5m5GNBg==",
"dependencies": {
"@types/phoenix": "^1.5.4",
"websocket": "^1.0.34"
@@ -337,14 +337,14 @@
}
},
"node_modules/@supabase/supabase-js": {
"version": "1.34.1",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.34.1.tgz",
"integrity": "sha512-0K9iJXvGcg+iBrUXf9vBlCObPVXn7B77tdCUcaw2/0XgJJBNFg90t43zNnY51KdjT1AZCm/1Kpwx2zd7FdCzKQ==",
"version": "1.35.3",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.35.3.tgz",
"integrity": "sha512-uwO8OVdMFsGZNZ1xQhFz22+PSW0EWYZ5xVq+jQeGz8nhabEu+Q9Uyep/bcNzOpyPJRzbGfxSPRzgAdAxfJgFhw==",
"dependencies": {
"@supabase/functions-js": "^1.3.3",
"@supabase/gotrue-js": "^1.22.12",
"@supabase/gotrue-js": "^1.22.14",
"@supabase/postgrest-js": "^0.37.2",
"@supabase/realtime-js": "^1.7.1",
"@supabase/realtime-js": "^1.7.2",
"@supabase/storage-js": "^1.7.0"
}
},
@@ -723,9 +723,9 @@
"integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw=="
},
"node_modules/es5-ext": {
"version": "0.10.60",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz",
"integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==",
"version": "0.10.61",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
"integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
"hasInstallScript": true,
"dependencies": {
"es6-iterator": "^2.0.3",
@@ -1973,9 +1973,9 @@
}
},
"@supabase/gotrue-js": {
"version": "1.22.12",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.22.12.tgz",
"integrity": "sha512-/baPkNiumE2B+OLSpvZquDsTqnOTAsG/07GBq5rXU8/e0rSyjljAFf8gnawGPezjlDGTFr2fjRYs0BYMz4LD/A==",
"version": "1.22.15",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.22.15.tgz",
"integrity": "sha512-7/mwnd1hR/bpkCmbDvjnwPfWyRcE2B1ZnfxthqgVaZ5oJHS/CQibyuLBL8DA75fxmgY9nIfednDZSydSm6zK0w==",
"requires": {
"cross-fetch": "^3.0.6"
}
@@ -1989,9 +1989,9 @@
}
},
"@supabase/realtime-js": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.7.1.tgz",
"integrity": "sha512-ovp9UXzi3ibA/AOyL4CXW7hjbrR+ZQoxbJZ8rfZTSMpqYhT8Jl8/sLUozMobIzSV6gsZYuHR3QnzJmemzvBQhg==",
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.7.2.tgz",
"integrity": "sha512-DMUaFIKj7KszGtWTTQbhMmUzZf7UnwYqySsmY+G8HgYxvY3ZaVa+DZD0I6ofgr4OLNr0po/ODM2a4lf5m5GNBg==",
"requires": {
"@types/phoenix": "^1.5.4",
"websocket": "^1.0.34"
@@ -2006,14 +2006,14 @@
}
},
"@supabase/supabase-js": {
"version": "1.34.1",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.34.1.tgz",
"integrity": "sha512-0K9iJXvGcg+iBrUXf9vBlCObPVXn7B77tdCUcaw2/0XgJJBNFg90t43zNnY51KdjT1AZCm/1Kpwx2zd7FdCzKQ==",
"version": "1.35.3",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.35.3.tgz",
"integrity": "sha512-uwO8OVdMFsGZNZ1xQhFz22+PSW0EWYZ5xVq+jQeGz8nhabEu+Q9Uyep/bcNzOpyPJRzbGfxSPRzgAdAxfJgFhw==",
"requires": {
"@supabase/functions-js": "^1.3.3",
"@supabase/gotrue-js": "^1.22.12",
"@supabase/gotrue-js": "^1.22.14",
"@supabase/postgrest-js": "^0.37.2",
"@supabase/realtime-js": "^1.7.1",
"@supabase/realtime-js": "^1.7.2",
"@supabase/storage-js": "^1.7.0"
}
},
@@ -2287,9 +2287,9 @@
"integrity": "sha512-/s3+fwhKf1YK4k7btOImOzCQLpUjS6MaPf0ODTNuT4eTM1Bg4itBpLkydhOzJmpmH6Z9eXFyuuK5czsmzRzwtw=="
},
"es5-ext": {
"version": "0.10.60",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.60.tgz",
"integrity": "sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg==",
"version": "0.10.61",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
"integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
"requires": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
@@ -9,7 +9,7 @@
"start": "next start"
},
"dependencies": {
"@supabase/supabase-js": "^1.34.1",
"@supabase/supabase-js": "^1.35.3",
"next": "latest",
"react": "^18.0.0",
"react-dom": "^18.0.0",
@@ -28,7 +28,7 @@ The `anon` key is your client-side API key. It allows "anonymous access" to your
### 4. Deploy the Vue.js client
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/supabase/supabase/tree/master/examples/vue3-ts-todo-list&env=VUE_APP_SUPABASE_URL,VUE_APP_SUPABASE_KEY&envDescription=Find%20the%20Supabase%20URL%20and%20key%20in%20the%20your%20auto-generated%20docs%20at%20app.supabase.io&project-name=supabase-todo-list&repo-name=supabase-todo-list)
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/supabase/supabase/tree/master/examples/todo-list/vue3-ts-todo-list&env=VUE_APP_SUPABASE_URL,VUE_APP_SUPABASE_KEY&envDescription=Find%20the%20Supabase%20URL%20and%20key%20in%20the%20your%20auto-generated%20docs%20at%20app.supabase.io&project-name=supabase-todo-list&repo-name=supabase-todo-list)
Here, we recommend forking this repo so you can deploy through Vercel by clicking the button above. When you click the button, replace the repo URL with your fork's URL.
+5 -2
View File
@@ -1,7 +1,8 @@
<div style="direction: rtl;" dir="rtl">
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -16,7 +17,9 @@
- [x] واجهات برمجة التطبيقات التي يتم إنشاؤها تلقائيا.
- [x] لوحة الإدارة.
- [x] التخزين.
- [ ] الدوال (مفردها دالّة).
- [x] الدوال.
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## الشرح
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] স্বয়ংক্রিয়ভাবে তৈরি APIs
- [x] ড্যাশবোর্ড
- [x] স্টোরেজ
- [ ] ফাংশন (শীঘ্রই আসছে)
- [x] ফাংশন
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## ডকুমেন্টেশন
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] API autogenerada
- [x] Panell de control
- [x] Emmagatzematge
- [ ] Funcions (pròximament)
- [x] Funcions
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## Documentació
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] Automatisk genererede APIer
- [x] Instrumentbræt
- [x] Opbevaring af data
- [ ] Serverbaserede funktioner (på vej)
- [x] Serverbaserede funktioner
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## Dokumentation
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] Automatisch generierte APIs
- [x] Dashboard
- [x] Speicher
- [ ] Funktionen (kommt demnächst)
- [x] Funktionen
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## Dokumentation
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] API autogenerada
- [x] Panel de control
- [x] Almacenamiento
- [ ] Funciones (próximamente)
- [x] Funciones
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## Documentación
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-with-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] ‫ساختن خودکار APIها
- [x] پنل کاربری
- [x] فضای ذخیره‌سازی
- [ ] توابع (به زودی)
- [x] توابع
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## مستندات
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@
- [x] API générées automatiquement
- [x] Tableau de bord
- [x] Stockage
- [ ] Fonctions (à venir)
- [x] Fonctions
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## Documentation
+5 -2
View File
@@ -1,5 +1,6 @@
<p align="center">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/web/static/supabase-light-rounded-corner-background.svg"/>
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--light.svg?sanitize=true#gh-light-mode-only">
<img width="300" src="https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/supabase-logo-wordmark--dark.svg?sanitize=true#gh-dark-mode-only">
</p>
---
@@ -14,7 +15,9 @@ To [Supabase](https://supabase.com) είναι μια εναλλακτική λ
- [x] Auto-generated APIs
- [x] Dashboard
- [x] Storage
- [ ] Functions (coming soon)
- [x] Functions
![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png)
## Documentation
Loaded 100 of 348 files, more files were not shown because too many files have changed in this diff. Show more