Merge branch 'master' into feat/auth-config-refactor
No files matched your search
@@ -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
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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>
|
||||
|
||||
---
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
© {new Date().getFullYear()} Supabase.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
})}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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/"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
@@ -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: () => (
|
||||
|
||||
@@ -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": ""
|
||||
},
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
},
|
||||
{
|
||||
"text": "API Reference",
|
||||
"url": "/docs/client/supabase-client"
|
||||
"url": "/docs/guides/api"
|
||||
},
|
||||
{
|
||||
"text": "Guides",
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
]
|
||||
},
|
||||
})
|
||||
@@ -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>
|
||||
|
||||
@@ -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 ? (
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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={''}
|
||||
/>
|
||||
|
||||
@@ -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">
|
||||
|
||||
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
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' },
|
||||
})
|
||||
})
|
||||
@@ -8,6 +8,7 @@ export interface Partner {
|
||||
description: string
|
||||
logo: string
|
||||
images: string[]
|
||||
video: string
|
||||
overview: string
|
||||
website: string
|
||||
docs: string
|
||||
|
||||
@@ -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'>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## 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 🤖💬
|
||||
|
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
|
||||
|
||||
@@ -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
|
||||
|
||||
[](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)
|
||||
[](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.
|
||||
|
||||
|
||||
@@ -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] الدوال.
|
||||
|
||||

|
||||
|
||||
## الشرح
|
||||
|
||||
|
||||
@@ -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] ফাংশন
|
||||
|
||||

|
||||
|
||||
## ডকুমেন্টেশন
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## Documentació
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## Dokumentation
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## Dokumentation
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## Documentación
|
||||
|
||||
|
||||
@@ -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] توابع
|
||||
|
||||

|
||||
|
||||
## مستندات
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||