From d1fb6207432577fd59266c3f7585839e073f5fc4 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 11 Jan 2023 17:06:30 -0330 Subject: [PATCH 001/120] Start on pricing page updates --- apps/www/components/PricingTableRow.tsx | 35 ++-- apps/www/pages/pricing/index.tsx | 220 +++++++++++++++--------- apps/www/styles/index.css | 26 +++ 3 files changed, 186 insertions(+), 95 deletions(-) diff --git a/apps/www/components/PricingTableRow.tsx b/apps/www/components/PricingTableRow.tsx index 2a81769258b..e9a29a72236 100644 --- a/apps/www/components/PricingTableRow.tsx +++ b/apps/www/components/PricingTableRow.tsx @@ -1,6 +1,6 @@ import { IconHelpCircle } from 'ui' import ProductIcon from 'components/ProductIcon' -import React from 'react' +import React, { useState } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( @@ -50,7 +50,7 @@ export const PricingTableRowDesktop = (props: any) => { return ( <> {

{category.title}

- - - + + + {category.features.map((feat: any, i: number) => { @@ -85,17 +85,28 @@ export const PricingTableRowDesktop = (props: any) => { )} - {Object.values(feat.tiers).map((tier: any, i) => { + {Object.entries(feat.tiers).map((entry: any, i) => { + const tierName = entry[0] + const tierValue = entry[1] + return ( - - {typeof tier === 'boolean' && tier === true ? ( - - ) : typeof tier === 'boolean' && tier === false ? ( + + {typeof tierValue === 'boolean' && tierValue === true ? ( + + ) : typeof tierValue === 'boolean' && tierValue === false ? (
- +
) : ( - {tier} + + {tierValue} + )} ) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 75e03711b85..dd555d1683b 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -30,11 +30,14 @@ export default function IndexPage() { const tiers = [ { name: 'Free', - costUnit: '/month per project', + nameBadge: '', + costUnit: 'per month per project', href: 'https://app.supabase.com/new/new-project', + priceLabel: 'Starting from', priceMonthly: 0, warning: 'Limit of 2 free projects', description: 'Perfect for passion projects & simple websites.', + preface: 'Get started with...', features: [ 'Up to 500MB database & 1GB file storage', 'Up to 2GB bandwidth', @@ -51,9 +54,12 @@ export default function IndexPage() { }, { name: 'Pro', - costUnit: '/month per project', + nameBadge: '', + costUnit: 'per month per project', href: 'https://app.supabase.com/new/new-project', from: true, + priceLabel: 'Starting from', + warning: '+ any additional usage', priceMonthly: 25, description: 'For production applications with the option to scale.', features: [ @@ -74,6 +80,34 @@ export default function IndexPage() { additional: 'Need more? Turn off your spend cap to Pay As You Grow ', cta: 'Get Started', }, + { + name: 'Team', + nameBadge: 'New', + costUnit: 'per month per org', + href: 'https://app.supabase.com/new/new-project', + from: true, + priceLabel: 'Starting from', + priceMonthly: 25, + description: 'For scaling teams with permissions & access controls', + warning: '+ any additional usage', + features: [ + 'Usage-based pricing', + 'Organization member roles (ABAC)', + 'SOC2', + 'Priority email support & SLAs', + '14 day backups', + '100,000 monthly active users included', + 'Standardized Security Questionnaire', + 'SSO for Supabase Dashboard', + '1 XS compute instance', + '28 day log retention', + ], + scale: '', + shutdown: '', + preface: 'The following features will apply to all projects within the organization:', + additional: '', + cta: 'Get Started', + }, { name: 'Enterprise', href: 'https://forms.supabase.com/enterprise', @@ -163,7 +197,7 @@ export default function IndexPage() { -
+
{/*
*/}
-
+
{tiers.map((tier) => (
-
-
-

{tier.name}

- {tier.warning && ( -
- {tier.warning} + {tier.name === 'Pro' && ( +

Most Popular

+ )} +
+
+
+
+

+ {tier.name} +

+ {tier.nameBadge && ( + + {tier.nameBadge} + + )}
- )} -
-

{tier.description}

-
{tier.description}

+
- {tier.priceMonthly !== undefined ? ( -
-
-
- - {typeof tier.priceMonthly !== 'string' && '$'} - {tier.priceMonthly} - - - {tier.costUnit} - + > + {tier.priceMonthly !== undefined ? ( +
+
+
+

+ {tier.priceLabel} +

+

+ {typeof tier.priceMonthly !== 'string' && '$'} + {tier.priceMonthly} +

+ {tier.costUnit && ( +

{tier.costUnit}

+ )} + + {tier.warning && ( +
+ {tier.warning} +
+ )} +
- {tier.from && ( - - + any additional usage - - )} -
- ) : ( - Contact Us - )} + ) : ( + Contact Us + )} +
-
-
- {tier.preface &&

{tier.preface}

} - {/*

Included with plan:

*/} -
    - {tier.features.map((feature) => ( -
  • - {/*
    */} -
    */} -

    - {feature} -

    -
  • - ))} -
+ > + {tier.preface && ( +

{tier.preface}

+ )} + {/*

Included with plan:

*/} +
    + {tier.features.map((feature) => ( +
  • +
*/} + {feature} + + ))} + -
-
- {tier.additional && ( -

{tier.additional}

- )} - {tier.scale &&

{tier.scale}

} - {tier.shutdown &&

{tier.shutdown}

} +
+
+ {tier.additional && ( +

{tier.additional}

+ )} + {tier.scale &&

{tier.scale}

} + {tier.shutdown && ( +

{tier.shutdown}

+ )} +
+ + +
- - -
diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 77922bd7095..32cf38b67af 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -659,3 +659,29 @@ launch week -webkit-mask-image: linear-gradient(rgba(0, 0, 0, 1), transparent); } + +/* Text with a gradient background */ +[class*='gradient-text-'] { + background-clip: text; + -webkit-text-fill-color: transparent; +} +@variants dark { + .gradient-text-brand-100 { + background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); + } + .gradient-text-brand-500 { + background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); + } + + .gradient-text-scale-100 { + background-image: -webkit-linear-gradient(45deg, #fff 0%, var(--colors-green4) 100%); + } + + .gradient-text-scale-500 { + background-image: -webkit-linear-gradient( + 45deg, + var(--colors-scale10) 0%, + var(--colors-scale12) 100% + ); + } +} From 0a20312d893939b8fcabf38ddb44cf2291e964dc Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 16 Jan 2023 16:48:28 -0330 Subject: [PATCH 002/120] Start on addon cards --- .../AuthWidget/AuthWidgetSection.tsx | 2 +- apps/www/components/DarkModeToggle.tsx | 2 +- apps/www/components/Footer/index.tsx | 2 +- apps/www/components/Globe.tsx | 2 +- apps/www/components/Nav/index.tsx | 2 +- apps/www/components/Providers/index.tsx | 44 --- ...icingAddOn.json => PricingAddOnTable.json} | 0 apps/www/data/PricingAddOns.json | 374 ++++++++++++++++++ apps/www/pages/404.tsx | 2 +- apps/www/pages/_app.tsx | 2 +- apps/www/pages/careers/index.tsx | 4 +- apps/www/pages/launch-week/index.tsx | 2 +- .../pages/launch-week/tickets/[username].tsx | 2 +- apps/www/pages/launch-week/tickets/index.tsx | 2 +- apps/www/pages/pricing/index.tsx | 106 ++++- .../pricing/addons-compute-hero-light.svg | 95 +++++ .../images/pricing/addons-compute-hero.svg | 95 +++++ .../images/pricing/compute-upgrade-light.svg | 9 + .../public/images/pricing/compute-upgrade.svg | 9 + .../pricing/custom-domain-upgrade-light.svg | 9 + .../images/pricing/custom-domain-upgrade.svg | 9 + .../images/pricing/support-upgrade-light.svg | 9 + .../public/images/pricing/support-upgrade.svg | 9 + apps/www/styles/index.css | 2 +- 24 files changed, 718 insertions(+), 76 deletions(-) delete mode 100644 apps/www/components/Providers/index.tsx rename apps/www/data/{PricingAddOn.json => PricingAddOnTable.json} (100%) create mode 100644 apps/www/data/PricingAddOns.json create mode 100644 apps/www/public/images/pricing/addons-compute-hero-light.svg create mode 100644 apps/www/public/images/pricing/addons-compute-hero.svg create mode 100644 apps/www/public/images/pricing/compute-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/compute-upgrade.svg create mode 100644 apps/www/public/images/pricing/custom-domain-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/custom-domain-upgrade.svg create mode 100644 apps/www/public/images/pricing/support-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/support-upgrade.svg diff --git a/apps/www/components/AuthWidget/AuthWidgetSection.tsx b/apps/www/components/AuthWidget/AuthWidgetSection.tsx index 047ff5c4ac7..29f47168761 100644 --- a/apps/www/components/AuthWidget/AuthWidgetSection.tsx +++ b/apps/www/components/AuthWidget/AuthWidgetSection.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/router' import { ColorSwatchIcon, MenuIcon } from '@heroicons/react/outline' import { Auth, ThemeSupa } from '@supabase/auth-ui-react' -import { useTheme } from '../Providers' +import { useTheme } from 'common/Providers' const supabase = createClient( 'https://rsnibhkhsbfnncjmwnkj.supabase.co', diff --git a/apps/www/components/DarkModeToggle.tsx b/apps/www/components/DarkModeToggle.tsx index c3a1b0f946f..789bdd7a5a4 100644 --- a/apps/www/components/DarkModeToggle.tsx +++ b/apps/www/components/DarkModeToggle.tsx @@ -1,4 +1,4 @@ -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import { IconSun, IconMoon } from 'ui' function DarkModeToggle() { diff --git a/apps/www/components/Footer/index.tsx b/apps/www/components/Footer/index.tsx index e4fb2ee81f5..bcc49c7bcc9 100644 --- a/apps/www/components/Footer/index.tsx +++ b/apps/www/components/Footer/index.tsx @@ -2,7 +2,7 @@ import FooterLinks from 'data/Footer.json' import SectionContainer from '../Layouts/SectionContainer' import DarkModeToggle from '../DarkModeToggle' import Link from 'next/link' -import { useTheme } from '../Providers' +import { useTheme } from 'common/Providers' import { Badge } from 'ui' import Image from 'next/image' import * as supabaseLogoWordmarkDark from 'common/assets/images/supabase-logo-wordmark--dark.png' diff --git a/apps/www/components/Globe.tsx b/apps/www/components/Globe.tsx index 388c6a3d65d..49470073455 100644 --- a/apps/www/components/Globe.tsx +++ b/apps/www/components/Globe.tsx @@ -1,6 +1,6 @@ import createGlobe from 'cobe' import { useEffect, useRef } from 'react' -import { useTheme } from './Providers/index' +import { useTheme } from 'common/Providers' const Globe = () => { const { isDarkMode } = useTheme() diff --git a/apps/www/components/Nav/index.tsx b/apps/www/components/Nav/index.tsx index 93e7402a1ab..54a04a654aa 100644 --- a/apps/www/components/Nav/index.tsx +++ b/apps/www/components/Nav/index.tsx @@ -11,7 +11,7 @@ import Solutions from '~/components/Nav/Product' import Developers from '~/components/Nav/Developers' import Announcement from '~/components/Nav/Announcement' -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import TextLink from '../TextLink' import Image from 'next/image' import * as supabaseLogoWordmarkDark from 'common/assets/images/supabase-logo-wordmark--dark.png' diff --git a/apps/www/components/Providers/index.tsx b/apps/www/components/Providers/index.tsx deleted file mode 100644 index ab023562c17..00000000000 --- a/apps/www/components/Providers/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { createContext, useContext, useEffect, useState } from 'react' - -interface UseThemeProps { - isDarkMode?: boolean - toggleTheme: () => void -} - -interface ThemeProviderProps { - children?: any -} - -export const ThemeContext = createContext({ - isDarkMode: true, - toggleTheme: () => {}, -}) - -export const useTheme = () => useContext(ThemeContext) - -export const ThemeProvider = ({ children }: ThemeProviderProps) => { - const [isDarkMode, setIsDarkMode] = useState(false) - - useEffect(() => { - const key = localStorage.getItem('supabaseDarkMode') - // Default to dark mode if no preference config - setIsDarkMode(!key || key === 'true') - }, []) - - const toggleTheme = () => { - setIsDarkMode(!isDarkMode) - } - - return ( - <> - - {children} - - - ) -} diff --git a/apps/www/data/PricingAddOn.json b/apps/www/data/PricingAddOnTable.json similarity index 100% rename from apps/www/data/PricingAddOn.json rename to apps/www/data/PricingAddOnTable.json diff --git a/apps/www/data/PricingAddOns.json b/apps/www/data/PricingAddOns.json new file mode 100644 index 00000000000..63b69e84725 --- /dev/null +++ b/apps/www/data/PricingAddOns.json @@ -0,0 +1,374 @@ +{ + "optimized_compute": { + "title": "Optimized Compute", + "features": [ + "For projects that need dedicated compute", + "For scaling number of connections", + "Additional CPU & RAM options", + "Additional Disk IO Bandwidth" + ], + "rows": [ + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Free (Included)" }, + { "key": "pricing", "title": "Pricing", "value": "$0" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "memory", "title": "Memory", "value": "1 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "87 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "10" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "50" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Small" }, + { "key": "pricing", "title": "Pricing", "value": "$5" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "memory", "title": "Memory", "value": "2 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "174 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "30" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "75" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Medium" }, + { "key": "pricing", "title": "Pricing", "value": "$50" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "memory", "title": "Memory", "value": "4 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "347 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "50" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "150" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Large" }, + { "key": "pricing", "title": "Pricing", "value": "$100" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "8 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "630 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "100" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "300" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "XL" }, + { "key": "pricing", "title": "Pricing", "value": "$200" }, + { "key": "cpu", "title": "CPU", "value": "4-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "16 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "1,188 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "200" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "2XL" }, + { "key": "pricing", "title": "Pricing", "value": "$400" }, + { "key": "cpu", "title": "CPU", "value": "8-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "32 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "2,375 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "350" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "1200" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "4XL" }, + { "key": "pricing", "title": "Pricing", "value": "$950" }, + { "key": "cpu", "title": "CPU", "value": "16-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "64 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "4,750 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "420" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "2800" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "8XL" }, + { "key": "pricing", "title": "Pricing", "value": "$1,860" }, + { "key": "cpu", "title": "CPU", "value": "32-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "128 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "9,500 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "450" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "5600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "12XL" }, + { "key": "pricing", "title": "Pricing", "value": "$2,790" }, + { "key": "cpu", "title": "CPU", "value": "48-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "192 GB" }, + { + "key": "maxDiskIO", + "title": "Maximum Disk IO Bandwidth", + "value": "14,250 Mbps" + }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "14,250 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "480" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "8600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "16XL" }, + { "key": "pricing", "title": "Pricing", "value": "$3,720" }, + { "key": "cpu", "title": "CPU", "value": "64-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "256 GB" }, + { + "key": "maxDiskIO", + "title": "Maximum Disk IO Bandwidth", + "value": "19,000 Mbps" + }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "19,000 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "500" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "11,600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Custom (need more?)" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { "key": "cpu", "title": "CPU", "value": "Contact Us" }, + { "key": "memory", "title": "Memory", "value": "Contact Us" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "Contact Us" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "Contact Us" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "Contact Us" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "Contact Us" + } + ] + } + ] + }, + "support": { + "title": "Support", + "features": [ + "Guaranteed Response Times", + "SLAs", + "Designated Support", + "Advanced Support Scope" + ], + "rows": [ + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Standard" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { + "key": "severityLevelUrgent", + "title": "1. Severity Level: Urgent", + "value": "1 business hour (24/7x365)" + }, + { + "key": "severityLevelHigh", + "title": "2. Severity Level: High", + "value": "4 business hours (Monday - Friday)" + }, + { + "key": "severityLevelNormal", + "title": "3. Severity Level: Normal", + "value": "1 business day (Monday - Friday)" + }, + { + "key": "severityLevelLow", + "title": "4. Severity Level: Low", + "value": "2 business days (Monday - Friday)" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Priority" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { + "key": "severityLevelUrgent", + "title": "1. Severity Level: Urgent", + "value": "1 business hour (24/7x365)" + }, + { + "key": "severityLevelHigh", + "title": "2. Severity Level: High", + "value": "2 business hours (Monday - Friday)" + }, + { + "key": "severityLevelNormal", + "title": "3. Severity Level: Normal", + "value": "1 business day (Monday - Friday)" + }, + { + "key": "severityLevelLow", + "title": "4. Severity Level: Low", + "value": "2 business days (Monday - Friday)" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Priority Plus" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { + "key": "severityLevelUrgent", + "title": "1. Severity Level: Urgent", + "value": "1 business hour (24/7x365)" + }, + { + "key": "severityLevelHigh", + "title": "2. Severity Level: High", + "value": "2 business hours (24/7x365)" + }, + { + "key": "severityLevelNormal", + "title": "3. Severity Level: Normal", + "value": "12 business hours (Monday - Friday)" + }, + { + "key": "severityLevelLow", + "title": "4. Severity Level: Low", + "value": "1 business days (Monday - Friday)" + } + ] + } + ] + } +} diff --git a/apps/www/pages/404.tsx b/apps/www/pages/404.tsx index f0d453140e4..f31fe7d4dd3 100644 --- a/apps/www/pages/404.tsx +++ b/apps/www/pages/404.tsx @@ -5,7 +5,7 @@ import { Button } from 'ui' import DefaultLayout from '../components/Layouts/Default' -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import * as supabaseLogoWordmarkDark from 'common/assets/images/supabase-logo-wordmark--dark.png' import * as supabaseLogoWordmarkLight from 'common/assets/images/supabase-logo-wordmark--light.png' diff --git a/apps/www/pages/_app.tsx b/apps/www/pages/_app.tsx index afe6bd7a1a1..b4fb7a031ce 100644 --- a/apps/www/pages/_app.tsx +++ b/apps/www/pages/_app.tsx @@ -6,7 +6,7 @@ import { useEffect } from 'react' import Meta from '~/components/Favicons' import '../styles/index.css' import { post } from './../lib/fetchWrapper' -import { ThemeProvider } from '~/components/Providers' +import { ThemeProvider } from 'common/Providers' import Head from 'next/head' export default function MyApp({ Component, pageProps }: AppProps) { diff --git a/apps/www/pages/careers/index.tsx b/apps/www/pages/careers/index.tsx index d7d4ec2d29a..55ba72ca594 100644 --- a/apps/www/pages/careers/index.tsx +++ b/apps/www/pages/careers/index.tsx @@ -8,7 +8,7 @@ import { Badge, Button, IconCheck } from 'ui' import Globe from '~/components/Globe' import DefaultLayout from '~/components/Layouts/Default' import SectionContainer from '~/components/Layouts/SectionContainer' -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import career from '~/data/career.json' import Styles from './career.module.css' @@ -321,7 +321,7 @@ const CareerPage: NextPage = ({ jobs, contributors }: any) => {
(
{tier.name === 'Pro' && ( @@ -286,8 +336,6 @@ export default function IndexPage() { flex-1 flex-col - space-y-4 - bg-white px-8 @@ -300,7 +348,7 @@ export default function IndexPage() { {/*

Included with plan:

*/}
    {tier.features.map((feature) => (
  • @@ -315,14 +363,14 @@ export default function IndexPage() { ))}
-
-
+
+
{tier.additional && ( -

{tier.additional}

+

{tier.additional}

)} - {tier.scale &&

{tier.scale}

} + {tier.scale &&

{tier.scale}

} {tier.shutdown && ( -

{tier.shutdown}

+

{tier.shutdown}

)}
@@ -341,13 +389,33 @@ export default function IndexPage() {
-
-

Add-Ons

-

- Level up your Supabase experience with add-ons. -

+
+
+

Easily customizable add-Ons

+

+ Level up your Supabase experience with add-ons. +

+
+
+ {addons.map((addon) => ( +
+ Compute +
+ {addon.icon} + {addon.name} + {addon.price} +
+
+ ))} +
+
+
} diff --git a/apps/www/public/images/pricing/addons-compute-hero-light.svg b/apps/www/public/images/pricing/addons-compute-hero-light.svg new file mode 100644 index 00000000000..37ec0b91dad --- /dev/null +++ b/apps/www/public/images/pricing/addons-compute-hero-light.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-compute-hero.svg b/apps/www/public/images/pricing/addons-compute-hero.svg new file mode 100644 index 00000000000..500a0803480 --- /dev/null +++ b/apps/www/public/images/pricing/addons-compute-hero.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/compute-upgrade-light.svg b/apps/www/public/images/pricing/compute-upgrade-light.svg new file mode 100644 index 00000000000..8f23ffadd2f --- /dev/null +++ b/apps/www/public/images/pricing/compute-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/compute-upgrade.svg b/apps/www/public/images/pricing/compute-upgrade.svg new file mode 100644 index 00000000000..c6241aa159e --- /dev/null +++ b/apps/www/public/images/pricing/compute-upgrade.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/custom-domain-upgrade-light.svg b/apps/www/public/images/pricing/custom-domain-upgrade-light.svg new file mode 100644 index 00000000000..6d08ae8eedd --- /dev/null +++ b/apps/www/public/images/pricing/custom-domain-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/custom-domain-upgrade.svg b/apps/www/public/images/pricing/custom-domain-upgrade.svg new file mode 100644 index 00000000000..0d608d5d91d --- /dev/null +++ b/apps/www/public/images/pricing/custom-domain-upgrade.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/support-upgrade-light.svg b/apps/www/public/images/pricing/support-upgrade-light.svg new file mode 100644 index 00000000000..e2143d09436 --- /dev/null +++ b/apps/www/public/images/pricing/support-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/support-upgrade.svg b/apps/www/public/images/pricing/support-upgrade.svg new file mode 100644 index 00000000000..d981270ce21 --- /dev/null +++ b/apps/www/public/images/pricing/support-upgrade.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 32cf38b67af..585cc7cfb1e 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -665,7 +665,7 @@ launch week background-clip: text; -webkit-text-fill-color: transparent; } -@variants dark { +@layer utilities { .gradient-text-brand-100 { background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); } From e2607446a5f1c076dd4e8eb079eb02acf02da421 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 17 Jan 2023 09:40:13 -0330 Subject: [PATCH 003/120] Add brand icons --- apps/www/pages/pricing/index.tsx | 9 ++++----- apps/www/public/images/icons/brand/api-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/api-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/api-green.svg | 7 +++++++ .../images/icons/brand/api-management-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/api-management-gray.svg | 3 +++ .../public/images/icons/brand/api-management-green.svg | 3 +++ .../www/public/images/icons/brand/auth-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/auth-gray.svg | 6 ++++++ apps/www/public/images/icons/brand/auth-green.svg | 6 ++++++ .../www/public/images/icons/brand/blog-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/blog-gray.svg | 4 ++++ apps/www/public/images/icons/brand/blog-green.svg | 4 ++++ apps/www/public/images/icons/brand/cli-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/cli-gray.svg | 5 +++++ apps/www/public/images/icons/brand/cli-green.svg | 3 +++ .../public/images/icons/brand/columns-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/columns-gray.svg | 5 +++++ apps/www/public/images/icons/brand/columns-green.svg | 5 +++++ .../images/icons/brand/custom-domains-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/custom-domains-gray.svg | 5 +++++ .../public/images/icons/brand/custom-domains-green.svg | 5 +++++ .../icons/brand/database-add-ons-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/database-add-ons-gray.svg | 9 +++++++++ .../public/images/icons/brand/database-add-ons-green.svg | 9 +++++++++ .../public/images/icons/brand/database-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/database-gray.svg | 5 +++++ apps/www/public/images/icons/brand/database-green.svg | 5 +++++ .../images/icons/brand/documentation-gray-negative.svg | 9 +++++++++ .../www/public/images/icons/brand/documentation-gray.svg | 7 +++++++ .../public/images/icons/brand/documentation-green.svg | 7 +++++++ .../images/icons/brand/edge-functions-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/edge-functions-gray.svg | 6 ++++++ .../public/images/icons/brand/edge-functions-green.svg | 6 ++++++ .../images/icons/brand/extensions-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/extensions-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/extensions-green.svg | 7 +++++++ .../images/icons/brand/getting-started-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/getting-started-gray.svg | 3 +++ .../public/images/icons/brand/getting-started-green.svg | 3 +++ .../public/images/icons/brand/glossary-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/glossary-gray.svg | 5 +++++ apps/www/public/images/icons/brand/glossary-green.svg | 5 +++++ .../public/images/icons/brand/guides-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/guides-gray.svg | 5 +++++ apps/www/public/images/icons/brand/guides-green.svg | 5 +++++ .../www/public/images/icons/brand/home-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/home-gray.svg | 5 +++++ apps/www/public/images/icons/brand/home-green.svg | 5 +++++ .../www/public/images/icons/brand/logs-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/logs-gray.svg | 6 ++++++ apps/www/public/images/icons/brand/logs-green.svg | 6 ++++++ .../www/public/images/icons/brand/pitr-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/pitr-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/pitr-green.svg | 7 +++++++ .../public/images/icons/brand/platform-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/platform-gray.svg | 5 +++++ apps/www/public/images/icons/brand/platform-green.svg | 5 +++++ .../public/images/icons/brand/profile-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/profile-gray.svg | 5 +++++ apps/www/public/images/icons/brand/profile-green.svg | 5 +++++ .../images/icons/brand/read-replicas-gray-negative.svg | 9 +++++++++ .../www/public/images/icons/brand/read-replicas-gray.svg | 6 ++++++ .../public/images/icons/brand/read-replicas-green.svg | 6 ++++++ .../public/images/icons/brand/realtime-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/realtime-gray.svg | 6 ++++++ apps/www/public/images/icons/brand/realtime-green.svg | 6 ++++++ .../public/images/icons/brand/reports-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/reports-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/reports-green.svg | 7 +++++++ .../public/images/icons/brand/roles-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/roles-gray.svg | 8 ++++++++ apps/www/public/images/icons/brand/roles-green.svg | 9 +++++++++ .../www/public/images/icons/brand/rows-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/rows-gray.svg | 5 +++++ apps/www/public/images/icons/brand/rows-green.svg | 5 +++++ .../images/icons/brand/self-hosting-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/self-hosting-gray.svg | 9 +++++++++ .../www/public/images/icons/brand/self-hosting-green.svg | 9 +++++++++ .../public/images/icons/brand/settings-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/settings-gray.svg | 4 ++++ apps/www/public/images/icons/brand/settings-green.svg | 4 ++++ .../public/images/icons/brand/storage-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/storage-gray.svg | 5 +++++ apps/www/public/images/icons/brand/storage-green.svg | 5 +++++ .../images/icons/brand/support-add-ons-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/support-add-ons-gray.svg | 7 +++++++ .../public/images/icons/brand/support-add-ons-green.svg | 7 +++++++ .../public/images/icons/brand/support-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/support-gray.svg | 5 +++++ apps/www/public/images/icons/brand/support-green.svg | 5 +++++ .../images/icons/brand/table-editor-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/table-editor-gray.svg | 6 ++++++ .../www/public/images/icons/brand/table-editor-green.svg | 6 ++++++ .../public/images/icons/brand/tables-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/tables-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/tables-green.svg | 7 +++++++ .../images/icons/brand/tutorials-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/tutorials-gray.svg | 4 ++++ apps/www/public/images/icons/brand/tutorials-green.svg | 4 ++++ .../public/images/icons/brand/wrappers-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/wrappers-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/wrappers-green.svg | 7 +++++++ 103 files changed, 701 insertions(+), 5 deletions(-) create mode 100644 apps/www/public/images/icons/brand/api-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/api-gray.svg create mode 100644 apps/www/public/images/icons/brand/api-green.svg create mode 100644 apps/www/public/images/icons/brand/api-management-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/api-management-gray.svg create mode 100644 apps/www/public/images/icons/brand/api-management-green.svg create mode 100644 apps/www/public/images/icons/brand/auth-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/auth-gray.svg create mode 100644 apps/www/public/images/icons/brand/auth-green.svg create mode 100644 apps/www/public/images/icons/brand/blog-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/blog-gray.svg create mode 100644 apps/www/public/images/icons/brand/blog-green.svg create mode 100644 apps/www/public/images/icons/brand/cli-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/cli-gray.svg create mode 100644 apps/www/public/images/icons/brand/cli-green.svg create mode 100644 apps/www/public/images/icons/brand/columns-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/columns-gray.svg create mode 100644 apps/www/public/images/icons/brand/columns-green.svg create mode 100644 apps/www/public/images/icons/brand/custom-domains-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/custom-domains-gray.svg create mode 100644 apps/www/public/images/icons/brand/custom-domains-green.svg create mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray.svg create mode 100644 apps/www/public/images/icons/brand/database-add-ons-green.svg create mode 100644 apps/www/public/images/icons/brand/database-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/database-gray.svg create mode 100644 apps/www/public/images/icons/brand/database-green.svg create mode 100644 apps/www/public/images/icons/brand/documentation-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/documentation-gray.svg create mode 100644 apps/www/public/images/icons/brand/documentation-green.svg create mode 100644 apps/www/public/images/icons/brand/edge-functions-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/edge-functions-gray.svg create mode 100644 apps/www/public/images/icons/brand/edge-functions-green.svg create mode 100644 apps/www/public/images/icons/brand/extensions-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/extensions-gray.svg create mode 100644 apps/www/public/images/icons/brand/extensions-green.svg create mode 100644 apps/www/public/images/icons/brand/getting-started-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/getting-started-gray.svg create mode 100644 apps/www/public/images/icons/brand/getting-started-green.svg create mode 100644 apps/www/public/images/icons/brand/glossary-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/glossary-gray.svg create mode 100644 apps/www/public/images/icons/brand/glossary-green.svg create mode 100644 apps/www/public/images/icons/brand/guides-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/guides-gray.svg create mode 100644 apps/www/public/images/icons/brand/guides-green.svg create mode 100644 apps/www/public/images/icons/brand/home-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/home-gray.svg create mode 100644 apps/www/public/images/icons/brand/home-green.svg create mode 100644 apps/www/public/images/icons/brand/logs-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/logs-gray.svg create mode 100644 apps/www/public/images/icons/brand/logs-green.svg create mode 100644 apps/www/public/images/icons/brand/pitr-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/pitr-gray.svg create mode 100644 apps/www/public/images/icons/brand/pitr-green.svg create mode 100644 apps/www/public/images/icons/brand/platform-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/platform-gray.svg create mode 100644 apps/www/public/images/icons/brand/platform-green.svg create mode 100644 apps/www/public/images/icons/brand/profile-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/profile-gray.svg create mode 100644 apps/www/public/images/icons/brand/profile-green.svg create mode 100644 apps/www/public/images/icons/brand/read-replicas-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/read-replicas-gray.svg create mode 100644 apps/www/public/images/icons/brand/read-replicas-green.svg create mode 100644 apps/www/public/images/icons/brand/realtime-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/realtime-gray.svg create mode 100644 apps/www/public/images/icons/brand/realtime-green.svg create mode 100644 apps/www/public/images/icons/brand/reports-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/reports-gray.svg create mode 100644 apps/www/public/images/icons/brand/reports-green.svg create mode 100644 apps/www/public/images/icons/brand/roles-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/roles-gray.svg create mode 100644 apps/www/public/images/icons/brand/roles-green.svg create mode 100644 apps/www/public/images/icons/brand/rows-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/rows-gray.svg create mode 100644 apps/www/public/images/icons/brand/rows-green.svg create mode 100644 apps/www/public/images/icons/brand/self-hosting-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/self-hosting-gray.svg create mode 100644 apps/www/public/images/icons/brand/self-hosting-green.svg create mode 100644 apps/www/public/images/icons/brand/settings-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/settings-gray.svg create mode 100644 apps/www/public/images/icons/brand/settings-green.svg create mode 100644 apps/www/public/images/icons/brand/storage-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/storage-gray.svg create mode 100644 apps/www/public/images/icons/brand/storage-green.svg create mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray.svg create mode 100644 apps/www/public/images/icons/brand/support-add-ons-green.svg create mode 100644 apps/www/public/images/icons/brand/support-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/support-gray.svg create mode 100644 apps/www/public/images/icons/brand/support-green.svg create mode 100644 apps/www/public/images/icons/brand/table-editor-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/table-editor-gray.svg create mode 100644 apps/www/public/images/icons/brand/table-editor-green.svg create mode 100644 apps/www/public/images/icons/brand/tables-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/tables-gray.svg create mode 100644 apps/www/public/images/icons/brand/tables-green.svg create mode 100644 apps/www/public/images/icons/brand/tutorials-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/tutorials-gray.svg create mode 100644 apps/www/public/images/icons/brand/tutorials-green.svg create mode 100644 apps/www/public/images/icons/brand/wrappers-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/wrappers-gray.svg create mode 100644 apps/www/public/images/icons/brand/wrappers-green.svg diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 8cc41575118..9fe40754704 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -19,7 +19,7 @@ export default function IndexPage() { const router = useRouter() const { basePath } = useRouter() const { isDarkMode } = useTheme() - console.log('isDarkMode', isDarkMode) + const meta_title = 'Pricing & fees | Supabase' const meta_description = 'Explore Supabase fees and pricing information. Find our competitive pricing tiers, with no hidden pricing. We have generous free tiers for those getting started, and Pay As You Go for those scaling up.' @@ -258,7 +258,7 @@ export default function IndexPage() { lg:px-8 " > -
+
{tiers.map((tier) => (
{addons.map((addon) => ( -
+
Compute -
- {addon.icon} +
{addon.name} {addon.price}
diff --git a/apps/www/public/images/icons/brand/api-gray-negative.svg b/apps/www/public/images/icons/brand/api-gray-negative.svg new file mode 100644 index 00000000000..1c8b36abab2 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-gray.svg b/apps/www/public/images/icons/brand/api-gray.svg new file mode 100644 index 00000000000..af00abfa5c6 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-green.svg b/apps/www/public/images/icons/brand/api-green.svg new file mode 100644 index 00000000000..14f6f33c4fe --- /dev/null +++ b/apps/www/public/images/icons/brand/api-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-management-gray-negative.svg b/apps/www/public/images/icons/brand/api-management-gray-negative.svg new file mode 100644 index 00000000000..9cfe9c931d8 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-management-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-management-gray.svg b/apps/www/public/images/icons/brand/api-management-gray.svg new file mode 100644 index 00000000000..ad8169dc421 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-management-gray.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/api-management-green.svg b/apps/www/public/images/icons/brand/api-management-green.svg new file mode 100644 index 00000000000..2724bdb975d --- /dev/null +++ b/apps/www/public/images/icons/brand/api-management-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/auth-gray-negative.svg b/apps/www/public/images/icons/brand/auth-gray-negative.svg new file mode 100644 index 00000000000..611ec59b334 --- /dev/null +++ b/apps/www/public/images/icons/brand/auth-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/auth-gray.svg b/apps/www/public/images/icons/brand/auth-gray.svg new file mode 100644 index 00000000000..69a108e951d --- /dev/null +++ b/apps/www/public/images/icons/brand/auth-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/auth-green.svg b/apps/www/public/images/icons/brand/auth-green.svg new file mode 100644 index 00000000000..0875ec0d581 --- /dev/null +++ b/apps/www/public/images/icons/brand/auth-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/blog-gray-negative.svg b/apps/www/public/images/icons/brand/blog-gray-negative.svg new file mode 100644 index 00000000000..77cd8aa368d --- /dev/null +++ b/apps/www/public/images/icons/brand/blog-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/blog-gray.svg b/apps/www/public/images/icons/brand/blog-gray.svg new file mode 100644 index 00000000000..d17a7a75f2f --- /dev/null +++ b/apps/www/public/images/icons/brand/blog-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/blog-green.svg b/apps/www/public/images/icons/brand/blog-green.svg new file mode 100644 index 00000000000..ce9e01c1703 --- /dev/null +++ b/apps/www/public/images/icons/brand/blog-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/cli-gray-negative.svg b/apps/www/public/images/icons/brand/cli-gray-negative.svg new file mode 100644 index 00000000000..eaa2cee6601 --- /dev/null +++ b/apps/www/public/images/icons/brand/cli-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/cli-gray.svg b/apps/www/public/images/icons/brand/cli-gray.svg new file mode 100644 index 00000000000..e44838f4b7a --- /dev/null +++ b/apps/www/public/images/icons/brand/cli-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/cli-green.svg b/apps/www/public/images/icons/brand/cli-green.svg new file mode 100644 index 00000000000..ab3012bccd9 --- /dev/null +++ b/apps/www/public/images/icons/brand/cli-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/columns-gray-negative.svg b/apps/www/public/images/icons/brand/columns-gray-negative.svg new file mode 100644 index 00000000000..767fc7c44e9 --- /dev/null +++ b/apps/www/public/images/icons/brand/columns-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/columns-gray.svg b/apps/www/public/images/icons/brand/columns-gray.svg new file mode 100644 index 00000000000..bdf3c770bea --- /dev/null +++ b/apps/www/public/images/icons/brand/columns-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/columns-green.svg b/apps/www/public/images/icons/brand/columns-green.svg new file mode 100644 index 00000000000..e55340280d8 --- /dev/null +++ b/apps/www/public/images/icons/brand/columns-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg b/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg new file mode 100644 index 00000000000..afc7ede37ff --- /dev/null +++ b/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/custom-domains-gray.svg b/apps/www/public/images/icons/brand/custom-domains-gray.svg new file mode 100644 index 00000000000..405ab724659 --- /dev/null +++ b/apps/www/public/images/icons/brand/custom-domains-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/custom-domains-green.svg b/apps/www/public/images/icons/brand/custom-domains-green.svg new file mode 100644 index 00000000000..48f15398d17 --- /dev/null +++ b/apps/www/public/images/icons/brand/custom-domains-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg new file mode 100644 index 00000000000..55685530c78 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray.svg b/apps/www/public/images/icons/brand/database-add-ons-gray.svg new file mode 100644 index 00000000000..1a434548729 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-add-ons-gray.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-add-ons-green.svg b/apps/www/public/images/icons/brand/database-add-ons-green.svg new file mode 100644 index 00000000000..c893942cdc6 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-add-ons-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-gray-negative.svg b/apps/www/public/images/icons/brand/database-gray-negative.svg new file mode 100644 index 00000000000..5e55c299c24 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-gray.svg b/apps/www/public/images/icons/brand/database-gray.svg new file mode 100644 index 00000000000..56bc4ae60b2 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/database-green.svg b/apps/www/public/images/icons/brand/database-green.svg new file mode 100644 index 00000000000..7919de28ca8 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/documentation-gray-negative.svg b/apps/www/public/images/icons/brand/documentation-gray-negative.svg new file mode 100644 index 00000000000..9c9549935db --- /dev/null +++ b/apps/www/public/images/icons/brand/documentation-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/documentation-gray.svg b/apps/www/public/images/icons/brand/documentation-gray.svg new file mode 100644 index 00000000000..9e4b7b66c91 --- /dev/null +++ b/apps/www/public/images/icons/brand/documentation-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/documentation-green.svg b/apps/www/public/images/icons/brand/documentation-green.svg new file mode 100644 index 00000000000..877b89de115 --- /dev/null +++ b/apps/www/public/images/icons/brand/documentation-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg b/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg new file mode 100644 index 00000000000..47168849c2b --- /dev/null +++ b/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/edge-functions-gray.svg b/apps/www/public/images/icons/brand/edge-functions-gray.svg new file mode 100644 index 00000000000..65b62e8f89e --- /dev/null +++ b/apps/www/public/images/icons/brand/edge-functions-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/edge-functions-green.svg b/apps/www/public/images/icons/brand/edge-functions-green.svg new file mode 100644 index 00000000000..cfe6bb89751 --- /dev/null +++ b/apps/www/public/images/icons/brand/edge-functions-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/extensions-gray-negative.svg b/apps/www/public/images/icons/brand/extensions-gray-negative.svg new file mode 100644 index 00000000000..6fdd405e034 --- /dev/null +++ b/apps/www/public/images/icons/brand/extensions-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/extensions-gray.svg b/apps/www/public/images/icons/brand/extensions-gray.svg new file mode 100644 index 00000000000..fcd4c774c8b --- /dev/null +++ b/apps/www/public/images/icons/brand/extensions-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/extensions-green.svg b/apps/www/public/images/icons/brand/extensions-green.svg new file mode 100644 index 00000000000..bea58a73a02 --- /dev/null +++ b/apps/www/public/images/icons/brand/extensions-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/getting-started-gray-negative.svg b/apps/www/public/images/icons/brand/getting-started-gray-negative.svg new file mode 100644 index 00000000000..66a75217931 --- /dev/null +++ b/apps/www/public/images/icons/brand/getting-started-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/getting-started-gray.svg b/apps/www/public/images/icons/brand/getting-started-gray.svg new file mode 100644 index 00000000000..b1ef015bec7 --- /dev/null +++ b/apps/www/public/images/icons/brand/getting-started-gray.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/getting-started-green.svg b/apps/www/public/images/icons/brand/getting-started-green.svg new file mode 100644 index 00000000000..f24b5d6f883 --- /dev/null +++ b/apps/www/public/images/icons/brand/getting-started-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/glossary-gray-negative.svg b/apps/www/public/images/icons/brand/glossary-gray-negative.svg new file mode 100644 index 00000000000..48846d72ed6 --- /dev/null +++ b/apps/www/public/images/icons/brand/glossary-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/glossary-gray.svg b/apps/www/public/images/icons/brand/glossary-gray.svg new file mode 100644 index 00000000000..9931120ffa6 --- /dev/null +++ b/apps/www/public/images/icons/brand/glossary-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/glossary-green.svg b/apps/www/public/images/icons/brand/glossary-green.svg new file mode 100644 index 00000000000..7ab0359e7b9 --- /dev/null +++ b/apps/www/public/images/icons/brand/glossary-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/guides-gray-negative.svg b/apps/www/public/images/icons/brand/guides-gray-negative.svg new file mode 100644 index 00000000000..619dfc473e5 --- /dev/null +++ b/apps/www/public/images/icons/brand/guides-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/guides-gray.svg b/apps/www/public/images/icons/brand/guides-gray.svg new file mode 100644 index 00000000000..375fe6d5d8b --- /dev/null +++ b/apps/www/public/images/icons/brand/guides-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/guides-green.svg b/apps/www/public/images/icons/brand/guides-green.svg new file mode 100644 index 00000000000..27863e00032 --- /dev/null +++ b/apps/www/public/images/icons/brand/guides-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/home-gray-negative.svg b/apps/www/public/images/icons/brand/home-gray-negative.svg new file mode 100644 index 00000000000..ae023b5375a --- /dev/null +++ b/apps/www/public/images/icons/brand/home-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/home-gray.svg b/apps/www/public/images/icons/brand/home-gray.svg new file mode 100644 index 00000000000..ebfa14f7f23 --- /dev/null +++ b/apps/www/public/images/icons/brand/home-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/home-green.svg b/apps/www/public/images/icons/brand/home-green.svg new file mode 100644 index 00000000000..0a228053177 --- /dev/null +++ b/apps/www/public/images/icons/brand/home-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/logs-gray-negative.svg b/apps/www/public/images/icons/brand/logs-gray-negative.svg new file mode 100644 index 00000000000..234a573c22a --- /dev/null +++ b/apps/www/public/images/icons/brand/logs-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/logs-gray.svg b/apps/www/public/images/icons/brand/logs-gray.svg new file mode 100644 index 00000000000..0e99fe1f216 --- /dev/null +++ b/apps/www/public/images/icons/brand/logs-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/logs-green.svg b/apps/www/public/images/icons/brand/logs-green.svg new file mode 100644 index 00000000000..52da7533ce1 --- /dev/null +++ b/apps/www/public/images/icons/brand/logs-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/pitr-gray-negative.svg b/apps/www/public/images/icons/brand/pitr-gray-negative.svg new file mode 100644 index 00000000000..378964e9333 --- /dev/null +++ b/apps/www/public/images/icons/brand/pitr-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/pitr-gray.svg b/apps/www/public/images/icons/brand/pitr-gray.svg new file mode 100644 index 00000000000..c13962eae4f --- /dev/null +++ b/apps/www/public/images/icons/brand/pitr-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/pitr-green.svg b/apps/www/public/images/icons/brand/pitr-green.svg new file mode 100644 index 00000000000..f6269710023 --- /dev/null +++ b/apps/www/public/images/icons/brand/pitr-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/platform-gray-negative.svg b/apps/www/public/images/icons/brand/platform-gray-negative.svg new file mode 100644 index 00000000000..bdff9e59d70 --- /dev/null +++ b/apps/www/public/images/icons/brand/platform-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/platform-gray.svg b/apps/www/public/images/icons/brand/platform-gray.svg new file mode 100644 index 00000000000..83483f36f32 --- /dev/null +++ b/apps/www/public/images/icons/brand/platform-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/platform-green.svg b/apps/www/public/images/icons/brand/platform-green.svg new file mode 100644 index 00000000000..2c73d35f721 --- /dev/null +++ b/apps/www/public/images/icons/brand/platform-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/profile-gray-negative.svg b/apps/www/public/images/icons/brand/profile-gray-negative.svg new file mode 100644 index 00000000000..2e4fe6c99e7 --- /dev/null +++ b/apps/www/public/images/icons/brand/profile-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/profile-gray.svg b/apps/www/public/images/icons/brand/profile-gray.svg new file mode 100644 index 00000000000..344fa4c16f3 --- /dev/null +++ b/apps/www/public/images/icons/brand/profile-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/profile-green.svg b/apps/www/public/images/icons/brand/profile-green.svg new file mode 100644 index 00000000000..4064771b4f8 --- /dev/null +++ b/apps/www/public/images/icons/brand/profile-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg b/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg new file mode 100644 index 00000000000..ba08dbd69e7 --- /dev/null +++ b/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/read-replicas-gray.svg b/apps/www/public/images/icons/brand/read-replicas-gray.svg new file mode 100644 index 00000000000..abfb88d2213 --- /dev/null +++ b/apps/www/public/images/icons/brand/read-replicas-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/read-replicas-green.svg b/apps/www/public/images/icons/brand/read-replicas-green.svg new file mode 100644 index 00000000000..c033c7189cf --- /dev/null +++ b/apps/www/public/images/icons/brand/read-replicas-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/realtime-gray-negative.svg b/apps/www/public/images/icons/brand/realtime-gray-negative.svg new file mode 100644 index 00000000000..e820eaae08f --- /dev/null +++ b/apps/www/public/images/icons/brand/realtime-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/realtime-gray.svg b/apps/www/public/images/icons/brand/realtime-gray.svg new file mode 100644 index 00000000000..a3bcf43ffdd --- /dev/null +++ b/apps/www/public/images/icons/brand/realtime-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/realtime-green.svg b/apps/www/public/images/icons/brand/realtime-green.svg new file mode 100644 index 00000000000..1d5d535b40d --- /dev/null +++ b/apps/www/public/images/icons/brand/realtime-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/reports-gray-negative.svg b/apps/www/public/images/icons/brand/reports-gray-negative.svg new file mode 100644 index 00000000000..3cea4f0d444 --- /dev/null +++ b/apps/www/public/images/icons/brand/reports-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/reports-gray.svg b/apps/www/public/images/icons/brand/reports-gray.svg new file mode 100644 index 00000000000..4e988b96331 --- /dev/null +++ b/apps/www/public/images/icons/brand/reports-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/reports-green.svg b/apps/www/public/images/icons/brand/reports-green.svg new file mode 100644 index 00000000000..a04dc29b8e9 --- /dev/null +++ b/apps/www/public/images/icons/brand/reports-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/roles-gray-negative.svg b/apps/www/public/images/icons/brand/roles-gray-negative.svg new file mode 100644 index 00000000000..bd12069792c --- /dev/null +++ b/apps/www/public/images/icons/brand/roles-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/roles-gray.svg b/apps/www/public/images/icons/brand/roles-gray.svg new file mode 100644 index 00000000000..7764b8841bb --- /dev/null +++ b/apps/www/public/images/icons/brand/roles-gray.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/www/public/images/icons/brand/roles-green.svg b/apps/www/public/images/icons/brand/roles-green.svg new file mode 100644 index 00000000000..6ab8c3b3c05 --- /dev/null +++ b/apps/www/public/images/icons/brand/roles-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/rows-gray-negative.svg b/apps/www/public/images/icons/brand/rows-gray-negative.svg new file mode 100644 index 00000000000..f0640712741 --- /dev/null +++ b/apps/www/public/images/icons/brand/rows-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/rows-gray.svg b/apps/www/public/images/icons/brand/rows-gray.svg new file mode 100644 index 00000000000..f5320ce67bb --- /dev/null +++ b/apps/www/public/images/icons/brand/rows-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/rows-green.svg b/apps/www/public/images/icons/brand/rows-green.svg new file mode 100644 index 00000000000..02b29c41d64 --- /dev/null +++ b/apps/www/public/images/icons/brand/rows-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg b/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg new file mode 100644 index 00000000000..ea74756adce --- /dev/null +++ b/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/self-hosting-gray.svg b/apps/www/public/images/icons/brand/self-hosting-gray.svg new file mode 100644 index 00000000000..7a5e667ced1 --- /dev/null +++ b/apps/www/public/images/icons/brand/self-hosting-gray.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/self-hosting-green.svg b/apps/www/public/images/icons/brand/self-hosting-green.svg new file mode 100644 index 00000000000..9cc2c2ddfb8 --- /dev/null +++ b/apps/www/public/images/icons/brand/self-hosting-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/settings-gray-negative.svg b/apps/www/public/images/icons/brand/settings-gray-negative.svg new file mode 100644 index 00000000000..2b64a926831 --- /dev/null +++ b/apps/www/public/images/icons/brand/settings-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/settings-gray.svg b/apps/www/public/images/icons/brand/settings-gray.svg new file mode 100644 index 00000000000..2b62223d7bc --- /dev/null +++ b/apps/www/public/images/icons/brand/settings-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/settings-green.svg b/apps/www/public/images/icons/brand/settings-green.svg new file mode 100644 index 00000000000..2d149540e53 --- /dev/null +++ b/apps/www/public/images/icons/brand/settings-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/storage-gray-negative.svg b/apps/www/public/images/icons/brand/storage-gray-negative.svg new file mode 100644 index 00000000000..837bee9ee6d --- /dev/null +++ b/apps/www/public/images/icons/brand/storage-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/storage-gray.svg b/apps/www/public/images/icons/brand/storage-gray.svg new file mode 100644 index 00000000000..bef6045c255 --- /dev/null +++ b/apps/www/public/images/icons/brand/storage-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/storage-green.svg b/apps/www/public/images/icons/brand/storage-green.svg new file mode 100644 index 00000000000..55b6ca6367f --- /dev/null +++ b/apps/www/public/images/icons/brand/storage-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg new file mode 100644 index 00000000000..4eaf7940385 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray.svg b/apps/www/public/images/icons/brand/support-add-ons-gray.svg new file mode 100644 index 00000000000..bd8647de63d --- /dev/null +++ b/apps/www/public/images/icons/brand/support-add-ons-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-add-ons-green.svg b/apps/www/public/images/icons/brand/support-add-ons-green.svg new file mode 100644 index 00000000000..6ff5e144638 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-add-ons-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-gray-negative.svg b/apps/www/public/images/icons/brand/support-gray-negative.svg new file mode 100644 index 00000000000..c2f5ca07036 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-gray.svg b/apps/www/public/images/icons/brand/support-gray.svg new file mode 100644 index 00000000000..7f0cddd1c45 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/support-green.svg b/apps/www/public/images/icons/brand/support-green.svg new file mode 100644 index 00000000000..0e3034f495a --- /dev/null +++ b/apps/www/public/images/icons/brand/support-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/table-editor-gray-negative.svg b/apps/www/public/images/icons/brand/table-editor-gray-negative.svg new file mode 100644 index 00000000000..53d8b392821 --- /dev/null +++ b/apps/www/public/images/icons/brand/table-editor-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/table-editor-gray.svg b/apps/www/public/images/icons/brand/table-editor-gray.svg new file mode 100644 index 00000000000..7c79f5d9512 --- /dev/null +++ b/apps/www/public/images/icons/brand/table-editor-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/table-editor-green.svg b/apps/www/public/images/icons/brand/table-editor-green.svg new file mode 100644 index 00000000000..a100b64c80f --- /dev/null +++ b/apps/www/public/images/icons/brand/table-editor-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/tables-gray-negative.svg b/apps/www/public/images/icons/brand/tables-gray-negative.svg new file mode 100644 index 00000000000..0156ae2f417 --- /dev/null +++ b/apps/www/public/images/icons/brand/tables-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/tables-gray.svg b/apps/www/public/images/icons/brand/tables-gray.svg new file mode 100644 index 00000000000..3f7f4a54554 --- /dev/null +++ b/apps/www/public/images/icons/brand/tables-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/tables-green.svg b/apps/www/public/images/icons/brand/tables-green.svg new file mode 100644 index 00000000000..509103462b1 --- /dev/null +++ b/apps/www/public/images/icons/brand/tables-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/tutorials-gray-negative.svg b/apps/www/public/images/icons/brand/tutorials-gray-negative.svg new file mode 100644 index 00000000000..08a86d1254d --- /dev/null +++ b/apps/www/public/images/icons/brand/tutorials-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/tutorials-gray.svg b/apps/www/public/images/icons/brand/tutorials-gray.svg new file mode 100644 index 00000000000..df4b35c7489 --- /dev/null +++ b/apps/www/public/images/icons/brand/tutorials-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/tutorials-green.svg b/apps/www/public/images/icons/brand/tutorials-green.svg new file mode 100644 index 00000000000..a4787fd42a3 --- /dev/null +++ b/apps/www/public/images/icons/brand/tutorials-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/wrappers-gray-negative.svg b/apps/www/public/images/icons/brand/wrappers-gray-negative.svg new file mode 100644 index 00000000000..b9825cc8b84 --- /dev/null +++ b/apps/www/public/images/icons/brand/wrappers-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/wrappers-gray.svg b/apps/www/public/images/icons/brand/wrappers-gray.svg new file mode 100644 index 00000000000..6b504f78bf5 --- /dev/null +++ b/apps/www/public/images/icons/brand/wrappers-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/wrappers-green.svg b/apps/www/public/images/icons/brand/wrappers-green.svg new file mode 100644 index 00000000000..970028b1b07 --- /dev/null +++ b/apps/www/public/images/icons/brand/wrappers-green.svg @@ -0,0 +1,7 @@ + + + + + + + From 5b634770efd5530fde0c7e838f113c8ea3a28145 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 18 Jan 2023 08:19:37 -0330 Subject: [PATCH 004/120] Update --- .../Pricing/ComputePricingModal.tsx | 113 ++++++++ .../{ => Pricing}/PricingAddOnTable.tsx | 0 .../{ => Pricing}/PricingTableRow.tsx | 123 ++++---- apps/www/components/ProductIcon.tsx | 11 +- apps/www/data/Pricing.json | 48 ++++ apps/www/data/PricingAddOnTable.json | 62 ++-- apps/www/pages/pricing/index.tsx | 267 ++++++++++-------- .../images/icons/brand/api-gray-negative.svg | 9 - .../public/images/icons/brand/api-gray.svg | 7 - .../public/images/icons/brand/api-green.svg | 7 - .../brand/api-management-gray-negative.svg | 9 - .../icons/brand/api-management-gray.svg | 3 - .../icons/brand/api-management-green.svg | 3 - .../images/icons/brand/auth-gray-negative.svg | 9 - .../public/images/icons/brand/auth-gray.svg | 6 - .../public/images/icons/brand/auth-green.svg | 6 - .../images/icons/brand/blog-gray-negative.svg | 9 - .../public/images/icons/brand/blog-gray.svg | 4 - .../public/images/icons/brand/blog-green.svg | 4 - .../images/icons/brand/cli-gray-negative.svg | 9 - .../public/images/icons/brand/cli-gray.svg | 5 - .../public/images/icons/brand/cli-green.svg | 3 - .../icons/brand/columns-gray-negative.svg | 9 - .../images/icons/brand/columns-gray.svg | 5 - .../images/icons/brand/columns-green.svg | 5 - .../brand/custom-domains-gray-negative.svg | 9 - .../icons/brand/custom-domains-gray.svg | 5 - .../icons/brand/custom-domains-green.svg | 5 - .../brand/database-add-ons-gray-negative.svg | 9 - .../icons/brand/database-add-ons-gray.svg | 9 - .../icons/brand/database-add-ons-green.svg | 9 - .../icons/brand/database-gray-negative.svg | 9 - .../images/icons/brand/database-gray.svg | 5 - .../images/icons/brand/database-green.svg | 5 - .../brand/documentation-gray-negative.svg | 9 - .../images/icons/brand/documentation-gray.svg | 7 - .../icons/brand/documentation-green.svg | 7 - .../brand/edge-functions-gray-negative.svg | 9 - .../icons/brand/edge-functions-gray.svg | 6 - .../icons/brand/edge-functions-green.svg | 6 - .../icons/brand/extensions-gray-negative.svg | 9 - .../images/icons/brand/extensions-gray.svg | 7 - .../images/icons/brand/extensions-green.svg | 7 - .../brand/getting-started-gray-negative.svg | 9 - .../icons/brand/getting-started-gray.svg | 3 - .../icons/brand/getting-started-green.svg | 3 - .../icons/brand/glossary-gray-negative.svg | 9 - .../images/icons/brand/glossary-gray.svg | 5 - .../images/icons/brand/glossary-green.svg | 5 - .../icons/brand/guides-gray-negative.svg | 9 - .../public/images/icons/brand/guides-gray.svg | 5 - .../images/icons/brand/guides-green.svg | 5 - .../images/icons/brand/home-gray-negative.svg | 9 - .../public/images/icons/brand/home-gray.svg | 5 - .../public/images/icons/brand/home-green.svg | 5 - .../images/icons/brand/logs-gray-negative.svg | 9 - .../public/images/icons/brand/logs-gray.svg | 6 - .../public/images/icons/brand/logs-green.svg | 6 - .../images/icons/brand/pitr-gray-negative.svg | 9 - .../public/images/icons/brand/pitr-gray.svg | 7 - .../public/images/icons/brand/pitr-green.svg | 7 - .../icons/brand/platform-gray-negative.svg | 9 - .../images/icons/brand/platform-gray.svg | 5 - .../images/icons/brand/platform-green.svg | 5 - .../icons/brand/profile-gray-negative.svg | 9 - .../images/icons/brand/profile-gray.svg | 5 - .../images/icons/brand/profile-green.svg | 5 - .../brand/read-replicas-gray-negative.svg | 9 - .../images/icons/brand/read-replicas-gray.svg | 6 - .../icons/brand/read-replicas-green.svg | 6 - .../icons/brand/realtime-gray-negative.svg | 9 - .../images/icons/brand/realtime-gray.svg | 6 - .../images/icons/brand/realtime-green.svg | 6 - .../icons/brand/reports-gray-negative.svg | 9 - .../images/icons/brand/reports-gray.svg | 7 - .../images/icons/brand/reports-green.svg | 7 - .../icons/brand/roles-gray-negative.svg | 9 - .../public/images/icons/brand/roles-gray.svg | 8 - .../public/images/icons/brand/roles-green.svg | 9 - .../images/icons/brand/rows-gray-negative.svg | 9 - .../public/images/icons/brand/rows-gray.svg | 5 - .../public/images/icons/brand/rows-green.svg | 5 - .../brand/self-hosting-gray-negative.svg | 9 - .../images/icons/brand/self-hosting-gray.svg | 9 - .../images/icons/brand/self-hosting-green.svg | 9 - .../icons/brand/settings-gray-negative.svg | 9 - .../images/icons/brand/settings-gray.svg | 4 - .../images/icons/brand/settings-green.svg | 4 - .../icons/brand/storage-gray-negative.svg | 9 - .../images/icons/brand/storage-gray.svg | 5 - .../images/icons/brand/storage-green.svg | 5 - .../brand/support-add-ons-gray-negative.svg | 9 - .../icons/brand/support-add-ons-gray.svg | 7 - .../icons/brand/support-add-ons-green.svg | 7 - .../icons/brand/support-gray-negative.svg | 9 - .../images/icons/brand/support-gray.svg | 5 - .../images/icons/brand/support-green.svg | 5 - .../brand/table-editor-gray-negative.svg | 9 - .../images/icons/brand/table-editor-gray.svg | 6 - .../images/icons/brand/table-editor-green.svg | 6 - .../icons/brand/tables-gray-negative.svg | 9 - .../public/images/icons/brand/tables-gray.svg | 7 - .../images/icons/brand/tables-green.svg | 7 - .../icons/brand/tutorials-gray-negative.svg | 9 - .../images/icons/brand/tutorials-gray.svg | 4 - .../images/icons/brand/tutorials-green.svg | 4 - .../icons/brand/wrappers-gray-negative.svg | 9 - .../images/icons/brand/wrappers-gray.svg | 7 - .../images/icons/brand/wrappers-green.svg | 7 - .../addons-custom-domain-hero-light.svg | 158 +++++++++++ .../pricing/addons-custom-domain-hero.svg | 159 +++++++++++ .../images/pricing/addons-pitr-light.svg | 188 ++++++++++++ .../www/public/images/pricing/addons-pitr.svg | 188 ++++++++++++ .../images/pricing/addons-support-light.svg | 136 +++++++++ .../public/images/pricing/addons-support.svg | 136 +++++++++ .../images/pricing/pitr-upgrade-light.svg | 9 + .../public/images/pricing/pitr-upgrade.svg | 7 + 117 files changed, 1396 insertions(+), 906 deletions(-) create mode 100644 apps/www/components/Pricing/ComputePricingModal.tsx rename apps/www/components/{ => Pricing}/PricingAddOnTable.tsx (100%) rename apps/www/components/{ => Pricing}/PricingTableRow.tsx (50%) delete mode 100644 apps/www/public/images/icons/brand/api-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/api-gray.svg delete mode 100644 apps/www/public/images/icons/brand/api-green.svg delete mode 100644 apps/www/public/images/icons/brand/api-management-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/api-management-gray.svg delete mode 100644 apps/www/public/images/icons/brand/api-management-green.svg delete mode 100644 apps/www/public/images/icons/brand/auth-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/auth-gray.svg delete mode 100644 apps/www/public/images/icons/brand/auth-green.svg delete mode 100644 apps/www/public/images/icons/brand/blog-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/blog-gray.svg delete mode 100644 apps/www/public/images/icons/brand/blog-green.svg delete mode 100644 apps/www/public/images/icons/brand/cli-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/cli-gray.svg delete mode 100644 apps/www/public/images/icons/brand/cli-green.svg delete mode 100644 apps/www/public/images/icons/brand/columns-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/columns-gray.svg delete mode 100644 apps/www/public/images/icons/brand/columns-green.svg delete mode 100644 apps/www/public/images/icons/brand/custom-domains-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/custom-domains-gray.svg delete mode 100644 apps/www/public/images/icons/brand/custom-domains-green.svg delete mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray.svg delete mode 100644 apps/www/public/images/icons/brand/database-add-ons-green.svg delete mode 100644 apps/www/public/images/icons/brand/database-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/database-gray.svg delete mode 100644 apps/www/public/images/icons/brand/database-green.svg delete mode 100644 apps/www/public/images/icons/brand/documentation-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/documentation-gray.svg delete mode 100644 apps/www/public/images/icons/brand/documentation-green.svg delete mode 100644 apps/www/public/images/icons/brand/edge-functions-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/edge-functions-gray.svg delete mode 100644 apps/www/public/images/icons/brand/edge-functions-green.svg delete mode 100644 apps/www/public/images/icons/brand/extensions-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/extensions-gray.svg delete mode 100644 apps/www/public/images/icons/brand/extensions-green.svg delete mode 100644 apps/www/public/images/icons/brand/getting-started-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/getting-started-gray.svg delete mode 100644 apps/www/public/images/icons/brand/getting-started-green.svg delete mode 100644 apps/www/public/images/icons/brand/glossary-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/glossary-gray.svg delete mode 100644 apps/www/public/images/icons/brand/glossary-green.svg delete mode 100644 apps/www/public/images/icons/brand/guides-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/guides-gray.svg delete mode 100644 apps/www/public/images/icons/brand/guides-green.svg delete mode 100644 apps/www/public/images/icons/brand/home-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/home-gray.svg delete mode 100644 apps/www/public/images/icons/brand/home-green.svg delete mode 100644 apps/www/public/images/icons/brand/logs-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/logs-gray.svg delete mode 100644 apps/www/public/images/icons/brand/logs-green.svg delete mode 100644 apps/www/public/images/icons/brand/pitr-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/pitr-gray.svg delete mode 100644 apps/www/public/images/icons/brand/pitr-green.svg delete mode 100644 apps/www/public/images/icons/brand/platform-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/platform-gray.svg delete mode 100644 apps/www/public/images/icons/brand/platform-green.svg delete mode 100644 apps/www/public/images/icons/brand/profile-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/profile-gray.svg delete mode 100644 apps/www/public/images/icons/brand/profile-green.svg delete mode 100644 apps/www/public/images/icons/brand/read-replicas-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/read-replicas-gray.svg delete mode 100644 apps/www/public/images/icons/brand/read-replicas-green.svg delete mode 100644 apps/www/public/images/icons/brand/realtime-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/realtime-gray.svg delete mode 100644 apps/www/public/images/icons/brand/realtime-green.svg delete mode 100644 apps/www/public/images/icons/brand/reports-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/reports-gray.svg delete mode 100644 apps/www/public/images/icons/brand/reports-green.svg delete mode 100644 apps/www/public/images/icons/brand/roles-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/roles-gray.svg delete mode 100644 apps/www/public/images/icons/brand/roles-green.svg delete mode 100644 apps/www/public/images/icons/brand/rows-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/rows-gray.svg delete mode 100644 apps/www/public/images/icons/brand/rows-green.svg delete mode 100644 apps/www/public/images/icons/brand/self-hosting-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/self-hosting-gray.svg delete mode 100644 apps/www/public/images/icons/brand/self-hosting-green.svg delete mode 100644 apps/www/public/images/icons/brand/settings-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/settings-gray.svg delete mode 100644 apps/www/public/images/icons/brand/settings-green.svg delete mode 100644 apps/www/public/images/icons/brand/storage-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/storage-gray.svg delete mode 100644 apps/www/public/images/icons/brand/storage-green.svg delete mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray.svg delete mode 100644 apps/www/public/images/icons/brand/support-add-ons-green.svg delete mode 100644 apps/www/public/images/icons/brand/support-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/support-gray.svg delete mode 100644 apps/www/public/images/icons/brand/support-green.svg delete mode 100644 apps/www/public/images/icons/brand/table-editor-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/table-editor-gray.svg delete mode 100644 apps/www/public/images/icons/brand/table-editor-green.svg delete mode 100644 apps/www/public/images/icons/brand/tables-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/tables-gray.svg delete mode 100644 apps/www/public/images/icons/brand/tables-green.svg delete mode 100644 apps/www/public/images/icons/brand/tutorials-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/tutorials-gray.svg delete mode 100644 apps/www/public/images/icons/brand/tutorials-green.svg delete mode 100644 apps/www/public/images/icons/brand/wrappers-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/wrappers-gray.svg delete mode 100644 apps/www/public/images/icons/brand/wrappers-green.svg create mode 100644 apps/www/public/images/pricing/addons-custom-domain-hero-light.svg create mode 100644 apps/www/public/images/pricing/addons-custom-domain-hero.svg create mode 100644 apps/www/public/images/pricing/addons-pitr-light.svg create mode 100644 apps/www/public/images/pricing/addons-pitr.svg create mode 100644 apps/www/public/images/pricing/addons-support-light.svg create mode 100644 apps/www/public/images/pricing/addons-support.svg create mode 100644 apps/www/public/images/pricing/pitr-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/pitr-upgrade.svg diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx new file mode 100644 index 00000000000..b56881abb0c --- /dev/null +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -0,0 +1,113 @@ +import React, { Fragment, useMemo } from 'react' + +import { IconCheckCircle, IconXCircle, Modal } from 'ui' +import pricingAddOn from '~/data/PricingAddOnTable.json' + +interface Props { + showComputeModal: boolean + setShowComputeModal: React.Dispatch> +} + +export default function ComputePricingModal({ showComputeModal, setShowComputeModal }: Props) { + const columnNames = useMemo( + () => + pricingAddOn.database.rows.map((row) => + row.columns.map((column) => ({ key: column.key, title: column.title })) + )[0], + [] + ) + + return ( + setVideoVisible(false)} + hideFooter + header={ +
+ Compute pricing + setShowComputeModal(false)} + /> +
+ } + > +
+
+
+

Choose best compute setup for you

+

+ Every project on the Supabase Platform comes with its own dedicated Postgres instance + running inside a virtual machine (VM). The following table describes the base instance + with additional compute add-ons available if you need extra performance when scaling + up Supabase. +

+
+
+ + + + {columnNames.map((column) => ( + + ))} + + + + {pricingAddOn.database.rows.map((row, i) => ( + <> + {i === 0 && ( + + + + )} + + {row.columns.map((column) => ( + + ))} + + + ))} + +
+ {column.title} +
+ Included in Free and Pro tiers +
+ {column.key === 'dedicated' ? ( + + ) : ( + column.value + )} +
+
+ + + + {pricingAddOn.database.rows.map((row, i) => ( + + {row.columns.map((column) => ( + + + + + ))} + + ))} + +
{column.title}{column.value}
+
+
+
+ ) +} diff --git a/apps/www/components/PricingAddOnTable.tsx b/apps/www/components/Pricing/PricingAddOnTable.tsx similarity index 100% rename from apps/www/components/PricingAddOnTable.tsx rename to apps/www/components/Pricing/PricingAddOnTable.tsx diff --git a/apps/www/components/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx similarity index 50% rename from apps/www/components/PricingTableRow.tsx rename to apps/www/components/Pricing/PricingTableRow.tsx index e9a29a72236..f546208082e 100644 --- a/apps/www/components/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -1,11 +1,11 @@ -import { IconHelpCircle } from 'ui' +import { IconHelpCircle, IconInfo, IconX, IconXCircle, Modal } from 'ui' import ProductIcon from 'components/ProductIcon' import React, { useState } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( ( ) const IncludedCheck = (props: any) => ( - <> + Included in {props.tier} - + ) const Minus = (props: any) => ( <> { return ( <>
-
- {props.icon && } -

{category.title}

+
+ {props.icon && } +

{category.title}

- - - + + + + {category.features.map((feat: any, i: number) => { return ( - - - {feat.title} - {feat.tooltip && ( - - - - )} - + <> + + + {feat.title} + {feat.tooltip && !feat.tooltipPosition && ( + + + + )} + - {Object.entries(feat.tiers).map((entry: any, i) => { - const tierName = entry[0] - const tierValue = entry[1] + {Object.entries(feat.tiers).map((entry: any, i) => { + const tierName = entry[0] + const tierValue = entry[1] - return ( - - {typeof tierValue === 'boolean' && tierValue === true ? ( - - ) : typeof tierValue === 'boolean' && tierValue === false ? ( -
- -
- ) : ( - - {tierValue} - - )} - - ) - })} - + return ( + + {typeof tierValue === 'boolean' && tierValue === true ? ( + + ) : typeof tierValue === 'boolean' && tierValue === false ? ( +
+ +
+ ) : ( + + {feat.tooltip && feat.tooltipPosition === tierName && ( + + + + )} + + {tierValue} + + )} + + ) + })} + + {i === category.features.length - 1 && ( +
+ )} + ) })} diff --git a/apps/www/components/ProductIcon.tsx b/apps/www/components/ProductIcon.tsx index d7a24709787..fa2240071a4 100644 --- a/apps/www/components/ProductIcon.tsx +++ b/apps/www/components/ProductIcon.tsx @@ -1,10 +1,17 @@ interface ProductIcon { icon: string + color?: 'black' | 'green' } -function ProductIcon({ icon }: ProductIcon) { +function ProductIcon({ icon, color }: ProductIcon) { return ( -
+
1TB, contact enterprise)", + "team": "text", "enterprise": "Custom" } }, @@ -42,6 +47,7 @@ "tiers": { "free": false, "pro": false, + "team": "text", "enterprise": true } }, @@ -51,6 +57,7 @@ "tiers": { "free": "Paused after 1 week inactivity", "pro": "Never", + "team": "text", "enterprise": "Never" } }, @@ -60,6 +67,7 @@ "tiers": { "free": "Up to 2GB", "pro": "50GB included per month, then $0.09 per GB", + "team": "text", "enterprise": "Unlimited" } } @@ -75,6 +83,7 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", + "team": "text", "enterprise": "Unlimited" } }, @@ -84,6 +93,7 @@ "tiers": { "free": "Up to 50,000 MAUs", "pro": "100,000 included, then $0.00325 per MAU", + "team": "text", "enterprise": "Unlimited" } }, @@ -92,6 +102,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -100,6 +111,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -108,6 +120,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -116,6 +129,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -124,6 +138,7 @@ "tiers": { "free": "1 hour", "pro": "7 days", + "team": "text", "enterprise": true } }, @@ -132,6 +147,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -141,6 +157,7 @@ "tiers": { "free": "30 / hour", "pro": "100 / hour", + "team": "text", "enterprise": "Contact Us" } }, @@ -149,6 +166,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": "Contact Us" } } @@ -163,6 +181,7 @@ "tiers": { "free": "Up to 1 GB", "pro": "100 GB included, then $0.021 per GB", + "team": "text", "enterprise": "Unlimited" } }, @@ -172,6 +191,7 @@ "tiers": { "free": "Up to 2 GB", "pro": "200 GB included, then $0.09 per GB", + "team": "text", "enterprise": "Unlimited" } }, @@ -189,6 +209,7 @@ "tiers": { "free": "Up to 50MB", "pro": "Up to 5GB", + "team": "text", "enterprise": "Unlimited" } }, @@ -197,6 +218,7 @@ "tiers": { "free": false, "pro": "Unlimited transformations for 100 origin images, then 5$ per 1000 origin images", + "team": "text", "enterprise": "Unlimited" } } @@ -211,6 +233,7 @@ "tiers": { "free": "500K per month", "pro": "2 Million per month, then $2 per 1 million invocations", + "team": "text", "enterprise": "Unlimited" } }, @@ -219,6 +242,7 @@ "tiers": { "free": "2 mb", "pro": "10 mb", + "team": "text", "enterprise": "Unlimited" } }, @@ -227,6 +251,7 @@ "tiers": { "free": "10", "pro": "100, then $10 per additional 100 functions", + "team": "text", "enterprise": "Unlimited" } } @@ -241,6 +266,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -249,6 +275,7 @@ "tiers": { "free": "Up to 200", "pro": "Up to 500, then $10 per 1000", + "team": "text", "enterprise": "Unlimited concurrent connections and volume discount" } }, @@ -257,6 +284,7 @@ "tiers": { "free": "2 Million (including database)", "pro": "5 Million", + "team": "text", "enterprise": "Volume discounts on messages" } }, @@ -265,6 +293,7 @@ "tiers": { "free": "250 Kb", "pro": "3 Mb", + "team": "text", "enterprise": "Custom" } } @@ -279,6 +308,7 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", + "team": "text", "enterprise": "Unlimited" } }, @@ -287,6 +317,7 @@ "tiers": { "free": "Coming soon", "pro": "Coming soon", + "team": "text", "enterprise": true } }, @@ -295,6 +326,7 @@ "tiers": { "free": false, "pro": false, + "team": false, "enterprise": true } } @@ -309,6 +341,7 @@ "tiers": { "free": false, "pro": false, + "team": false, "enterprise": true } }, @@ -317,6 +350,7 @@ "tiers": { "free": "1 day", "pro": "7 days", + "team": "text", "enterprise": "90 days" } }, @@ -325,6 +359,7 @@ "tiers": { "free": false, "pro": false, + "team": "text", "enterprise": "Coming soon" } }, @@ -333,6 +368,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -341,6 +377,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -349,6 +386,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": "Contact Us" } }, @@ -357,6 +395,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -365,6 +404,7 @@ "tiers": { "free": "Owner, Developer", "pro": "Owner, Developer", + "team": "text", "enterprise": "Additional owner(s), admin, read-only, billing admin, custom" } }, @@ -373,6 +413,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -382,6 +423,7 @@ "tiers": { "free": false, "pro": "$10 per domain per month per project add on", + "team": "text", "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available." } } @@ -396,6 +438,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -404,6 +447,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -412,6 +456,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -420,6 +465,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -436,6 +482,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -444,6 +491,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } } diff --git a/apps/www/data/PricingAddOnTable.json b/apps/www/data/PricingAddOnTable.json index d756fb75d18..e20da275960 100644 --- a/apps/www/data/PricingAddOnTable.json +++ b/apps/www/data/PricingAddOnTable.json @@ -10,11 +10,12 @@ "rows": [ { "columns": [ - { "key": "plan", "title": "Plan", "value": "Free (Included)" }, + { "key": "plan", "title": "Plan", "value": "Starter" }, { "key": "pricing", "title": "Pricing", "value": "$0" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "1 GB" }, - { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { "key": "maxDiskIO", "title": "Disk IO Bandwidth up to", "value": "2,606 Mbps" }, { "key": "baseDiskIO", "title": "Baseline Disk IO Bandwidth", @@ -22,12 +23,12 @@ }, { "key": "directConnections", - "title": "Connections: Direct (recommended)", + "title": "Connections: Direct", "value": "10" }, { "key": "poolerConnections", - "title": "Connections: Pooler (recommended)", + "title": "Connections: Pooler", "value": "50" } ] @@ -36,7 +37,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "Small" }, { "key": "pricing", "title": "Pricing", "value": "$5" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "2 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, { @@ -60,7 +62,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "Medium" }, { "key": "pricing", "title": "Pricing", "value": "$50" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "4 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, { @@ -84,7 +87,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "Large" }, { "key": "pricing", "title": "Pricing", "value": "$100" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "8 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -108,7 +112,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "XL" }, { "key": "pricing", "title": "Pricing", "value": "$200" }, - { "key": "cpu", "title": "CPU", "value": "4-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "4-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "16 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -132,7 +137,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "2XL" }, { "key": "pricing", "title": "Pricing", "value": "$400" }, - { "key": "cpu", "title": "CPU", "value": "8-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "8-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "32 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -156,7 +162,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "4XL" }, { "key": "pricing", "title": "Pricing", "value": "$950" }, - { "key": "cpu", "title": "CPU", "value": "16-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "16-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "64 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -180,7 +187,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "8XL" }, { "key": "pricing", "title": "Pricing", "value": "$1,860" }, - { "key": "cpu", "title": "CPU", "value": "32-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "32-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "128 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" }, { @@ -204,7 +212,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "12XL" }, { "key": "pricing", "title": "Pricing", "value": "$2,790" }, - { "key": "cpu", "title": "CPU", "value": "48-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "48-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "192 GB" }, { "key": "maxDiskIO", @@ -232,7 +241,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "16XL" }, { "key": "pricing", "title": "Pricing", "value": "$3,720" }, - { "key": "cpu", "title": "CPU", "value": "64-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "64-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "256 GB" }, { "key": "maxDiskIO", @@ -255,30 +265,6 @@ "value": "11,600" } ] - }, - { - "columns": [ - { "key": "plan", "title": "Plan", "value": "Custom (need more?)" }, - { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, - { "key": "cpu", "title": "CPU", "value": "Contact Us" }, - { "key": "memory", "title": "Memory", "value": "Contact Us" }, - { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "Contact Us" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "Contact Us" - }, - { - "key": "directConnections", - "title": "Connections: Direct (recommended)", - "value": "Contact Us" - }, - { - "key": "poolerConnections", - "title": "Connections: Pooler (recommended)", - "value": "Contact Us" - } - ] } ] }, diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 9fe40754704..89c21f0ffec 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -4,21 +4,23 @@ import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' import Link from 'next/link' import { useRouter } from 'next/router' -import React from 'react' +import React, { useState } from 'react' import ReactMarkdown from 'react-markdown' import CTABanner from '~/components/CTABanner' import DefaultLayout from '~/components/Layouts/Default' -import PricingAddOnTable from '~/components/PricingAddOnTable' -import { PricingTableRowDesktop, PricingTableRowMobile } from '~/components/PricingTableRow' +import PricingAddOnTable from '~/components/Pricing/PricingAddOnTable' +import { PricingTableRowDesktop, PricingTableRowMobile } from '~/components/Pricing/PricingTableRow' import pricing from '~/data/Pricing.json' import pricingAddOn from '~/data/PricingAddOnTable.json' import pricingFaq from '~/data/PricingFAQ.json' import { useTheme } from 'common/Providers' +import ComputePricingModal from '~/components/Pricing/ComputePricingModal' export default function IndexPage() { const router = useRouter() const { basePath } = useRouter() const { isDarkMode } = useTheme() + const [showComputeModal, setShowComputeModal] = useState(false) const meta_title = 'Pricing & fees | Supabase' const meta_description = @@ -37,7 +39,7 @@ export default function IndexPage() { costUnit: 'per month per project', href: 'https://app.supabase.com/new/new-project', priceLabel: 'Starting from', - priceMonthly: 0, + priceMonthly: '0', warning: 'Limit of 2 free projects', description: 'Perfect for passion projects & simple websites.', preface: 'Get started with...', @@ -90,7 +92,7 @@ export default function IndexPage() { href: 'https://app.supabase.com/new/new-project', from: true, priceLabel: 'Starting from', - priceMonthly: 25, + priceMonthly: 599, description: 'For scaling teams with permissions & access controls', warning: '+ any additional usage', features: [ @@ -134,7 +136,7 @@ export default function IndexPage() { const addons = [ { name: 'Optimized Compute', - heroImg: 'hero', + heroImg: 'addons-compute-hero', icon: 'compute-upgrade', price: 'Starts from $5', description: 'Increase the captability of your database only for what you need.', @@ -145,7 +147,7 @@ export default function IndexPage() { }, { name: 'Dedicated Support', - heroImg: 'hero', + heroImg: 'addons-support', icon: 'support-upgrade', price: 'Starts from $5', description: @@ -157,7 +159,7 @@ export default function IndexPage() { }, { name: 'Custom Domain', - heroImg: 'hero', + heroImg: 'addons-custom-domain-hero', icon: 'custom-domain-upgrade', price: 'Flat fee $10', description: @@ -169,8 +171,8 @@ export default function IndexPage() { }, { name: 'Point in time recovery', - heroImg: 'hero', - icon: 'icon', + heroImg: 'addons-pitr', + icon: 'pitr-upgrade', price: 'Starts from $5', description: 'Roll back to any specific point in time and ensure that data is not lost.', leftCtaText: 'Documentation', @@ -249,7 +251,7 @@ export default function IndexPage() {
-
+
{/*
*/}
-
+
{tiers.map((tier) => (
-
+

Easily customizable add-Ons

@@ -396,24 +398,73 @@ export default function IndexPage() { Level up your Supabase experience with add-ons.

-
+ +
{addons.map((addon) => ( -
- Compute -
- {addon.name} - {addon.price} +
+
+ +
+
+

{addon.price}

+
+ Compute + {addon.name} +
+

+ {addon.description} +

+
+ + + + + + {addon.name === 'Optimized Compute' ? ( + + ) : ( + '' + )} +
))}
-
+
+
+ + Available for Pro plan + +

Flexible Spend Cap

+

+ Ensure you have the flexibility to scale your business without the restrictions of Pro + usage limits. Turn off the usage cap to let your project scale and only pay for what + you use.{' '} +

+
+
+
right
+
+
- + - - - - - + {tiers.map((tier) => ( + + ))} + + + + {tiers.map((tier) => ( + + ))} + - + + > - - - - - + + + + + ))} + ) } diff --git a/apps/www/public/images/icons/brand/api-gray-negative.svg b/apps/www/public/images/icons/brand/api-gray-negative.svg deleted file mode 100644 index 1c8b36abab2..00000000000 --- a/apps/www/public/images/icons/brand/api-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-gray.svg b/apps/www/public/images/icons/brand/api-gray.svg deleted file mode 100644 index af00abfa5c6..00000000000 --- a/apps/www/public/images/icons/brand/api-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-green.svg b/apps/www/public/images/icons/brand/api-green.svg deleted file mode 100644 index 14f6f33c4fe..00000000000 --- a/apps/www/public/images/icons/brand/api-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-management-gray-negative.svg b/apps/www/public/images/icons/brand/api-management-gray-negative.svg deleted file mode 100644 index 9cfe9c931d8..00000000000 --- a/apps/www/public/images/icons/brand/api-management-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-management-gray.svg b/apps/www/public/images/icons/brand/api-management-gray.svg deleted file mode 100644 index ad8169dc421..00000000000 --- a/apps/www/public/images/icons/brand/api-management-gray.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/api-management-green.svg b/apps/www/public/images/icons/brand/api-management-green.svg deleted file mode 100644 index 2724bdb975d..00000000000 --- a/apps/www/public/images/icons/brand/api-management-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/auth-gray-negative.svg b/apps/www/public/images/icons/brand/auth-gray-negative.svg deleted file mode 100644 index 611ec59b334..00000000000 --- a/apps/www/public/images/icons/brand/auth-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/auth-gray.svg b/apps/www/public/images/icons/brand/auth-gray.svg deleted file mode 100644 index 69a108e951d..00000000000 --- a/apps/www/public/images/icons/brand/auth-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/auth-green.svg b/apps/www/public/images/icons/brand/auth-green.svg deleted file mode 100644 index 0875ec0d581..00000000000 --- a/apps/www/public/images/icons/brand/auth-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/blog-gray-negative.svg b/apps/www/public/images/icons/brand/blog-gray-negative.svg deleted file mode 100644 index 77cd8aa368d..00000000000 --- a/apps/www/public/images/icons/brand/blog-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/blog-gray.svg b/apps/www/public/images/icons/brand/blog-gray.svg deleted file mode 100644 index d17a7a75f2f..00000000000 --- a/apps/www/public/images/icons/brand/blog-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/blog-green.svg b/apps/www/public/images/icons/brand/blog-green.svg deleted file mode 100644 index ce9e01c1703..00000000000 --- a/apps/www/public/images/icons/brand/blog-green.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/cli-gray-negative.svg b/apps/www/public/images/icons/brand/cli-gray-negative.svg deleted file mode 100644 index eaa2cee6601..00000000000 --- a/apps/www/public/images/icons/brand/cli-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/cli-gray.svg b/apps/www/public/images/icons/brand/cli-gray.svg deleted file mode 100644 index e44838f4b7a..00000000000 --- a/apps/www/public/images/icons/brand/cli-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/cli-green.svg b/apps/www/public/images/icons/brand/cli-green.svg deleted file mode 100644 index ab3012bccd9..00000000000 --- a/apps/www/public/images/icons/brand/cli-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/columns-gray-negative.svg b/apps/www/public/images/icons/brand/columns-gray-negative.svg deleted file mode 100644 index 767fc7c44e9..00000000000 --- a/apps/www/public/images/icons/brand/columns-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/columns-gray.svg b/apps/www/public/images/icons/brand/columns-gray.svg deleted file mode 100644 index bdf3c770bea..00000000000 --- a/apps/www/public/images/icons/brand/columns-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/columns-green.svg b/apps/www/public/images/icons/brand/columns-green.svg deleted file mode 100644 index e55340280d8..00000000000 --- a/apps/www/public/images/icons/brand/columns-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg b/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg deleted file mode 100644 index afc7ede37ff..00000000000 --- a/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/custom-domains-gray.svg b/apps/www/public/images/icons/brand/custom-domains-gray.svg deleted file mode 100644 index 405ab724659..00000000000 --- a/apps/www/public/images/icons/brand/custom-domains-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/custom-domains-green.svg b/apps/www/public/images/icons/brand/custom-domains-green.svg deleted file mode 100644 index 48f15398d17..00000000000 --- a/apps/www/public/images/icons/brand/custom-domains-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg deleted file mode 100644 index 55685530c78..00000000000 --- a/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray.svg b/apps/www/public/images/icons/brand/database-add-ons-gray.svg deleted file mode 100644 index 1a434548729..00000000000 --- a/apps/www/public/images/icons/brand/database-add-ons-gray.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-add-ons-green.svg b/apps/www/public/images/icons/brand/database-add-ons-green.svg deleted file mode 100644 index c893942cdc6..00000000000 --- a/apps/www/public/images/icons/brand/database-add-ons-green.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-gray-negative.svg b/apps/www/public/images/icons/brand/database-gray-negative.svg deleted file mode 100644 index 5e55c299c24..00000000000 --- a/apps/www/public/images/icons/brand/database-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-gray.svg b/apps/www/public/images/icons/brand/database-gray.svg deleted file mode 100644 index 56bc4ae60b2..00000000000 --- a/apps/www/public/images/icons/brand/database-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/database-green.svg b/apps/www/public/images/icons/brand/database-green.svg deleted file mode 100644 index 7919de28ca8..00000000000 --- a/apps/www/public/images/icons/brand/database-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/documentation-gray-negative.svg b/apps/www/public/images/icons/brand/documentation-gray-negative.svg deleted file mode 100644 index 9c9549935db..00000000000 --- a/apps/www/public/images/icons/brand/documentation-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/documentation-gray.svg b/apps/www/public/images/icons/brand/documentation-gray.svg deleted file mode 100644 index 9e4b7b66c91..00000000000 --- a/apps/www/public/images/icons/brand/documentation-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/documentation-green.svg b/apps/www/public/images/icons/brand/documentation-green.svg deleted file mode 100644 index 877b89de115..00000000000 --- a/apps/www/public/images/icons/brand/documentation-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg b/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg deleted file mode 100644 index 47168849c2b..00000000000 --- a/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/edge-functions-gray.svg b/apps/www/public/images/icons/brand/edge-functions-gray.svg deleted file mode 100644 index 65b62e8f89e..00000000000 --- a/apps/www/public/images/icons/brand/edge-functions-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/edge-functions-green.svg b/apps/www/public/images/icons/brand/edge-functions-green.svg deleted file mode 100644 index cfe6bb89751..00000000000 --- a/apps/www/public/images/icons/brand/edge-functions-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/extensions-gray-negative.svg b/apps/www/public/images/icons/brand/extensions-gray-negative.svg deleted file mode 100644 index 6fdd405e034..00000000000 --- a/apps/www/public/images/icons/brand/extensions-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/extensions-gray.svg b/apps/www/public/images/icons/brand/extensions-gray.svg deleted file mode 100644 index fcd4c774c8b..00000000000 --- a/apps/www/public/images/icons/brand/extensions-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/extensions-green.svg b/apps/www/public/images/icons/brand/extensions-green.svg deleted file mode 100644 index bea58a73a02..00000000000 --- a/apps/www/public/images/icons/brand/extensions-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/getting-started-gray-negative.svg b/apps/www/public/images/icons/brand/getting-started-gray-negative.svg deleted file mode 100644 index 66a75217931..00000000000 --- a/apps/www/public/images/icons/brand/getting-started-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/getting-started-gray.svg b/apps/www/public/images/icons/brand/getting-started-gray.svg deleted file mode 100644 index b1ef015bec7..00000000000 --- a/apps/www/public/images/icons/brand/getting-started-gray.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/getting-started-green.svg b/apps/www/public/images/icons/brand/getting-started-green.svg deleted file mode 100644 index f24b5d6f883..00000000000 --- a/apps/www/public/images/icons/brand/getting-started-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/glossary-gray-negative.svg b/apps/www/public/images/icons/brand/glossary-gray-negative.svg deleted file mode 100644 index 48846d72ed6..00000000000 --- a/apps/www/public/images/icons/brand/glossary-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/glossary-gray.svg b/apps/www/public/images/icons/brand/glossary-gray.svg deleted file mode 100644 index 9931120ffa6..00000000000 --- a/apps/www/public/images/icons/brand/glossary-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/glossary-green.svg b/apps/www/public/images/icons/brand/glossary-green.svg deleted file mode 100644 index 7ab0359e7b9..00000000000 --- a/apps/www/public/images/icons/brand/glossary-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/guides-gray-negative.svg b/apps/www/public/images/icons/brand/guides-gray-negative.svg deleted file mode 100644 index 619dfc473e5..00000000000 --- a/apps/www/public/images/icons/brand/guides-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/guides-gray.svg b/apps/www/public/images/icons/brand/guides-gray.svg deleted file mode 100644 index 375fe6d5d8b..00000000000 --- a/apps/www/public/images/icons/brand/guides-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/guides-green.svg b/apps/www/public/images/icons/brand/guides-green.svg deleted file mode 100644 index 27863e00032..00000000000 --- a/apps/www/public/images/icons/brand/guides-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/home-gray-negative.svg b/apps/www/public/images/icons/brand/home-gray-negative.svg deleted file mode 100644 index ae023b5375a..00000000000 --- a/apps/www/public/images/icons/brand/home-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/home-gray.svg b/apps/www/public/images/icons/brand/home-gray.svg deleted file mode 100644 index ebfa14f7f23..00000000000 --- a/apps/www/public/images/icons/brand/home-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/home-green.svg b/apps/www/public/images/icons/brand/home-green.svg deleted file mode 100644 index 0a228053177..00000000000 --- a/apps/www/public/images/icons/brand/home-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/logs-gray-negative.svg b/apps/www/public/images/icons/brand/logs-gray-negative.svg deleted file mode 100644 index 234a573c22a..00000000000 --- a/apps/www/public/images/icons/brand/logs-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/logs-gray.svg b/apps/www/public/images/icons/brand/logs-gray.svg deleted file mode 100644 index 0e99fe1f216..00000000000 --- a/apps/www/public/images/icons/brand/logs-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/logs-green.svg b/apps/www/public/images/icons/brand/logs-green.svg deleted file mode 100644 index 52da7533ce1..00000000000 --- a/apps/www/public/images/icons/brand/logs-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/pitr-gray-negative.svg b/apps/www/public/images/icons/brand/pitr-gray-negative.svg deleted file mode 100644 index 378964e9333..00000000000 --- a/apps/www/public/images/icons/brand/pitr-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/pitr-gray.svg b/apps/www/public/images/icons/brand/pitr-gray.svg deleted file mode 100644 index c13962eae4f..00000000000 --- a/apps/www/public/images/icons/brand/pitr-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/pitr-green.svg b/apps/www/public/images/icons/brand/pitr-green.svg deleted file mode 100644 index f6269710023..00000000000 --- a/apps/www/public/images/icons/brand/pitr-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/platform-gray-negative.svg b/apps/www/public/images/icons/brand/platform-gray-negative.svg deleted file mode 100644 index bdff9e59d70..00000000000 --- a/apps/www/public/images/icons/brand/platform-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/platform-gray.svg b/apps/www/public/images/icons/brand/platform-gray.svg deleted file mode 100644 index 83483f36f32..00000000000 --- a/apps/www/public/images/icons/brand/platform-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/platform-green.svg b/apps/www/public/images/icons/brand/platform-green.svg deleted file mode 100644 index 2c73d35f721..00000000000 --- a/apps/www/public/images/icons/brand/platform-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/profile-gray-negative.svg b/apps/www/public/images/icons/brand/profile-gray-negative.svg deleted file mode 100644 index 2e4fe6c99e7..00000000000 --- a/apps/www/public/images/icons/brand/profile-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/profile-gray.svg b/apps/www/public/images/icons/brand/profile-gray.svg deleted file mode 100644 index 344fa4c16f3..00000000000 --- a/apps/www/public/images/icons/brand/profile-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/profile-green.svg b/apps/www/public/images/icons/brand/profile-green.svg deleted file mode 100644 index 4064771b4f8..00000000000 --- a/apps/www/public/images/icons/brand/profile-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg b/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg deleted file mode 100644 index ba08dbd69e7..00000000000 --- a/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/read-replicas-gray.svg b/apps/www/public/images/icons/brand/read-replicas-gray.svg deleted file mode 100644 index abfb88d2213..00000000000 --- a/apps/www/public/images/icons/brand/read-replicas-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/read-replicas-green.svg b/apps/www/public/images/icons/brand/read-replicas-green.svg deleted file mode 100644 index c033c7189cf..00000000000 --- a/apps/www/public/images/icons/brand/read-replicas-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/realtime-gray-negative.svg b/apps/www/public/images/icons/brand/realtime-gray-negative.svg deleted file mode 100644 index e820eaae08f..00000000000 --- a/apps/www/public/images/icons/brand/realtime-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/realtime-gray.svg b/apps/www/public/images/icons/brand/realtime-gray.svg deleted file mode 100644 index a3bcf43ffdd..00000000000 --- a/apps/www/public/images/icons/brand/realtime-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/realtime-green.svg b/apps/www/public/images/icons/brand/realtime-green.svg deleted file mode 100644 index 1d5d535b40d..00000000000 --- a/apps/www/public/images/icons/brand/realtime-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/reports-gray-negative.svg b/apps/www/public/images/icons/brand/reports-gray-negative.svg deleted file mode 100644 index 3cea4f0d444..00000000000 --- a/apps/www/public/images/icons/brand/reports-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/reports-gray.svg b/apps/www/public/images/icons/brand/reports-gray.svg deleted file mode 100644 index 4e988b96331..00000000000 --- a/apps/www/public/images/icons/brand/reports-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/reports-green.svg b/apps/www/public/images/icons/brand/reports-green.svg deleted file mode 100644 index a04dc29b8e9..00000000000 --- a/apps/www/public/images/icons/brand/reports-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/roles-gray-negative.svg b/apps/www/public/images/icons/brand/roles-gray-negative.svg deleted file mode 100644 index bd12069792c..00000000000 --- a/apps/www/public/images/icons/brand/roles-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/roles-gray.svg b/apps/www/public/images/icons/brand/roles-gray.svg deleted file mode 100644 index 7764b8841bb..00000000000 --- a/apps/www/public/images/icons/brand/roles-gray.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/www/public/images/icons/brand/roles-green.svg b/apps/www/public/images/icons/brand/roles-green.svg deleted file mode 100644 index 6ab8c3b3c05..00000000000 --- a/apps/www/public/images/icons/brand/roles-green.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/rows-gray-negative.svg b/apps/www/public/images/icons/brand/rows-gray-negative.svg deleted file mode 100644 index f0640712741..00000000000 --- a/apps/www/public/images/icons/brand/rows-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/rows-gray.svg b/apps/www/public/images/icons/brand/rows-gray.svg deleted file mode 100644 index f5320ce67bb..00000000000 --- a/apps/www/public/images/icons/brand/rows-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/rows-green.svg b/apps/www/public/images/icons/brand/rows-green.svg deleted file mode 100644 index 02b29c41d64..00000000000 --- a/apps/www/public/images/icons/brand/rows-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg b/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg deleted file mode 100644 index ea74756adce..00000000000 --- a/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/self-hosting-gray.svg b/apps/www/public/images/icons/brand/self-hosting-gray.svg deleted file mode 100644 index 7a5e667ced1..00000000000 --- a/apps/www/public/images/icons/brand/self-hosting-gray.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/self-hosting-green.svg b/apps/www/public/images/icons/brand/self-hosting-green.svg deleted file mode 100644 index 9cc2c2ddfb8..00000000000 --- a/apps/www/public/images/icons/brand/self-hosting-green.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/settings-gray-negative.svg b/apps/www/public/images/icons/brand/settings-gray-negative.svg deleted file mode 100644 index 2b64a926831..00000000000 --- a/apps/www/public/images/icons/brand/settings-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/settings-gray.svg b/apps/www/public/images/icons/brand/settings-gray.svg deleted file mode 100644 index 2b62223d7bc..00000000000 --- a/apps/www/public/images/icons/brand/settings-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/settings-green.svg b/apps/www/public/images/icons/brand/settings-green.svg deleted file mode 100644 index 2d149540e53..00000000000 --- a/apps/www/public/images/icons/brand/settings-green.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/storage-gray-negative.svg b/apps/www/public/images/icons/brand/storage-gray-negative.svg deleted file mode 100644 index 837bee9ee6d..00000000000 --- a/apps/www/public/images/icons/brand/storage-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/storage-gray.svg b/apps/www/public/images/icons/brand/storage-gray.svg deleted file mode 100644 index bef6045c255..00000000000 --- a/apps/www/public/images/icons/brand/storage-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/storage-green.svg b/apps/www/public/images/icons/brand/storage-green.svg deleted file mode 100644 index 55b6ca6367f..00000000000 --- a/apps/www/public/images/icons/brand/storage-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg deleted file mode 100644 index 4eaf7940385..00000000000 --- a/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray.svg b/apps/www/public/images/icons/brand/support-add-ons-gray.svg deleted file mode 100644 index bd8647de63d..00000000000 --- a/apps/www/public/images/icons/brand/support-add-ons-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-add-ons-green.svg b/apps/www/public/images/icons/brand/support-add-ons-green.svg deleted file mode 100644 index 6ff5e144638..00000000000 --- a/apps/www/public/images/icons/brand/support-add-ons-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-gray-negative.svg b/apps/www/public/images/icons/brand/support-gray-negative.svg deleted file mode 100644 index c2f5ca07036..00000000000 --- a/apps/www/public/images/icons/brand/support-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-gray.svg b/apps/www/public/images/icons/brand/support-gray.svg deleted file mode 100644 index 7f0cddd1c45..00000000000 --- a/apps/www/public/images/icons/brand/support-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/support-green.svg b/apps/www/public/images/icons/brand/support-green.svg deleted file mode 100644 index 0e3034f495a..00000000000 --- a/apps/www/public/images/icons/brand/support-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/table-editor-gray-negative.svg b/apps/www/public/images/icons/brand/table-editor-gray-negative.svg deleted file mode 100644 index 53d8b392821..00000000000 --- a/apps/www/public/images/icons/brand/table-editor-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/table-editor-gray.svg b/apps/www/public/images/icons/brand/table-editor-gray.svg deleted file mode 100644 index 7c79f5d9512..00000000000 --- a/apps/www/public/images/icons/brand/table-editor-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/table-editor-green.svg b/apps/www/public/images/icons/brand/table-editor-green.svg deleted file mode 100644 index a100b64c80f..00000000000 --- a/apps/www/public/images/icons/brand/table-editor-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/tables-gray-negative.svg b/apps/www/public/images/icons/brand/tables-gray-negative.svg deleted file mode 100644 index 0156ae2f417..00000000000 --- a/apps/www/public/images/icons/brand/tables-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/tables-gray.svg b/apps/www/public/images/icons/brand/tables-gray.svg deleted file mode 100644 index 3f7f4a54554..00000000000 --- a/apps/www/public/images/icons/brand/tables-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/tables-green.svg b/apps/www/public/images/icons/brand/tables-green.svg deleted file mode 100644 index 509103462b1..00000000000 --- a/apps/www/public/images/icons/brand/tables-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/tutorials-gray-negative.svg b/apps/www/public/images/icons/brand/tutorials-gray-negative.svg deleted file mode 100644 index 08a86d1254d..00000000000 --- a/apps/www/public/images/icons/brand/tutorials-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/tutorials-gray.svg b/apps/www/public/images/icons/brand/tutorials-gray.svg deleted file mode 100644 index df4b35c7489..00000000000 --- a/apps/www/public/images/icons/brand/tutorials-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/tutorials-green.svg b/apps/www/public/images/icons/brand/tutorials-green.svg deleted file mode 100644 index a4787fd42a3..00000000000 --- a/apps/www/public/images/icons/brand/tutorials-green.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/wrappers-gray-negative.svg b/apps/www/public/images/icons/brand/wrappers-gray-negative.svg deleted file mode 100644 index b9825cc8b84..00000000000 --- a/apps/www/public/images/icons/brand/wrappers-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/wrappers-gray.svg b/apps/www/public/images/icons/brand/wrappers-gray.svg deleted file mode 100644 index 6b504f78bf5..00000000000 --- a/apps/www/public/images/icons/brand/wrappers-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/wrappers-green.svg b/apps/www/public/images/icons/brand/wrappers-green.svg deleted file mode 100644 index 970028b1b07..00000000000 --- a/apps/www/public/images/icons/brand/wrappers-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/pricing/addons-custom-domain-hero-light.svg b/apps/www/public/images/pricing/addons-custom-domain-hero-light.svg new file mode 100644 index 00000000000..0b6cd42fcad --- /dev/null +++ b/apps/www/public/images/pricing/addons-custom-domain-hero-light.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-custom-domain-hero.svg b/apps/www/public/images/pricing/addons-custom-domain-hero.svg new file mode 100644 index 00000000000..9522f483565 --- /dev/null +++ b/apps/www/public/images/pricing/addons-custom-domain-hero.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-pitr-light.svg b/apps/www/public/images/pricing/addons-pitr-light.svg new file mode 100644 index 00000000000..ec8f6511785 --- /dev/null +++ b/apps/www/public/images/pricing/addons-pitr-light.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-pitr.svg b/apps/www/public/images/pricing/addons-pitr.svg new file mode 100644 index 00000000000..9136cffa38d --- /dev/null +++ b/apps/www/public/images/pricing/addons-pitr.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-support-light.svg b/apps/www/public/images/pricing/addons-support-light.svg new file mode 100644 index 00000000000..040e497a537 --- /dev/null +++ b/apps/www/public/images/pricing/addons-support-light.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-support.svg b/apps/www/public/images/pricing/addons-support.svg new file mode 100644 index 00000000000..628bf43d9df --- /dev/null +++ b/apps/www/public/images/pricing/addons-support.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/pitr-upgrade-light.svg b/apps/www/public/images/pricing/pitr-upgrade-light.svg new file mode 100644 index 00000000000..57a36a937f1 --- /dev/null +++ b/apps/www/public/images/pricing/pitr-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/pitr-upgrade.svg b/apps/www/public/images/pricing/pitr-upgrade.svg new file mode 100644 index 00000000000..238a81aaf80 --- /dev/null +++ b/apps/www/public/images/pricing/pitr-upgrade.svg @@ -0,0 +1,7 @@ + + + + + + + From 13f8aa5458094bf16fb66044c53791b809f849a7 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Thu, 19 Jan 2023 16:38:47 -0330 Subject: [PATCH 005/120] Update --- .../Pricing/ComputePricingModal.tsx | 35 ++++-- .../components/Pricing/PricingTableRow.tsx | 17 ++- apps/www/data/Pricing.json | 110 ++++++++++++------ apps/www/data/PricingAddOnTable.json | 60 ++-------- apps/www/pages/pricing/index.tsx | 38 +++--- .../images/pricing/compute-upgrade-green.svg | 9 ++ apps/www/public/images/pricing/spend-cap.svg | 1 + 7 files changed, 141 insertions(+), 129 deletions(-) create mode 100644 apps/www/public/images/pricing/compute-upgrade-green.svg create mode 100644 apps/www/public/images/pricing/spend-cap.svg diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index b56881abb0c..d88a622361a 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -1,14 +1,15 @@ import React, { Fragment, useMemo } from 'react' - +import { useRouter } from 'next/router' +import { useTheme } from 'common/Providers' import { IconCheckCircle, IconXCircle, Modal } from 'ui' import pricingAddOn from '~/data/PricingAddOnTable.json' - interface Props { showComputeModal: boolean setShowComputeModal: React.Dispatch> } export default function ComputePricingModal({ showComputeModal, setShowComputeModal }: Props) { + const { basePath } = useRouter() const columnNames = useMemo( () => pricingAddOn.database.rows.map((row) => @@ -36,13 +37,25 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
-

Choose best compute setup for you

-

- Every project on the Supabase Platform comes with its own dedicated Postgres instance - running inside a virtual machine (VM). The following table describes the base instance - with additional compute add-ons available if you need extra performance when scaling - up Supabase. -

+
+
+
+ +
+
+
+

Choose best compute setup for you

+

+ Every project on the Supabase Platform comes with its own dedicated Postgres + instance running inside a virtual machine (VM). The following table describes the + base instance with additional compute add-ons available if you need extra + performance when scaling up Supabase. +

+
+
Pricing plan comparison
Feature by - Plans
- Free -
-
- Pro -
-
- Enterprise -
-
+

+ {tier.name} +

+
+
+

{tier.description}

+
+
- Pricing - -
- $0 -

/project/month

+ {tiers.map((tier) => ( +
+
+
+ {tier.priceMonthly && ( + <> + + ${tier.priceMonthly} + +

per project per month

+ + )} -

Perfect for hobby projects and experiments

+ {tier.warning && ( +

+ + {tier.warning} + +

+ )} - - - - - -
-
-
- $25 -

/project/month + usage costs

- -

- Everything you need to scale your project into production -

- - - - - - -
-
-
- Contact Us -

for a quote

- -

- Designated support team, account manager and technical specialist -

- - - - - - -
-
@@ -57,7 +70,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo {pricingAddOn.database.rows.map((row, i) => ( - <> + {i === 0 && ( ))} - + ))}
@@ -86,7 +99,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index f546208082e..b8b5a314358 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -1,6 +1,6 @@ import { IconHelpCircle, IconInfo, IconX, IconXCircle, Modal } from 'ui' import ProductIcon from 'components/ProductIcon' -import React, { useState } from 'react' +import React, { Fragment, useState } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( @@ -70,17 +70,17 @@ export const PricingTableRowDesktop = (props: any) => { {category.features.map((feat: any, i: number) => { return ( - <> + {feat.title} - {feat.tooltip && !feat.tooltipPosition && ( + {feat.tooltips?.main && ( @@ -107,15 +107,14 @@ export const PricingTableRowDesktop = (props: any) => {
) : ( - {feat.tooltip && feat.tooltipPosition === tierName && ( + {feat.tooltips?.[tierName] && ( - + )} - {tierValue} )} @@ -126,7 +125,7 @@ export const PricingTableRowDesktop = (props: any) => { {i === category.features.length - 1 && (
)} - + ) })} diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 860d7421130..4607d7c5dd6 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -5,7 +5,9 @@ "features": [ { "title": "Dedicated Postgres Database", - "tooltip": "A Postgres database with no restrictions? You get it. No pseudo limited users, you are the postgres root user. No caveats.", + "tooltips": { + "main": "A Postgres database with no restrictions? You get it. No pseudo limited users, you are the postgres root user. No caveats." + }, "tiers": { "free": true, "pro": true, @@ -24,20 +26,25 @@ }, { "title": "Database space", + "tooltips": { + "pro": "8 GB included, then $0.125 per GB" + }, "tiers": { - "free": "Up to 500 MB", - "pro": "8 GB included, then $0.125 per GB", + "free": "500 MB", + "pro": "8 GB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Automatic backups", - "tooltip": "Backups are entire copies of your database that can be restored in the future.", - "tooltipPosition": "pro", + "tooltips": { + "main": "Backups are entire copies of your database that can be restored in the future.", + "pro": "7 days of backup (if > 1TB, contact for Enterprise pricing)" + }, "tiers": { "free": false, - "pro": "7 days of backup* (* if > 1TB, contact enterprise)", + "pro": "7 days", "team": "text", "enterprise": "Custom" } @@ -53,9 +60,11 @@ }, { "title": "Pausing", - "tooltip": "Projects that have no activity or API requests will be paused. They can be reactivated via the dashboard", + "tooltips": { + "main": "Projects that have no activity or API requests will be paused. They can be reactivated via the dashboard" + }, "tiers": { - "free": "Paused after 1 week inactivity", + "free": "After 1 inactive week", "pro": "Never", "team": "text", "enterprise": "Never" @@ -63,10 +72,13 @@ }, { "title": "Database egress", - "tooltip": "Good news, only download operations are counted towards the limit", + "tooltips": { + "main": "Good news, only download operations are counted towards the limit", + "pro": "50GB included per month, then $0.09 per GB" + }, "tiers": { - "free": "Up to 2GB", - "pro": "50GB included per month, then $0.09 per GB", + "free": "2GB", + "pro": "50GB", "team": "text", "enterprise": "Unlimited" } @@ -79,7 +91,7 @@ "features": [ { "title": "Total Users", - "tooltip": "The maximum number of users your project can have", + "tooltips": { "main": "The maximum number of users your project can have" }, "tiers": { "free": "Unlimited", "pro": "Unlimited", @@ -89,10 +101,13 @@ }, { "title": "MAUs", - "tooltip": "Monthly Active Users; a user that has made an API request in the last month.", + "tooltips": { + "main": "Monthly Active Users; a user that has made an API request in the last month.", + "pro": "100,000 included, then $0.00325 per MAU" + }, "tiers": { - "free": "Up to 50,000 MAUs", - "pro": "100,000 included, then $0.00325 per MAU", + "free": "50,000", + "pro": "100,000", "team": "text", "enterprise": "Unlimited" } @@ -153,7 +168,7 @@ }, { "title": "Supabase Auth emails", - "tooltip": "Rate limits do not apply to Custom SMTP", + "tooltips": { "main": "Rate limits do not apply to Custom SMTP" }, "tiers": { "free": "30 / hour", "pro": "100 / hour", @@ -175,22 +190,27 @@ "storage": { "title": "Storage", "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4", + "features": [ { "title": "Storage", + "tooltips": { "pro": "100 GB included, then $0.021 per GB" }, "tiers": { - "free": "Up to 1 GB", - "pro": "100 GB included, then $0.021 per GB", + "free": "1 GB", + "pro": "100 GB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Storage egress", - "tooltip": "Good news, only download operations are counted towards the limit", + "tooltips": { + "main": "Good news, only download operations are counted towards the limit", + "pro": "200 GB included, then $0.09 per GB" + }, "tiers": { - "free": "Up to 2 GB", - "pro": "200 GB included, then $0.09 per GB", + "free": "2 GB", + "pro": "200 GB", "team": "text", "enterprise": "Unlimited" } @@ -205,19 +225,20 @@ }, { "title": "Max file upload size", - "tooltip": "You can change the upload size in the dashboard", + "tooltips": { "main": "You can change the upload size in the dashboard" }, "tiers": { - "free": "Up to 50MB", - "pro": "Up to 5GB", + "free": "50MB", + "pro": "5GB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Asset transformations", + "tooltips": { "pro": "5$ per 1000 origin images after the first 100" }, "tiers": { "free": false, - "pro": "Unlimited transformations for 100 origin images, then 5$ per 1000 origin images", + "pro": "Unlimited for 100 origin images", "team": "text", "enterprise": "Unlimited" } @@ -230,9 +251,12 @@ "features": [ { "title": "Invocations", + "tooltips": { + "pro": "2 Million per month, then $2 per 1 million invocations" + }, "tiers": { - "free": "500K per month", - "pro": "2 Million per month, then $2 per 1 million invocations", + "free": "500K/month", + "pro": "2 Million/month", "team": "text", "enterprise": "Unlimited" } @@ -240,17 +264,20 @@ { "title": "Script size", "tiers": { - "free": "2 mb", - "pro": "10 mb", + "free": "2 MB", + "pro": "10 MB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Number of functions", + "tooltips": { + "pro": "100, then $10 per additional 100 functions" + }, "tiers": { "free": "10", - "pro": "100, then $10 per additional 100 functions", + "pro": "100", "team": "text", "enterprise": "Unlimited" } @@ -272,17 +299,23 @@ }, { "title": "Concurrent Peak Connections", + "tooltips": { + "pro": "Up to 500, then $10 per 1000" + }, "tiers": { - "free": "Up to 200", - "pro": "Up to 500, then $10 per 1000", + "free": "200", + "pro": "500", "team": "text", "enterprise": "Unlimited concurrent connections and volume discount" } }, { "title": "Max Messages Per Month", + "tooltips": { + "free": "2 Million (including database)" + }, "tiers": { - "free": "2 Million (including database)", + "free": "2 Million", "pro": "5 Million", "team": "text", "enterprise": "Volume discounts on messages" @@ -291,8 +324,8 @@ { "title": "Max Message Size", "tiers": { - "free": "250 Kb", - "pro": "3 Mb", + "free": "250 KB", + "pro": "3 MB", "team": "text", "enterprise": "Custom" } @@ -419,12 +452,15 @@ }, { "title": "Custom Domains", - "tooltip": "Contact us to access this feature", + "tooltips": { + "main": "Contact us to access this feature", + "enterprise": "Volume discounts available." + }, "tiers": { "free": false, "pro": "$10 per domain per month per project add on", "team": "text", - "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available." + "enterprise": "1 included, additional $10/domain/month" } } ] diff --git a/apps/www/data/PricingAddOnTable.json b/apps/www/data/PricingAddOnTable.json index e20da275960..031f8ecbe74 100644 --- a/apps/www/data/PricingAddOnTable.json +++ b/apps/www/data/PricingAddOnTable.json @@ -16,11 +16,7 @@ { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "1 GB" }, { "key": "maxDiskIO", "title": "Disk IO Bandwidth up to", "value": "2,606 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "87 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct", @@ -41,11 +37,7 @@ { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "2 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "174 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -66,11 +58,7 @@ { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "4 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "347 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -91,11 +79,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "8 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "630 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -116,11 +100,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "16 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "1,188 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -141,11 +121,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "32 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "2,375 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -166,11 +142,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "64 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "4,750 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -191,11 +163,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "128 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "9,500 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -220,11 +188,7 @@ "title": "Maximum Disk IO Bandwidth", "value": "14,250 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "14,250 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -249,11 +213,7 @@ "title": "Maximum Disk IO Bandwidth", "value": "19,000 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "19,000 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 89c21f0ffec..67aa7f80c60 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -145,18 +145,6 @@ export default function IndexPage() { rightCtaText: 'See Pricing breakdown', rightCtaLink: '#open-modal', }, - { - name: 'Dedicated Support', - heroImg: 'addons-support', - icon: 'support-upgrade', - price: 'Starts from $5', - description: - 'Your own team who can help you with your account and any technical issues you might come across.', - leftCtaText: 'Documentation', - leftCtaLink: 'http://.....', - rightCtaText: 'Contact Sales', - rightCtaLink: 'http://', - }, { name: 'Custom Domain', heroImg: 'addons-custom-domain-hero', @@ -263,6 +251,7 @@ export default function IndexPage() {
{tiers.map((tier) => (
-
+
{addons.map((addon) => ( -
+
-
+
Available for Pro plan

Flexible Spend Cap

-

+

Ensure you have the flexibility to scale your business without the restrictions of Pro usage limits. Turn off the usage cap to let your project scale and only pay for what - you use.{' '} + you use.

-
right
+
+ +
-
+ {/*
} pricing={pricingAddOn.database} @@ -475,7 +467,7 @@ export default function IndexPage() { icon={} pricing={pricingAddOn.support} /> -
+
*/}
@@ -660,8 +652,9 @@ export default function IndexPage() { {tiers.map((tier) => (

{tier.name} @@ -684,6 +677,7 @@ export default function IndexPage() {

{tier.description}

{tiers.map((tier) => ( - +
{tier.priceMonthly && ( diff --git a/apps/www/public/images/pricing/compute-upgrade-green.svg b/apps/www/public/images/pricing/compute-upgrade-green.svg new file mode 100644 index 00000000000..4f3520fd0d5 --- /dev/null +++ b/apps/www/public/images/pricing/compute-upgrade-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/spend-cap.svg b/apps/www/public/images/pricing/spend-cap.svg new file mode 100644 index 00000000000..7078422fb38 --- /dev/null +++ b/apps/www/public/images/pricing/spend-cap.svg @@ -0,0 +1 @@ + \ No newline at end of file From 04d215c10440bfc5b437d34b53f17f810dd480cb Mon Sep 17 00:00:00 2001 From: Rodrigo Mansueli Nunes Date: Thu, 19 Jan 2023 17:35:03 -0300 Subject: [PATCH 006/120] update confirmation template to use GoTrue's template --- studio/pages/api/auth/[ref]/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studio/pages/api/auth/[ref]/config.ts b/studio/pages/api/auth/[ref]/config.ts index d7f62b2de4d..9db70f40ed4 100644 --- a/studio/pages/api/auth/[ref]/config.ts +++ b/studio/pages/api/auth/[ref]/config.ts @@ -114,7 +114,7 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { '

You have been invited

\n\n

You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite:

\n

Accept the invite

', MAILER_TEMPLATES_CONFIRMATION: null, MAILER_TEMPLATES_CONFIRMATION_CONTENT: - '

Confirm your signup

\n\n

Follow this link to confirm your user:

\n

Confirm your mail

', + '

Confirm your email

\n\n

Follow this link to confirm your email:

\n\n

Confirm your email address

\n\n

Alternatively, enter the code: {{ .Token }}

', MAILER_TEMPLATES_RECOVERY: null, MAILER_TEMPLATES_RECOVERY_CONTENT: '

Reset Password

\n\n

Follow this link to reset the password for your user:

\n

Reset Password

', From 55ad72b710c2e367a5cf6dcb1c727eaf63df572a Mon Sep 17 00:00:00 2001 From: Rodrigo Mansueli Nunes Date: Fri, 20 Jan 2023 09:29:07 -0300 Subject: [PATCH 007/120] Removed the token part as suggested. --- studio/pages/api/auth/[ref]/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studio/pages/api/auth/[ref]/config.ts b/studio/pages/api/auth/[ref]/config.ts index 9db70f40ed4..66545dba0ae 100644 --- a/studio/pages/api/auth/[ref]/config.ts +++ b/studio/pages/api/auth/[ref]/config.ts @@ -114,7 +114,7 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { '

You have been invited

\n\n

You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite:

\n

Accept the invite

', MAILER_TEMPLATES_CONFIRMATION: null, MAILER_TEMPLATES_CONFIRMATION_CONTENT: - '

Confirm your email

\n\n

Follow this link to confirm your email:

\n\n

Confirm your email address

\n\n

Alternatively, enter the code: {{ .Token }}

', + '

Confirm your email

\n\n

Follow this link to confirm your email:

\n\n

Confirm your email address

', MAILER_TEMPLATES_RECOVERY: null, MAILER_TEMPLATES_RECOVERY_CONTENT: '

Reset Password

\n\n

Follow this link to reset the password for your user:

\n

Reset Password

', From 53ca3988e57a1c5dfc5ffc73232bb84ff5442311 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Fri, 20 Jan 2023 15:18:20 -0330 Subject: [PATCH 008/120] Update --- .../Pricing/ComputePricingModal.tsx | 5 +- .../components/Pricing/PricingTableRow.tsx | 12 +- apps/www/components/ProductIcon.tsx | 7 +- apps/www/data/Pricing.json | 94 +++--- apps/www/pages/pricing/index.tsx | 152 +++++----- .../images/pricing/compute-upgrade-green.svg | 14 +- .../public/images/pricing/spend-cap-light.svg | 271 ++++++++++++++++++ apps/www/styles/index.css | 2 +- 8 files changed, 416 insertions(+), 141 deletions(-) create mode 100644 apps/www/public/images/pricing/spend-cap-light.svg diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index d88a622361a..2c497a334b2 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -10,6 +10,7 @@ interface Props { export default function ComputePricingModal({ showComputeModal, setShowComputeModal }: Props) { const { basePath } = useRouter() + const { isDarkMode } = useTheme() const columnNames = useMemo( () => pricingAddOn.database.rows.map((row) => @@ -42,7 +43,9 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index b8b5a314358..925bd2c9454 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -5,7 +5,7 @@ import ReactTooltip from 'react-tooltip' export const Check = () => ( { style={{ borderTop: 'none' }} >
@@ -62,10 +62,10 @@ export const PricingTableRowDesktop = (props: any) => {

{category.title}

- - - - + + + + {category.features.map((feat: any, i: number) => { diff --git a/apps/www/components/ProductIcon.tsx b/apps/www/components/ProductIcon.tsx index fa2240071a4..894c7ea5117 100644 --- a/apps/www/components/ProductIcon.tsx +++ b/apps/www/components/ProductIcon.tsx @@ -9,11 +9,14 @@ function ProductIcon({ icon, color }: ProductIcon) { className={[ 'inline-flex h-8 w-8 items-center justify-center rounded-md', !color || color === 'black' ? 'bg-scale-1200 text-scale-100' : '', - color && color === 'green' ? 'bg-brand-800 text-brand-100' : '', + color && color === 'green' ? 'bg-brand-800 dark:bg-brand-600 text-brand-100' : '', ].join(' ')} > { return (
-

{tier}

+

+ {tier} +

{from && From} - - {showDollarSign && '$'} - {price} - + {showDollarSign ? ( + ${price} + ) : ( + {price} + )} +

{priceDescription}

{description}

@@ -248,12 +252,14 @@ export default function IndexPage() { lg:px-8 " > -
+
{tiers.map((tier) => (
{tier.name === 'Pro' && ( @@ -279,20 +285,22 @@ export default function IndexPage() { )}
-

{tier.description}

-
+ {tier.description} +

+ + {tier.name !== 'Enterprise' && ( +
- {tier.priceMonthly !== undefined ? ( + >
@@ -300,8 +308,7 @@ export default function IndexPage() { {tier.priceLabel}

- {typeof tier.priceMonthly !== 'string' && '$'} - {tier.priceMonthly} + ${tier.priceMonthly}

{tier.costUnit && (

{tier.costUnit}

@@ -315,31 +322,21 @@ export default function IndexPage() {
- ) : ( - Contact Us - )} -
+
+ )}
{tier.preface && ( -

{tier.preface}

+

{tier.preface}

)} {/*

Included with plan:

*/}
    {tier.features.map((feature) => (
  • @@ -388,7 +385,7 @@ export default function IndexPage() {

-
+
{addons.map((addon) => (
@@ -399,7 +396,7 @@ export default function IndexPage() { }.svg`} />
-
+

{addon.price}

{addon.description}

- -
+
Available for Pro plan -

Flexible Spend Cap

+

Cost control with spend caps

- Ensure you have the flexibility to scale your business without the restrictions of Pro - usage limits. Turn off the usage cap to let your project scale and only pay for what - you use. + The Pro tier has a usage quota included and a spend cap turned on by default. If you + need to go beyond the inclusive limits, simply switch off your spend cap to pay for + additional usage.

- +
@@ -637,10 +637,10 @@ export default function IndexPage() {
- + {tiers.map((tier) => (
Pricing plan comparison
Feature by @@ -652,7 +652,7 @@ export default function IndexPage() { {tiers.map((tier) => ( @@ -669,13 +669,13 @@ export default function IndexPage() {
@@ -698,7 +698,7 @@ export default function IndexPage() {
- {tier.priceMonthly && ( + {tier.name !== 'Enterprise' && ( <> ${tier.priceMonthly} diff --git a/apps/www/public/images/pricing/compute-upgrade-green.svg b/apps/www/public/images/pricing/compute-upgrade-green.svg index 4f3520fd0d5..e8b6258fb32 100644 --- a/apps/www/public/images/pricing/compute-upgrade-green.svg +++ b/apps/www/public/images/pricing/compute-upgrade-green.svg @@ -1,9 +1,7 @@ - - - - - - - - + + + + + + diff --git a/apps/www/public/images/pricing/spend-cap-light.svg b/apps/www/public/images/pricing/spend-cap-light.svg new file mode 100644 index 00000000000..dd604f1e5ce --- /dev/null +++ b/apps/www/public/images/pricing/spend-cap-light.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 585cc7cfb1e..c76b18851d6 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -674,7 +674,7 @@ launch week } .gradient-text-scale-100 { - background-image: -webkit-linear-gradient(45deg, #fff 0%, var(--colors-green4) 100%); + background-image: -webkit-linear-gradient(45deg, #fff 0%, var(--colors-green12) 100%); } .gradient-text-scale-500 { From 65b78c164e2f844cbdba79899258f5892b70f65e Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Fri, 20 Jan 2023 15:46:19 -0330 Subject: [PATCH 009/120] Update mobile header --- apps/www/pages/pricing/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index b52dfe77ffc..c103257e777 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -536,7 +536,7 @@ export default function IndexPage() { {/* Pro - Mobile */} Date: Fri, 20 Jan 2023 15:51:28 -0330 Subject: [PATCH 010/120] Update pricing.json --- apps/www/data/Pricing.json | 52 +++----------------------------------- 1 file changed, 4 insertions(+), 48 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 24d2e3e51da..3de5edaa2d8 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -11,7 +11,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -20,7 +19,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -32,7 +30,6 @@ "tiers": { "free": "500 MB", "pro": "8 GB", - "enterprise": "Unlimited" } }, @@ -45,16 +42,17 @@ "tiers": { "free": false, "pro": "7 days", - "enterprise": "Custom" } }, { "title": "Point in time recovery", + "tooltips": { + "main": "PITR cannot be applied retroactively, projects can only be rolled back to the point from which PITR has been applied." + }, "tiers": { "free": false, - "pro": false, - + "pro": "$100 per 7 day rollback period (if > 28 days, contact enterprise)", "enterprise": true } }, @@ -66,7 +64,6 @@ "tiers": { "free": "After 1 inactive week", "pro": "Never", - "enterprise": "Never" } }, @@ -79,7 +76,6 @@ "tiers": { "free": "2GB", "pro": "50GB", - "enterprise": "Unlimited" } } @@ -95,7 +91,6 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", - "enterprise": "Unlimited" } }, @@ -108,7 +103,6 @@ "tiers": { "free": "50,000", "pro": "100,000", - "enterprise": "Unlimited" } }, @@ -117,7 +111,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -126,7 +119,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -135,7 +127,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -144,7 +135,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -153,7 +143,6 @@ "tiers": { "free": "1 hour", "pro": "7 days", - "enterprise": true } }, @@ -162,7 +151,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -172,7 +160,6 @@ "tiers": { "free": "30 / hour", "pro": "100 / hour", - "enterprise": "Contact Us" } }, @@ -181,7 +168,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Contact Us" } } @@ -198,7 +184,6 @@ "tiers": { "free": "1 GB", "pro": "100 GB", - "enterprise": "Unlimited" } }, @@ -211,7 +196,6 @@ "tiers": { "free": "2 GB", "pro": "200 GB", - "enterprise": "Unlimited" } }, @@ -229,7 +213,6 @@ "tiers": { "free": "50MB", "pro": "5GB", - "enterprise": "Unlimited" } }, @@ -239,7 +222,6 @@ "tiers": { "free": false, "pro": "Unlimited for 100 origin images", - "enterprise": "Unlimited" } } @@ -257,7 +239,6 @@ "tiers": { "free": "500K/month", "pro": "2 Million/month", - "enterprise": "Unlimited" } }, @@ -266,7 +247,6 @@ "tiers": { "free": "2 MB", "pro": "10 MB", - "enterprise": "Unlimited" } }, @@ -278,7 +258,6 @@ "tiers": { "free": "10", "pro": "100", - "enterprise": "Unlimited" } } @@ -293,7 +272,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -305,7 +283,6 @@ "tiers": { "free": "200", "pro": "500", - "enterprise": "Unlimited concurrent connections and volume discount" } }, @@ -317,7 +294,6 @@ "tiers": { "free": "2 Million", "pro": "5 Million", - "enterprise": "Volume discounts on messages" } }, @@ -326,7 +302,6 @@ "tiers": { "free": "250 KB", "pro": "3 MB", - "enterprise": "Custom" } } @@ -341,7 +316,6 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", - "enterprise": "Unlimited" } }, @@ -350,7 +324,6 @@ "tiers": { "free": "Coming soon", "pro": "Coming soon", - "enterprise": true } }, @@ -359,7 +332,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } } @@ -374,7 +346,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -383,7 +354,6 @@ "tiers": { "free": "1 day", "pro": "7 days", - "enterprise": "90 days" } }, @@ -392,7 +362,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Coming soon" } }, @@ -401,7 +370,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -410,7 +378,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -419,7 +386,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Contact Us" } }, @@ -428,7 +394,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -437,7 +402,6 @@ "tiers": { "free": "Owner, Developer", "pro": "Owner, Developer", - "enterprise": "Additional owner(s), admin, read-only, billing admin, custom" } }, @@ -446,7 +410,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -459,7 +422,6 @@ "tiers": { "free": false, "pro": "$10 per domain per month per project add on", - "enterprise": "1 included, additional $10/domain/month" } } @@ -474,7 +436,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -483,7 +444,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -492,7 +452,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -501,7 +460,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -518,7 +476,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -527,7 +484,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } } From c2637879a00cdb4be78d332eded2a14c493ef47e Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 23 Jan 2023 11:36:36 -0330 Subject: [PATCH 011/120] Updates --- .../Pricing/ComputePricingModal.tsx | 2 +- .../components/Pricing/PricingTableRow.tsx | 2 +- apps/www/pages/pricing/index.tsx | 38 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index 2c497a334b2..18605613266 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -39,7 +39,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
-
+
( { return (
-

+

{tier}

@@ -228,7 +228,7 @@ export default function IndexPage() { }} /> -
+
@@ -258,7 +258,7 @@ export default function IndexPage() { key={`row-${tier.name}`} className={[ tier.name === 'Pro' - ? 'bg-brand-800 dark:bg-brand-900 border px-0.5 -mt-8 rounded-xl' + ? 'bg-brand-1100 dark:bg-brand-900 border px-0.5 -mt-8 rounded-xl' : '', ].join(' ')} > @@ -269,13 +269,16 @@ export default function IndexPage() { key={tier.name} className={[ 'flex flex-col overflow-hidden rounded-xl', - tier.name === 'Pro' ? '' : 'border h-full', + tier.name === 'Pro' ? '' : 'border h-full rounded-xl', ].join(' ')} >
-

+

{tier.name}

{tier.nameBadge && ( @@ -326,18 +329,17 @@ export default function IndexPage() { )}
{tier.preface && (

{tier.preface}

)} {/*

Included with plan:

*/} -
-
+

Easily customizable add-Ons

From acf7e288ef6fd19c30c5bd9e61492adf5225ec32 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 24 Jan 2023 12:00:48 -0330 Subject: [PATCH 018/120] Svg fix --- apps/www/components/Pricing/PricingTableRow.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index 0ef11772df2..90e8979b897 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -7,9 +7,9 @@ export const Check = () => ( ) @@ -32,9 +32,9 @@ const Minus = (props: any) => ( > Not included in {props.tier} @@ -52,9 +52,9 @@ const InfoIcon = () => ( > Info From 258b8380e40478dcbe5c79891268118b44fd7a2c Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 24 Jan 2023 12:56:55 -0330 Subject: [PATCH 019/120] update --- apps/www/components/Pricing/PricingTableRow.tsx | 2 +- apps/www/pages/pricing/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index 90e8979b897..799d9113597 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -71,7 +71,7 @@ export const PricingTableRowDesktop = (props: any) => { style={{ borderTop: 'none' }} >
diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index dba00ba6ba3..65845d775a0 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -453,7 +453,7 @@ export default function IndexPage() { Available for Pro plan

Cost control with spend caps

-

+

The Pro tier has a usage quota included and a spend cap turned on by default. If you need to go beyond the inclusive limits, simply switch off your spend cap to pay for additional usage. @@ -711,7 +711,7 @@ export default function IndexPage() { {tier.warning && (

- + {tier.warning}

From 4f6f4469c039e9d362e6609c3edd5f780ed6031b Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 24 Jan 2023 13:11:23 -0330 Subject: [PATCH 020/120] Style updates --- apps/www/pages/pricing/index.tsx | 2 +- apps/www/styles/index.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 65845d775a0..4984c6df414 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -258,7 +258,7 @@ export default function IndexPage() { key={`row-${tier.name}`} className={[ tier.name === 'Pro' - ? 'bg-brand-1100 dark:bg-brand-900 border px-0.5 -mt-8 rounded-xl' + ? 'bg-brand-1100 dark:bg-brand-900 border px-0.5 -mt-8 rounded-[14px]' : '', ].join(' ')} > diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index c76b18851d6..ebebd43fc00 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -665,6 +665,13 @@ launch week background-clip: text; -webkit-text-fill-color: transparent; } + +[class*='gradient-text-']::selection { + background-color: var(--colors-brand9); + background-clip: unset; + -webkit-text-fill-color: white; +} + @layer utilities { .gradient-text-brand-100 { background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); From 02fb0cdc356010634ad17ad0a6505334cc0a85d4 Mon Sep 17 00:00:00 2001 From: Ollie Halliday <22655069+Hallidayo@users.noreply.github.com> Date: Thu, 26 Jan 2023 13:57:19 +0000 Subject: [PATCH 021/120] removed md gap --- packages/ui/src/lib/theme/defaultTheme.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/lib/theme/defaultTheme.ts b/packages/ui/src/lib/theme/defaultTheme.ts index 1265d536a10..8cf91b927ff 100644 --- a/packages/ui/src/lib/theme/defaultTheme.ts +++ b/packages/ui/src/lib/theme/defaultTheme.ts @@ -1112,7 +1112,7 @@ export default { }, }, - responsive: 'md:grid md:grid-cols-12 md:gap-x-4', + responsive: 'md:grid md:grid-cols-12', non_responsive: 'grid grid-cols-12 gap-2', labels_horizontal_layout: 'flex flex-row space-x-2 justify-between col-span-12', From 552bde0302ff5e8be175d260b4ef3e1ca74b86b2 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 30 Jan 2023 13:48:33 -0330 Subject: [PATCH 022/120] Add mobile plan switcher --- apps/www/pages/pricing/index.tsx | 327 +++++++++++---------- packages/ui/src/lib/theme/defaultTheme.ts | 328 +++++++++++----------- 2 files changed, 341 insertions(+), 314 deletions(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 4984c6df414..936a73aacbc 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -1,5 +1,5 @@ import { ServerIcon, SupportIcon } from '@heroicons/react/outline' -import { Accordion, Button, IconCheck } from 'ui' +import { Accordion, Button, IconCheck, Select } from 'ui' import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' import Link from 'next/link' @@ -21,6 +21,7 @@ export default function IndexPage() { const { basePath } = useRouter() const { isDarkMode } = useTheme() const [showComputeModal, setShowComputeModal] = useState(false) + const [activeMobileTier, setActiveMobileTier] = useState('Free') const meta_title = 'Pricing & fees | Supabase' const meta_description = @@ -170,7 +171,7 @@ export default function IndexPage() { }, ] - const MobileHeaders = ({ + const MobileHeader = ({ // title, description, priceDescription, @@ -187,7 +188,7 @@ export default function IndexPage() { from?: boolean }) => { return ( -
+

{tier}

@@ -391,7 +392,7 @@ export default function IndexPage() {

Easily customizable add-Ons

-

+

Level up your Supabase experience with add-ons.

@@ -476,7 +477,7 @@ export default function IndexPage() {

Compare Plans

-

+

Start with a hobby project, collaborate with a team, and scale to millions of users.

@@ -486,153 +487,179 @@ export default function IndexPage() {
{/* Free - Mobile */} +
+
+ + +
+
+ {activeMobileTier === 'Free' && ( + <> + + + + + + + + + + + )} - + {activeMobileTier === 'Pro' && ( + <> + + + + + + + + + + + )} - - - - - - - - - - {/* Pro - Mobile */} - - - - - - - - - - - {/* Enterprise - Mobile */} - - - - - - - - - - + {activeMobileTier === 'Enterprise' && ( + <> + + + + + + + + + + + )}
{/* */} diff --git a/packages/ui/src/lib/theme/defaultTheme.ts b/packages/ui/src/lib/theme/defaultTheme.ts index 1265d536a10..cbab5e23dbd 100644 --- a/packages/ui/src/lib/theme/defaultTheme.ts +++ b/packages/ui/src/lib/theme/defaultTheme.ts @@ -117,9 +117,9 @@ export default { flex flex-row gap-3 items-center - w-full - text-left - cursor-pointer + w-full + text-left + cursor-pointer outline-none focus-visible:ring-1 @@ -143,27 +143,27 @@ export default { group border border-scale-700 - + first:rounded-tl-md first:rounded-tr-md last:rounded-bl-md last:rounded-br-md `, trigger: ` flex flex-row items-center - px-6 py-4 - w-full - text-left - cursor-pointer - - font-medium - text-base - bg-transparent + px-6 py-4 + w-full + text-left + cursor-pointer + + font-medium + text-base + bg-transparent outline-none focus-visible:ring-1 focus-visible:z-50 ring-scale-1100 - + transition-colors hover:bg-scale-200 @@ -252,8 +252,8 @@ export default { alert: { base: ` - relative rounded border py-4 px-6 - flex space-x-4 items-start + relative rounded border py-4 px-6 + flex space-x-4 items-start `, header: 'block text-sm font-normal mb-1', description: `text-xs`, @@ -290,11 +290,11 @@ export default { }, }, close: ` - absolute - right-6 top-4 - p-0 m-0 + absolute + right-6 top-4 + p-0 m-0 text-scale-900 - cursor-pointer transition ease-in-out + cursor-pointer transition ease-in-out bg-transparent border-transparent focus:outline-none opacity-50 hover:opacity-100`, }, @@ -306,15 +306,15 @@ export default { card: { base: ` bg-white dark:bg-scaleDark-700 - - border - ${defaults.border.primary} - flex flex-col + border + ${defaults.border.primary} + + flex flex-col rounded-md shadow-lg overflow-hidden relative `, hoverable: 'transition hover:-translate-y-1 hover:shadow-2xl', - head: `px-8 py-6 flex justify-between + head: `px-8 py-6 flex justify-between border-b ${defaults.border.primary} `, content: 'p-8', @@ -328,20 +328,20 @@ export default { base: `w-full justify-between space-y-4`, underlined: { list: ` - flex items-center border-b + flex items-center border-b ${defaults.border.secondary} `, - base: ` - relative - cursor-pointer - text-scale-900 - flex - items-center + base: ` + relative + cursor-pointer + text-scale-900 + flex + items-center space-x-2 - text-center + text-center transition - focus:outline-none - focus-visible:ring + focus:outline-none + focus-visible:ring focus-visible:ring-scale-700 focus-visible:border-scale-900 `, @@ -355,18 +355,18 @@ export default { }, pills: { list: 'flex space-x-1', - base: ` - relative - cursor-pointer - flex - items-center + base: ` + relative + cursor-pointer + flex + items-center space-x-2 - text-center + text-center transition shadow-sm rounded - focus:outline-none - focus-visible:ring + focus:outline-none + focus-visible:ring focus-visible:ring-scale-700 focus-visible:border-scale-900 `, @@ -378,23 +378,23 @@ export default { active: ` bg-scale-1200 text-scale-200 - border-scale-1200 + border-scale-1200 `, }, 'rounded-pills': { list: 'flex flex-wrap gap-2', - base: ` - relative - cursor-pointer - flex - items-center + base: ` + relative + cursor-pointer + flex + items-center space-x-2 - text-center + text-center transition shadow-sm rounded-full - focus:outline-none - focus-visible:ring + focus:outline-none + focus-visible:ring focus-visible:ring-scale-700 focus-visible:border-scale-900 `, @@ -406,7 +406,7 @@ export default { active: ` bg-scale-1200 text-scale-200 - border-scale-1200 + border-scale-1200 `, }, block: 'w-full flex items-center justify-center', @@ -427,15 +427,15 @@ export default { button: { base: ` - relative - cursor-pointer - inline-flex items-center space-x-2 - text-center + relative + cursor-pointer + inline-flex items-center space-x-2 + text-center font-regular - transition ease-out duration-200 - rounded + transition ease-out duration-200 + rounded ${defaults['focus-visible']} - + `, label: `truncate`, container: 'inline-flex font-medium', @@ -449,7 +449,7 @@ export default { secondary: ` bg-scale-1200 text-scale-100 hover:text-scale-800 - focus-visible:text-scale-600 + focus-visible:text-scale-600 bordershadow-scale-1100 hover:bordershadow-scale-900 @@ -462,7 +462,7 @@ export default { dark:bordershadow-scale-700 hover:dark:bordershadow-scale-800 dark:bg-scale-500 dark:hover:bg-scale-600 focus-visible:outline-brand-600 - + `, alternative: ` text-brand-1100 @@ -473,14 +473,14 @@ export default { focus-visible:outline-brand-600 `, outline: ` - text-scale-1200 - bg-transparent + text-scale-1200 + bg-transparent bordershadow-scale-600 hover:bordershadow-scale-700 dark:bordershadow-scale-800 hover:dark:bordershadow-scale-900 focus-visible:outline-scale-700 `, dashed: ` - text-scale-1200 + text-scale-1200 border border-dashed border-scale-700 hover:border-scale-900 @@ -498,7 +498,7 @@ export default { focus-visible:outline-scale-700 `, text: ` - text-scale-1200 + text-scale-1200 hover:bg-scale-500 shadow-none focus-visible:outline-scale-700 @@ -538,13 +538,13 @@ export default { input: { base: ` - block - box-border - w-full - rounded-md - shadow-sm + block + box-border + w-full + rounded-md + shadow-sm transition-all - text-scale-1200 + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -559,7 +559,7 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, @@ -581,13 +581,13 @@ export default { select: { base: ` - block - box-border - w-full - rounded-md - shadow-sm + block + box-border + w-full + rounded-md + shadow-sm transition-all - text-scale-1200 + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -605,7 +605,7 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, @@ -618,7 +618,7 @@ export default { disabled: 'opacity-50', actions_container: 'absolute inset-y-0 right-0 pl-3 pr-1 mr-5 flex items-center', chevron_container: 'absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none', - chevron: 'h-5 w-5 text-scale-600', + chevron: 'h-5 w-5 text-scale-800', }, /* @@ -628,12 +628,12 @@ export default { inputNumber: { base: ` block - box-border - w-full - rounded-md - shadow-sm + box-border + w-full + rounded-md + shadow-sm transition-all - text-scale-1200 + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -651,7 +651,7 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, @@ -668,9 +668,9 @@ export default { /* * Checkbox * - * + * * This Checkbox requires a plugin in your config: - + ``` // tailwind.config.js module.exports = { @@ -681,17 +681,17 @@ export default { ], } ``` - * - * + * + * */ checkbox: { base: ` - bg-transparent + bg-transparent ${defaults.focus} focus:ring-scale-400 - text-brand-900 - border-scale-700 + text-brand-900 + border-scale-700 shadow-sm rounded cursor-pointer @@ -727,9 +727,9 @@ export default { /* * Radio * - * + * * This Radio requires a plugin in your config: - + ``` // tailwind.config.js module.exports = { @@ -740,8 +740,8 @@ export default { ], } ``` - * - * + * + * */ radio: { @@ -750,7 +750,7 @@ export default { ${defaults.focus} focus:ring-brand-400 border-scale-700 - + text-brand-900 shadow-sm cursor-pointer @@ -797,7 +797,7 @@ export default { `, active: ` bg-scale-300 dark:bg-scale-600 z-10 - border-scale-900 dark:border-scale-900 + border-scale-900 dark:border-scale-900 border-1 `, radio_offset: 'left-4', @@ -816,7 +816,7 @@ export default { transition rounded-md border - shadow-sm + shadow-sm `, size: { tiny: `px-5 py-3`, @@ -833,7 +833,7 @@ export default { `, active: ` bg-scale-300 dark:bg-scale-600 z-10 - border-scale-900 dark:border-scale-900 + border-scale-900 dark:border-scale-900 border-1 `, radio_offset: 'left-4', @@ -849,9 +849,9 @@ export default { }, group: `flex flex-row gap-3`, base: ` - transition + transition border - rounded-lg + rounded-lg grow items-center flex-wrap @@ -888,10 +888,10 @@ export default { }, group: `flex flex-row gap-3`, base: ` - transition - border border-scale-700 hover:border-scale-900 + transition + border border-scale-700 hover:border-scale-900 shadow-sm - rounded-lg + rounded-lg grow `, size: { @@ -909,7 +909,7 @@ export default { `, active: ` bg-scale-300 dark:bg-scale-600 z-10 - border-scale-900 dark:border-scale-900 + border-scale-900 dark:border-scale-900 border-1 `, radio_offset: 'left-4', @@ -969,21 +969,21 @@ export default { sidepanel: { base: ` bg-scale-100 dark:bg-scale-300 - flex flex-col - fixed - inset-y-0 - max-w-full + flex flex-col + fixed + inset-y-0 + max-w-full h-screen border-l border-overlay-border shadow-xl `, header: ` - space-y-1 py-4 px-4 bg-overlay-bg sm:px-6 + space-y-1 py-4 px-4 bg-overlay-bg sm:px-6 border-b border-overlay-border `, contents: ` - relative - flex-1 + relative + flex-1 overflow-y-auto `, content: ` @@ -1002,12 +1002,12 @@ export default { align: { left: ` left-0 - data-open:animate-panel-slide-left-out + data-open:animate-panel-slide-left-out data-closed:animate-panel-slide-left-in `, right: ` right-0 - data-open:animate-panel-slide-right-out + data-open:animate-panel-slide-right-out data-closed:animate-panel-slide-right-in `, }, @@ -1023,9 +1023,9 @@ export default { dark:bg-scale-100 h-full w-full left-0 - top-0 + top-0 opacity-75 - data-closed:animate-fade-out-overlay-bg + data-closed:animate-fade-out-overlay-bg data-open:animate-fade-in-overlay-bg `, // this is to reset the button @@ -1041,10 +1041,10 @@ export default { toggle: { base: ` - p-0 relative - inline-flex flex-shrink-0 - border-2 border-transparent - rounded-full + p-0 relative + inline-flex flex-shrink-0 + border-2 border-transparent + rounded-full cursor-pointer transition-colors ease-in-out duration-200 ${defaults.focus} @@ -1054,8 +1054,8 @@ export default { hover:bg-scale-700 `, active: ` - bg-brand-900 - hover:bg-brand-900 + bg-brand-900 + hover:bg-brand-900 `, handle_container: { tiny: 'h-4 w-7', @@ -1066,12 +1066,12 @@ export default { }, handle: { base: ` - inline-block h-5 w-5 - rounded-full + inline-block h-5 w-5 + rounded-full bg-scale-100 dark:bg-scale-900 - shadow ring-0 - transition + shadow ring-0 + transition ease-in-out duration-200 `, tiny: 'h-3 w-3', @@ -1159,7 +1159,7 @@ export default { }, error: { base: ` - text-red-900 + text-red-900 transition-all data-show:mt-2 data-show:animate-slide-down-normal @@ -1187,7 +1187,7 @@ export default { trigger: ` flex - border-none + border-none rounded bg-transparent p-0 outline-none @@ -1279,8 +1279,8 @@ export default { popover: { trigger: ` flex - border-none - + border-none + rounded bg-transparent p-0 @@ -1300,7 +1300,7 @@ export default { data-closed:animate-dropdown-content-hide min-w-fit - origin-popover + origin-popover data-open:animate-dropdown-content-show data-closed:animate-dropdown-content-hide `, @@ -1344,7 +1344,7 @@ export default { cursor-pointer flex space-x-3 items-center outline-none - focus-visible:ring-1 ring-scale-1200 focus-visible:z-10 + focus-visible:ring-1 ring-scale-1200 focus-visible:z-10 group `, content: { @@ -1415,7 +1415,7 @@ export default { }, group: { base: ` - flex space-x-3 + flex space-x-3 mb-2 font-normal `, @@ -1438,20 +1438,20 @@ export default { bg-scale-100 dark:bg-scale-300 my-4 border border-scale-300 dark:border-scale-500 - rounded-md - shadow-xl - data-open:animate-overlay-show - data-closed:animate-overlay-hide - + rounded-md + shadow-xl + data-open:animate-overlay-show + data-closed:animate-overlay-hide + `, header: ` bg-scale-200 dark:bg-scale-400 - space-y-1 py-3 px-4 sm:px-5 + space-y-1 py-3 px-4 sm:px-5 border-b border-scale-300 dark:border-scale-500 `, footer: ` flex justify-end gap-2 - py-3 px-5 + py-3 px-5 border-t border-scale-300 dark:border-scale-500 `, size: { @@ -1469,9 +1469,9 @@ export default { dark:bg-scale-100 h-full w-full left-0 - top-0 + top-0 opacity-75 - data-closed:animate-fade-out-overlay-bg + data-closed:animate-fade-out-overlay-bg data-open:animate-fade-in-overlay-bg `, scroll_overlay: ` @@ -1480,7 +1480,7 @@ export default { grid place-items-center overflow-y-auto - data-open:animate-overlay-show data-closed:animate-overlay-hide + data-open:animate-overlay-show data-closed:animate-overlay-hide `, separator: ` w-full @@ -1495,12 +1495,12 @@ export default { listbox: { base: ` - block - box-border - w-full - rounded-md - shadow-sm - text-scale-1200 + block + box-border + w-full + rounded-md + shadow-sm + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -1524,24 +1524,24 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, }, options_container_animate: ` transition - data-open:animate-slide-down + data-open:animate-slide-down data-open:opacity-1 data-closed:animate-slide-up data-closed:opacity-0 `, options_container: ` - bg-scale-100 dark:bg-scale-300 - shadow-lg - border border-solid - border-gray-100 dark:border-gray-600 max-h-60 - rounded-md py-1 text-base + bg-scale-100 dark:bg-scale-300 + shadow-lg + border border-solid + border-gray-100 dark:border-gray-600 max-h-60 + rounded-md py-1 text-base sm:text-sm z-10 overflow-hidden overflow-y-scroll origin-dropdown @@ -1561,7 +1561,7 @@ export default { chevron: 'h-5 w-5 text-scale-600', option: ` w-listbox - transition cursor-pointer select-none relative py-2 pl-3 pr-9 + transition cursor-pointer select-none relative py-2 pl-3 pr-9 text-scale-900 text-sm hover:bg-scale-300 dark:hover:bg-scale-500 @@ -1587,9 +1587,9 @@ export default { inputErrorIcon: { base: ` - flex items-center - right-3 pr-2 pl-2 - inset-y-0 + flex items-center + right-3 pr-2 pl-2 + inset-y-0 pointer-events-none text-red-900 `, @@ -1597,8 +1597,8 @@ export default { inputIconContainer: { base: ` - absolute inset-y-0 - left-0 pl-3 flex + absolute inset-y-0 + left-0 pl-3 flex items-center pointer-events-none text-scale-1100 `, From 8a7a50ae8b873e744bff681de43f1131b1051154 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 30 Jan 2023 13:58:26 -0330 Subject: [PATCH 023/120] Updates --- apps/www/pages/pricing/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 936a73aacbc..e369db9896a 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -230,7 +230,7 @@ export default function IndexPage() { />
-
+

From 46fae5e677abb9a7ef6cd8f82a6eaaf2d4c7d0e1 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 30 Jan 2023 17:16:10 -0330 Subject: [PATCH 024/120] Add link to feature req --- apps/docs/public/sitemap.xml | 350 ++++++++++++++++++++----------- apps/www/pages/pricing/index.tsx | 17 +- 2 files changed, 238 insertions(+), 129 deletions(-) diff --git a/apps/docs/public/sitemap.xml b/apps/docs/public/sitemap.xml index 2e86001d252..43126c6257b 100644 --- a/apps/docs/public/sitemap.xml +++ b/apps/docs/public/sitemap.xml @@ -6,12 +6,6 @@ 0.5 - - https://supabase.com/docs/getting-started - weekly - 0.5 - - https://supabase.com/docs/index weekly @@ -30,6 +24,12 @@ 0.5 + + https://supabase.com/docs/guides/cli + weekly + 0.5 + + https://supabase.com/docs/guides/database weekly @@ -90,12 +90,6 @@ 0.5 - - https://supabase.com/docs/guides/tutorials - weekly - 0.5 - - https://supabase.com/docs/handbook/contributing weekly @@ -108,24 +102,12 @@ 0.5 - - https://supabase.com/docs/new/auth - weekly - 0.5 - - https://supabase.com/docs/reference/index weekly 0.5 - - https://supabase.com/docs/tutorials/nextjs - weekly - 0.5 - - https://supabase.com/docs/guides/api/generating-types weekly @@ -204,6 +186,18 @@ 0.5 + + https://supabase.com/docs/guides/cli/local-development + weekly + 0.5 + + + + https://supabase.com/docs/guides/cli/managing-environments + weekly + 0.5 + + https://supabase.com/docs/guides/database/arrays weekly @@ -300,24 +294,54 @@ 0.5 - - https://supabase.com/docs/guides/functions/best-practices - weekly - 0.5 - - https://supabase.com/docs/guides/functions/cicd-workflow weekly 0.5 + + https://supabase.com/docs/guides/functions/cors + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/debugging + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/import-maps + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/local-development + weekly + 0.5 + + https://supabase.com/docs/guides/functions/quickstart weekly 0.5 + + https://supabase.com/docs/guides/functions/schedule-functions + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/secrets + weekly + 0.5 + + https://supabase.com/docs/guides/getting-started/architecture weekly @@ -390,6 +414,12 @@ 0.5 + + https://supabase.com/docs/guides/integrations/illa + weekly + 0.5 + + https://supabase.com/docs/guides/integrations/integrations weekly @@ -414,6 +444,12 @@ 0.5 + + https://supabase.com/docs/guides/integrations/picket + weekly + 0.5 + + https://supabase.com/docs/guides/integrations/plasmic weekly @@ -510,6 +546,12 @@ 0.5 + + https://supabase.com/docs/guides/platform/http-status-codes + weekly + 0.5 + + https://supabase.com/docs/guides/platform/logs weekly @@ -552,6 +594,12 @@ 0.5 + + https://supabase.com/docs/guides/platform/troubleshooting + weekly + 0.5 + + https://supabase.com/docs/guides/realtime/postgres-changes weekly @@ -577,7 +625,7 @@ - https://supabase.com/docs/guides/resources/supabase-cli + https://supabase.com/docs/guides/self-hosting/docker weekly 0.5 @@ -612,12 +660,6 @@ 0.5 - - https://supabase.com/docs/guides/self-hosting/docker - weekly - 0.5 - - https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts weekly @@ -648,6 +690,24 @@ 0.5 + + https://supabase.com/docs/guides/auth/phone-login/messagebird + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/phone-login/twilio + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/phone-login/vonage + weekly + 0.5 + + https://supabase.com/docs/guides/auth/auth-helpers/auth-ui weekly @@ -678,24 +738,6 @@ 0.5 - - https://supabase.com/docs/guides/auth/phone-login/messagebird - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/phone-login/twilio - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/phone-login/vonage - weekly - 0.5 - - https://supabase.com/docs/guides/auth/social-login/auth-apple weekly @@ -799,43 +841,97 @@ - https://supabase.com/docs/guides/database/extensions/http + https://supabase.com/docs/guides/functions/examples/cloudflare-turnstile weekly 0.5 - https://supabase.com/docs/guides/database/extensions/pgcron + https://supabase.com/docs/guides/functions/examples/github-actions weekly 0.5 - https://supabase.com/docs/guides/database/extensions/pgnet + https://supabase.com/docs/guides/functions/examples/og-image weekly 0.5 - https://supabase.com/docs/guides/database/extensions/pgtap + https://supabase.com/docs/guides/functions/examples/storage-caching weekly 0.5 - https://supabase.com/docs/guides/database/extensions/plv8 + https://supabase.com/docs/guides/functions/examples/stripe-webhooks weekly 0.5 - https://supabase.com/docs/guides/database/extensions/postgis + https://supabase.com/docs/guides/functions/examples/telegram-bot weekly 0.5 - https://supabase.com/docs/guides/database/extensions/uuid-ossp + https://supabase.com/docs/guides/getting-started/quickstarts/flutter + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/nextjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/nuxtjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/reactjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/solidjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/sveltekit + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/vue + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/azure + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/gsuite + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/okta weekly 0.5 @@ -924,66 +1020,6 @@ 0.5 - - https://supabase.com/docs/guides/functions/examples/og-image - weekly - 0.5 - - - - https://supabase.com/docs/guides/getting-started/quickstarts/nextjs - weekly - 0.5 - - - - https://supabase.com/docs/guides/getting-started/quickstarts/nuxtjs - weekly - 0.5 - - - - https://supabase.com/docs/guides/getting-started/quickstarts/reactjs - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/azure - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/gsuite - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/okta - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/supabase-cli/local-development - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/supabase-cli/managing-environments - weekly - 0.5 - - - - https://supabase.com/docs/guides/self-hosting/auth/config - weekly - 0.5 - - https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-auth weekly @@ -1008,6 +1044,54 @@ 0.5 + + https://supabase.com/docs/guides/database/extensions/http + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgcron + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgnet + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgtap + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/plv8 + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/postgis + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/uuid-ossp + weekly + 0.5 + + + + https://supabase.com/docs/guides/self-hosting/auth/config + weekly + 0.5 + + https://supabase.com/docs/guides/self-hosting/realtime/config weekly @@ -1443,7 +1527,7 @@ - https://supabase.com/docs/reference/javascript/auth-admin-invoke + https://supabase.com/docs/reference/javascript/functions-invoke weekly 0.5 @@ -1677,7 +1761,7 @@ - https://supabase.com/docs/reference/javascript/v1/auth-admin-invoke + https://supabase.com/docs/reference/javascript/v1/functions-invoke weekly 0.5 @@ -2018,6 +2102,12 @@ 0.5 + + https://supabase.com/docs/reference/dart/initializing + weekly + 0.5 + + https://supabase.com/docs/reference/dart/auth-signup weekly @@ -2085,7 +2175,7 @@ - https://supabase.com/docs/reference/dart/auth-admin-invoke + https://supabase.com/docs/reference/dart/functions-invoke weekly 0.5 @@ -2493,7 +2583,7 @@ - https://supabase.com/docs/reference/dart/v0/auth-admin-invoke + https://supabase.com/docs/reference/dart/v0/functions-invoke weekly 0.5 @@ -2895,7 +2985,7 @@ - https://supabase.com/docs/reference/dart/v0/auth-admin-invoke + https://supabase.com/docs/reference/dart/v0/functions-invoke weekly 0.5 @@ -3446,6 +3536,12 @@ 0.5 + + https://supabase.com/docs/reference/cli/supabase-functions-download + weekly + 0.5 + + https://supabase.com/docs/reference/cli/supabase-functions-deploy weekly diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index e369db9896a..4c2c0f14a75 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -83,7 +83,7 @@ export default function IndexPage() { scale: 'Additional fees apply for usage and storage beyond the limits above.', shutdown: '', preface: 'Everything below included in the base plan', - additional: 'Turn off your spend cap to Pay As You Grow ', + additional: '', cta: 'Get Started', }, // { @@ -446,9 +446,22 @@ export default function IndexPage() {

))}
+
+ Got something you'd like to see here? + + + + + +
-
+
Available for Pro plan From 27c29dcadc231ba02d07b3c40aeb05a1d058ca1c Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 31 Jan 2023 10:15:44 -0330 Subject: [PATCH 025/120] Fix prose section --- apps/www/components/Pricing/ComputePricingModal.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index 18605613266..4f1f31e385d 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -35,12 +35,12 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
} > -
+
-
+
-
+

Choose best compute setup for you

Every project on the Supabase Platform comes with its own dedicated Postgres From 40fc6ecff33698f745deb6d936d7804aab174555 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 31 Jan 2023 15:07:29 -0330 Subject: [PATCH 026/120] New svg --- apps/www/public/images/pricing/compute-upgrade.svg | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/apps/www/public/images/pricing/compute-upgrade.svg b/apps/www/public/images/pricing/compute-upgrade.svg index c6241aa159e..6f27d68fbb7 100644 --- a/apps/www/public/images/pricing/compute-upgrade.svg +++ b/apps/www/public/images/pricing/compute-upgrade.svg @@ -1,9 +1 @@ - - - - - - - - - + \ No newline at end of file From 70ec5e1036e66c26112457dea23aefc7068a19e1 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Mon, 6 Feb 2023 10:29:54 -0600 Subject: [PATCH 027/120] postgres extension docs: pg_graphql, wrappers, pg_stat_monitor --- .../NavigationMenu.constants.ts | 17 ++- .../guides/database/extensions/pg_graphql.mdx | 119 ++++++++++++++++++ .../database/extensions/pg_stat_monitor.mdx | 85 +++++++++++++ .../extensions/pg_stat_statements.mdx | 2 +- .../guides/database/extensions/wrappers.mdx | 75 +++++++++++ 5 files changed, 296 insertions(+), 2 deletions(-) create mode 100644 apps/docs/pages/guides/database/extensions/pg_graphql.mdx create mode 100644 apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx create mode 100644 apps/docs/pages/guides/database/extensions/wrappers.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index ba16f51d218..a33c5724c8b 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -409,6 +409,11 @@ export const database = { url: '/guides/database/extensions/pgcron', items: [], }, + { + name: 'pg_graphql: GraphQL support', + url: '/guides/database/extensions/pg_graphql', + items: [], + }, { name: 'pg_jsonschema: JSON Schema Validation', url: '/guides/database/extensions/pg_jsonschema', @@ -420,7 +425,12 @@ export const database = { items: [], }, { - name: 'pg_stat_statements: SQL Planning and Execution Statistics', + name: 'pg_stat_monitor: Extended Query Performance Monitoring', + url: '/guides/database/extensions/pg_stat_monitor', + items: [], + }, + { + name: 'pg_stat_statements: Query Performance Monitoring, url: '/guides/database/extensions/pg_stat_statements', items: [], }, @@ -445,6 +455,11 @@ export const database = { url: '/guides/database/extensions/rum', items: [], }, + { + name: 'wrappers: 3rd Party Integrations', + url: '/guides/database/extensions/rum', + items: [], + }, ], }, { diff --git a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx new file mode 100644 index 00000000000..21be1da6e5b --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx @@ -0,0 +1,119 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg_graphql', + title: 'pg_graphql: Native GraphQL for PostgreSQL', + description: 'A GraphQL API for PostgreSQL', +} + +[pg_graphql](https://supabase.github.io/pg_graphql/) is PostgreSQL extension for interacting with the database using [GraphQL](https://graphql.org) instead of SQL. + +The extension reflects a GraphQL schema from the existing SQL schema and exposes it through a SQL function, `graphql.resolve(...)`. This enables any programming language that can connect to PostgreSQL to query the database via GraphQL with no additional servers, processes, or libraries. + +The `pg_graphql` resolve method is designed to interop with [PostgREST](https://postgrest.org/en/stable/index.html), the tool that underpins the Supabase API, such that the `graphql.resolve` function can be called via RPC to safely and performantly expose the GraphQL API over HTTP/s. + +For more information about how the SQL schema is reflected into a GraphQL schema, see the [pg_graphql API docs](https://supabase.github.io/pg_graphql/api/). + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pg_graphql" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pg_graphql" extension +create extension pg_graphql; + +-- Disable the "pg_graphql" extension +drop extension if exists pg_graphql; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + + + + +## Usage + +Given a table + +{/* prettier-ignore */} +```sql +create table "Blog"( + id serial primary key, + name varchar(255) not null, + description varchar(255), +); + +insert into "Blog"(name) +values ('My Blog'); +``` + +The reflected GraphQL schema can be queries immediately as + +{/* prettier-ignore */} +```sql +select + graphql.resolve($$ + { + blogCollection(first: 1) { + edges { + node { + id, + name + } + } + } + } + $$); +``` + +returning the JSON + +{/* prettier-ignore */} +```json +{ + "data": { + "blogCollection": { + "edges": [ + { + "node": { + "id": 1 + "name": "My Blog" + } + } + ] + } + } +} +``` + +Note that pg_graphql fully supports schema introspection so you can connect any IDE or schema inspection tool to see the full set of fields and arguments available in the API. + +## API + +- [`graphql.resolve`](https://supabase.github.io/pg_graphql/sql_interface/): A SQL function for executing GraphQL queries. + + +## Resources + +- Official [`pg_graphql` documentation](https://github.com/supabase/pg_graphql) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx new file mode 100644 index 00000000000..801f9f7bb92 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -0,0 +1,85 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg_stat_monitor', + title: 'pg_stat_monitor: Query Performance Monitoring', + description: 'Query performance monitoring for PostgreSQL', +} + +[pg_stat_monitor](https://github.com/percona/pg_stat_monitor) is query performance monitoring tool that provides query execution statistics in a SQL view named `pg_stat_monitor`. It tracks a superset of statistics available in [`pg_stat_statements`](https://www.postgresql.org/docs/current/pgstatstatements.html). + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pg_stat_monitor" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pg_stat_monitor" extension +create extension pg_stat_monitor with schema extensions; + +-- Disable the "pg_stat_monitor" extension +drop extension if exists pg_stat_monitor; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + +It's good practice to create the extension within a separate schema (like `extensions`) to keep your database clean. + + + + +## Views + +{/* prettier-ignore */} +```sql +select * from extensions.pg_stat_monitor; +``` + +The following table shows a subset of available columns: + +| Column Type | Description | +| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| bucket bigint | Data collection unit. The number shows what bucket in a chain a record belongs to | +| bucket_start_time timestampz | The start time of the bucket | +| userid oid (references pg_authid.oid) | OID of user who executed the statement | +| dbid oid (references pg_database.oid) | OID of database in which the statement was executed | +| toplevel bool | True if the query was executed as a top-level statement (always true if pg_stat_statements.track is set to top) | +| client_ip inet | The IP address of a client that ran the query | +| queryid bigint | Hash code to identify identical normalized queries. | +| planid text | An internally generated ID of a query plan | +| query_plan text | The sequence of steps used to execute a query. This parameter is only available when pgsm_enable_query_plan is enabled | +| query text | Text of a representative statement | +| plans bigint | Number of times the statement was planned (if pg_stat_statements.track_planning is enabled, otherwise zero) | +| total_plan_time double precision | Total time spent planning the statement, in milliseconds (if pg_stat_statements.track_planning is enabled, otherwise zero) | +| min_plan_time double precision | Minimum time spent planning the statement, in milliseconds (if pg_stat_statements.track_planning is enabled, otherwise zero) | + +A full list of statistics is available in the [pg_stat_monitor](https://docs.percona.com/pg-stat-monitor/reference.html#postgresql-15) docs. + +## Functions +- [`pg_stat_monitor_reset()`](https://docs.percona.com/pg-stat-monitor/functions.html): Resets the statistics tracked by the `pg_stat_monitor` view and deletes all previous data. +- [`pg_stat_monitor_version()`](https://docs.percona.com/pg-stat-monitor/functions.html): Displays the version of the `pg_stat_monitor` extension. + + +## Resources + +- Official [`pg_stat_monitor` documentation](https://github.com/percona/pg_stat_monitor) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx index 711878d78c0..e699a30eb8e 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx @@ -2,7 +2,7 @@ import Layout from '~/layouts/DefaultGuideLayout' export const meta = { id: 'pg_stat_statements', - title: 'pg_stat_statements: SQL Planning and Execution Statistics', + title: 'pg_stat_statements: Query Performance Monitoring', description: 'Track planning and execution statistics of all SQL statements executed on the database.', } diff --git a/apps/docs/pages/guides/database/extensions/wrappers.mdx b/apps/docs/pages/guides/database/extensions/wrappers.mdx new file mode 100644 index 00000000000..1368d9e1ece --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/wrappers.mdx @@ -0,0 +1,75 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'wrappers', + title: 'wrappers: 3rd Party Integrations', + description: '3rd party integrations for PostgreSQL ', +} + +[supabase/wrappers](https://supabase.github.io/wrappers/) is a PostgreSQL extension that provides integrations with external sources so you can interact with third-party data using SQL. + +For example, the [Stripe wrapper](https://supabase.github.io/wrappers/stripe/) connects to [Stripe's API](https://stripe.com/docs/api) and exposes each endpoint as a SQL table. + +{/* prettier-ignore */} +```sql +select + customer_id + currency +from + stripe.customers; + + customer_id | currency +--------------------+----------- + cus_MJiBtCqOF1Bb3F | usd +(1 row) +``` + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "wrappers" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "wrappers" extension +create extension wrappers with schema extensions; + +-- Disable the "wrappers" extension +drop extension if exists wrappers; +``` + + + + +Instructions for setting up connections to each 3rd party service via SQL are avaiable at the links in the integrations section below. +A web interface for connecting to external data is coming to Supabase Studio in 2023. + +## Integrations + +- [Firebase](https://supabase.github.io/wrappers/firebase/) +- [Stripe](https://supabase.github.io/wrappers/stripe/) +- Airtable - Coming Soon +- BigQuery - Coming Soon +- Clickhouse - Coming Soon + +## Resources + +- Official [`supabase/wrappers` documentation](https://supabase.github.io/wrappers/) + +export const Page = ({ children }) => + +export default Page From 0f99a96f873bd2869fcc858d0f5dcb20e4785778 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Mon, 6 Feb 2023 10:31:43 -0600 Subject: [PATCH 028/120] typo: url --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index a33c5724c8b..ac78e5d91a7 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -457,7 +457,7 @@ export const database = { }, { name: 'wrappers: 3rd Party Integrations', - url: '/guides/database/extensions/rum', + url: '/guides/database/extensions/wrappers', items: [], }, ], From 3f6ef12f5f1938c0fc8a38206c3123ad147c1100 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 7 Feb 2023 13:40:48 -0330 Subject: [PATCH 029/120] Updates --- apps/www/data/PricingFAQ.json | 4 ++-- apps/www/pages/pricing/index.tsx | 41 +++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/apps/www/data/PricingFAQ.json b/apps/www/data/PricingFAQ.json index f6d897e8541..44fa8c58784 100644 --- a/apps/www/data/PricingFAQ.json +++ b/apps/www/data/PricingFAQ.json @@ -1,7 +1,7 @@ [ { "question": "Can I cap my usage so my bill doesn't run over?", - "answer": "Yes. Spend caps are on by default on the pro tier. You can turn spend caps off for usage beyond the tier limits to pay as you grow." + "answer": "Yes. Spend caps are on by default on the Pro tier. You can turn spend caps off for usage beyond the tier limits to pay as you grow." }, { "question": "I'm worried I could end up with a huge bill at the end of the month.", @@ -9,7 +9,7 @@ }, { "question": "When will I be billed?", - "answer": "Our Pro plan is charged up front, and billed on a monthly basis. Additional usage costs are also billed at the end of the month." + "answer": "Our Pro tier is charged up front, and billed on a monthly basis. Additional usage costs are also billed at the end of the month." }, { "question": "Are you going to change your pricing in the future?", diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 4c2c0f14a75..e3cadbf6723 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -855,17 +855,52 @@ export default function IndexPage() { Can't find the answer to your question, ask someone in the community either on our Discord or GitHub.

-
+
- - From 4e6036e44b75a248b7d4aa505c00ff71980fda12 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 7 Feb 2023 16:07:03 -0330 Subject: [PATCH 030/120] Style nudges --- .../www/components/Pricing/PricingTableRow.tsx | 8 ++++---- apps/www/pages/pricing/index.tsx | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index 799d9113597..fb44f3a0baa 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -1,6 +1,6 @@ -import { IconHelpCircle, IconInfo, IconX, IconXCircle, Modal } from 'ui' +import { IconHelpCircle } from 'ui' import ProductIcon from 'components/ProductIcon' -import React, { Fragment, useState } from 'react' +import React, { Fragment } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( @@ -145,7 +145,7 @@ export const PricingTableRowDesktop = (props: any) => { ) })} - + ) } @@ -200,7 +200,7 @@ export const PricingTableRowMobile = (props: any) => { })}
- + ) } diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index e3cadbf6723..2b106595f57 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -119,7 +119,7 @@ export default function IndexPage() { href: 'https://forms.supabase.com/enterprise', description: 'For large-scale applications managing serious workloads.', features: [ - `Point in time recovery`, + `Point in Time Recovery`, `Designated Support manager & SLAs`, `Enterprise OAuth providers`, `SSO/ SAML`, @@ -140,7 +140,7 @@ export default function IndexPage() { heroImg: 'addons-compute-hero', icon: 'compute-upgrade', price: 'Starts from $5', - description: 'Increase the captability of your database only for what you need.', + description: 'Increase the capability of your database only for what you need.', leftCtaText: 'Documentation', leftCtaLink: 'http://.....', rightCtaText: 'See Pricing breakdown', @@ -159,7 +159,7 @@ export default function IndexPage() { rightCtaLink: 'http://', }, { - name: 'Point in time recovery', + name: 'Point in Time Recovery', heroImg: 'addons-pitr-hero', icon: 'pitr-upgrade', price: 'Starts from $5', @@ -367,7 +367,7 @@ export default function IndexPage() { )}
- @@ -391,7 +391,7 @@ export default function IndexPage() {
-

Easily customizable add-Ons

+

Easily customizable add-ons

Level up your Supabase experience with add-ons.

@@ -762,7 +762,7 @@ export default function IndexPage() { @@ -825,7 +825,7 @@ export default function IndexPage() { - @@ -835,7 +835,7 @@ export default function IndexPage() { - From 4b7ff902ed73f53d6db7926c6a542509a0cdd34c Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 8 Feb 2023 15:39:02 -0600 Subject: [PATCH 031/120] postgres extension docs: pgrouting --- .../NavigationMenu.constants.ts | 5 + .../guides/database/extensions/pgrouting.mdx | 162 ++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/pgrouting.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index ac78e5d91a7..f1f9fc7c0cc 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -404,6 +404,11 @@ export const database = { url: '/guides/database/extensions/pgroonga', items: [], }, + { + name: 'pgRouting: Geospatial Routing', + url: '/guides/database/extensions/pgrouting', + items: [], + }, { name: 'pg_cron: Job Scheduling', url: '/guides/database/extensions/pgcron', diff --git a/apps/docs/pages/guides/database/extensions/pgrouting.mdx b/apps/docs/pages/guides/database/extensions/pgrouting.mdx new file mode 100644 index 00000000000..45b55737f80 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pgrouting.mdx @@ -0,0 +1,162 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pgrouting', + title: 'pgrouting: Geospatial Routing', + description: 'Extends PostGIS with Geospatial Routing', +} + +[pgRouting](http://pgrouting.org) is PostgreSQL and [PostGIS](http://postgis.net) extension adding geospatial routing functionality. + +The core functionality of pgRouting is a set of path finding algorithms including: + +- All Pairs Shortest Path, Johnson’s Algorithm +- All Pairs Shortest Path, Floyd-Warshall Algorithm +- Shortest Path A* +- Bi-directional Dijkstra Shortest Path +- Bi-directional A* Shortest Path +- Shortest Path Dijkstra +- Driving Distance +- K-Shortest Path, Multiple Alternative Paths +- K-Dijkstra, One to Many Shortest Path +- Traveling Sales Person +- Turn Restriction Shortest Path (TRSP) + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pgrouting" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pgRouting" extension +create extension pgrouting cascade; + +-- Disable the "pgRouting" extension +drop extension if exists pgRouting; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + + + + +## Example Usage + +As an example, we'll solve the [traveling salesman probelem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) using the pgRouting's `pgr_TSPeuclidean` function from some PostGIS coodinates. + +A summary of the traveling salesman problem is, given a set of city coordinates, solve for a path that goes through each city and minimizes the total distance traveled. + +First we populate a table with some X, Y coordiantes +{/* prettier-ignore */} +```sql +create table wi29 ( + id bigint, + x float, + y float, + geom geometry +); + +insert into wi29 (id, x, y) +values + (1,20833.3333,17100.0000), + (2,20900.0000,17066.6667), + (3,21300.0000,13016.6667), + (4,21600.0000,14150.0000), + (5,21600.0000,14966.6667), + (6,21600.0000,16500.0000), + (7,22183.3333,13133.3333), + (8,22583.3333,14300.0000), + (9,22683.3333,12716.6667), + (10,23616.6667,15866.6667), + (11,23700.0000,15933.3333), + (12,23883.3333,14533.3333), + (13,24166.6667,13250.0000), + (14,25149.1667,12365.8333), + (15,26133.3333,14500.0000), + (16,26150.0000,10550.0000), + (17,26283.3333,12766.6667), + (18,26433.3333,13433.3333), + (19,26550.0000,13850.0000), + (20,26733.3333,11683.3333), + (21,27026.1111,13051.9444), + (22,27096.1111,13415.8333), + (23,27153.6111,13203.3333), + (24,27166.6667,9833.3333), + (25,27233.3333,10450.0000), + (26,27233.3333,11783.3333), + (27,27266.6667,10383.3333), + (28,27433.3333,12400.0000), + (29,27462.5000,12992.2222); +``` + +Next we use the `pgr_TSPeuclidean` function to find the best path. + +{/* prettier-ignore */} +```sql +select + * +from + pgr_TSPeuclidean($$select * from wi29$$) +``` + +{/* prettier-ignore */} +```sql + seq | node | cost | agg_cost +-----+------+------------------+------------------ + 1 | 1 | 0 | 0 + 2 | 2 | 74.535614157127 | 74.535614157127 + 3 | 6 | 900.617093380362 | 975.152707537489 + 4 | 10 | 2113.77757765045 | 3088.93028518793 + 5 | 11 | 106.718669615254 | 3195.64895480319 + 6 | 12 | 1411.95293791574 | 4607.60189271893 + 7 | 13 | 1314.23824873744 | 5921.84014145637 + 8 | 14 | 1321.76283931305 | 7243.60298076942 + 9 | 17 | 1202.91366735569 | 8446.5166481251 + 10 | 18 | 683.333268292684 | 9129.84991641779 + 11 | 15 | 1108.05137466134 | 10237.9012910791 + 12 | 19 | 772.082339448903 | 11009.983630528 + 13 | 22 | 697.666150054665 | 11707.6497805827 + 14 | 23 | 220.141999627513 | 11927.7917802102 + 15 | 21 | 197.926372783442 | 12125.7181529937 + 16 | 29 | 440.456596290771 | 12566.1747492844 + 17 | 28 | 592.939989005405 | 13159.1147382898 + 18 | 26 | 648.288376333318 | 13807.4031146231 + 19 | 20 | 509.901951359278 | 14317.3050659824 + 20 | 25 | 1330.83095428717 | 15648.1360202696 + 21 | 27 | 74.535658878487 | 15722.6716791481 + 22 | 24 | 559.016994374947 | 16281.688673523 + 23 | 16 | 1243.87392358622 | 17525.5625971092 + 24 | 9 | 4088.0585364911 | 21613.6211336004 + 25 | 7 | 650.85409697993 | 22264.4752305803 + 26 | 3 | 891.004385199336 | 23155.4796157796 + 27 | 4 | 1172.36699411442 | 24327.846609894 + 28 | 8 | 994.708187806297 | 25322.5547977003 + 29 | 5 | 1188.01888359478 | 26510.5736812951 + 30 | 1 | 2266.91173136004 | 28777.4854126552 +``` + +Given a table + +## Resources + +- Official [`pgRouting` documentation](https://docs.pgrouting.org/latest/en/index.html) + +export const Page = ({ children }) => + +export default Page From c040bbe28dd0bd406fe69795e408391939d7a1bc Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Thu, 9 Feb 2023 14:39:38 -0600 Subject: [PATCH 032/120] postgres extension docs: pgaudit --- .../NavigationMenu.constants.ts | 5 + .../database/extensions/pg_jsonschema.mdx | 2 +- .../guides/database/extensions/pgaudit.mdx | 108 ++++++++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 apps/docs/pages/guides/database/extensions/pgaudit.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index f1f9fc7c0cc..5dcc05cea39 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -399,6 +399,11 @@ export const database = { items: [], }, { name: 'http: RESTful Client', url: '/guides/database/extensions/http', items: [] }, + { + name: 'PGAudit: Postgres Auditing', + url: '/guides/database/extensions/pgaudit', + items: [], + }, { name: 'PGRoonga: Multilingual Full Text Search', url: '/guides/database/extensions/pgroonga', diff --git a/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx b/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx index c51a4c3783e..ade2adf5271 100644 --- a/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx @@ -6,7 +6,7 @@ export const meta = { description: 'Validate json/jsonb with JSON Schema in PostgreSQL.', } -[JSON Schema](https://json-schema.org) is a language for annotating and validating JSON documents. [`pg_jsonschema`](https://json-schema.org) is a PostgreSQL extension that adds the ability to validate PostgreSQL's built-in `json` and `jsonb` data types against a JSON Schema document. +[JSON Schema](https://json-schema.org) is a language for annotating and validating JSON documents. [`pg_jsonschema`](https://github.com/supabase/pg_jsonschema) is a PostgreSQL extension that adds the ability to validate PostgreSQL's built-in `json` and `jsonb` data types against a JSON Schema document. ## Usage diff --git a/apps/docs/pages/guides/database/extensions/pgaudit.mdx b/apps/docs/pages/guides/database/extensions/pgaudit.mdx new file mode 100644 index 00000000000..6019bbb992b --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pgaudit.mdx @@ -0,0 +1,108 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pgaudit', + title: 'PGAudit: Postgres Auditing', + description: 'Session and object auditing via PostgreSQL standard logging', +} + +[PGAudit](https://www.pgaudit.org) is a PostgreSQL extension for logging session and object auditing over the standard PostgreSQL logging utility. + +PGAudit grants fine grain control over which statements and objects are emitted to logs. + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pgaudit" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pgaudit" extension +create extension pgaudit; + +-- Disable the "pgaudit" extension +drop extension if exists pgaudit; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + + + + + +## Settings + +The `pgaudit.log` setting controls which statements to log. Available values include: + +- **read**: `SELECT` and `COPY` when the source is a relation or a query. +- **write**: `INSERT`, `UPDATE`, `DELETE`, `TRUNCATE`, and `COPY` when the destination is a relation. +- **function**: Function calls and `DO` blocks. +- **role**: Statements related to roles and privileges: `GRANT`, `REVOKE`, `CREATE/ALTER/DROP ROLE`. +- **ddl**: All `DDL` that is not included in the `ROLE` class. +- **misc**: Miscellaneous commands, e.g. `DISCARD`, `FETCH`, `CHECKPOINT`, `VACUUM`, `SET`. +- **misc_set**: Miscellaneous `SET` commands, e.g. `SET ROLE`. + +- **all**: Include all of the above. + +For a full list of available settings see [settings docs](https://github.com/pgaudit/pgaudit/blob/master/README.md#settings). Be aware that the `all` setting will generate a very large volume of logs. + +## Example + +Given a pgaudit setting + +{/* prettier-ignore */} +```sql +set pgaudit.log = 'read, ddl'; +``` + +The following create table, insert and select statements + +{/* prettier-ignore */} +```sql +create table account ( + id int primary key, + name text, + description text +); + +insert into account (id, name, description) +values (1, 'Foo Barsworth', 'Customer account'); + +select * from account; +``` + +Results in the log output + +```text +AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.account,create table account( + id int, + name text, + description text +);, +AUDIT: SESSION,2,1,READ,SELECT,,,select * from account,, +``` + +Note that the insert statement is not logged because we did not include the `write` option for `pgaudit.log`. + +## Resources + +- Official [`PGAudit` documentation](https://www.pgaudit.org) + +export const Page = ({ children }) => + +export default Page From f0c4192db80209ee453035adf9a5bc38d04581c5 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Thu, 9 Feb 2023 14:46:04 -0600 Subject: [PATCH 033/120] resolve linter complaints --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 2 +- apps/docs/pages/guides/database/extensions/pg_graphql.mdx | 1 - apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx | 1 - apps/docs/pages/guides/database/extensions/wrappers.mdx | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 5dcc05cea39..51e2eb14194 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -440,7 +440,7 @@ export const database = { items: [], }, { - name: 'pg_stat_statements: Query Performance Monitoring, + name: 'pg_stat_statements: Query Performance Monitoring', url: '/guides/database/extensions/pg_stat_statements', items: [], }, diff --git a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx index 21be1da6e5b..d8b6c3d3397 100644 --- a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx @@ -109,7 +109,6 @@ Note that pg_graphql fully supports schema introspection so you can connect any - [`graphql.resolve`](https://supabase.github.io/pg_graphql/sql_interface/): A SQL function for executing GraphQL queries. - ## Resources - Official [`pg_graphql` documentation](https://github.com/supabase/pg_graphql) diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx index 801f9f7bb92..aa4e3b5d4bf 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -75,7 +75,6 @@ A full list of statistics is available in the [pg_stat_monitor](https://docs.per - [`pg_stat_monitor_reset()`](https://docs.percona.com/pg-stat-monitor/functions.html): Resets the statistics tracked by the `pg_stat_monitor` view and deletes all previous data. - [`pg_stat_monitor_version()`](https://docs.percona.com/pg-stat-monitor/functions.html): Displays the version of the `pg_stat_monitor` extension. - ## Resources - Official [`pg_stat_monitor` documentation](https://github.com/percona/pg_stat_monitor) diff --git a/apps/docs/pages/guides/database/extensions/wrappers.mdx b/apps/docs/pages/guides/database/extensions/wrappers.mdx index 1368d9e1ece..2673d17f037 100644 --- a/apps/docs/pages/guides/database/extensions/wrappers.mdx +++ b/apps/docs/pages/guides/database/extensions/wrappers.mdx @@ -55,7 +55,7 @@ drop extension if exists wrappers; -Instructions for setting up connections to each 3rd party service via SQL are avaiable at the links in the integrations section below. +Instructions for setting up connections to each 3rd party service via SQL are available at the links in the integrations section below. A web interface for connecting to external data is coming to Supabase Studio in 2023. ## Integrations From 5d70811c1e3d12e7866a76f49074652a69e3133a Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Thu, 9 Feb 2023 16:04:07 -0600 Subject: [PATCH 034/120] pg_stat_statements typos --- .../guides/database/extensions/pg_stat_statements.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx index e699a30eb8e..d97ce19eb7f 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx @@ -74,10 +74,10 @@ select from pg_stat_statements where - calls > 1000 -- at least 50 calls - and mean_exec_time > 2.0 -- averaging at least 2ms/call - and total_exec_time > 60000 -- at least one minute total server time spent - and query ilike '%user_in_organization%' -- filter to queries that touch the user_in_organization table + calls > 50 -- at least 50 calls + and mean_exec_time > 2.0 -- averaging at least 2ms/call + and total_exec_time > 60000 -- at least one minute total server time spent + and query ilike '%user_in_organization%' -- filter to queries that touch the user_in_organization table order by calls desc ``` From c47526ffd03c0ddf1f8895ef74e2a43ceca03814 Mon Sep 17 00:00:00 2001 From: egor-romanov <58992960+egor-romanov@users.noreply.github.com> Date: Fri, 10 Feb 2023 12:50:43 +0300 Subject: [PATCH 035/120] rm integration tests as it is in tests repo now --- .github/workflows/integration-tests.yml | 92 ------------------------- 1 file changed, 92 deletions(-) delete mode 100644 .github/workflows/integration-tests.yml diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml deleted file mode 100644 index 0c9a3c46ebd..00000000000 --- a/.github/workflows/integration-tests.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: Tests - -# Controls when the workflow will run -on: - schedule: - - cron: '0 4/6 * * *' - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - autotests: - name: Run tests and generate Allure Report - strategy: - matrix: - node: ['14'] - - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./tests - - steps: - - uses: actions/checkout@v2 - - - name: Set up JDK - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - - name: Set up Node - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node }} - - - name: Install dependencies - run: npm ci - - - uses: supabase/setup-cli@v1 - - run: supabase start - - - name: Run Test - run: npm run test:local - env: - SUPABASE_DB_PORT: 54322 - SUPABASE_DB_PASS: postgres - SUPABASE_DB_HOST: localhost - SUPABASE_GOTRUE: http://localhost:54321 - SUPABASE_URL: http://localhost:54321 - SUPABASE_KEY_ANON: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24ifQ.625_WdcF3KHqz5amU0x2X5WWHP-OEs_4qj0ssLNHzTs - SUPABASE_KEY_ADMIN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSJ9.vI9obAHOGyVVKa3pD--kJlyxp-Z2zV9UUMAhKpNLAcU - - - name: Stop infrastructure - if: always() - run: supabase stop - - - name: Get Allure history - uses: actions/checkout@v2 - if: always() - continue-on-error: true - with: - repository: supabase/test-reports - ref: gh-pages - path: gh-pages - - - name: Allure Report action - uses: simple-elf/allure-report-action@master - if: always() - with: - github_repo: test-reports - allure_results: tests/allure-results - allure_history: allure-history - subfolder: supabase-integration - keep_reports: 50 - - - name: Deploy report to Github Pages - if: always() - uses: peaceiris/actions-gh-pages@v2 - env: - EXTERNAL_REPOSITORY: supabase/test-reports - ACTIONS_DEPLOY_KEY: ${{ secrets.DEPLOY_TO_TEST_REPORTS_KEY }} - PUBLISH_BRANCH: gh-pages - PUBLISH_DIR: allure-history - - - name: Post the link to the report - if: always() - uses: Sibz/github-status-action@v1 - with: - authToken: ${{ secrets.GITHUB_TOKEN }} - context: 'Test report' - state: 'success' - sha: ${{ github.event.pull_request.head.sha || github.sha }} - target_url: https://supabase.github.io/test-reports/supabase-integration/${{ github.run_number }} From 950b3c19d6691be6516088c19c6eeb9a9b0da530 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Fri, 10 Feb 2023 12:08:47 -0600 Subject: [PATCH 036/120] postgres extension docs: pgjwt --- .../NavigationMenu.constants.ts | 5 + .../guides/database/extensions/pgjwt.mdx | 116 ++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/pgjwt.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 51e2eb14194..290c39a3394 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -404,6 +404,11 @@ export const database = { url: '/guides/database/extensions/pgaudit', items: [], }, + { + name: 'pgjwt: JSON Web Tokens', + url: '/guides/database/extensions/pgjwt', + items: [], + }, { name: 'PGRoonga: Multilingual Full Text Search', url: '/guides/database/extensions/pgroonga', diff --git a/apps/docs/pages/guides/database/extensions/pgjwt.mdx b/apps/docs/pages/guides/database/extensions/pgjwt.mdx new file mode 100644 index 00000000000..097cad3e4d3 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pgjwt.mdx @@ -0,0 +1,116 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pgjwt', + title: 'pgjwt: JSON Web Tokens', + description: 'Encode and decode JWTs in PostgreSQL', +} + +The [pgjwt](https://github.com/michelp/pgjwt) (PostgreSQL JSON Web Token) extension allows you to create and parse [JSON Web Tokens (JWTs)](https://en.wikipedia.org/wiki/JSON_Web_Token) within a PostgreSQL database. JWTs are commonly used for authentication and authorization in web applications and services. + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pgjwt" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pgjwt" extension +create extension pgjwt schema extensions; + +-- Disable the "pgjwt" extension +drop extension if exists pgjwt; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + +It's good practice to create the extension within a separate schema (like `extensions`) to keep your database clean. + + + + +## API + +- [`sign(payload json, secret text, algorithm text default 'HSA256')`](https://github.com/michelp/pgjwt#usage): Signs a JWT containng *payload* with *secret* using *algorithm*. +- [`verify(token text, secret text, algorithm text default 'HSA256')`](https://github.com/michelp/pgjwt#usage): Decodes a JWT *token* that was signed with *secret* using *algorithm*. + +Where: +- `payload` is an encrypted JWT represented as a string. +- `secret` is the private/secret passcode which is used to sign the JWT and verify its integrity. +- `algorithm` is the method used to sign the JWT using the secret. +- `token` is an encrypted JWT represented as a string. + + +## Usage + +Once the extension is installed, you can use its functions to create and parse JWTs. Here's an example of how you can use the `sign` function to create a JWT: + +{/* prettier-ignore */} +```sql +select + extensions.sign( + payload := '{"sub":"1234567890","name":"John Doe","iat":1516239022}', + secret := 'secret', + algorithm := 'HS256' + ); +``` + +The pgjwt_encode function returns a string that represents the JWT, which can then be safely transmitted between parties. + +{/* prettier-ignore */} +``` + sign +--------------------------------- + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpX + VCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiw + ibmFtZSI6IkpvaG4gRG9lIiwiaWF0Ijo + xNTE2MjM5MDIyfQ.XbPfbIHMI6arZ3Y9 + 22BhjWgQzWXcXNrz0ogtVhfEd2o +(1 row) +``` + +To parse a JWT and extract its claims, you can use the `verify` function. Here's an example: + + +{/* prettier-ignore */} +```sql +select + extensions.verify( + token := 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiRm9vIn0.Q8hKjuadCEhnCPuqIj9bfLhTh_9QSxshTRsA5Aq4IuM', + secret := 'secret', + algorithm := 'HS256' + ); +``` + +Which returns the decoded contents and some associated metadata. + +{/* prettier-ignore */} +```sql + header | payload | valid +-----------------------------+----------------+------- + {"alg":"HS256","typ":"JWT"} | {"name":"Foo"} | t +(1 row) +``` + +## Resources + +- Official [`pgjwt` documentation](https://github.com/michelp/pgjwt) + +export const Page = ({ children }) => + +export default Page From f30648972e22a496cb90f01b85c97fe2c5fb3932 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Fri, 10 Feb 2023 12:12:41 -0600 Subject: [PATCH 037/120] postgres extension docs: plpgsql_check --- .../NavigationMenu.constants.ts | 5 + .../database/extensions/plpgsql_check.mdx | 107 ++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/plpgsql_check.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 290c39a3394..ad7b5d85303 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -460,6 +460,11 @@ export const database = { items: [], }, { name: 'pgTAP: Unit Testing', url: '/guides/database/extensions/pgtap', items: [] }, + { + name: 'plpgsql_check: PL/pgSQL Linter', + url: '/guides/database/extensions/plpgsql_check', + items: [], + }, { name: 'uuid-ossp: Unique Identifiers', url: '/guides/database/extensions/uuid-ossp', diff --git a/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx b/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx new file mode 100644 index 00000000000..8a9fb7bfde4 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx @@ -0,0 +1,107 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'plpgsql_check', + title: 'plpgsql_check: PL/pgSQL Linter', + description: 'Lint PL/pgSQL code', +} + +plpg_sqlcheck is a PostgreSQL extension that lints plpgsql for syntax, semantic and other related issues. The tool helps developers to identify and correct errors before executing the code. plpgsql_sqlcheck is most useful for developers who are working with large or complex SQL codebases, as it can help identify and resolve issues early in the development cycle. + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "plpgsql_check" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "plpgsql_check" extension +create extension plpgsql_check; + +-- Disable the "plpgsql_check" extension +drop extension if exists plpgsql_check; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + + + + +## API + +- [`plpgsql_check_function( ... )`](https://github.com/okbob/plpgsql_check#active-mode): Scans a function for errors. + +`plpgsql_check_function` is highly customizable. For a complete list of available arguments see [their doc](https://github.com/okbob/plpgsql_check#arguments) + +## Usage + +To demonstrate plpgsql_check we can create a function with a known error. In this case we create a function `some_func`, that references a non-existent column `location.created_at`. + +{/* prettier-ignore */} +```sql +create table place( + x float, + y float +); + +create or replace function public.some_func() + returns void + language plpgsql +as $$ +declare + rec record; +begin + for rec in select * from place + loop + -- Bug: There is no column `created_at` on table `location` + raise notice '%', rec.created_at; + end loop; +end; +$$; +``` + +Note that executing the function would not catch the invalid reference error because the `loop` does not execute if no rows are present in the table. + +{/* prettier-ignore */} +```sql +select public.some_func(); + some_func + ─────────── + + (1 row) +``` + +Now we can use plpgsql_check's `plpgsql_check_function` function to identify the known error. + +{/* prettier-ignore */} +```sql +select plpgsql_check_function('public.some_func()'); + + plpgsql_check_function +------------------------------------------------------------ + error:42703:8:RAISE:record "rec" has no field "created_at" + Context: SQL expression "rec.created_at" +``` + +## Resources + +- Official [`plpgsql_check` documentation](https://github.com/okbob/plpgsql_check) + +export const Page = ({ children }) => + +export default Page From dbe5c239b9282bf1322e6797d5f7e641b9dc4387 Mon Sep 17 00:00:00 2001 From: DreamInk-Offical Date: Sat, 11 Feb 2023 02:38:13 +0100 Subject: [PATCH 038/120] Updated auth-policies.mdx Added instructions to the documentation on how to create your own helper functions. --- .../pages/learn/auth-deep-dive/auth-policies.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx index 636eef09903..b79c6e038b7 100644 --- a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx +++ b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx @@ -155,10 +155,23 @@ create policy "Only Blizzard staff can update leaderboard" Supabase comes with two built-in helper functions: `auth.uid()` and `auth.jwt()`. +To create your own functions, navigate to the SQL editor and create a a new query. +``` +create or replace function auth.useragent() returns text as $$ + select nullif(current_setting('request.headers', true)::json->>'user-agent', '')::text; +$$ language sql; +``` +You can access request headers, cookies and JWT claims by reading GUC variables set by PostgREST per request. They are named `request.headers`, `request.cookies` and `request.jwt.claims`. + + +Read more about the http-context here: [https://postgrest.org/en/v10.0/api.html#http-context](https://postgrest.org/en/v10.0/api.html#http-context) + See the full PostgreSQL policy docs here: [https://www.postgresql.org/docs/12/sql-createpolicy.html](https://www.postgresql.org/docs/12/sql-createpolicy.html) You can get as creative as you like with these policies. + + ### Resources - JWT debugger: https://jwt.io​ From 5417c98aa45d5bcd401c58da7adf2ff02303f64f Mon Sep 17 00:00:00 2001 From: DreamInk-Offical Date: Sat, 11 Feb 2023 03:05:21 +0100 Subject: [PATCH 039/120] Update auth-policies.mdx --- apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx index b79c6e038b7..17e81a174b2 100644 --- a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx +++ b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx @@ -157,7 +157,7 @@ Supabase comes with two built-in helper functions: `auth.uid()` and `auth.jwt()` To create your own functions, navigate to the SQL editor and create a a new query. ``` -create or replace function auth.useragent() returns text as $$ +create or replace function useragent() returns text as $$ select nullif(current_setting('request.headers', true)::json->>'user-agent', '')::text; $$ language sql; ``` From d1be8c2d80455ac15412d7add4cbc65d56ffdd0d Mon Sep 17 00:00:00 2001 From: aar2dee2 <85004512+aar2dee2@users.noreply.github.com> Date: Sat, 11 Feb 2023 23:31:04 +0530 Subject: [PATCH 040/120] Use `\copy` instead of `copy` to upload data with the `postgres` role With the recent Supabase migration, where the `postgres` role is no longer a `superuser`, the "COPY" commands throws an error ``` ERROR: must be superuser or a member of the pg_read_server_files role to COPY from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone. ``` --- apps/docs/pages/guides/database/tables.mdx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index 13fd0bfa2bd..535da8bcb9d 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -242,8 +242,15 @@ You would [connect](../../guides/database/connecting-to-postgres#direct-connecti ```bash psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ - -c "COPY movies FROM './movies.csv';" + -c "\COPY movies FROM './movies.csv';" ``` +Additionally use the `DELIMITER`, `HEADER` and `FORMAT` options as defined in the PostgreSQL [COPY](https://www.postgresql.org/docs/current/sql-copy.html) docs. +```bash +psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ + -c "\COPY movies FROM './movies.csv' WITH DELIMITER ',' CSV HEADER" +``` + +Tip: If you get a `FATAL: password authentication failed for user "postgres"` error, reset the password in your Database settings and try again. ## Joining tables with Foreign Keys From 8a1e8f3db54ce384d6ba89204ef5003134dcdede Mon Sep 17 00:00:00 2001 From: Steve Phuc Date: Sun, 12 Feb 2023 06:48:04 +0200 Subject: [PATCH 041/120] Update plv8.mdx ret result --- apps/docs/pages/guides/database/extensions/plv8.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/docs/pages/guides/database/extensions/plv8.mdx b/apps/docs/pages/guides/database/extensions/plv8.mdx index eb408b2c30f..3149c354dd3 100644 --- a/apps/docs/pages/guides/database/extensions/plv8.mdx +++ b/apps/docs/pages/guides/database/extensions/plv8.mdx @@ -135,6 +135,8 @@ returns setof messages as $$ return json_result; $$ language plv8; + +select * from get_messages(); ``` ## Resources From 3486afa229e43cf4d314bd6ad0b985dcf55eafc9 Mon Sep 17 00:00:00 2001 From: Ruggero Tomaselli Date: Fri, 27 Jan 2023 13:21:18 +0000 Subject: [PATCH 042/120] Add package-lock.json to studio workflows --- .github/workflows/studio-build.yml | 1 + .github/workflows/studio-tests.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/studio-build.yml b/.github/workflows/studio-build.yml index 570baa1aa61..35d1f97b8b1 100644 --- a/.github/workflows/studio-build.yml +++ b/.github/workflows/studio-build.yml @@ -7,6 +7,7 @@ on: - studio paths: - 'studio/**' + - 'package-lock.json' jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/studio-tests.yml b/.github/workflows/studio-tests.yml index 1a99a50182d..72a84549568 100644 --- a/.github/workflows/studio-tests.yml +++ b/.github/workflows/studio-tests.yml @@ -8,10 +8,12 @@ on: branches: [master] paths: - 'studio/**' + - 'package-lock.json' pull_request: branches: [master] paths: - 'studio/**' + - 'package-lock.json' jobs: build: runs-on: ubuntu-latest From 47ab1b9818894fd60f769d03ef56b7ac14742a2f Mon Sep 17 00:00:00 2001 From: Isaiah Hamilton Date: Sun, 12 Feb 2023 14:55:12 -0500 Subject: [PATCH 043/120] update to show alpha label --- studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.ts b/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.ts index 8ea9c65ca30..774ad0fb2a7 100644 --- a/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.ts +++ b/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.ts @@ -26,6 +26,7 @@ export const generateDatabaseMenu = (project?: Project): ProductMenuGroup[] => { name: 'Functions', key: 'functions', url: `/project/${ref}/database/functions`, + label: 'ALPHA', items: [], }, { From 45f2b474eaf47e27dbb2963d68bd3325fb89aff7 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 13 Feb 2023 09:12:26 +1100 Subject: [PATCH 044/120] Update docs for auth.getUser() to add reference to auth.getSession() as a faster alternative --- spec/supabase_js_v2.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/supabase_js_v2.yml b/spec/supabase_js_v2.yml index b4d3080a4e4..f06ca19edc5 100644 --- a/spec/supabase_js_v2.yml +++ b/spec/supabase_js_v2.yml @@ -356,6 +356,7 @@ functions: notes: | - This method gets the user object from the current session. - Fetches the user object from the database instead of local session. + - Should be used only when you require the most current user data. For faster results, `getSession().session.user` is recommended. examples: - id: get-the-logged-in-user-with-the-current-existing-session name: Get the logged in user with the current existing session From 4ea826682bed3e2f8b43740b60ae54357607117c Mon Sep 17 00:00:00 2001 From: Isaiah Hamilton Date: Mon, 13 Feb 2023 23:32:56 -0500 Subject: [PATCH 045/120] improve seo --- apps/docs/data/authProviders.ts | 2 +- .../AuthWidget/AuthWidgetSection.tsx | 82 ++- apps/www/components/Blog/BlogListItem.tsx | 1 + .../components/Carousels/ImageCarousel.tsx | 1 + apps/www/components/ImageGrid.tsx | 8 +- apps/www/pages/blog.tsx | 1 + apps/www/pages/blog/[slug].tsx | 2 + apps/www/pages/brand-assets.tsx | 7 +- apps/www/pages/launch-week/index.tsx | 473 ++++++++++-------- apps/www/pages/partners/[slug].tsx | 4 +- 10 files changed, 337 insertions(+), 244 deletions(-) diff --git a/apps/docs/data/authProviders.ts b/apps/docs/data/authProviders.ts index 44958476ba6..ea5855061bd 100644 --- a/apps/docs/data/authProviders.ts +++ b/apps/docs/data/authProviders.ts @@ -107,7 +107,7 @@ const authProviders = [ supporter: 'MessageBird', platform: true, selfHosted: true, - authType: 'phone' + authType: 'phone', }, { name: 'Notion', diff --git a/apps/www/components/AuthWidget/AuthWidgetSection.tsx b/apps/www/components/AuthWidget/AuthWidgetSection.tsx index 047ff5c4ac7..275786e644f 100644 --- a/apps/www/components/AuthWidget/AuthWidgetSection.tsx +++ b/apps/www/components/AuthWidget/AuthWidgetSection.tsx @@ -3,6 +3,7 @@ import { Button } from 'ui' import { useState } from 'react' // Import Swiper React components import { useRouter } from 'next/router' +import Image from 'next/image' import { ColorSwatchIcon, MenuIcon } from '@heroicons/react/outline' import { Auth, ThemeSupa } from '@supabase/auth-ui-react' @@ -120,7 +121,14 @@ function AuthWidgetSection() { match your brand and aesthetic

- +
+ react icon +
React only. Other frameworks coming soon.
@@ -204,14 +212,22 @@ function AuthWidgetSection() { : '', ].join(' ')} > - - +
+ react icon +
+
+ react icon +
diff --git a/apps/www/components/Blog/BlogListItem.tsx b/apps/www/components/Blog/BlogListItem.tsx index bc77f543bf7..c08b5006db7 100644 --- a/apps/www/components/Blog/BlogListItem.tsx +++ b/apps/www/components/Blog/BlogListItem.tsx @@ -58,6 +58,7 @@ const BlogListItem = ({ post }: Props) => { {`${author.author} -
+
{x.alt}
diff --git a/apps/www/pages/blog/[slug].tsx b/apps/www/pages/blog/[slug].tsx index f5762169a36..1d612ab7b95 100644 --- a/apps/www/pages/blog/[slug].tsx +++ b/apps/www/pages/blog/[slug].tsx @@ -209,6 +209,7 @@ function BlogPostPage(props: any) { {`${author.author} {props.blog.title} diff --git a/apps/www/pages/brand-assets.tsx b/apps/www/pages/brand-assets.tsx index e29ca0ee249..72eb3c161c5 100644 --- a/apps/www/pages/brand-assets.tsx +++ b/apps/www/pages/brand-assets.tsx @@ -49,7 +49,12 @@ const Index = () => {
- + Supabase logo Preview
diff --git a/apps/www/pages/launch-week/index.tsx b/apps/www/pages/launch-week/index.tsx index 113e177a1b0..d6b8ce5e077 100644 --- a/apps/www/pages/launch-week/index.tsx +++ b/apps/www/pages/launch-week/index.tsx @@ -1,5 +1,4 @@ // @ts-nocheck - import { NextSeo } from 'next-seo' import _days from '~/components/LaunchWeek/lw6_days.json' @@ -19,6 +18,7 @@ import { WeekDayProps } from '~/components/LaunchWeek/types' import styles from './launchWeek.module.css' import Image from 'next/image' +import Link from 'next/link' const days = _days as WeekDayProps[] const constellation = [ @@ -122,33 +122,51 @@ export default function launchweek() { const SectionButtons = ({ blog, docs, video }) => { return (
- -
- Blog post -
- -
-
-
- {docs && ( - + +
- Docs + Blog post
- + blog post icon
+ + {docs && ( + + +
+ Docs +
+ docs icon +
+
+
+ )} {video && ( - - ) @@ -181,12 +199,11 @@ export default function launchweek() { >
- Launch Week logo

Dec 12 – 16 at 6 AM PT | 9 AM ET

@@ -228,9 +245,10 @@ export default function launchweek() { Ant & Copple + />
Who we hire at Supabase @@ -238,22 +256,34 @@ export default function launchweek() {
- - @@ -263,9 +293,10 @@ export default function launchweek() {
Outro icon + />
Wrap Up @@ -273,14 +304,20 @@ export default function launchweek() {
@@ -433,6 +470,7 @@ export default function launchweek() { ? '/images/launchweek/mfa-dark.png' : '/images/launchweek/mfa-light.png' } + alt="MFA" layout="fill" objectFit="cover" quality={100} @@ -446,6 +484,7 @@ export default function launchweek() { ? '/images/launchweek/mfa-dark-hover.png' : '/images/launchweek/mfa-light-hover.png' } + alt="MFA" layout="fill" objectFit="cover" quality={100} @@ -492,6 +531,7 @@ export default function launchweek() { ? '/images/launchweek/wrappers-visual.svg' : '/images/launchweek/wrappers-visual-light.svg' } + alt="Wrappers" layout="fill" objectFit="cover" quality={100} @@ -508,6 +548,7 @@ export default function launchweek() { ? '/images/launchweek/wrappers-visual-hover.svg' : '/images/launchweek/wrappers-visual-hover-light.svg' } + alt="Wrappers" layout="fill" objectFit="cover" quality={100} @@ -559,6 +600,7 @@ export default function launchweek() { ? '/images/launchweek/vault-visual.svg' : '/images/launchweek/vault-visual-light.svg' } + alt="Vault" layout="fill" objectFit="cover" quality={100} @@ -575,6 +617,7 @@ export default function launchweek() { ? '/images/launchweek/vault-visual-hover.svg' : '/images/launchweek/vault-visual-hover-light.svg' } + alt="Vault" layout="fill" objectFit="cover" quality={100} @@ -601,6 +644,7 @@ export default function launchweek() { ? '/images/launchweek/TCE-visual.svg' : '/images/launchweek/TCE-visual-light.svg' } + alt="TCE" layout="fill" objectFit="cover" quality={100} @@ -617,6 +661,7 @@ export default function launchweek() { ? '/images/launchweek/TCE-visual-hover.svg' : '/images/launchweek/TCE-visual-hover-light.svg' } + alt="TCE" layout="fill" objectFit="cover" quality={100} @@ -648,6 +693,7 @@ export default function launchweek() { ? '/images/launchweek/community-visual.svg' : '/images/launchweek/community-visual-light.svg' } + alt="Community" layout="fill" objectFit="cover" quality={100} @@ -664,6 +710,7 @@ export default function launchweek() { ? '/images/launchweek/community-visual-hover.svg' : '/images/launchweek/community-visual-light-hover.svg' } + alt="Community" layout="fill" objectFit="cover" quality={100} @@ -675,68 +722,64 @@ export default function launchweek() {
- -
- Blog post - - - - @@ -755,6 +798,7 @@ export default function launchweek() { ? '/images/launchweek/PgGraphql-visual.svg' : '/images/launchweek/PgGraphql-visual-light.svg' } + alt="PgGraphql" layout="fill" objectFit="cover" quality={100} @@ -771,6 +815,7 @@ export default function launchweek() { ? '/images/launchweek/PgGraphql-visual-hover.svg' : '/images/launchweek/PgGraphql-visual-hover-light.svg' } + alt="PgGraphql" layout="fill" objectFit="cover" quality={100} @@ -800,6 +845,7 @@ export default function launchweek() { ? '/images/launchweek/custom-domains-visual.svg' : '/images/launchweek/custom-domains-visual-light.svg' } + alt="Custom Domains" layout="fill" objectFit="cover" quality={100} @@ -816,6 +862,7 @@ export default function launchweek() { ? '/images/launchweek/custom-domains-visual-hover.svg' : '/images/launchweek/custom-domains-visual-hover-light.svg' } + alt="Custom Domains" layout="fill" objectFit="cover" quality={100} @@ -845,6 +892,7 @@ export default function launchweek() { ? '/images/launchweek/PITR-visual.svg' : '/images/launchweek/PITR-visual-light.svg' } + alt="PITR" layout="fill" objectFit="cover" quality={100} @@ -861,6 +909,7 @@ export default function launchweek() { ? '/images/launchweek/PITR-visual-hover.svg' : '/images/launchweek/PITR-visual-hover-light.svg' } + alt="PITR" layout="fill" objectFit="cover" quality={100} @@ -890,6 +939,7 @@ export default function launchweek() { ? '/images/launchweek/pg_crdt-visual.svg' : '/images/launchweek/pg_crdt-visual-light.svg' } + alt="pg_crdt" layout="fill" objectFit="cover" quality={100} @@ -906,6 +956,7 @@ export default function launchweek() { ? '/images/launchweek/pg_crdt-visual-hover.svg' : '/images/launchweek/pg_crdt-visual-hover-light.svg' } + alt="pg_crdt" layout="fill" objectFit="cover" quality={100} @@ -935,6 +986,7 @@ export default function launchweek() { ? '/images/launchweek/postgres-visual.svg' : '/images/launchweek/postgres-visual-light.svg' } + alt="postgres" layout="fill" objectFit="cover" quality={100} @@ -951,6 +1003,7 @@ export default function launchweek() { ? '/images/launchweek/postgres-visual-hover.svg' : '/images/launchweek/postgres-visual-hover-light.svg' } + alt="postgres" layout="fill" objectFit="cover" quality={100} @@ -980,6 +1033,7 @@ export default function launchweek() { ? '/images/launchweek/PostgREST11-visual.svg' : '/images/launchweek/PostgREST11-visual-light.svg' } + alt="PostgREST11" layout="fill" objectFit="cover" quality={100} @@ -996,6 +1050,7 @@ export default function launchweek() { ? '/images/launchweek/PostgREST11-visual-hover.svg' : '/images/launchweek/PostgREST11-visual-hover-light.svg' } + alt="PostgREST11" layout="fill" objectFit="cover" quality={100} @@ -1039,14 +1094,11 @@ export default function launchweek() { The traditional parallel Hackathon is back! Build a new open source project with Supabase and you can win $1500 in GitHub sponsorships and a coveted Supabase Darkmode Keyboard! For more info check the{' '} - - blog post - + + + blog post + + .

@@ -1074,27 +1126,27 @@ export default function launchweek() { or if you just want to chill and watch people build, come and join us!

- - Join our Discord - + + + Join our Discord{' '} + + +

Submission

Submit your project through{' '} - - madewithsupabase.com - + + + madewithsupabase.com + + . All submissions must be open source and publically available. Submissions close Monday 19th Dec 00:01 AM PT.

@@ -1106,75 +1158,73 @@ export default function launchweek() { 'flex basis-1/3 flex-col px-5' )} > - -
- -

Supabase Cache Helpers

-

Previous Best Overall Project Winner

-
-
- -
- -

Super UI

-

Previous Best Overall Project Runner Up

-
-
- -
- -

Quid Faciam Hodie?

-

Winner Best Flutter Project

-
-
- -
- -

That Hot Dog Game

-

Previous Winner: Most Fun/Interesting

-
-
- -
- -

RepoWatch

-

Previous Winner Best Realtime Project

-
-
+ + +
+ link icon +

Supabase Cache Helpers

+

Previous Best Overall Project Winner

+
+
+ + + +
+ link icon +

Super UI

+

+ Previous Best Overall Project Runner Up +

+
+
+ + + +
+ link icon +

Quid Faciam Hodie?

+

Winner Best Flutter Project

+
+
+ + + +
+ link icon +

That Hot Dog Game

+

Previous Winner: Most Fun/Interesting

+
+
+ + + +
+ link icon +

RepoWatch

+

Previous Winner Best Realtime Project

+
+
+
@@ -1202,12 +1252,15 @@ export default function launchweek() { >
- - - + + + {`${creator.first_name} + +
) @@ -1227,12 +1280,14 @@ export default function launchweek() {

We worked with more than 30 content creators from around the world to drop a mountain of content simultaneously! - -

- + + +
+ See all the content + +
+
+

{activeCreator !== null && (
diff --git a/apps/www/pages/partners/[slug].tsx b/apps/www/pages/partners/[slug].tsx index dc498cae9fc..7ce29906765 100644 --- a/apps/www/pages/partners/[slug].tsx +++ b/apps/www/pages/partners/[slug].tsx @@ -115,12 +115,12 @@ function Partner({ partner }: { partner: Partner }) { {partner.video && (
-This guide gives you a quick overview of implementing basic CRUD operations using FlutterFlow and Supabase. You can find the full docs on FlutterFlow and Supabase [here](https://docs.flutterflow.io/actions/actions/backend-database/supabase). ## Step 1: Connect FlutterFlow to Supabase From 9fbea13dbbe723ec1bcc5a17a4f16a06edc05a4b Mon Sep 17 00:00:00 2001 From: Tyler <18113850+dshukertjr@users.noreply.github.com> Date: Thu, 16 Feb 2023 12:21:19 +0900 Subject: [PATCH 095/120] Update apps/docs/pages/guides/integrations/flutterflow.mdx Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- apps/docs/pages/guides/integrations/flutterflow.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/integrations/flutterflow.mdx b/apps/docs/pages/guides/integrations/flutterflow.mdx index 42c8d544860..cc2cbbcc0f0 100644 --- a/apps/docs/pages/guides/integrations/flutterflow.mdx +++ b/apps/docs/pages/guides/integrations/flutterflow.mdx @@ -13,7 +13,7 @@ export const meta = { This guide gives you a quick overview of implementing basic CRUD operations using FlutterFlow and Supabase. You can find the full docs on FlutterFlow and Supabase [here](https://docs.flutterflow.io/actions/actions/backend-database/supabase). > **Warning** -> FlutterFlow and Supabase integration is currently in alpha, and supported features may be limited. +> FlutterFlow and Supabase integration is currently in alpha, and supported features may be limited.
+
You can find a full write up in our previous blog post: [Storing OpenAI embeddings in Postgres with pgvector](https://supabase.com/blog/openai-embeddings-postgres-vector). @@ -90,13 +90,13 @@ A few weeks ago I received an email, drawing our attention to a [Pull Request](h After we merged the PR, I reached out to see if Greg was interested in helping with some documentation or a blog post to help the community to use pgvector. On the call, Greg surprised me with an initial prototype where he had ingested the Supabase docs for a ChatGPT-like experience. I was suitably impressed and suggested that we could explore ways to work together to build it into the Supabase docs. He wasted no time:
- +
### A friendly collaboration From 74175ec11216b1ba9f64b964d8e8e632073a8617 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 16 Feb 2023 13:35:40 +0800 Subject: [PATCH 104/120] Update 2021-02-09-case-study-roboflow.mdx --- apps/www/_blog/2021-02-09-case-study-roboflow.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/www/_blog/2021-02-09-case-study-roboflow.mdx b/apps/www/_blog/2021-02-09-case-study-roboflow.mdx index 6d4baeb302b..97888890d83 100644 --- a/apps/www/_blog/2021-02-09-case-study-roboflow.mdx +++ b/apps/www/_blog/2021-02-09-case-study-roboflow.mdx @@ -9,7 +9,8 @@ authorURL: https://github.com/roryw10 image: roboflow-og.png thumb: roboflow-website.png tags: - - case-studyai + - case-study + - AI date: '02-09-2021' --- From 077cfe02bf88c08b133daac0c54552cfd976ba05 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 16 Feb 2023 13:36:40 +0800 Subject: [PATCH 105/120] formatting --- ...2-03-openai-embeddings-postgres-vector.mdx | 19 ++++++------- .../2023-02-07-chatgpt-supabase-docs.mdx | 28 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx b/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx index a866367a9ef..e6c7aa2fe4f 100644 --- a/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx +++ b/apps/www/_blog/2023-02-03-openai-embeddings-postgres-vector.mdx @@ -13,7 +13,7 @@ toc_depth: 3 A new PostgreSQL extension is now available in Supabase: [`pgvector`](https://github.com/pgvector/pgvector), an open-source vector similarity search. -The exponential progress of AI functionality over the past year has inspired many new real world applications. One specific challenge has been the ability to store and query _embeddings_ at scale. +The exponential progress of AI functionality over the past year has inspired many new real world applications. One specific challenge has been the ability to store and query _embeddings_ at scale. In this post we'll explain what embeddings are, why we might want to use them, and how we can store and query them in PostgreSQL using `pgvector`. ## What are embeddings? @@ -88,12 +88,11 @@ create extension vector; Next let's create a table to store our documents and their embeddings: ```sql -create table - documents ( - id bigserial primary key, - content text, - embedding vector (1536) - ); +create table documents ( + id bigserial primary key, + content text, + embedding vector (1536) +); ``` `pgvector` introduces a new data type called `vector`. In the code above, we create a column named `embedding` with the `vector` data type. The size of the vector defines how many dimensions the vector holds. OpenAI's `text-embedding-ada-002` model outputs 1536 dimensions, so we will use that for our vector size. @@ -148,9 +147,9 @@ Once your table starts to grow with embeddings, you will likely want to add an i Each distance operator requires a different type of index. We expect to order by cosine distance, so we need `vector_cosine_ops` index. A good starting number of lists is 4 \* sqrt(table_rows): ```sql -create index on documents using ivfflat (embedding vector_cosine_ops) -with - (lists = 100); +create index on documents +using ivfflat (embedding vector_cosine_ops) +with (lists = 100); ``` You can read more about indexing on `pgvector`'s GitHub page [here](https://github.com/pgvector/pgvector#indexing). diff --git a/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx b/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx index 0773f7c9713..bce1784c0f6 100644 --- a/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx +++ b/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx @@ -55,13 +55,13 @@ It's built with Supabase/Postgres, and consists of several key parts: All the changes we made are in [this](https://github.com/supabase/supabase/pull/12056) Pull Request. Greg is here to explain every step in full detail:
- +
You can find a full write up in our previous blog post: [Storing OpenAI embeddings in Postgres with pgvector](https://supabase.com/blog/openai-embeddings-postgres-vector). @@ -90,13 +90,13 @@ A few weeks ago I received an email, drawing our attention to a [Pull Request](h After we merged the PR, I reached out to see if Greg was interested in helping with some documentation or a blog post to help the community to use pgvector. On the call, Greg surprised me with an initial prototype where he had ingested the Supabase docs for a ChatGPT-like experience. I was suitably impressed and suggested that we could explore ways to work together to build it into the Supabase docs. He wasted no time:
- +
### A friendly collaboration From 5320d4695df4adbbbadb30bf1e1346e5487050e2 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 16 Feb 2023 13:50:12 +0800 Subject: [PATCH 106/120] update feeds and sitemap --- .../planetpg-angelico_de_los_reyes-rss.xml | 10 ++-- apps/www/public/planetpg-ant_wilson-rss.xml | 4 +- apps/www/public/planetpg-burggraf-rss.xml | 6 +-- apps/www/public/planetpg-michel-rss.xml | 6 +-- apps/www/public/planetpg-oli_rice-rss.xml | 6 +-- .../public/planetpg-paul_copplestone-rss.xml | 10 ++-- apps/www/public/planetpg-pavel-rss.xml | 6 +-- apps/www/public/planetpg-steve_chavez-rss.xml | 6 +-- apps/www/public/planetpg-victor-rss.xml | 8 +-- apps/www/public/sitemap_www.xml | 50 ++++++++++++++----- 10 files changed, 68 insertions(+), 44 deletions(-) diff --git a/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml b/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml index 84fe8fab257..36e68b1f254 100644 --- a/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml +++ b/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml @@ -5,35 +5,35 @@ https://supabase.com/blog Latest Postgres news from Angelico de los Reyes at Supabase en - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/postgres-point-in-time-recovery Point in Time Recovery is now available for Pro projects https://supabase.com/blog/postgres-point-in-time-recovery We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use. - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/continuous-postgresql-backup-walg Continuous PostgreSQL Backups using WAL-G https://supabase.com/blog/continuous-postgresql-backup-walg Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G. - Sun, 02 Aug 2020 02:02:30 +0000 + Sat, 01 Aug 2020 16:04:00 +0000 https://supabase.com/blog/postgresql-templates What are PostgreSQL Templates? https://supabase.com/blog/postgresql-templates What are PostgreSQL templates and what are they used for? - Thu, 09 Jul 2020 02:02:30 +0000 + Wed, 08 Jul 2020 16:04:00 +0000 https://supabase.com/blog/postgresql-physical-logical-backups Physical vs Logical Backups in PostgreSQL https://supabase.com/blog/postgresql-physical-logical-backups What are physical and logical backups in Postgres? - Tue, 07 Jul 2020 02:02:30 +0000 + Mon, 06 Jul 2020 16:04:00 +0000 diff --git a/apps/www/public/planetpg-ant_wilson-rss.xml b/apps/www/public/planetpg-ant_wilson-rss.xml index 07cfe4056b8..e5267c09b21 100644 --- a/apps/www/public/planetpg-ant_wilson-rss.xml +++ b/apps/www/public/planetpg-ant_wilson-rss.xml @@ -5,14 +5,14 @@ https://supabase.com/blog Latest Postgres news from Ant Wilson at Supabase en - Sat, 27 Feb 2021 03:03:30 +0000 + Fri, 26 Feb 2021 16:04:00 +0000 https://supabase.com/blog/cracking-postgres-interview Cracking PostgreSQL Interview Questions https://supabase.com/blog/cracking-postgres-interview Understand the top PostgreSQL Interview Questions - Sat, 27 Feb 2021 03:03:30 +0000 + Fri, 26 Feb 2021 16:04:00 +0000 diff --git a/apps/www/public/planetpg-burggraf-rss.xml b/apps/www/public/planetpg-burggraf-rss.xml index 26233a86f1e..8f72ecc9963 100644 --- a/apps/www/public/planetpg-burggraf-rss.xml +++ b/apps/www/public/planetpg-burggraf-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Mark Burggraf at Supabase en - Wed, 23 Nov 2022 03:03:30 +0000 + Wed, 23 Nov 2022 16:04:00 +0000 https://supabase.com/blog/sql-or-nosql-both-with-postgresql SQL or NoSQL? Why not use both (with PostgreSQL)? https://supabase.com/blog/sql-or-nosql-both-with-postgresql How to turn Postgres into an easy-to-use NoSQL database that retains all the power of SQL - Wed, 23 Nov 2022 03:03:30 +0000 + Wed, 23 Nov 2022 16:04:00 +0000 https://supabase.com/blog/postgres-wasm Postgres WASM by Snaplet and Supabase https://supabase.com/blog/postgres-wasm We're open sourcing postgres-wasm, a PostgresQL server that runs inside a browser, with our friends at Snaplet. - Sun, 02 Oct 2022 02:02:30 +0000 + Sun, 02 Oct 2022 16:04:00 +0000 diff --git a/apps/www/public/planetpg-michel-rss.xml b/apps/www/public/planetpg-michel-rss.xml index 3bcd14a76b8..64a880de00b 100644 --- a/apps/www/public/planetpg-michel-rss.xml +++ b/apps/www/public/planetpg-michel-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Michel Pelletier at Supabase en - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/vault-now-in-beta Supabase Vault is now in Beta https://supabase.com/blog/vault-now-in-beta A Postgres extension to store encrypted secrets and encrypt data. - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/transparent-column-encryption-with-postgres Transparent Column Encryption with Postgres https://supabase.com/blog/transparent-column-encryption-with-postgres Using pgsodium's Transparent Column Encryption to encrypt data and provide your users with row-level encryption. - Wed, 30 Nov 2022 03:03:30 +0000 + Wed, 30 Nov 2022 16:04:00 +0000 diff --git a/apps/www/public/planetpg-oli_rice-rss.xml b/apps/www/public/planetpg-oli_rice-rss.xml index 77f01e50bdf..92868dfd004 100644 --- a/apps/www/public/planetpg-oli_rice-rss.xml +++ b/apps/www/public/planetpg-oli_rice-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Oliver Rice at Supabase en - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/pg-graphql-v1 pg_graphql v1.0 https://supabase.com/blog/pg-graphql-v1 Announcing the v1.0 release of pg_graphql - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/audit Postgres Auditing in 150 lines of SQL https://supabase.com/blog/audit PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL. - Mon, 07 Mar 2022 03:03:30 +0000 + Mon, 07 Mar 2022 16:04:00 +0000 diff --git a/apps/www/public/planetpg-paul_copplestone-rss.xml b/apps/www/public/planetpg-paul_copplestone-rss.xml index a1da81917d4..4a5aa3e817b 100644 --- a/apps/www/public/planetpg-paul_copplestone-rss.xml +++ b/apps/www/public/planetpg-paul_copplestone-rss.xml @@ -5,35 +5,35 @@ https://supabase.com/blog Latest Postgres news from Paul Copplestone at Supabase en - Fri, 09 Dec 2022 03:03:30 +0000 + Fri, 09 Dec 2022 16:04:00 +0000 https://supabase.com/blog/postgres-crdt pg_crdt - an experimental CRDT extension for Postgres https://supabase.com/blog/postgres-crdt Embedding Yjs and Automerge into Postgres for collaborative applications. - Fri, 09 Dec 2022 03:03:30 +0000 + Fri, 09 Dec 2022 16:04:00 +0000 https://supabase.com/blog/partial-postgresql-data-dumps-with-rls Partial data dumps using Postgres Row Level Security https://supabase.com/blog/partial-postgresql-data-dumps-with-rls Using RLS to create seed files for local PostgreSQL testing. - Mon, 27 Jun 2022 02:02:30 +0000 + Mon, 27 Jun 2022 16:04:00 +0000 https://supabase.com/blog/postgres-as-a-cron-server Postgres as a CRON Server https://supabase.com/blog/postgres-as-a-cron-server Running repetitive tasks with your Postgres database. - Fri, 05 Mar 2021 03:03:30 +0000 + Thu, 04 Mar 2021 16:04:00 +0000 https://supabase.com/blog/postgresql-views Postgres Views https://supabase.com/blog/postgresql-views Creating and using a view in PostgreSQL. - Wed, 18 Nov 2020 03:03:30 +0000 + Tue, 17 Nov 2020 16:04:00 +0000 diff --git a/apps/www/public/planetpg-pavel-rss.xml b/apps/www/public/planetpg-pavel-rss.xml index e6dbbb4c1fe..9f6f7667f58 100644 --- a/apps/www/public/planetpg-pavel-rss.xml +++ b/apps/www/public/planetpg-pavel-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Pavel Borisov at Supabase en - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/new-in-postgres-15 What's new in Postgres 15? https://supabase.com/blog/new-in-postgres-15 Describes the release of Postgres 15, new features and reasons to use it - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/postgresql-commitfest What is PostgreSQL commitfest and how to contribute https://supabase.com/blog/postgresql-commitfest A time-tested method for contributing to the core Postgres code - Wed, 26 Oct 2022 02:02:30 +0000 + Wed, 26 Oct 2022 16:04:00 +0000 diff --git a/apps/www/public/planetpg-steve_chavez-rss.xml b/apps/www/public/planetpg-steve_chavez-rss.xml index 575cafb6b06..2630daa3f55 100644 --- a/apps/www/public/planetpg-steve_chavez-rss.xml +++ b/apps/www/public/planetpg-steve_chavez-rss.xml @@ -5,21 +5,21 @@ https://supabase.com/blog Latest Postgres news from Steve Chavez at Supabase en - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/postgrest-11-prerelease PostgREST 11 pre-release https://supabase.com/blog/postgrest-11-prerelease Describes new features of PostgREST 11 pre-release - Thu, 15 Dec 2022 03:03:30 +0000 + Thu, 15 Dec 2022 16:04:00 +0000 https://supabase.com/blog/roles-postgres-hooks Protecting reserved roles with PostgreSQL Hooks https://supabase.com/blog/roles-postgres-hooks Using Postgres Hooks to protect functionality in your Postgres database. - Thu, 01 Jul 2021 02:02:30 +0000 + Thu, 01 Jul 2021 16:04:00 +0000 diff --git a/apps/www/public/planetpg-victor-rss.xml b/apps/www/public/planetpg-victor-rss.xml index e742fb6eec8..5b38b784b2c 100644 --- a/apps/www/public/planetpg-victor-rss.xml +++ b/apps/www/public/planetpg-victor-rss.xml @@ -5,28 +5,28 @@ https://supabase.com/blog Latest Postgres news from Victor at Supabase en - Thu, 13 Oct 2022 02:02:30 +0000 + Thu, 13 Oct 2022 16:04:00 +0000 https://supabase.com/blog/postgres-full-text-search-vs-the-rest Postgres Full Text Search vs the rest https://supabase.com/blog/postgres-full-text-search-vs-the-rest Comparing one of the most popular Postgres features against alternatives - Thu, 13 Oct 2022 02:02:30 +0000 + Thu, 13 Oct 2022 16:04:00 +0000 https://supabase.com/blog/choosing-a-postgres-primary-key Choosing a Postgres Primary Key https://supabase.com/blog/choosing-a-postgres-primary-key Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out - Wed, 07 Sep 2022 02:02:30 +0000 + Wed, 07 Sep 2022 16:04:00 +0000 https://supabase.com/blog/seen-by-in-postgresql Implementing "seen by" functionality with Postgres https://supabase.com/blog/seen-by-in-postgresql Different approaches for tracking visitor counts with PostgreSQL. - Sun, 17 Jul 2022 02:02:30 +0000 + Sun, 17 Jul 2022 16:04:00 +0000 diff --git a/apps/www/public/sitemap_www.xml b/apps/www/public/sitemap_www.xml index 1f593cac4b6..a0922df9c0d 100644 --- a/apps/www/public/sitemap_www.xml +++ b/apps/www/public/sitemap_www.xml @@ -60,12 +60,6 @@ 0.5 - - https://supabase.com/contact/mfa - weekly - 0.5 - - https://supabase.com/blog/ weekly @@ -73,13 +67,7 @@ - https://supabase.com/edge-functions - weekly - 0.5 - - - - https://supabase.com/legal/dpa + https://supabase.com/contact/mfa weekly 0.5 @@ -90,12 +78,24 @@ 0.5 + + https://supabase.com/edge-functions + weekly + 0.5 + + https://supabase.com/launch-week/ticket-image weekly 0.5 + + https://supabase.com/legal/dpa + weekly + 0.5 + + https://supabase.com/nextjs weekly @@ -1034,6 +1034,30 @@ 0.5 + + https://supabase.com/blog/openai-embeddings-postgres-vector + weekly + 0.5 + + + + https://supabase.com/blog/chatgpt-supabase-docs + weekly + 0.5 + + + + https://supabase.com/blog/supabase-beta-january-2023 + weekly + 0.5 + + + + https://supabase.com/blog/flutter-real-time-multiplayer-game + weekly + 0.5 + + https://supabase.com/alternatives/supabase-vs-firebase weekly From 0c18aa21d553c37dab49294ff841830e0e18b230 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 16 Feb 2023 14:45:56 +0800 Subject: [PATCH 107/120] small UI updates to extensions page --- apps/docs/components/Extensions.js | 38 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/apps/docs/components/Extensions.js b/apps/docs/components/Extensions.js index 47753d6bfde..d03780463c8 100644 --- a/apps/docs/components/Extensions.js +++ b/apps/docs/components/Extensions.js @@ -1,33 +1,37 @@ +import Link from 'next/link' import React, { useState } from 'react' +import { GlassPanel, IconSearch, Input } from 'ui' import extensions from '../data/extensions.json' export default function Extensions() { const [filter, setFilter] = useState('') return ( <> -
- - + } + value={filter} onChange={(e) => setFilter(e.target.value)} />
-
+
{extensions .filter((x) => x.name.indexOf(filter) >= 0) .map((extension) => ( -
-
-

- {extension.name} -

-

- {extension.comment.charAt(0).toUpperCase() + extension.comment.slice(1)} -

-
-
+ + + {extension.name}} + background={false} + key={extension.name} + > +

+ {extension.comment.charAt(0).toUpperCase() + extension.comment.slice(1)} +

+
+
+ ))}
From bee7b06fc6bc9f1b42352beb293a01a197200b9e Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 16 Feb 2023 12:20:20 +0800 Subject: [PATCH 108/120] Update config cat implementation as per their latest docs --- studio/components/ui/Flag/FlagProvider.tsx | 49 +++++++++++----------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/studio/components/ui/Flag/FlagProvider.tsx b/studio/components/ui/Flag/FlagProvider.tsx index bcbb1b05347..0ba89597d3d 100644 --- a/studio/components/ui/Flag/FlagProvider.tsx +++ b/studio/components/ui/Flag/FlagProvider.tsx @@ -1,41 +1,42 @@ import { FC, useEffect, useState } from 'react' -import createConfigCatClient from 'configcat-js' -import FlagContext from './FlagContext' -import { IS_PLATFORM } from 'lib/constants' -import { useStore } from 'hooks' import { observer } from 'mobx-react-lite' +import * as configcat from 'configcat-js' + import { User } from 'types' +import { useStore } from 'hooks' +import { IS_PLATFORM } from 'lib/constants' +import FlagContext from './FlagContext' const FlagProvider: FC = ({ children }) => { - const [store, setStore] = useState({}) const { ui } = useStore() - const { Provider } = FlagContext const { profile } = ui + const { Provider } = FlagContext + const [store, setStore] = useState({}) + useEffect(() => { + // [Joshen] getFlags get triggered everytime the tab refocuses but this should be okay + // as per https://configcat.com/docs/sdk-reference/js/#polling-modes: + // The polling downloads the config.json at the set interval and are stored in the internal cache + // which subsequently all getValueAsync() calls are served from there if (IS_PLATFORM) getFlags(profile) }, [profile]) const getFlags = async (user?: User) => { - const setFlagValues = async () => { - const flagValues = - user !== undefined - ? await client.getAllValuesAsync({ identifier: user.primary_email }) - : await client.getAllValuesAsync() - const flagStore: any = {} - - flagValues.forEach((item: any) => { - flagStore[item.settingKey] = item.settingValue - }) - setStore(flagStore) - } - - const client = createConfigCatClient(process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', { - configChanged: setFlagValues, - pollIntervalSeconds: 600, + const flagStore: any = {} + const client = configcat.getClient( + process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', + configcat.PollingMode.AutoPoll, + { pollIntervalSeconds: 10 } + ) + const flagValues = + user !== undefined + ? await client.getAllValuesAsync(new configcat.User(user.primary_email)) + : await client.getAllValuesAsync() + flagValues.forEach((item: any) => { + flagStore[item.settingKey] = item.settingValue }) - - await setFlagValues() + setStore(flagStore) } return {children} From ca1a17a2d0c0ffd6a42a5ef4316e413a53a41eec Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 16 Feb 2023 14:52:12 +0800 Subject: [PATCH 109/120] Store configcat client into provider state, make it a singleton --- studio/components/ui/Flag/FlagProvider.tsx | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/studio/components/ui/Flag/FlagProvider.tsx b/studio/components/ui/Flag/FlagProvider.tsx index 0ba89597d3d..172cfef0a4f 100644 --- a/studio/components/ui/Flag/FlagProvider.tsx +++ b/studio/components/ui/Flag/FlagProvider.tsx @@ -13,6 +13,7 @@ const FlagProvider: FC = ({ children }) => { const { Provider } = FlagContext const [store, setStore] = useState({}) + const [client, setClient] = useState() useEffect(() => { // [Joshen] getFlags get triggered everytime the tab refocuses but this should be okay @@ -23,16 +24,21 @@ const FlagProvider: FC = ({ children }) => { }, [profile]) const getFlags = async (user?: User) => { + let configcatClient = client + if (!configcatClient) { + configcatClient = configcat.getClient( + process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', + configcat.PollingMode.AutoPoll, + { pollIntervalSeconds: 10 } + ) + setClient(configcatClient) + } + const flagStore: any = {} - const client = configcat.getClient( - process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', - configcat.PollingMode.AutoPoll, - { pollIntervalSeconds: 10 } - ) const flagValues = user !== undefined - ? await client.getAllValuesAsync(new configcat.User(user.primary_email)) - : await client.getAllValuesAsync() + ? await configcatClient.getAllValuesAsync(new configcat.User(user.primary_email)) + : await configcatClient.getAllValuesAsync() flagValues.forEach((item: any) => { flagStore[item.settingKey] = item.settingValue }) From de1225effa6de044fd2815d4c1ff384f00ce9133 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 16 Feb 2023 14:57:24 +0800 Subject: [PATCH 110/120] Shift config cat client into a global singleton --- studio/components/ui/Flag/FlagProvider.tsx | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/studio/components/ui/Flag/FlagProvider.tsx b/studio/components/ui/Flag/FlagProvider.tsx index 172cfef0a4f..f719d9b0996 100644 --- a/studio/components/ui/Flag/FlagProvider.tsx +++ b/studio/components/ui/Flag/FlagProvider.tsx @@ -7,13 +7,18 @@ import { useStore } from 'hooks' import { IS_PLATFORM } from 'lib/constants' import FlagContext from './FlagContext' +let client: configcat.IConfigCatClient = configcat.getClient( + process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', + configcat.PollingMode.AutoPoll, + { pollIntervalSeconds: 10 } +) + const FlagProvider: FC = ({ children }) => { const { ui } = useStore() const { profile } = ui const { Provider } = FlagContext const [store, setStore] = useState({}) - const [client, setClient] = useState() useEffect(() => { // [Joshen] getFlags get triggered everytime the tab refocuses but this should be okay @@ -24,21 +29,11 @@ const FlagProvider: FC = ({ children }) => { }, [profile]) const getFlags = async (user?: User) => { - let configcatClient = client - if (!configcatClient) { - configcatClient = configcat.getClient( - process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', - configcat.PollingMode.AutoPoll, - { pollIntervalSeconds: 10 } - ) - setClient(configcatClient) - } - const flagStore: any = {} const flagValues = user !== undefined - ? await configcatClient.getAllValuesAsync(new configcat.User(user.primary_email)) - : await configcatClient.getAllValuesAsync() + ? await client.getAllValuesAsync(new configcat.User(user.primary_email)) + : await client.getAllValuesAsync() flagValues.forEach((item: any) => { flagStore[item.settingKey] = item.settingValue }) From d166ae4bbb6db795d5a908368161c94874774f22 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 16 Feb 2023 15:07:34 +0800 Subject: [PATCH 111/120] fix --- studio/components/ui/Flag/FlagProvider.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/studio/components/ui/Flag/FlagProvider.tsx b/studio/components/ui/Flag/FlagProvider.tsx index f719d9b0996..e521fec1a65 100644 --- a/studio/components/ui/Flag/FlagProvider.tsx +++ b/studio/components/ui/Flag/FlagProvider.tsx @@ -7,11 +7,7 @@ import { useStore } from 'hooks' import { IS_PLATFORM } from 'lib/constants' import FlagContext from './FlagContext' -let client: configcat.IConfigCatClient = configcat.getClient( - process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', - configcat.PollingMode.AutoPoll, - { pollIntervalSeconds: 10 } -) +let client: configcat.IConfigCatClient const FlagProvider: FC = ({ children }) => { const { ui } = useStore() @@ -29,6 +25,14 @@ const FlagProvider: FC = ({ children }) => { }, [profile]) const getFlags = async (user?: User) => { + if (!client) { + client = configcat.getClient( + process.env.NEXT_PUBLIC_CONFIGCAT_SDK_KEY ?? '', + configcat.PollingMode.AutoPoll, + { pollIntervalSeconds: 10 } + ) + } + const flagStore: any = {} const flagValues = user !== undefined From 3e05a320e71d425918a14e2a9e6f997b24a3e1f2 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Mon, 13 Feb 2023 18:19:28 +0800 Subject: [PATCH 112/120] Update database roles page to improve ui --- .../interfaces/Database/Roles/RoleRow.tsx | 114 ++++++++++++++++++ .../interfaces/Database/Roles/RolesList.tsx | 104 ++++++++++------ studio/pages/project/[ref]/database/roles.tsx | 2 +- 3 files changed, 185 insertions(+), 35 deletions(-) create mode 100644 studio/components/interfaces/Database/Roles/RoleRow.tsx diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx new file mode 100644 index 00000000000..f1b65d052c7 --- /dev/null +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -0,0 +1,114 @@ +import { FC } from 'react' +import { PostgresRole } from '@supabase/postgres-meta' +import { IconChevronUp, IconCheck, IconX, Collapsible } from 'ui' + +interface Props { + role: PostgresRole + isExpanded: boolean + onClick: () => void +} + +const RoleRow: FC = ({ role, isExpanded, onClick }) => { + return ( + + + + + +
+
+
+ {role.is_superuser ? ( + + ) : ( + + )} +

User is a Superuser

+
+
+ {role.can_login ? ( + + ) : ( + + )} +

User can login

+
+
+ {role.can_create_role ? ( + + ) : ( + + )} +

User can create roles

+
+
+ {role.can_create_db ? ( + + ) : ( + + )} +

User can create databases

+
+
+ {role.is_replication_role ? ( + + ) : ( + + )} +

+ User can initiate streaming replication and put the system in and out of backup mode +

+
+
+ {role.can_bypass_rls ? ( + + ) : ( + + )} +

User bypasses every row level security policy

+
+
+
+
+
+ ) +} + +export default RoleRow diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index fc46dc7b30c..9fd1ba80944 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,10 +1,12 @@ -import { FC } from 'react' +import { FC, useState } from 'react' import { observer } from 'mobx-react-lite' -import { IconChevronRight } from 'ui' +import * as Tooltip from '@radix-ui/react-tooltip' import { useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' -import Table from 'components/to-be-cleaned/Table' +import { FormHeader } from 'components/ui/Forms' +import { PostgresRole } from '@supabase/postgres-meta' +import RoleRow from './RoleRow' interface Props { onSelectRole: (role: any) => void @@ -13,43 +15,77 @@ interface Props { const RolesList: FC = ({ onSelectRole = () => {} }) => { const { meta } = useStore() const roles = meta.roles.list() + const [expandedRoleId, setExpandedRoleId] = useState() + + const connectionLimit = Math.max(...roles.map((role: PostgresRole) => role.connection_limit)) + const totalActiveConnections = roles + .map((role: PostgresRole) => role.active_connections) + .reduce((a, b) => a + b, 0) + const rolesWithActiveConnections = roles + .filter((role: PostgresRole) => role.active_connections > 0) + .sort((a, b) => b.active_connections - a.active_connections) return ( - <> - Name, - System ID, - Connections, - , - ]} - body={roles.map((x, i) => ( - onSelectRole(x)}> - -

{x.name}

-
- -

{x.id}

-
- -
-

- {x.active_connections}/{x.connection_limit} connections -

+
+
+ +
+ + +
0.9 * connectionLimit + ? 'bg-red-800' + : totalActiveConnections > 0.75 * connectionLimit + ? 'bg-amber-900' + : 'bg-green-800' + } + labelTop={`${totalActiveConnections}/${connectionLimit}`} + labelBottom="Active connections" />
- - - - - +
+ + +
+

Connection breakdown:

+ {rolesWithActiveConnections.map((role: PostgresRole) => ( +
+ {role.name}: {role.active_connections} +
+ ))} +
+
+
+
+
+ +
+ {roles.map((role: PostgresRole, i: number) => ( + { + if (expandedRoleId === role.id) setExpandedRoleId(undefined) + else setExpandedRoleId(role.id) + }} + /> ))} - /> - +
+
) } diff --git a/studio/pages/project/[ref]/database/roles.tsx b/studio/pages/project/[ref]/database/roles.tsx index 1cd86534d1c..9057f0cfa8e 100644 --- a/studio/pages/project/[ref]/database/roles.tsx +++ b/studio/pages/project/[ref]/database/roles.tsx @@ -10,7 +10,7 @@ const DatabaseRoles: NextPageWithLayout = () => { const [selectedRole, setSelectedRole] = useState() return ( -
+
{isUndefined(selectedRole) ? ( ) : ( From 1291d6d18af3bf37acbad56d715267da93b72168 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Mon, 13 Feb 2023 22:45:08 +0800 Subject: [PATCH 113/120] Scaffold UI for editing roles --- .../interfaces/Database/Roles/RoleRow.tsx | 262 ++++++++++++------ .../interfaces/Database/Roles/RolesList.tsx | 23 +- 2 files changed, 184 insertions(+), 101 deletions(-) diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx index f1b65d052c7..5b949af8dd6 100644 --- a/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -1,18 +1,81 @@ -import { FC } from 'react' +import { FC, useState, useRef } from 'react' import { PostgresRole } from '@supabase/postgres-meta' -import { IconChevronUp, IconCheck, IconX, Collapsible } from 'ui' +import { + Button, + Form, + Dropdown, + IconChevronUp, + IconCheck, + IconX, + Collapsible, + IconEdit3, + IconTrash, + IconMoreVertical, + Checkbox, +} from 'ui' interface Props { role: PostgresRole - isExpanded: boolean - onClick: () => void } -const RoleRow: FC = ({ role, isExpanded, onClick }) => { +const ROLE_PERMISSIONS: any = { + is_superuser: 'User is a Superuser', + can_login: 'User can login', + can_create_role: 'User can create roles', + can_create_db: 'User can create databases', + is_replication_role: + 'User can initiate streaming replication and put the system in and out of backup mode', + can_bypass_rls: 'User bypasses every row level security policy', +} + +const RoleRow: FC = ({ role }) => { + const [isExpanded, setIsExpanded] = useState(false) + const [isEditing, setIsEditing] = useState(false) + const [isSaving, setIsSaving] = useState(false) + const [isDeleting, setIsDeleting] = useState(false) + + const isEditingRef = useRef() + + const { + is_superuser, + can_login, + can_create_role, + can_create_db, + is_replication_role, + can_bypass_rls, + } = role + + const onSelectEdit = (event: any) => { + event.stopPropagation() + setIsExpanded(true) + setIsEditing(true) + isEditingRef.current = true + } + + const onCancelEdit = (event: any) => { + event.stopPropagation() + setIsEditing(false) + isEditingRef.current = false + } + + const onSaveChanges = async (values: any) => { + setIsSaving(true) + console.log(values) + setIsSaving(false) + } + return ( - = ({ role, isExpanded, onClick }) => { 'dark:hover:border-scale-700 data-open:border-scale-700', 'data-open:pb-px col-span-12 mx-auto', '-space-y-px overflow-hidden', - 'border border-b-0 last:border-b shadow transition hover:z-50', + 'border border-t-0 first:border-t first:!mt-0 hover:border-t hover:-mt-[1px] shadow transition hover:z-50', 'first:rounded-tl first:rounded-tr', 'last:rounded-bl last:rounded-br', ].join(' ')} > - - - - -
-
-
- {role.is_superuser ? ( - + + + +
+ ) : ( + + } + onClick={onSelectEdit} + > + Edit + + + } + onClick={() => setIsDeleting(true)} + > + Delete + + + } + > +
+ + + +
+ {isEditing ? ( +
+ {Object.keys(ROLE_PERMISSIONS).map((permission) => ( + + ))} +
) : ( - +
+ {Object.keys(ROLE_PERMISSIONS).map((permission) => ( +
+ {(role as any)[permission] ? ( + + ) : ( + + )} +

{ROLE_PERMISSIONS[permission]}

+
+ ))} +
)} -

User is a Superuser

-
- {role.can_login ? ( - - ) : ( - - )} -

User can login

-
-
- {role.can_create_role ? ( - - ) : ( - - )} -

User can create roles

-
-
- {role.can_create_db ? ( - - ) : ( - - )} -

User can create databases

-
-
- {role.is_replication_role ? ( - - ) : ( - - )} -

- User can initiate streaming replication and put the system in and out of backup mode -

-
-
- {role.can_bypass_rls ? ( - - ) : ( - - )} -

User bypasses every row level security policy

-
-
-
- - + + + )} + ) } diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index 9fd1ba80944..e7eac075fce 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,11 +1,12 @@ -import { FC, useState } from 'react' +import { FC } from 'react' import { observer } from 'mobx-react-lite' import * as Tooltip from '@radix-ui/react-tooltip' +import { PostgresRole } from '@supabase/postgres-meta' +import { Button, IconPlus } from 'ui' import { useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' import { FormHeader } from 'components/ui/Forms' -import { PostgresRole } from '@supabase/postgres-meta' import RoleRow from './RoleRow' interface Props { @@ -15,7 +16,6 @@ interface Props { const RolesList: FC = ({ onSelectRole = () => {} }) => { const { meta } = useStore() const roles = meta.roles.list() - const [expandedRoleId, setExpandedRoleId] = useState() const connectionLimit = Math.max(...roles.map((role: PostgresRole) => role.connection_limit)) const totalActiveConnections = roles @@ -32,7 +32,7 @@ const RolesList: FC = ({ onSelectRole = () => {} }) => { title="Database Roles" description="Manage access control to your database through users, groups, and permissions" /> -
+
@@ -60,7 +60,7 @@ const RolesList: FC = ({ onSelectRole = () => {} }) => { 'border border-scale-200 space-y-1', ].join(' ')} > -

Connection breakdown:

+

Connections by roles:

{rolesWithActiveConnections.map((role: PostgresRole) => (
{role.name}: {role.active_connections} @@ -69,20 +69,15 @@ const RolesList: FC = ({ onSelectRole = () => {} }) => {
+
{roles.map((role: PostgresRole, i: number) => ( - { - if (expandedRoleId === role.id) setExpandedRoleId(undefined) - else setExpandedRoleId(role.id) - }} - /> + ))}
From c5be23964c1eaed4742bf28e17be93e8d2e902bd Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 14 Feb 2023 16:16:10 +0800 Subject: [PATCH 114/120] Implement create and delete roles --- packages/ui/src/components/Modal/Modal.tsx | 7 +- packages/ui/src/components/Toggle/Toggle.tsx | 2 +- .../src/lib/Layout/FormLayout/FormLayout.tsx | 34 +-- packages/ui/src/lib/theme/defaultTheme.ts | 4 +- .../interfaces/Database/Roles/CreateRole.tsx | 171 ++++++++++++++ .../Database/Roles/DeleteRoleModal.tsx | 58 +++++ .../interfaces/Database/Roles/RoleRow.tsx | 214 ++++++++---------- .../Database/Roles/Roles.constants.ts | 27 +++ .../interfaces/Database/Roles/RolesList.tsx | 127 ++++++----- .../database/{roles.tsx => roles/index.tsx} | 0 .../project/[ref]/database/roles/new.tsx | 21 ++ studio/styles/ui.scss | 6 + 12 files changed, 473 insertions(+), 198 deletions(-) create mode 100644 studio/components/interfaces/Database/Roles/CreateRole.tsx create mode 100644 studio/components/interfaces/Database/Roles/DeleteRoleModal.tsx create mode 100644 studio/components/interfaces/Database/Roles/Roles.constants.ts rename studio/pages/project/[ref]/database/{roles.tsx => roles/index.tsx} (100%) create mode 100644 studio/pages/project/[ref]/database/roles/new.tsx diff --git a/packages/ui/src/components/Modal/Modal.tsx b/packages/ui/src/components/Modal/Modal.tsx index 4c536622e39..c475ab11ff1 100644 --- a/packages/ui/src/components/Modal/Modal.tsx +++ b/packages/ui/src/components/Modal/Modal.tsx @@ -125,7 +125,12 @@ const Modal = ({ - diff --git a/packages/ui/src/components/Toggle/Toggle.tsx b/packages/ui/src/components/Toggle/Toggle.tsx index 413c1725a1f..07f4654a7ff 100644 --- a/packages/ui/src/components/Toggle/Toggle.tsx +++ b/packages/ui/src/components/Toggle/Toggle.tsx @@ -11,7 +11,7 @@ interface Props extends Omit, 'size'> { layout?: 'horizontal' | 'vertical' | 'flex' error?: string descriptionText?: string - label?: string + label?: string | React.ReactNode afterLabel?: string beforeLabel?: string labelOptional?: string diff --git a/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx b/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx index d400ed44020..14262972430 100644 --- a/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx +++ b/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx @@ -86,9 +86,7 @@ export function FormLayout({ } else { dataInputContainerClasses.push(__styles.data_input_vertical_layout) if (align === 'right') { - dataInputContainerClasses.push( - __styles.data_input_vertical_layout__align_right - ) + dataInputContainerClasses.push(__styles.data_input_vertical_layout__align_right) } } @@ -128,10 +126,7 @@ export function FormLayout({ const renderDescription = descriptionText && (

{descriptionText} @@ -153,19 +148,14 @@ export function FormLayout({ > {labelled && (

+
+ +

Create a new role

+ {/* */} +
+ +
+ {({ isSubmitting, handleReset, values, initialValues }: any) => { + const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) + return ( + + +
+ } + > + Role Configuration}> + + + + + Role Privileges}> + +
+ {Object.keys(ROLE_PERMISSIONS).map((permission) => ( + + + + + + +
+ + This privilege cannot be granted via the dashboard + +
+
+ + ) + } + /> + ))} +
+
+
+ + ) + }} + +
+ + ) +} + +export default CreateRole diff --git a/studio/components/interfaces/Database/Roles/DeleteRoleModal.tsx b/studio/components/interfaces/Database/Roles/DeleteRoleModal.tsx new file mode 100644 index 00000000000..c4388e74ad0 --- /dev/null +++ b/studio/components/interfaces/Database/Roles/DeleteRoleModal.tsx @@ -0,0 +1,58 @@ +import { FC, useState } from 'react' +import { Modal } from 'ui' +import { PostgresRole } from '@supabase/postgres-meta' +import { useStore } from 'hooks' + +interface Props { + role: PostgresRole + visible: boolean + onClose: () => void +} + +const DeleteRoleModal: FC = ({ role, visible, onClose }) => { + const { ui, meta } = useStore() + const [isDeleting, setIsDeleting] = useState(false) + + const deleteRole = async () => { + if (!role) return console.error('Failed to delete role: role is missing') + + setIsDeleting(true) + const res: any = await meta.roles.del(role.id) + setIsDeleting(false) + if (res.error) { + return ui.setNotification({ + category: 'error', + message: `Failed to delete role: ${res.error.message}`, + }) + } else { + ui.setNotification({ + category: 'success', + message: `Successfully deleted role: "${role.name}"`, + }) + onClose() + } + } + + return ( + Confirm to delete role "{role?.name}"} + loading={isDeleting} + > +
+ +

+ This will automatically revoke any membership of this role in other roles, and this + action cannot be undone. +

+
+
+
+ ) +} + +export default DeleteRoleModal diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx index 5b949af8dd6..8f4bccd9e16 100644 --- a/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -1,40 +1,27 @@ -import { FC, useState, useRef } from 'react' +import { FC, useState } from 'react' +import * as Tooltip from '@radix-ui/react-tooltip' import { PostgresRole } from '@supabase/postgres-meta' import { Button, Form, Dropdown, IconChevronUp, - IconCheck, - IconX, + Toggle, Collapsible, - IconEdit3, IconTrash, + IconHelpCircle, IconMoreVertical, - Checkbox, } from 'ui' +import { ROLE_PERMISSIONS } from './Roles.constants' interface Props { role: PostgresRole + onSelectDelete: (role: PostgresRole) => void } -const ROLE_PERMISSIONS: any = { - is_superuser: 'User is a Superuser', - can_login: 'User can login', - can_create_role: 'User can create roles', - can_create_db: 'User can create databases', - is_replication_role: - 'User can initiate streaming replication and put the system in and out of backup mode', - can_bypass_rls: 'User bypasses every row level security policy', -} - -const RoleRow: FC = ({ role }) => { +const RoleRow: FC = ({ role, onSelectDelete }) => { const [isExpanded, setIsExpanded] = useState(false) - const [isEditing, setIsEditing] = useState(false) const [isSaving, setIsSaving] = useState(false) - const [isDeleting, setIsDeleting] = useState(false) - - const isEditingRef = useRef() const { is_superuser, @@ -45,19 +32,6 @@ const RoleRow: FC = ({ role }) => { can_bypass_rls, } = role - const onSelectEdit = (event: any) => { - event.stopPropagation() - setIsExpanded(true) - setIsEditing(true) - isEditingRef.current = true - } - - const onCancelEdit = (event: any) => { - event.stopPropagation() - setIsEditing(false) - isEditingRef.current = false - } - const onSaveChanges = async (values: any) => { setIsSaving(true) console.log(values) @@ -89,69 +63,50 @@ const RoleRow: FC = ({ role }) => { 'last:rounded-bl last:rounded-br', ].join(' ')} > - {({ handleReset }: any) => ( - { - if (!isEditingRef.current) setIsExpanded(!isExpanded) - }} - > - - - + {({ values, initialValues, handleReset }: any) => { + const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) + + return ( + + +
- - - -
- {isEditing ? ( -
+
+ + + +
+
{Object.keys(ROLE_PERMISSIONS).map((permission) => ( - + + + + + +
+ + This privilege cannot be updated via the dashboard + +
+
+ + ) + } /> ))}
- ) : ( -
- {Object.keys(ROLE_PERMISSIONS).map((permission) => ( -
- {(role as any)[permission] ? ( - - ) : ( - - )} -

{ROLE_PERMISSIONS[permission]}

-
- ))} +
+ +
- )} -
- - - )} +
+
+ + ) + }} ) } diff --git a/studio/components/interfaces/Database/Roles/Roles.constants.ts b/studio/components/interfaces/Database/Roles/Roles.constants.ts new file mode 100644 index 00000000000..a7d1a02ac42 --- /dev/null +++ b/studio/components/interfaces/Database/Roles/Roles.constants.ts @@ -0,0 +1,27 @@ +export const ROLE_PERMISSIONS: any = { + can_login: { + disabled: false, + description: 'User can login', + }, + can_create_role: { + disabled: false, + description: 'User can create roles', + }, + can_create_db: { + disabled: false, + description: 'User can create databases', + }, + can_bypass_rls: { + disabled: false, + description: 'User bypasses every row level security policy', + }, + is_superuser: { + disabled: true, + description: 'User is a Superuser', + }, + is_replication_role: { + disabled: true, + description: + 'User can initiate streaming replication and put the system in and out of backup mode', + }, +} diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index e7eac075fce..519517cd70e 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,22 +1,27 @@ -import { FC } from 'react' +import { FC, useState } from 'react' import { observer } from 'mobx-react-lite' import * as Tooltip from '@radix-ui/react-tooltip' import { PostgresRole } from '@supabase/postgres-meta' import { Button, IconPlus } from 'ui' -import { useStore } from 'hooks' +import { useParams, useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' import { FormHeader } from 'components/ui/Forms' import RoleRow from './RoleRow' +import Link from 'next/link' +import DeleteRoleModal from './DeleteRoleModal' interface Props { onSelectRole: (role: any) => void } -const RolesList: FC = ({ onSelectRole = () => {} }) => { +const RolesList: FC = ({}) => { + const { ref } = useParams() const { meta } = useStore() const roles = meta.roles.list() + const [selectedRoleToDelete, setSelectedRoleToDelete] = useState() + const connectionLimit = Math.max(...roles.map((role: PostgresRole) => role.connection_limit)) const totalActiveConnections = roles .map((role: PostgresRole) => role.active_connections) @@ -26,61 +31,73 @@ const RolesList: FC = ({ onSelectRole = () => {} }) => { .sort((a, b) => b.active_connections - a.active_connections) return ( -
-
- -
- - -
- 0.9 * connectionLimit - ? 'bg-red-800' - : totalActiveConnections > 0.75 * connectionLimit - ? 'bg-amber-900' - : 'bg-green-800' - } - labelTop={`${totalActiveConnections}/${connectionLimit}`} - labelBottom="Active connections" - /> -
-
- - -
-

Connections by roles:

- {rolesWithActiveConnections.map((role: PostgresRole) => ( -
- {role.name}: {role.active_connections} -
- ))} -
-
-
- + <> +
+
+ +
+ + +
+ 0.9 * connectionLimit + ? 'bg-red-800' + : totalActiveConnections > 0.75 * connectionLimit + ? 'bg-amber-900' + : 'bg-green-800' + } + labelTop={`${totalActiveConnections}/${connectionLimit}`} + labelBottom="Active connections" + /> +
+
+ + +
+

Connections by roles:

+ {rolesWithActiveConnections.map((role: PostgresRole) => ( +
+ {role.name}: {role.active_connections} +
+ ))} +
+
+
+ + + + + +
+
+ +
+ {roles.map((role: PostgresRole, i: number) => ( + + ))}
-
- {roles.map((role: PostgresRole, i: number) => ( - - ))} -
-
+ setSelectedRoleToDelete(undefined)} + /> + ) } diff --git a/studio/pages/project/[ref]/database/roles.tsx b/studio/pages/project/[ref]/database/roles/index.tsx similarity index 100% rename from studio/pages/project/[ref]/database/roles.tsx rename to studio/pages/project/[ref]/database/roles/index.tsx diff --git a/studio/pages/project/[ref]/database/roles/new.tsx b/studio/pages/project/[ref]/database/roles/new.tsx new file mode 100644 index 00000000000..5b234350727 --- /dev/null +++ b/studio/pages/project/[ref]/database/roles/new.tsx @@ -0,0 +1,21 @@ +import { observer } from 'mobx-react-lite' +import { PermissionAction } from '@supabase/shared-types/out/constants' + +import { DatabaseLayout } from 'components/layouts' +import { NextPageWithLayout } from 'types' +import { checkPermissions } from 'hooks' +import NoPermission from 'components/ui/NoPermission' +import CreateRole from 'components/interfaces/Database/Roles/CreateRole' + +const CreateNewRole: NextPageWithLayout = () => { + const canReadRoles = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_READ, 'roles') + if (!canReadRoles) { + return + } + + return +} + +CreateNewRole.getLayout = (page) => {page} + +export default observer(CreateNewRole) diff --git a/studio/styles/ui.scss b/studio/styles/ui.scss index 16a1284fc6b..e927eb48782 100644 --- a/studio/styles/ui.scss +++ b/studio/styles/ui.scss @@ -333,4 +333,10 @@ .pitr-listbox { @apply md:gap-x-2; +} + +.roles-toggle { + label { + @apply mt-1; + } } \ No newline at end of file From 28940e0c378b2b136f1aa3f1a19f44a692d4d9d7 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 14 Feb 2023 16:50:29 +0800 Subject: [PATCH 115/120] Add search and filter for roles --- .../Database/Roles/Roles.constants.ts | 17 +++++ .../interfaces/Database/Roles/RolesList.tsx | 62 +++++++++++++++++-- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/studio/components/interfaces/Database/Roles/Roles.constants.ts b/studio/components/interfaces/Database/Roles/Roles.constants.ts index a7d1a02ac42..9a558bfb4e8 100644 --- a/studio/components/interfaces/Database/Roles/Roles.constants.ts +++ b/studio/components/interfaces/Database/Roles/Roles.constants.ts @@ -1,3 +1,20 @@ +export const SUPABASE_ROLES = [ + 'anon', + 'service_role', + 'authenticated', + 'authenticator', + 'dashboard_user', + 'supabase_admin', + 'supabase_auth_admin', + 'supabase_replication_admin', + 'supabase_storage_admin', + 'supabase_functions_admin', + 'pgbouncer', + 'pgsodium_keyholder', + 'pgsodium_keyiduser', + 'pgsodium_keymaker', +] + export const ROLE_PERMISSIONS: any = { can_login: { disabled: false, diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index 519517cd70e..c8290fde5db 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,14 +1,14 @@ +import Link from 'next/link' import { FC, useState } from 'react' import { observer } from 'mobx-react-lite' import * as Tooltip from '@radix-ui/react-tooltip' import { PostgresRole } from '@supabase/postgres-meta' -import { Button, IconPlus } from 'ui' +import { Button, Input, IconPlus, IconSearch } from 'ui' import { useParams, useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' import { FormHeader } from 'components/ui/Forms' import RoleRow from './RoleRow' -import Link from 'next/link' import DeleteRoleModal from './DeleteRoleModal' interface Props { @@ -18,10 +18,18 @@ interface Props { const RolesList: FC = ({}) => { const { ref } = useParams() const { meta } = useStore() - const roles = meta.roles.list() + const [filterString, setFilterString] = useState('') + const [filterType, setFilterType] = useState<'all' | 'active'>('all') const [selectedRoleToDelete, setSelectedRoleToDelete] = useState() + const roles = meta.roles.list() + const filteredRoles = ( + filterType === 'active' + ? meta.roles.list((role: PostgresRole) => role.active_connections > 0) + : meta.roles.list() + ).filter((role: PostgresRole) => role.name.includes(filterString)) + const connectionLimit = Math.max(...roles.map((role: PostgresRole) => role.connection_limit)) const totalActiveConnections = roles .map((role: PostgresRole) => role.active_connections) @@ -38,7 +46,43 @@ const RolesList: FC = ({}) => { title="Database Roles" description="Manage access control to your database through users, groups, and permissions" /> -
+
+ +
+
+ } + onChange={(event: any) => setFilterString(event.target.value)} + /> +
+ +
+ +
+
+
@@ -86,9 +130,17 @@ const RolesList: FC = ({}) => {
- {roles.map((role: PostgresRole, i: number) => ( + {filteredRoles.map((role: PostgresRole, i: number) => ( ))} + {filterString.length > 0 && filteredRoles.length === 0 && ( +
+

No results found

+

+ Your search for "{filterString}" did not return any results +

+
+ )}
From 93fdde701baa91458ffe01a31b73d5d79d025626 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 14 Feb 2023 18:19:52 +0800 Subject: [PATCH 116/120] Update create role into a side panel --- .../ui/src/components/SidePanel/SidePanel.tsx | 7 +- .../src/lib/Layout/FormLayout/FormLayout.tsx | 2 +- .../interfaces/Database/Roles/CreateRole.tsx | 171 ------------------ .../Database/Roles/CreateRolePanel.tsx | 164 +++++++++++++++++ .../interfaces/Database/Roles/RoleRow.tsx | 128 ++++++++----- .../interfaces/Database/Roles/RolesList.tsx | 92 +++++++--- .../project/[ref]/database/roles/new.tsx | 21 --- 7 files changed, 327 insertions(+), 258 deletions(-) delete mode 100644 studio/components/interfaces/Database/Roles/CreateRole.tsx create mode 100644 studio/components/interfaces/Database/Roles/CreateRolePanel.tsx delete mode 100644 studio/pages/project/[ref]/database/roles/new.tsx diff --git a/packages/ui/src/components/SidePanel/SidePanel.tsx b/packages/ui/src/components/SidePanel/SidePanel.tsx index e105fe85d91..d04b062b3c2 100644 --- a/packages/ui/src/components/SidePanel/SidePanel.tsx +++ b/packages/ui/src/components/SidePanel/SidePanel.tsx @@ -67,7 +67,12 @@ const SidePanel = ({ -
diff --git a/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx b/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx index 14262972430..9715d795b1d 100644 --- a/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx +++ b/packages/ui/src/lib/Layout/FormLayout/FormLayout.tsx @@ -148,7 +148,7 @@ export function FormLayout({ > {labelled && (
- - ) -} - -export default CreateRole diff --git a/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx b/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx new file mode 100644 index 00000000000..c313ec041f5 --- /dev/null +++ b/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx @@ -0,0 +1,164 @@ +import { FC, useRef, useState } from 'react' +import * as Tooltip from '@radix-ui/react-tooltip' +import { Form, IconHelpCircle, Input, SidePanel, Button, Toggle } from 'ui' +import { ROLE_PERMISSIONS } from './Roles.constants' +import { FormSection, FormSectionLabel, FormSectionContent } from 'components/ui/Forms' +import { useStore } from 'hooks' +interface Props { + visible: boolean + onClose: () => void +} + +const CreateRolePanel: FC = ({ visible, onClose }) => { + const formId = 'create-new-role' + const submitRef: any = useRef() + const { ui, meta } = useStore() + const [isSubmitting, setIsSubmitting] = useState(false) + + const initialValues = { + name: '', + is_superuser: false, + can_login: false, + can_create_role: false, + can_create_db: false, + is_replication_role: false, + can_bypass_rls: false, + } + + const validate = (values: any) => { + const errors: any = {} + if (values.name.length === 0) errors.name = 'Please provide a name for your role' + return errors + } + + const onSubmit = async (values: any) => { + setIsSubmitting(true) + const res = await meta.roles.create(values) + setIsSubmitting(false) + + if (res.error) { + return ui.setNotification({ + category: 'error', + message: `Failed to create role: ${res.error.message}`, + }) + } else { + ui.setNotification({ + category: 'success', + message: `Successfully created new role: ${res.name}`, + }) + onClose() + } + } + + return ( + + + +
+ } + > +
+ {({ isSubmitting, handleReset, values, initialValues }: any) => { + return ( +
+ Role Configuration + } + > + + + + + + Role Privileges + } + > + +
+ {Object.keys(ROLE_PERMISSIONS).map((permission) => ( + + + + + + +
+ + This privilege cannot be granted via the dashboard + +
+
+ + ) + } + /> + ))} +
+
+
+
+ ) + }} + + + ) +} + +export default CreateRolePanel diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx index 8f4bccd9e16..37e5bd96b93 100644 --- a/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -12,16 +12,19 @@ import { IconHelpCircle, IconMoreVertical, } from 'ui' + +import { useStore } from 'hooks' import { ROLE_PERMISSIONS } from './Roles.constants' interface Props { role: PostgresRole + disabled?: boolean onSelectDelete: (role: PostgresRole) => void } -const RoleRow: FC = ({ role, onSelectDelete }) => { +const RoleRow: FC = ({ role, disabled = false, onSelectDelete }) => { + const { ui, meta } = useStore() const [isExpanded, setIsExpanded] = useState(false) - const [isSaving, setIsSaving] = useState(false) const { is_superuser, @@ -32,10 +35,22 @@ const RoleRow: FC = ({ role, onSelectDelete }) => { can_bypass_rls, } = role - const onSaveChanges = async (values: any) => { - setIsSaving(true) - console.log(values) - setIsSaving(false) + const onSaveChanges = async (values: any, { setSubmitting }: any) => { + setSubmitting(true) + const res = await meta.roles.update(role.id, values) + setSubmitting(false) + + if (res.error) { + ui.setNotification({ + category: 'error', + message: `Failed to update role "${role.name}": ${res.error.message}`, + }) + } else { + ui.setNotification({ + category: 'success', + message: `Successfully updated role "${role.name}"`, + }) + } } return ( @@ -63,7 +78,7 @@ const RoleRow: FC = ({ role, onSelectDelete }) => { 'last:rounded-bl last:rounded-br', ].join(' ')} > - {({ values, initialValues, handleReset }: any) => { + {({ values, initialValues, handleReset, isSubmitting }: any) => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) return ( @@ -79,42 +94,65 @@ const RoleRow: FC = ({ role, onSelectDelete }) => { >
-

{role.name}

-

(ID: {role.id})

+

+ {role.name} +

+

+ (ID: {role.id}) +

+ {role.active_connections > 0 && ( +
+ + + + +
+ )}

0 ? 'text-scale-1100' : 'text-scale-1000' }`} > {role.active_connections} connections

- - } - onClick={(event: any) => { - event.stopPropagation() - onSelectDelete(role) - }} - > - Delete - - - } - > -
@@ -128,12 +166,13 @@ const RoleRow: FC = ({ role, onSelectDelete }) => { id={permission} name={permission} label={ROLE_PERMISSIONS[permission].description} - disabled={ROLE_PERMISSIONS[permission].disabled} + disabled={disabled || ROLE_PERMISSIONS[permission].disabled} className={[ 'roles-toggle', ROLE_PERMISSIONS[permission].disabled ? 'opacity-50' : '', ].join(' ')} afterLabel={ + !disabled && ROLE_PERMISSIONS[permission].disabled && ( @@ -162,18 +201,25 @@ const RoleRow: FC = ({ role, onSelectDelete }) => { /> ))}
-
- - -
+ {!disabled && ( +
+ + +
+ )}
diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index c8290fde5db..1195188b429 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,15 +1,17 @@ -import Link from 'next/link' import { FC, useState } from 'react' import { observer } from 'mobx-react-lite' import * as Tooltip from '@radix-ui/react-tooltip' import { PostgresRole } from '@supabase/postgres-meta' -import { Button, Input, IconPlus, IconSearch } from 'ui' +import { Button, Input, IconPlus, IconSearch, IconX, Badge } from 'ui' import { useParams, useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' import { FormHeader } from 'components/ui/Forms' import RoleRow from './RoleRow' import DeleteRoleModal from './DeleteRoleModal' +import { SUPABASE_ROLES } from './Roles.constants' +import { partition } from 'lodash' +import CreateRolePanel from './CreateRolePanel' interface Props { onSelectRole: (role: any) => void @@ -21,6 +23,7 @@ const RolesList: FC = ({}) => { const [filterString, setFilterString] = useState('') const [filterType, setFilterType] = useState<'all' | 'active'>('all') + const [isCreatingRole, setIsCreatingRole] = useState(false) const [selectedRoleToDelete, setSelectedRoleToDelete] = useState() const roles = meta.roles.list() @@ -29,6 +32,9 @@ const RolesList: FC = ({}) => { ? meta.roles.list((role: PostgresRole) => role.active_connections > 0) : meta.roles.list() ).filter((role: PostgresRole) => role.name.includes(filterString)) + const [supabaseRoles, otherRoles] = partition(filteredRoles, (role: PostgresRole) => + SUPABASE_ROLES.includes(role.name) + ) const connectionLimit = Math.max(...roles.map((role: PostgresRole) => role.connection_limit)) const totalActiveConnections = roles @@ -54,12 +60,25 @@ const RolesList: FC = ({}) => { size="small" placeholder="Search for a role" icon={} + value={filterString} onChange={(event: any) => setFilterString(event.target.value)} + actions={ + filterString && ( + + ) + } />
- - - - - + -
- {filteredRoles.map((role: PostgresRole, i: number) => ( - - ))} - {filterString.length > 0 && filteredRoles.length === 0 && ( -
-

No results found

-

- Your search for "{filterString}" did not return any results -

-
- )} +
+
+ {supabaseRoles.length > 0 && ( +
+

Roles from Supabase

+ Protected +
+ )} + {supabaseRoles.map((role: PostgresRole, i: number) => ( + + ))} +
+ +
+ {otherRoles.length > 0 && ( +
+

Other database roles

+
+ )} + {otherRoles.map((role: PostgresRole, i: number) => ( + + ))} +
+ + {filterString.length > 0 && filteredRoles.length === 0 && ( +
+

No results found

+

+ Your search for "{filterString}" did not return any results +

+
+ )}
+ setIsCreatingRole(false)} /> + { - const canReadRoles = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_READ, 'roles') - if (!canReadRoles) { - return - } - - return -} - -CreateNewRole.getLayout = (page) => {page} - -export default observer(CreateNewRole) From 141d056239625748064a3b447fef09b9634ac59c Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 14 Feb 2023 18:35:06 +0800 Subject: [PATCH 117/120] Remove id from payload in update from meta store --- studio/stores/common/PostgresMetaInterface.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/studio/stores/common/PostgresMetaInterface.ts b/studio/stores/common/PostgresMetaInterface.ts index 07445b75e46..09f605b5acc 100644 --- a/studio/stores/common/PostgresMetaInterface.ts +++ b/studio/stores/common/PostgresMetaInterface.ts @@ -200,10 +200,9 @@ export default class PostgresMetaInterface implements IPostgresMetaInterface< } } - async update(id: number | string, updates: any) { + async update(id: number | string, payload: any) { try { const headers = { 'Content-Type': 'application/json', ...this.headers } - let payload = { ...updates, id } const url = `${this.url}?id=${id}` const response = await patch(url, payload, { headers }) if (response.error) throw response.error From 591e98e7be73a2edadf83e42c83925735163ead7 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 15 Feb 2023 10:42:10 +0800 Subject: [PATCH 118/120] Fix --- studio/components/interfaces/Database/Roles/RoleRow.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx index 37e5bd96b93..6a95ea38e4a 100644 --- a/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -37,7 +37,8 @@ const RoleRow: FC = ({ role, disabled = false, onSelectDelete }) => { const onSaveChanges = async (values: any, { setSubmitting }: any) => { setSubmitting(true) - const res = await meta.roles.update(role.id, values) + const { is_superuser, is_replication_role, ...payload } = values + const res = await meta.roles.update(role.id, payload) setSubmitting(false) if (res.error) { From 730e7e5d652061be292ed5cbef7ea49989aa821d Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 15 Feb 2023 14:58:53 +0800 Subject: [PATCH 119/120] Ensure form gets reset after updating role successfully --- .../interfaces/Database/Roles/RoleRow.tsx | 3 ++- .../interfaces/Database/Roles/RolesList.tsx | 27 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx index 6a95ea38e4a..93bfc33adcf 100644 --- a/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -35,7 +35,7 @@ const RoleRow: FC = ({ role, disabled = false, onSelectDelete }) => { can_bypass_rls, } = role - const onSaveChanges = async (values: any, { setSubmitting }: any) => { + const onSaveChanges = async (values: any, { setSubmitting, resetForm }: any) => { setSubmitting(true) const { is_superuser, is_replication_role, ...payload } = values const res = await meta.roles.update(role.id, payload) @@ -51,6 +51,7 @@ const RoleRow: FC = ({ role, disabled = false, onSelectDelete }) => { category: 'success', message: `Successfully updated role "${role.name}"`, }) + resetForm({ values: { ...values }, initialValues: { ...values } }) } } diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index 1195188b429..51da8ed3911 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,10 +1,10 @@ -import { FC, useState } from 'react' +import { FC, useState, useEffect } from 'react' import { observer } from 'mobx-react-lite' import * as Tooltip from '@radix-ui/react-tooltip' import { PostgresRole } from '@supabase/postgres-meta' import { Button, Input, IconPlus, IconSearch, IconX, Badge } from 'ui' -import { useParams, useStore } from 'hooks' +import { useStore } from 'hooks' import SparkBar from 'components/ui/SparkBar' import { FormHeader } from 'components/ui/Forms' import RoleRow from './RoleRow' @@ -18,14 +18,24 @@ interface Props { } const RolesList: FC = ({}) => { - const { ref } = useParams() const { meta } = useStore() + const [maxConnectionLimit, setMaxConnectionLimit] = useState(0) const [filterString, setFilterString] = useState('') const [filterType, setFilterType] = useState<'all' | 'active'>('all') const [isCreatingRole, setIsCreatingRole] = useState(false) const [selectedRoleToDelete, setSelectedRoleToDelete] = useState() + useEffect(() => { + const getMaxConnectionLimit = async () => { + const res = await meta.query('show max_connections') + if (!res.error) { + setMaxConnectionLimit(Number(res[0]?.max_connections ?? 0)) + } + } + getMaxConnectionLimit() + }, []) + const roles = meta.roles.list() const filteredRoles = ( filterType === 'active' @@ -36,7 +46,6 @@ const RolesList: FC = ({}) => { SUPABASE_ROLES.includes(role.name) ) - const connectionLimit = Math.max(...roles.map((role: PostgresRole) => role.connection_limit)) const totalActiveConnections = roles .map((role: PostgresRole) => role.active_connections) .reduce((a, b) => a + b, 0) @@ -107,16 +116,18 @@ const RolesList: FC = ({}) => {
0.9 * connectionLimit + maxConnectionLimit === 0 + ? 'bg-gray-100 dark:bg-gray-600' + : totalActiveConnections > 0.9 * maxConnectionLimit ? 'bg-red-800' - : totalActiveConnections > 0.75 * connectionLimit + : totalActiveConnections > 0.75 * maxConnectionLimit ? 'bg-amber-900' : 'bg-green-800' } - labelTop={`${totalActiveConnections}/${connectionLimit}`} + labelTop={`${totalActiveConnections}/${maxConnectionLimit}`} labelBottom="Active connections" />
From 1ec964a607ceb2531989d04f95731d7715a9e4ff Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 15 Feb 2023 22:58:35 +0800 Subject: [PATCH 120/120] Update based on feedback --- studio/components/interfaces/Database/Roles/RoleRow.tsx | 2 +- studio/components/interfaces/Database/Roles/Roles.constants.ts | 2 +- studio/components/interfaces/Database/Roles/RolesList.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/studio/components/interfaces/Database/Roles/RoleRow.tsx b/studio/components/interfaces/Database/Roles/RoleRow.tsx index 93bfc33adcf..d8fcecb0c93 100644 --- a/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -171,7 +171,7 @@ const RoleRow: FC = ({ role, disabled = false, onSelectDelete }) => { disabled={disabled || ROLE_PERMISSIONS[permission].disabled} className={[ 'roles-toggle', - ROLE_PERMISSIONS[permission].disabled ? 'opacity-50' : '', + disabled || ROLE_PERMISSIONS[permission].disabled ? 'opacity-50' : '', ].join(' ')} afterLabel={ !disabled && diff --git a/studio/components/interfaces/Database/Roles/Roles.constants.ts b/studio/components/interfaces/Database/Roles/Roles.constants.ts index 9a558bfb4e8..7e9bcbc3c28 100644 --- a/studio/components/interfaces/Database/Roles/Roles.constants.ts +++ b/studio/components/interfaces/Database/Roles/Roles.constants.ts @@ -29,7 +29,7 @@ export const ROLE_PERMISSIONS: any = { description: 'User can create databases', }, can_bypass_rls: { - disabled: false, + disabled: true, description: 'User bypasses every row level security policy', }, is_superuser: { diff --git a/studio/components/interfaces/Database/Roles/RolesList.tsx b/studio/components/interfaces/Database/Roles/RolesList.tsx index 51da8ed3911..956fb1af750 100644 --- a/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -163,7 +163,7 @@ const RolesList: FC = ({}) => {
{supabaseRoles.length > 0 && (
-

Roles from Supabase

+

Roles managed by Supabase

Protected
)}